s390/switch_to: fix save_access_regs() / restore_access_regs()
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 20 Aug 2013 08:24:12 +0000 (10:24 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 22 Aug 2013 10:20:11 +0000 (12:20 +0200)
Fix broken contraints for both save_access_regs() and restore_access_regs().
The constraints are incorrect since they tell the compiler that the inline
assemblies only access the first element of an array of 16 elements.
Therefore the compiler could generate incorrect code.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/switch_to.h

index 80b6f11263c456233a6defaac28fd502bc7ad9f4..6dbd559763c9996c099f14e4ce6926e15930b7f8 100644 (file)
@@ -8,6 +8,7 @@
 #define __ASM_SWITCH_TO_H
 
 #include <linux/thread_info.h>
+#include <asm/ptrace.h>
 
 extern struct task_struct *__switch_to(void *, void *);
 extern void update_cr_regs(struct task_struct *task);
@@ -68,12 +69,16 @@ static inline void restore_fp_regs(s390_fp_regs *fpregs)
 
 static inline void save_access_regs(unsigned int *acrs)
 {
-       asm volatile("stam 0,15,%0" : "=Q" (*acrs));
+       typedef struct { int _[NUM_ACRS]; } acrstype;
+
+       asm volatile("stam 0,15,%0" : "=Q" (*(acrstype *)acrs));
 }
 
 static inline void restore_access_regs(unsigned int *acrs)
 {
-       asm volatile("lam 0,15,%0" : : "Q" (*acrs));
+       typedef struct { int _[NUM_ACRS]; } acrstype;
+
+       asm volatile("lam 0,15,%0" : : "Q" (*(acrstype *)acrs));
 }
 
 #define switch_to(prev,next,last) do {                                 \