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 * Subject to the GNU public license, v.2. No warranty of any kind.
6 */
7
8	#include <linux/linkage.h>
9	#include <asm/dwarf2.h>
10	#include <asm/calling.h>
11	#include <asm/rwlock.h>
12
13	/* rdi:	arg1 ... normal C conventions. rax is saved/restored. */
14	.macro thunk name,func
15	.globl \name
16\name:
17	CFI_STARTPROC
18	SAVE_ARGS
19	call \func
20	jmp  restore
21	CFI_ENDPROC
22	.endm
23
24	/* rdi:	arg1 ... normal C conventions. rax is passed from C. */
25	.macro thunk_retrax name,func
26	.globl \name
27\name:
28	CFI_STARTPROC
29	SAVE_ARGS
30	call \func
31	jmp  restore_norax
32	CFI_ENDPROC
33	.endm
34
35
36	.section .sched.text
37#ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM
38	thunk rwsem_down_read_failed_thunk,rwsem_down_read_failed
39	thunk rwsem_down_write_failed_thunk,rwsem_down_write_failed
40	thunk rwsem_wake_thunk,rwsem_wake
41	thunk rwsem_downgrade_thunk,rwsem_downgrade_wake
42#endif
43
44	thunk __down_failed,__down
45	thunk_retrax __down_failed_interruptible,__down_interruptible
46	thunk_retrax __down_failed_trylock,__down_trylock
47	thunk __up_wakeup,__up
48
49#ifdef CONFIG_TRACE_IRQFLAGS
50	thunk trace_hardirqs_on_thunk,trace_hardirqs_on
51	thunk trace_hardirqs_off_thunk,trace_hardirqs_off
52#endif
53
54	/* SAVE_ARGS below is used only for the .cfi directives it contains. */
55	CFI_STARTPROC
56	SAVE_ARGS
57restore:
58	RESTORE_ARGS
59	ret
60	CFI_ENDPROC
61
62	CFI_STARTPROC
63	SAVE_ARGS
64restore_norax:
65	RESTORE_ARGS 1
66	ret
67	CFI_ENDPROC
68