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 * $Id: thunk.S,v 1.2 2002/03/13 20:06:58 ak Exp $ 7 */ 8 9 #include <linux/config.h> 10 #include <linux/linkage.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 SAVE_ARGS 19 call \func 20 jmp restore 21 .endm 22 23 /* rdi: arg1 ... normal C conventions. rax is passed from C. */ 24 .macro thunk_retrax name,func 25 .globl \name 26\name: 27 SAVE_ARGS 28 call \func 29 jmp restore_norax 30 .endm 31 32 33#ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM 34 thunk rwsem_down_read_failed_thunk,rwsem_down_read_failed 35 thunk rwsem_down_write_failed_thunk,rwsem_down_write_failed 36 thunk rwsem_wake_thunk,rwsem_wake 37#endif 38 thunk do_softirq_thunk,do_softirq 39 40 thunk __down_failed,__down 41 thunk_retrax __down_failed_interruptible,__down_interruptible 42 thunk_retrax __down_failed_trylock,__down_trylock 43 thunk __up_wakeup,__up 44 45restore: 46 RESTORE_ARGS 47 ret 48 49restore_norax: 50 RESTORE_ARGS 1 51 ret 52 53#ifdef CONFIG_SMP 54/* Support for read/write spinlocks. */ 55 56/* rax: pointer to rwlock_t */ 57ENTRY(__write_lock_failed) 58 lock 59 addl $RW_LOCK_BIAS,(%rax) 601: rep 61 nop 62 cmpl $RW_LOCK_BIAS,(%rax) 63 jne 1b 64 lock 65 subl $RW_LOCK_BIAS,(%rax) 66 jnz __write_lock_failed 67 ret 68 69/* rax: pointer to rwlock_t */ 70ENTRY(__read_lock_failed) 71 lock 72 incl (%rax) 731: rep 74 nop 75 cmpl $1,(%rax) 76 js 1b 77 lock 78 decl (%rax) 79 js __read_lock_failed 80 ret 81#endif 82

