Commit d50efc6c40620b2e11648cac64ebf4a824e40382
1 parent
3a556b26a2
Exists in
master
and in
7 other branches
x86: fix UML and -regparm=3
introduce the "asmregparm" calling convention: for functions implemented in assembly with a fixed regparm input parameters calling convention. mark the semaphore and rwsem slowpath functions with that. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Showing 5 changed files with 25 additions and 12 deletions Side-by-side Diff
include/asm-x86/linkage.h
... | ... | @@ -9,6 +9,11 @@ |
9 | 9 | #ifdef CONFIG_X86_32 |
10 | 10 | #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) |
11 | 11 | #define prevent_tail_call(ret) __asm__ ("" : "=r" (ret) : "0" (ret)) |
12 | +/* | |
13 | + * For 32-bit UML - mark functions implemented in assembly that use | |
14 | + * regparm input parameters: | |
15 | + */ | |
16 | +#define asmregparm __attribute__((regparm(3))) | |
12 | 17 | #endif |
13 | 18 | |
14 | 19 | #ifdef CONFIG_X86_ALIGNMENT_16 |
include/asm-x86/rwsem.h
... | ... | @@ -44,10 +44,14 @@ |
44 | 44 | |
45 | 45 | struct rwsem_waiter; |
46 | 46 | |
47 | -extern struct rw_semaphore *FASTCALL(rwsem_down_read_failed(struct rw_semaphore *sem)); | |
48 | -extern struct rw_semaphore *FASTCALL(rwsem_down_write_failed(struct rw_semaphore *sem)); | |
49 | -extern struct rw_semaphore *FASTCALL(rwsem_wake(struct rw_semaphore *)); | |
50 | -extern struct rw_semaphore *FASTCALL(rwsem_downgrade_wake(struct rw_semaphore *sem)); | |
47 | +extern asmregparm struct rw_semaphore * | |
48 | + rwsem_down_read_failed(struct rw_semaphore *sem); | |
49 | +extern asmregparm struct rw_semaphore * | |
50 | + rwsem_down_write_failed(struct rw_semaphore *sem); | |
51 | +extern asmregparm struct rw_semaphore * | |
52 | + rwsem_wake(struct rw_semaphore *); | |
53 | +extern asmregparm struct rw_semaphore * | |
54 | + rwsem_downgrade_wake(struct rw_semaphore *sem); | |
51 | 55 | |
52 | 56 | /* |
53 | 57 | * the semaphore definition |
include/asm-x86/semaphore_32.h
... | ... | @@ -83,10 +83,10 @@ |
83 | 83 | sema_init(sem, 0); |
84 | 84 | } |
85 | 85 | |
86 | -void __down_failed(void /* special register calling convention */); | |
87 | -int __down_failed_interruptible(void /* params in registers */); | |
88 | -int __down_failed_trylock(void /* params in registers */); | |
89 | -void __up_wakeup(void /* special register calling convention */); | |
86 | +extern asmregparm void __down_failed(atomic_t *count_ptr); | |
87 | +extern asmregparm int __down_failed_interruptible(atomic_t *count_ptr); | |
88 | +extern asmregparm int __down_failed_trylock(atomic_t *count_ptr); | |
89 | +extern asmregparm void __up_wakeup(atomic_t *count_ptr); | |
90 | 90 | |
91 | 91 | /* |
92 | 92 | * This is ugly, but we want the default case to fall through. |
include/linux/linkage.h
lib/rwsem.c
... | ... | @@ -187,7 +187,7 @@ |
187 | 187 | /* |
188 | 188 | * wait for the read lock to be granted |
189 | 189 | */ |
190 | -struct rw_semaphore fastcall __sched * | |
190 | +asmregparm struct rw_semaphore __sched * | |
191 | 191 | rwsem_down_read_failed(struct rw_semaphore *sem) |
192 | 192 | { |
193 | 193 | struct rwsem_waiter waiter; |
... | ... | @@ -201,7 +201,7 @@ |
201 | 201 | /* |
202 | 202 | * wait for the write lock to be granted |
203 | 203 | */ |
204 | -struct rw_semaphore fastcall __sched * | |
204 | +asmregparm struct rw_semaphore __sched * | |
205 | 205 | rwsem_down_write_failed(struct rw_semaphore *sem) |
206 | 206 | { |
207 | 207 | struct rwsem_waiter waiter; |
... | ... | @@ -216,7 +216,7 @@ |
216 | 216 | * handle waking up a waiter on the semaphore |
217 | 217 | * - up_read/up_write has decremented the active part of count if we come here |
218 | 218 | */ |
219 | -struct rw_semaphore fastcall *rwsem_wake(struct rw_semaphore *sem) | |
219 | +asmregparm struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem) | |
220 | 220 | { |
221 | 221 | unsigned long flags; |
222 | 222 | |
... | ... | @@ -236,7 +236,7 @@ |
236 | 236 | * - caller incremented waiting part of count and discovered it still negative |
237 | 237 | * - just wake up any readers at the front of the queue |
238 | 238 | */ |
239 | -struct rw_semaphore fastcall *rwsem_downgrade_wake(struct rw_semaphore *sem) | |
239 | +asmregparm struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem) | |
240 | 240 | { |
241 | 241 | unsigned long flags; |
242 | 242 |