Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / x86_64 / lib / thunk.S
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/dwarf2.h>
12         #include <asm/calling.h>                        
13         #include <asm/rwlock.h>
14                 
15         /* rdi: arg1 ... normal C conventions. rax is saved/restored. */        
16         .macro thunk name,func
17         .globl \name
18 \name:  
19         CFI_STARTPROC
20         SAVE_ARGS
21         call \func
22         jmp  restore
23         CFI_ENDPROC
24         .endm
25
26         /* rdi: arg1 ... normal C conventions. rax is passed from C. */         
27         .macro thunk_retrax name,func
28         .globl \name
29 \name:  
30         CFI_STARTPROC
31         SAVE_ARGS
32         call \func
33         jmp  restore_norax
34         CFI_ENDPROC
35         .endm
36         
37
38         .section .sched.text
39 #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM
40         thunk rwsem_down_read_failed_thunk,rwsem_down_read_failed
41         thunk rwsem_down_write_failed_thunk,rwsem_down_write_failed
42         thunk rwsem_wake_thunk,rwsem_wake
43         thunk rwsem_downgrade_thunk,rwsem_downgrade_wake
44 #endif  
45         
46         thunk __down_failed,__down
47         thunk_retrax __down_failed_interruptible,__down_interruptible
48         thunk_retrax __down_failed_trylock,__down_trylock
49         thunk __up_wakeup,__up
50         
51         /* SAVE_ARGS below is used only for the .cfi directives it contains. */
52         CFI_STARTPROC
53         SAVE_ARGS
54 restore:
55         RESTORE_ARGS
56         ret     
57         CFI_ENDPROC
58         
59         CFI_STARTPROC
60         SAVE_ARGS
61 restore_norax:  
62         RESTORE_ARGS 1
63         ret
64         CFI_ENDPROC
65
66 #ifdef CONFIG_SMP
67 /* Support for read/write spinlocks. */
68         .text
69 /* rax: pointer to rwlock_t */  
70 ENTRY(__write_lock_failed)
71         lock
72         addl $RW_LOCK_BIAS,(%rax)
73 1:      rep
74         nop
75         cmpl $RW_LOCK_BIAS,(%rax)
76         jne 1b
77         lock 
78         subl $RW_LOCK_BIAS,(%rax)
79         jnz  __write_lock_failed
80         ret
81
82 /* rax: pointer to rwlock_t */  
83 ENTRY(__read_lock_failed)
84         lock
85         incl (%rax)
86 1:      rep
87         nop
88         cmpl $1,(%rax)
89         js 1b
90         lock
91         decl (%rax)
92         js __read_lock_failed
93         ret
94 #endif