diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /arch/x86_64/lib/thunk.S |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'arch/x86_64/lib/thunk.S')
-rw-r--r-- | arch/x86_64/lib/thunk.S | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/arch/x86_64/lib/thunk.S b/arch/x86_64/lib/thunk.S new file mode 100644 index 000000000000..acc1e2ca7ed7 --- /dev/null +++ b/arch/x86_64/lib/thunk.S | |||
@@ -0,0 +1,95 @@ | |||
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 | ||