Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

um: no need to play with save_sp in signal frame setup anymore

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Richard Weinberger <richard@nod.at>

authored by

Al Viro and committed by
Richard Weinberger
fbe98686 c7ea591c

+15 -57
+8 -31
arch/x86/um/signal_32.c
··· 215 215 } 216 216 217 217 static int copy_sc_to_user(struct sigcontext __user *to, 218 - struct _fpstate __user *to_fp, struct pt_regs *regs, 219 - unsigned long sp) 218 + struct _fpstate __user *to_fp, struct pt_regs *regs) 220 219 { 221 220 struct sigcontext sc; 222 221 struct faultinfo * fi = &current->thread.arch.faultinfo; ··· 229 230 sc.di = REGS_EDI(regs->regs.gp); 230 231 sc.si = REGS_ESI(regs->regs.gp); 231 232 sc.bp = REGS_EBP(regs->regs.gp); 232 - sc.sp = sp; 233 + sc.sp = REGS_SP(regs->regs.gp); 233 234 sc.bx = REGS_EBX(regs->regs.gp); 234 235 sc.dx = REGS_EDX(regs->regs.gp); 235 236 sc.cx = REGS_ECX(regs->regs.gp); ··· 290 291 err |= put_user(current->sas_ss_sp, &uc->uc_stack.ss_sp); 291 292 err |= put_user(sas_ss_flags(sp), &uc->uc_stack.ss_flags); 292 293 err |= put_user(current->sas_ss_size, &uc->uc_stack.ss_size); 293 - err |= copy_sc_to_user(&uc->uc_mcontext, fp, &current->thread.regs, sp); 294 + err |= copy_sc_to_user(&uc->uc_mcontext, fp, &current->thread.regs); 294 295 err |= copy_to_user(&uc->uc_sigmask, set, sizeof(*set)); 295 296 return err; 296 297 } ··· 323 324 { 324 325 struct sigframe __user *frame; 325 326 void __user *restorer; 326 - unsigned long save_sp = PT_REGS_SP(regs); 327 327 int err = 0; 328 328 329 329 /* This is the same calculation as i386 - ((sp + 4) & 15) == 0 */ ··· 335 337 if (ka->sa.sa_flags & SA_RESTORER) 336 338 restorer = ka->sa.sa_restorer; 337 339 338 - /* Update SP now because the page fault handler refuses to extend 339 - * the stack if the faulting address is too far below the current 340 - * SP, which frame now certainly is. If there's an error, the original 341 - * value is restored on the way out. 342 - * When writing the sigcontext to the stack, we have to write the 343 - * original value, so that's passed to copy_sc_to_user, which does 344 - * the right thing with it. 345 - */ 346 - PT_REGS_SP(regs) = (unsigned long) frame; 347 - 348 340 err |= __put_user(restorer, &frame->pretcode); 349 341 err |= __put_user(sig, &frame->sig); 350 - err |= copy_sc_to_user(&frame->sc, NULL, regs, save_sp); 342 + err |= copy_sc_to_user(&frame->sc, NULL, regs); 351 343 err |= __put_user(mask->sig[0], &frame->sc.oldmask); 352 344 if (_NSIG_WORDS > 1) 353 345 err |= __copy_to_user(&frame->extramask, &mask->sig[1], ··· 355 367 err |= __put_user(0x80cd, (short __user *)(frame->retcode+6)); 356 368 357 369 if (err) 358 - goto err; 370 + return err; 359 371 360 372 PT_REGS_SP(regs) = (unsigned long) frame; 361 373 PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler; ··· 366 378 if ((current->ptrace & PT_DTRACE) && (current->ptrace & PT_PTRACED)) 367 379 ptrace_notify(SIGTRAP); 368 380 return 0; 369 - 370 - err: 371 - PT_REGS_SP(regs) = save_sp; 372 - return err; 373 381 } 374 382 375 383 int setup_signal_stack_si(unsigned long stack_top, int sig, ··· 374 390 { 375 391 struct rt_sigframe __user *frame; 376 392 void __user *restorer; 377 - unsigned long save_sp = PT_REGS_SP(regs); 378 393 int err = 0; 379 394 380 395 stack_top &= -8UL; ··· 385 402 if (ka->sa.sa_flags & SA_RESTORER) 386 403 restorer = ka->sa.sa_restorer; 387 404 388 - /* See comment above about why this is here */ 389 - PT_REGS_SP(regs) = (unsigned long) frame; 390 - 391 405 err |= __put_user(restorer, &frame->pretcode); 392 406 err |= __put_user(sig, &frame->sig); 393 407 err |= __put_user(&frame->info, &frame->pinfo); 394 408 err |= __put_user(&frame->uc, &frame->puc); 395 409 err |= copy_siginfo_to_user(&frame->info, info); 396 410 err |= copy_ucontext_to_user(&frame->uc, &frame->fpstate, mask, 397 - save_sp); 411 + PT_REGS_SP(regs)); 398 412 399 413 /* 400 414 * This is movl $,%eax ; int $0x80 ··· 405 425 err |= __put_user(0x80cd, (short __user *)(frame->retcode+5)); 406 426 407 427 if (err) 408 - goto err; 428 + return err; 409 429 430 + PT_REGS_SP(regs) = (unsigned long) frame; 410 431 PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler; 411 432 PT_REGS_EAX(regs) = (unsigned long) sig; 412 433 PT_REGS_EDX(regs) = (unsigned long) &frame->info; ··· 416 435 if ((current->ptrace & PT_DTRACE) && (current->ptrace & PT_PTRACED)) 417 436 ptrace_notify(SIGTRAP); 418 437 return 0; 419 - 420 - err: 421 - PT_REGS_SP(regs) = save_sp; 422 - return err; 423 438 } 424 439 425 440 long sys_sigreturn(struct pt_regs regs)
+7 -26
arch/x86/um/signal_64.c
··· 68 68 69 69 static int copy_sc_to_user(struct sigcontext __user *to, 70 70 struct _fpstate __user *to_fp, struct pt_regs *regs, 71 - unsigned long mask, unsigned long sp) 71 + unsigned long mask) 72 72 { 73 73 struct faultinfo * fi = &current->thread.arch.faultinfo; 74 74 struct sigcontext sc; ··· 81 81 PUTREG(DI, di); 82 82 PUTREG(SI, si); 83 83 PUTREG(BP, bp); 84 - /* 85 - * Must use original RSP, which is passed in, rather than what's in 86 - * signal frame. 87 - */ 88 - sc.sp = sp; 84 + PUTREG(SP, sp); 89 85 PUTREG(BX, bx); 90 86 PUTREG(DX, dx); 91 87 PUTREG(CX, cx); ··· 137 141 siginfo_t *info, sigset_t *set) 138 142 { 139 143 struct rt_sigframe __user *frame; 140 - unsigned long save_sp = PT_REGS_RSP(regs); 141 144 int err = 0; 142 145 struct task_struct *me = current; 143 146 ··· 154 159 goto out; 155 160 } 156 161 157 - /* 158 - * Update SP now because the page fault handler refuses to extend 159 - * the stack if the faulting address is too far below the current 160 - * SP, which frame now certainly is. If there's an error, the original 161 - * value is restored on the way out. 162 - * When writing the sigcontext to the stack, we have to write the 163 - * original value, so that's passed to copy_sc_to_user, which does 164 - * the right thing with it. 165 - */ 166 - PT_REGS_RSP(regs) = (unsigned long) frame; 167 - 168 162 /* Create the ucontext. */ 169 163 err |= __put_user(0, &frame->uc.uc_flags); 170 164 err |= __put_user(0, &frame->uc.uc_link); 171 165 err |= __put_user(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 172 - err |= __put_user(sas_ss_flags(save_sp), 166 + err |= __put_user(sas_ss_flags(PT_REGS_RSP(regs)), 173 167 &frame->uc.uc_stack.ss_flags); 174 168 err |= __put_user(me->sas_ss_size, &frame->uc.uc_stack.ss_size); 175 169 err |= copy_sc_to_user(&frame->uc.uc_mcontext, &frame->fpstate, regs, 176 - set->sig[0], save_sp); 170 + set->sig[0]); 177 171 err |= __put_user(&frame->fpstate, &frame->uc.uc_mcontext.fpstate); 178 172 if (sizeof(*set) == 16) { 179 173 __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); ··· 181 197 err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); 182 198 else 183 199 /* could use a vstub here */ 184 - goto restore_sp; 200 + return err; 185 201 186 202 if (err) 187 - goto restore_sp; 203 + return err; 188 204 189 205 /* Set up registers for signal handler */ 190 206 { ··· 193 209 sig = ed->signal_invmap[sig]; 194 210 } 195 211 212 + PT_REGS_RSP(regs) = (unsigned long) frame; 196 213 PT_REGS_RDI(regs) = sig; 197 214 /* In case the signal handler was declared without prototypes */ 198 215 PT_REGS_RAX(regs) = 0; ··· 206 221 PT_REGS_RDX(regs) = (unsigned long) &frame->uc; 207 222 PT_REGS_RIP(regs) = (unsigned long) ka->sa.sa_handler; 208 223 out: 209 - return err; 210 - 211 - restore_sp: 212 - PT_REGS_RSP(regs) = save_sp; 213 224 return err; 214 225 } 215 226