Commit d50efc6c40620b2e11648cac64ebf4a824e40382

Authored by Ingo Molnar
1 parent 3a556b26a2

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
... ... @@ -13,6 +13,10 @@
13 13 #define asmlinkage CPP_ASMLINKAGE
14 14 #endif
15 15  
  16 +#ifndef asmregparm
  17 +# define asmregparm
  18 +#endif
  19 +
16 20 #ifndef prevent_tail_call
17 21 # define prevent_tail_call(ret) do { } while (0)
18 22 #endif
... ... @@ -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