more debug output
[linux-2.4.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/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         
45 restore:
46         RESTORE_ARGS
47         ret     
48         
49 restore_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 */  
57 ENTRY(__write_lock_failed)
58         lock
59         addl $RW_LOCK_BIAS,(%rax)
60 1:      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 */  
70 ENTRY(__read_lock_failed)
71         lock
72         incl (%rax)
73 1:      rep
74         nop
75         cmpl $1,(%rax)
76         js 1b
77         lock
78         decl (%rax)
79         js __read_lock_failed
80         ret
81 #endif