1/*
2 * Save registers before calling assembly functions. This avoids
3 * disturbance of register allocation in some inline assembly constructs.
4 * Copyright 2001,2002 by Andi Kleen, SuSE Labs.
5 * Added trace_hardirqs callers - Copyright 2007 Steven Rostedt, Red Hat, Inc.
6 * Subject to the GNU public license, v.2. No warranty of any kind.
7 */
8
9	#include <linux/linkage.h>
10	#include <asm/dwarf2.h>
11	#include <asm/calling.h>
12	#include <asm/rwlock.h>
13
14	/* rdi:	arg1 ... normal C conventions. rax is saved/restored. */
15	.macro thunk name,func
16	.globl \name
17\name:
18	CFI_STARTPROC
19	SAVE_ARGS
20	call \func
21	jmp  restore
22	CFI_ENDPROC
23	.endm
24
25#ifdef CONFIG_TRACE_IRQFLAGS
26	/* put return address in rdi (arg1) */
27	.macro thunk_ra name,func
28	.globl \name
29\name:
30	CFI_STARTPROC
31	SAVE_ARGS
32	/* SAVE_ARGS pushs 9 elements */
33	/* the next element would be the rip */
34	movq 9*8(%rsp), %rdi
35	call \func
36	jmp  restore
37	CFI_ENDPROC
38	.endm
39
40	thunk_ra trace_hardirqs_on_thunk,trace_hardirqs_on_caller
41	thunk_ra trace_hardirqs_off_thunk,trace_hardirqs_off_caller
42#endif
43
44#ifdef CONFIG_DEBUG_LOCK_ALLOC
45	thunk lockdep_sys_exit_thunk,lockdep_sys_exit
46#endif
47
48	/* SAVE_ARGS below is used only for the .cfi directives it contains. */
49	CFI_STARTPROC
50	SAVE_ARGS
51restore:
52	RESTORE_ARGS
53	ret
54	CFI_ENDPROC
55