Merge master.kernel.org:/home/rmk/linux-2.6-serial
[linux-2.6] / 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         thunk do_softirq_thunk,do_softirq
46         
47         thunk __down_failed,__down
48         thunk_retrax __down_failed_interruptible,__down_interruptible
49         thunk_retrax __down_failed_trylock,__down_trylock
50         thunk __up_wakeup,__up
51         
52         /* SAVE_ARGS below is used only for the .cfi directives it contains. */
53         CFI_STARTPROC
54         SAVE_ARGS
55 restore:
56         RESTORE_ARGS
57         ret     
58         CFI_ENDPROC
59         
60         CFI_STARTPROC
61         SAVE_ARGS
62 restore_norax:  
63         RESTORE_ARGS 1
64         ret
65         CFI_ENDPROC
66
67 #ifdef CONFIG_SMP
68 /* Support for read/write spinlocks. */
69         .text
70 /* rax: pointer to rwlock_t */  
71 ENTRY(__write_lock_failed)
72         lock
73         addl $RW_LOCK_BIAS,(%rax)
74 1:      rep
75         nop
76         cmpl $RW_LOCK_BIAS,(%rax)
77         jne 1b
78         lock 
79         subl $RW_LOCK_BIAS,(%rax)
80         jnz  __write_lock_failed
81         ret
82
83 /* rax: pointer to rwlock_t */  
84 ENTRY(__read_lock_failed)
85         lock
86         incl (%rax)
87 1:      rep
88         nop
89         cmpl $1,(%rax)
90         js 1b
91         lock
92         decl (%rax)
93         js __read_lock_failed
94         ret
95 #endif