diff options
-rw-r--r-- | arch/arm/kernel/signal.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index bd8810d4acb3..0ae74207e43e 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -176,6 +176,7 @@ static int restore_vfp_context(char __user **auxp) | |||
176 | 176 | ||
177 | static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf) | 177 | static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf) |
178 | { | 178 | { |
179 | struct sigcontext context; | ||
179 | char __user *aux; | 180 | char __user *aux; |
180 | sigset_t set; | 181 | sigset_t set; |
181 | int err; | 182 | int err; |
@@ -184,23 +185,26 @@ static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf) | |||
184 | if (err == 0) | 185 | if (err == 0) |
185 | set_current_blocked(&set); | 186 | set_current_blocked(&set); |
186 | 187 | ||
187 | __get_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err); | 188 | err |= __copy_from_user(&context, &sf->uc.uc_mcontext, sizeof(context)); |
188 | __get_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err); | 189 | if (err == 0) { |
189 | __get_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err); | 190 | regs->ARM_r0 = context.arm_r0; |
190 | __get_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err); | 191 | regs->ARM_r1 = context.arm_r1; |
191 | __get_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err); | 192 | regs->ARM_r2 = context.arm_r2; |
192 | __get_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err); | 193 | regs->ARM_r3 = context.arm_r3; |
193 | __get_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err); | 194 | regs->ARM_r4 = context.arm_r4; |
194 | __get_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err); | 195 | regs->ARM_r5 = context.arm_r5; |
195 | __get_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err); | 196 | regs->ARM_r6 = context.arm_r6; |
196 | __get_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err); | 197 | regs->ARM_r7 = context.arm_r7; |
197 | __get_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err); | 198 | regs->ARM_r8 = context.arm_r8; |
198 | __get_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err); | 199 | regs->ARM_r9 = context.arm_r9; |
199 | __get_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err); | 200 | regs->ARM_r10 = context.arm_r10; |
200 | __get_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err); | 201 | regs->ARM_fp = context.arm_fp; |
201 | __get_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err); | 202 | regs->ARM_ip = context.arm_ip; |
202 | __get_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err); | 203 | regs->ARM_sp = context.arm_sp; |
203 | __get_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err); | 204 | regs->ARM_lr = context.arm_lr; |
205 | regs->ARM_pc = context.arm_pc; | ||
206 | regs->ARM_cpsr = context.arm_cpsr; | ||
207 | } | ||
204 | 208 | ||
205 | err |= !valid_user_regs(regs); | 209 | err |= !valid_user_regs(regs); |
206 | 210 | ||