diff options
author | Hirokazu Takata <takata@linux-m32r.org> | 2006-02-24 16:03:51 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-24 17:31:36 -0500 |
commit | 6ced13cdcab440931b87829b0f2d0dedacfb3f2d (patch) | |
tree | 8bdd7a80685a7069b30a0e03d32892a81ea8ca9c /arch/m32r | |
parent | cde05cf2145b0aa06dd61277060bfba5d38acb0b (diff) |
[PATCH] m32r: fix and update for gcc-4.0
Fix and update for gcc-4.0.
- arch/m32r/kernel/signal.c:
Change type of the 8th parameter of sys_rt_sigsuspend() from
'struct pt_regs' to 'struct pt_regs *'.
This functions make use of the 'regs' parameter to return status value,
but gcc-4.0 optimizes and removes it as a dead code.
Functions, sys_sigaltstack() and sys_rt_sigreturn(), have also modified.
- arch/m32r/lib/usercopy.c, include/asm-m32r/uaccess.h:
Add early-clobber constraints('&') to output values of asm statements;
these constraints seems to be required for gcc-4.0 register assignment.
Signed-off-by: Hayato Fujiwara <fujiwara@linux-m32r.org>
Signed-off-by: Hirokazu Takata <takata@linux-m32r.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/m32r')
-rw-r--r-- | arch/m32r/kernel/signal.c | 24 | ||||
-rw-r--r-- | arch/m32r/lib/usercopy.c | 4 |
2 files changed, 12 insertions, 16 deletions
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c index 71763f7a1d19..cb33097fefc4 100644 --- a/arch/m32r/kernel/signal.c +++ b/arch/m32r/kernel/signal.c | |||
@@ -36,7 +36,7 @@ int do_signal(struct pt_regs *, sigset_t *); | |||
36 | asmlinkage int | 36 | asmlinkage int |
37 | sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, | 37 | sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, |
38 | unsigned long r2, unsigned long r3, unsigned long r4, | 38 | unsigned long r2, unsigned long r3, unsigned long r4, |
39 | unsigned long r5, unsigned long r6, struct pt_regs regs) | 39 | unsigned long r5, unsigned long r6, struct pt_regs *regs) |
40 | { | 40 | { |
41 | sigset_t saveset, newset; | 41 | sigset_t saveset, newset; |
42 | 42 | ||
@@ -54,21 +54,21 @@ sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, | |||
54 | recalc_sigpending(); | 54 | recalc_sigpending(); |
55 | spin_unlock_irq(¤t->sighand->siglock); | 55 | spin_unlock_irq(¤t->sighand->siglock); |
56 | 56 | ||
57 | regs.r0 = -EINTR; | 57 | regs->r0 = -EINTR; |
58 | while (1) { | 58 | while (1) { |
59 | current->state = TASK_INTERRUPTIBLE; | 59 | current->state = TASK_INTERRUPTIBLE; |
60 | schedule(); | 60 | schedule(); |
61 | if (do_signal(®s, &saveset)) | 61 | if (do_signal(regs, &saveset)) |
62 | return regs.r0; | 62 | return regs->r0; |
63 | } | 63 | } |
64 | } | 64 | } |
65 | 65 | ||
66 | asmlinkage int | 66 | asmlinkage int |
67 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | 67 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, |
68 | unsigned long r2, unsigned long r3, unsigned long r4, | 68 | unsigned long r2, unsigned long r3, unsigned long r4, |
69 | unsigned long r5, unsigned long r6, struct pt_regs regs) | 69 | unsigned long r5, unsigned long r6, struct pt_regs *regs) |
70 | { | 70 | { |
71 | return do_sigaltstack(uss, uoss, regs.spu); | 71 | return do_sigaltstack(uss, uoss, regs->spu); |
72 | } | 72 | } |
73 | 73 | ||
74 | 74 | ||
@@ -140,11 +140,10 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | |||
140 | asmlinkage int | 140 | asmlinkage int |
141 | sys_rt_sigreturn(unsigned long r0, unsigned long r1, | 141 | sys_rt_sigreturn(unsigned long r0, unsigned long r1, |
142 | unsigned long r2, unsigned long r3, unsigned long r4, | 142 | unsigned long r2, unsigned long r3, unsigned long r4, |
143 | unsigned long r5, unsigned long r6, struct pt_regs regs) | 143 | unsigned long r5, unsigned long r6, struct pt_regs *regs) |
144 | { | 144 | { |
145 | struct rt_sigframe __user *frame = (struct rt_sigframe __user *)regs.spu; | 145 | struct rt_sigframe __user *frame = (struct rt_sigframe __user *)regs->spu; |
146 | sigset_t set; | 146 | sigset_t set; |
147 | stack_t st; | ||
148 | int result; | 147 | int result; |
149 | 148 | ||
150 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 149 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
@@ -158,14 +157,11 @@ sys_rt_sigreturn(unsigned long r0, unsigned long r1, | |||
158 | recalc_sigpending(); | 157 | recalc_sigpending(); |
159 | spin_unlock_irq(¤t->sighand->siglock); | 158 | spin_unlock_irq(¤t->sighand->siglock); |
160 | 159 | ||
161 | if (restore_sigcontext(®s, &frame->uc.uc_mcontext, &result)) | 160 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &result)) |
162 | goto badframe; | 161 | goto badframe; |
163 | 162 | ||
164 | if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) | 163 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->spu) == -EFAULT) |
165 | goto badframe; | 164 | goto badframe; |
166 | /* It is more difficult to avoid calling this function than to | ||
167 | call it and ignore errors. */ | ||
168 | do_sigaltstack(&st, NULL, regs.spu); | ||
169 | 165 | ||
170 | return result; | 166 | return result; |
171 | 167 | ||
diff --git a/arch/m32r/lib/usercopy.c b/arch/m32r/lib/usercopy.c index ce16bbe26a52..2d1dd2106c4d 100644 --- a/arch/m32r/lib/usercopy.c +++ b/arch/m32r/lib/usercopy.c | |||
@@ -64,7 +64,7 @@ do { \ | |||
64 | " .balign 4\n" \ | 64 | " .balign 4\n" \ |
65 | " .long 0b,3b\n" \ | 65 | " .long 0b,3b\n" \ |
66 | ".previous" \ | 66 | ".previous" \ |
67 | : "=r"(res), "=r"(count), "=&r" (__d0), "=&r" (__d1), \ | 67 | : "=&r"(res), "=&r"(count), "=&r" (__d0), "=&r" (__d1), \ |
68 | "=&r" (__d2) \ | 68 | "=&r" (__d2) \ |
69 | : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), \ | 69 | : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), \ |
70 | "4"(dst) \ | 70 | "4"(dst) \ |
@@ -101,7 +101,7 @@ do { \ | |||
101 | " .balign 4\n" \ | 101 | " .balign 4\n" \ |
102 | " .long 0b,3b\n" \ | 102 | " .long 0b,3b\n" \ |
103 | ".previous" \ | 103 | ".previous" \ |
104 | : "=r"(res), "=r"(count), "=&r" (__d0), "=&r" (__d1), \ | 104 | : "=&r"(res), "=&r"(count), "=&r" (__d0), "=&r" (__d1), \ |
105 | "=&r" (__d2) \ | 105 | "=&r" (__d2) \ |
106 | : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), \ | 106 | : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), \ |
107 | "4"(dst) \ | 107 | "4"(dst) \ |