1 // SPDX-License-Identifier: GPL-2.0 2 /* arch/sparc64/kernel/signal32.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 6 * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) 7 * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) 8 * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 9 */ 10 11 #include <linux/sched.h> 12 #include <linux/kernel.h> 13 #include <linux/signal.h> 14 #include <linux/errno.h> 15 #include <linux/wait.h> 16 #include <linux/ptrace.h> 17 #include <linux/unistd.h> 18 #include <linux/mm.h> 19 #include <linux/tty.h> 20 #include <linux/binfmts.h> 21 #include <linux/compat.h> 22 #include <linux/bitops.h> 23 #include <linux/tracehook.h> 24 25 #include <linux/uaccess.h> 26 #include <asm/ptrace.h> 27 #include <asm/pgtable.h> 28 #include <asm/psrcompat.h> 29 #include <asm/fpumacro.h> 30 #include <asm/visasm.h> 31 #include <asm/compat_signal.h> 32 #include <asm/switch_to.h> 33 34 #include "sigutil.h" 35 #include "kernel.h" 36 37 /* This magic should be in g_upper[0] for all upper parts 38 * to be valid. 39 */ 40 #define SIGINFO_EXTRA_V8PLUS_MAGIC 0x130e269 41 typedef struct { 42 unsigned int g_upper[8]; 43 unsigned int o_upper[8]; 44 unsigned int asi; 45 } siginfo_extra_v8plus_t; 46 47 struct signal_frame32 { 48 struct sparc_stackf32 ss; 49 __siginfo32_t info; 50 /* __siginfo_fpu_t * */ u32 fpu_save; 51 unsigned int insns[2]; 52 unsigned int extramask[_COMPAT_NSIG_WORDS - 1]; 53 unsigned int extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */ 54 /* Only valid if (info.si_regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */ 55 siginfo_extra_v8plus_t v8plus; 56 /* __siginfo_rwin_t * */u32 rwin_save; 57 } __attribute__((aligned(8))); 58 59 struct rt_signal_frame32 { 60 struct sparc_stackf32 ss; 61 compat_siginfo_t info; 62 struct pt_regs32 regs; 63 compat_sigset_t mask; 64 /* __siginfo_fpu_t * */ u32 fpu_save; 65 unsigned int insns[2]; 66 compat_stack_t stack; 67 unsigned int extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */ 68 /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */ 69 siginfo_extra_v8plus_t v8plus; 70 /* __siginfo_rwin_t * */u32 rwin_save; 71 } __attribute__((aligned(8))); 72 73 int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) 74 { 75 int err; 76 77 if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) 78 return -EFAULT; 79 80 /* If you change siginfo_t structure, please be sure 81 this code is fixed accordingly. 82 It should never copy any pad contained in the structure 83 to avoid security leaks, but must copy the generic 84 3 ints plus the relevant union member. 85 This routine must convert siginfo from 64bit to 32bit as well 86 at the same time. */ 87 err = __put_user(from->si_signo, &to->si_signo); 88 err |= __put_user(from->si_errno, &to->si_errno); 89 err |= __put_user(from->si_code, &to->si_code); 90 if (from->si_code < 0) 91 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE); 92 else { 93 switch (siginfo_layout(from->si_signo, from->si_code)) { 94 case SIL_TIMER: 95 err |= __put_user(from->si_tid, &to->si_tid); 96 err |= __put_user(from->si_overrun, &to->si_overrun); 97 err |= __put_user(from->si_int, &to->si_int); 98 break; 99 case SIL_CHLD: 100 err |= __put_user(from->si_utime, &to->si_utime); 101 err |= __put_user(from->si_stime, &to->si_stime); 102 err |= __put_user(from->si_status, &to->si_status); 103 default: 104 case SIL_KILL: 105 err |= __put_user(from->si_pid, &to->si_pid); 106 err |= __put_user(from->si_uid, &to->si_uid); 107 break; 108 case SIL_FAULT: 109 err |= __put_user(from->si_trapno, &to->si_trapno); 110 err |= __put_user((unsigned long)from->si_addr, &to->si_addr); 111 break; 112 case SIL_POLL: 113 err |= __put_user(from->si_band, &to->si_band); 114 err |= __put_user(from->si_fd, &to->si_fd); 115 break; 116 case SIL_RT: 117 err |= __put_user(from->si_pid, &to->si_pid); 118 err |= __put_user(from->si_uid, &to->si_uid); 119 err |= __put_user(from->si_int, &to->si_int); 120 break; 121 } 122 } 123 return err; 124 } 125 126 /* CAUTION: This is just a very minimalist implementation for the 127 * sake of compat_sys_rt_sigqueueinfo() 128 */ 129 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) 130 { 131 if (!access_ok(VERIFY_WRITE, from, sizeof(compat_siginfo_t))) 132 return -EFAULT; 133 134 if (copy_from_user(to, from, 3*sizeof(int)) || 135 copy_from_user(to->_sifields._pad, from->_sifields._pad, 136 SI_PAD_SIZE)) 137 return -EFAULT; 138 139 return 0; 140 } 141 142 /* Checks if the fp is valid. We always build signal frames which are 143 * 16-byte aligned, therefore we can always enforce that the restore 144 * frame has that property as well. 145 */ 146 static bool invalid_frame_pointer(void __user *fp, int fplen) 147 { 148 if ((((unsigned long) fp) & 15) || 149 ((unsigned long)fp) > 0x100000000ULL - fplen) 150 return true; 151 return false; 152 } 153 154 void do_sigreturn32(struct pt_regs *regs) 155 { 156 struct signal_frame32 __user *sf; 157 compat_uptr_t fpu_save; 158 compat_uptr_t rwin_save; 159 unsigned int psr, ufp; 160 unsigned int pc, npc; 161 sigset_t set; 162 compat_sigset_t seta; 163 int err, i; 164 165 /* Always make any pending restarted system calls return -EINTR */ 166 current->restart_block.fn = do_no_restart_syscall; 167 168 synchronize_user_stack(); 169 170 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; 171 sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP]; 172 173 /* 1. Make sure we are not getting garbage from the user */ 174 if (invalid_frame_pointer(sf, sizeof(*sf))) 175 goto segv; 176 177 if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP])) 178 goto segv; 179 180 if (ufp & 0x7) 181 goto segv; 182 183 if (__get_user(pc, &sf->info.si_regs.pc) || 184 __get_user(npc, &sf->info.si_regs.npc)) 185 goto segv; 186 187 if ((pc | npc) & 3) 188 goto segv; 189 190 if (test_thread_flag(TIF_32BIT)) { 191 pc &= 0xffffffff; 192 npc &= 0xffffffff; 193 } 194 regs->tpc = pc; 195 regs->tnpc = npc; 196 197 /* 2. Restore the state */ 198 err = __get_user(regs->y, &sf->info.si_regs.y); 199 err |= __get_user(psr, &sf->info.si_regs.psr); 200 201 for (i = UREG_G1; i <= UREG_I7; i++) 202 err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]); 203 if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) { 204 err |= __get_user(i, &sf->v8plus.g_upper[0]); 205 if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) { 206 unsigned long asi; 207 208 for (i = UREG_G1; i <= UREG_I7; i++) 209 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]); 210 err |= __get_user(asi, &sf->v8plus.asi); 211 regs->tstate &= ~TSTATE_ASI; 212 regs->tstate |= ((asi & 0xffUL) << 24UL); 213 } 214 } 215 216 /* User can only change condition codes in %tstate. */ 217 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); 218 regs->tstate |= psr_to_tstate_icc(psr); 219 220 /* Prevent syscall restart. */ 221 pt_regs_clear_syscall(regs); 222 223 err |= __get_user(fpu_save, &sf->fpu_save); 224 if (!err && fpu_save) 225 err |= restore_fpu_state(regs, compat_ptr(fpu_save)); 226 err |= __get_user(rwin_save, &sf->rwin_save); 227 if (!err && rwin_save) { 228 if (restore_rwin_state(compat_ptr(rwin_save))) 229 goto segv; 230 } 231 err |= __get_user(seta.sig[0], &sf->info.si_mask); 232 err |= copy_from_user(&seta.sig[1], &sf->extramask, 233 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); 234 if (err) 235 goto segv; 236 237 set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); 238 set_current_blocked(&set); 239 return; 240 241 segv: 242 force_sig(SIGSEGV, current); 243 } 244 245 asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) 246 { 247 struct rt_signal_frame32 __user *sf; 248 unsigned int psr, pc, npc, ufp; 249 compat_uptr_t fpu_save; 250 compat_uptr_t rwin_save; 251 sigset_t set; 252 compat_sigset_t seta; 253 int err, i; 254 255 /* Always make any pending restarted system calls return -EINTR */ 256 current->restart_block.fn = do_no_restart_syscall; 257 258 synchronize_user_stack(); 259 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; 260 sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP]; 261 262 /* 1. Make sure we are not getting garbage from the user */ 263 if (invalid_frame_pointer(sf, sizeof(*sf))) 264 goto segv; 265 266 if (get_user(ufp, &sf->regs.u_regs[UREG_FP])) 267 goto segv; 268 269 if (ufp & 0x7) 270 goto segv; 271 272 if (__get_user(pc, &sf->regs.pc) || 273 __get_user(npc, &sf->regs.npc)) 274 goto segv; 275 276 if ((pc | npc) & 3) 277 goto segv; 278 279 if (test_thread_flag(TIF_32BIT)) { 280 pc &= 0xffffffff; 281 npc &= 0xffffffff; 282 } 283 regs->tpc = pc; 284 regs->tnpc = npc; 285 286 /* 2. Restore the state */ 287 err = __get_user(regs->y, &sf->regs.y); 288 err |= __get_user(psr, &sf->regs.psr); 289 290 for (i = UREG_G1; i <= UREG_I7; i++) 291 err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]); 292 if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) { 293 err |= __get_user(i, &sf->v8plus.g_upper[0]); 294 if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) { 295 unsigned long asi; 296 297 for (i = UREG_G1; i <= UREG_I7; i++) 298 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]); 299 err |= __get_user(asi, &sf->v8plus.asi); 300 regs->tstate &= ~TSTATE_ASI; 301 regs->tstate |= ((asi & 0xffUL) << 24UL); 302 } 303 } 304 305 /* User can only change condition codes in %tstate. */ 306 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); 307 regs->tstate |= psr_to_tstate_icc(psr); 308 309 /* Prevent syscall restart. */ 310 pt_regs_clear_syscall(regs); 311 312 err |= __get_user(fpu_save, &sf->fpu_save); 313 if (!err && fpu_save) 314 err |= restore_fpu_state(regs, compat_ptr(fpu_save)); 315 err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t)); 316 err |= compat_restore_altstack(&sf->stack); 317 if (err) 318 goto segv; 319 320 err |= __get_user(rwin_save, &sf->rwin_save); 321 if (!err && rwin_save) { 322 if (restore_rwin_state(compat_ptr(rwin_save))) 323 goto segv; 324 } 325 326 set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); 327 set_current_blocked(&set); 328 return; 329 segv: 330 force_sig(SIGSEGV, current); 331 } 332 333 static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) 334 { 335 unsigned long sp; 336 337 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; 338 sp = regs->u_regs[UREG_FP]; 339 340 /* 341 * If we are on the alternate signal stack and would overflow it, don't. 342 * Return an always-bogus address instead so we will die with SIGSEGV. 343 */ 344 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) 345 return (void __user *) -1L; 346 347 /* This is the X/Open sanctioned signal stack switching. */ 348 sp = sigsp(sp, ksig) - framesize; 349 350 /* Always align the stack frame. This handles two cases. First, 351 * sigaltstack need not be mindful of platform specific stack 352 * alignment. Second, if we took this signal because the stack 353 * is not aligned properly, we'd like to take the signal cleanly 354 * and report that. 355 */ 356 sp &= ~15UL; 357 358 return (void __user *) sp; 359 } 360 361 /* The I-cache flush instruction only works in the primary ASI, which 362 * right now is the nucleus, aka. kernel space. 363 * 364 * Therefore we have to kick the instructions out using the kernel 365 * side linear mapping of the physical address backing the user 366 * instructions. 367 */ 368 static void flush_signal_insns(unsigned long address) 369 { 370 unsigned long pstate, paddr; 371 pte_t *ptep, pte; 372 pgd_t *pgdp; 373 pud_t *pudp; 374 pmd_t *pmdp; 375 376 /* Commit all stores of the instructions we are about to flush. */ 377 wmb(); 378 379 /* Disable cross-call reception. In this way even a very wide 380 * munmap() on another cpu can't tear down the page table 381 * hierarchy from underneath us, since that can't complete 382 * until the IPI tlb flush returns. 383 */ 384 385 __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate)); 386 __asm__ __volatile__("wrpr %0, %1, %%pstate" 387 : : "r" (pstate), "i" (PSTATE_IE)); 388 389 pgdp = pgd_offset(current->mm, address); 390 if (pgd_none(*pgdp)) 391 goto out_irqs_on; 392 pudp = pud_offset(pgdp, address); 393 if (pud_none(*pudp)) 394 goto out_irqs_on; 395 pmdp = pmd_offset(pudp, address); 396 if (pmd_none(*pmdp)) 397 goto out_irqs_on; 398 399 ptep = pte_offset_map(pmdp, address); 400 pte = *ptep; 401 if (!pte_present(pte)) 402 goto out_unmap; 403 404 paddr = (unsigned long) page_address(pte_page(pte)); 405 406 __asm__ __volatile__("flush %0 + %1" 407 : /* no outputs */ 408 : "r" (paddr), 409 "r" (address & (PAGE_SIZE - 1)) 410 : "memory"); 411 412 out_unmap: 413 pte_unmap(ptep); 414 out_irqs_on: 415 __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate)); 416 417 } 418 419 static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs, 420 sigset_t *oldset) 421 { 422 struct signal_frame32 __user *sf; 423 int i, err, wsaved; 424 void __user *tail; 425 int sigframe_size; 426 u32 psr; 427 compat_sigset_t seta; 428 429 /* 1. Make sure everything is clean */ 430 synchronize_user_stack(); 431 save_and_clear_fpu(); 432 433 wsaved = get_thread_wsaved(); 434 435 sigframe_size = sizeof(*sf); 436 if (current_thread_info()->fpsaved[0] & FPRS_FEF) 437 sigframe_size += sizeof(__siginfo_fpu_t); 438 if (wsaved) 439 sigframe_size += sizeof(__siginfo_rwin_t); 440 441 sf = (struct signal_frame32 __user *) 442 get_sigframe(ksig, regs, sigframe_size); 443 444 if (invalid_frame_pointer(sf, sigframe_size)) { 445 do_exit(SIGILL); 446 return -EINVAL; 447 } 448 449 tail = (sf + 1); 450 451 /* 2. Save the current process state */ 452 if (test_thread_flag(TIF_32BIT)) { 453 regs->tpc &= 0xffffffff; 454 regs->tnpc &= 0xffffffff; 455 } 456 err = put_user(regs->tpc, &sf->info.si_regs.pc); 457 err |= __put_user(regs->tnpc, &sf->info.si_regs.npc); 458 err |= __put_user(regs->y, &sf->info.si_regs.y); 459 psr = tstate_to_psr(regs->tstate); 460 if (current_thread_info()->fpsaved[0] & FPRS_FEF) 461 psr |= PSR_EF; 462 err |= __put_user(psr, &sf->info.si_regs.psr); 463 for (i = 0; i < 16; i++) 464 err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]); 465 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size); 466 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]); 467 for (i = 1; i < 16; i++) 468 err |= __put_user(((u32 *)regs->u_regs)[2*i], 469 &sf->v8plus.g_upper[i]); 470 err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL, 471 &sf->v8plus.asi); 472 473 if (psr & PSR_EF) { 474 __siginfo_fpu_t __user *fp = tail; 475 tail += sizeof(*fp); 476 err |= save_fpu_state(regs, fp); 477 err |= __put_user((u64)fp, &sf->fpu_save); 478 } else { 479 err |= __put_user(0, &sf->fpu_save); 480 } 481 if (wsaved) { 482 __siginfo_rwin_t __user *rwp = tail; 483 tail += sizeof(*rwp); 484 err |= save_rwin_state(wsaved, rwp); 485 err |= __put_user((u64)rwp, &sf->rwin_save); 486 set_thread_wsaved(0); 487 } else { 488 err |= __put_user(0, &sf->rwin_save); 489 } 490 491 /* If these change we need to know - assignments to seta relies on these sizes */ 492 BUILD_BUG_ON(_NSIG_WORDS != 1); 493 BUILD_BUG_ON(_COMPAT_NSIG_WORDS != 2); 494 seta.sig[1] = (oldset->sig[0] >> 32); 495 seta.sig[0] = oldset->sig[0]; 496 497 err |= __put_user(seta.sig[0], &sf->info.si_mask); 498 err |= __copy_to_user(sf->extramask, &seta.sig[1], 499 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); 500 501 if (!wsaved) { 502 err |= copy_in_user((u32 __user *)sf, 503 (u32 __user *)(regs->u_regs[UREG_FP]), 504 sizeof(struct reg_window32)); 505 } else { 506 struct reg_window *rp; 507 508 rp = ¤t_thread_info()->reg_window[wsaved - 1]; 509 for (i = 0; i < 8; i++) 510 err |= __put_user(rp->locals[i], &sf->ss.locals[i]); 511 for (i = 0; i < 6; i++) 512 err |= __put_user(rp->ins[i], &sf->ss.ins[i]); 513 err |= __put_user(rp->ins[6], &sf->ss.fp); 514 err |= __put_user(rp->ins[7], &sf->ss.callers_pc); 515 } 516 if (err) 517 return err; 518 519 /* 3. signal handler back-trampoline and parameters */ 520 regs->u_regs[UREG_FP] = (unsigned long) sf; 521 regs->u_regs[UREG_I0] = ksig->sig; 522 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; 523 regs->u_regs[UREG_I2] = (unsigned long) &sf->info; 524 525 /* 4. signal handler */ 526 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; 527 regs->tnpc = (regs->tpc + 4); 528 if (test_thread_flag(TIF_32BIT)) { 529 regs->tpc &= 0xffffffff; 530 regs->tnpc &= 0xffffffff; 531 } 532 533 /* 5. return to kernel instructions */ 534 if (ksig->ka.ka_restorer) { 535 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; 536 } else { 537 unsigned long address = ((unsigned long)&(sf->insns[0])); 538 539 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); 540 541 err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/ 542 err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/ 543 if (err) 544 return err; 545 flush_signal_insns(address); 546 } 547 return 0; 548 } 549 550 static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs, 551 sigset_t *oldset) 552 { 553 struct rt_signal_frame32 __user *sf; 554 int i, err, wsaved; 555 void __user *tail; 556 int sigframe_size; 557 u32 psr; 558 compat_sigset_t seta; 559 560 /* 1. Make sure everything is clean */ 561 synchronize_user_stack(); 562 save_and_clear_fpu(); 563 564 wsaved = get_thread_wsaved(); 565 566 sigframe_size = sizeof(*sf); 567 if (current_thread_info()->fpsaved[0] & FPRS_FEF) 568 sigframe_size += sizeof(__siginfo_fpu_t); 569 if (wsaved) 570 sigframe_size += sizeof(__siginfo_rwin_t); 571 572 sf = (struct rt_signal_frame32 __user *) 573 get_sigframe(ksig, regs, sigframe_size); 574 575 if (invalid_frame_pointer(sf, sigframe_size)) { 576 do_exit(SIGILL); 577 return -EINVAL; 578 } 579 580 tail = (sf + 1); 581 582 /* 2. Save the current process state */ 583 if (test_thread_flag(TIF_32BIT)) { 584 regs->tpc &= 0xffffffff; 585 regs->tnpc &= 0xffffffff; 586 } 587 err = put_user(regs->tpc, &sf->regs.pc); 588 err |= __put_user(regs->tnpc, &sf->regs.npc); 589 err |= __put_user(regs->y, &sf->regs.y); 590 psr = tstate_to_psr(regs->tstate); 591 if (current_thread_info()->fpsaved[0] & FPRS_FEF) 592 psr |= PSR_EF; 593 err |= __put_user(psr, &sf->regs.psr); 594 for (i = 0; i < 16; i++) 595 err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]); 596 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size); 597 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]); 598 for (i = 1; i < 16; i++) 599 err |= __put_user(((u32 *)regs->u_regs)[2*i], 600 &sf->v8plus.g_upper[i]); 601 err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL, 602 &sf->v8plus.asi); 603 604 if (psr & PSR_EF) { 605 __siginfo_fpu_t __user *fp = tail; 606 tail += sizeof(*fp); 607 err |= save_fpu_state(regs, fp); 608 err |= __put_user((u64)fp, &sf->fpu_save); 609 } else { 610 err |= __put_user(0, &sf->fpu_save); 611 } 612 if (wsaved) { 613 __siginfo_rwin_t __user *rwp = tail; 614 tail += sizeof(*rwp); 615 err |= save_rwin_state(wsaved, rwp); 616 err |= __put_user((u64)rwp, &sf->rwin_save); 617 set_thread_wsaved(0); 618 } else { 619 err |= __put_user(0, &sf->rwin_save); 620 } 621 622 /* Update the siginfo structure. */ 623 err |= copy_siginfo_to_user32(&sf->info, &ksig->info); 624 625 /* Setup sigaltstack */ 626 err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); 627 628 seta.sig[1] = (oldset->sig[0] >> 32); 629 seta.sig[0] = oldset->sig[0]; 630 err |= __copy_to_user(&sf->mask, &seta, sizeof(compat_sigset_t)); 631 632 if (!wsaved) { 633 err |= copy_in_user((u32 __user *)sf, 634 (u32 __user *)(regs->u_regs[UREG_FP]), 635 sizeof(struct reg_window32)); 636 } else { 637 struct reg_window *rp; 638 639 rp = ¤t_thread_info()->reg_window[wsaved - 1]; 640 for (i = 0; i < 8; i++) 641 err |= __put_user(rp->locals[i], &sf->ss.locals[i]); 642 for (i = 0; i < 6; i++) 643 err |= __put_user(rp->ins[i], &sf->ss.ins[i]); 644 err |= __put_user(rp->ins[6], &sf->ss.fp); 645 err |= __put_user(rp->ins[7], &sf->ss.callers_pc); 646 } 647 if (err) 648 return err; 649 650 /* 3. signal handler back-trampoline and parameters */ 651 regs->u_regs[UREG_FP] = (unsigned long) sf; 652 regs->u_regs[UREG_I0] = ksig->sig; 653 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; 654 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; 655 656 /* 4. signal handler */ 657 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; 658 regs->tnpc = (regs->tpc + 4); 659 if (test_thread_flag(TIF_32BIT)) { 660 regs->tpc &= 0xffffffff; 661 regs->tnpc &= 0xffffffff; 662 } 663 664 /* 5. return to kernel instructions */ 665 if (ksig->ka.ka_restorer) 666 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; 667 else { 668 unsigned long address = ((unsigned long)&(sf->insns[0])); 669 670 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); 671 672 /* mov __NR_rt_sigreturn, %g1 */ 673 err |= __put_user(0x82102065, &sf->insns[0]); 674 675 /* t 0x10 */ 676 err |= __put_user(0x91d02010, &sf->insns[1]); 677 if (err) 678 return err; 679 680 flush_signal_insns(address); 681 } 682 return 0; 683 } 684 685 static inline void handle_signal32(struct ksignal *ksig, 686 struct pt_regs *regs) 687 { 688 sigset_t *oldset = sigmask_to_save(); 689 int err; 690 691 if (ksig->ka.sa.sa_flags & SA_SIGINFO) 692 err = setup_rt_frame32(ksig, regs, oldset); 693 else 694 err = setup_frame32(ksig, regs, oldset); 695 696 signal_setup_done(err, ksig, 0); 697 } 698 699 static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, 700 struct sigaction *sa) 701 { 702 switch (regs->u_regs[UREG_I0]) { 703 case ERESTART_RESTARTBLOCK: 704 case ERESTARTNOHAND: 705 no_system_call_restart: 706 regs->u_regs[UREG_I0] = EINTR; 707 regs->tstate |= TSTATE_ICARRY; 708 break; 709 case ERESTARTSYS: 710 if (!(sa->sa_flags & SA_RESTART)) 711 goto no_system_call_restart; 712 /* fallthrough */ 713 case ERESTARTNOINTR: 714 regs->u_regs[UREG_I0] = orig_i0; 715 regs->tpc -= 4; 716 regs->tnpc -= 4; 717 } 718 } 719 720 /* Note that 'init' is a special process: it doesn't get signals it doesn't 721 * want to handle. Thus you cannot kill init even with a SIGKILL even by 722 * mistake. 723 */ 724 void do_signal32(struct pt_regs * regs) 725 { 726 struct ksignal ksig; 727 unsigned long orig_i0 = 0; 728 int restart_syscall = 0; 729 bool has_handler = get_signal(&ksig); 730 731 if (pt_regs_is_syscall(regs) && 732 (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { 733 restart_syscall = 1; 734 orig_i0 = regs->u_regs[UREG_G6]; 735 } 736 737 if (has_handler) { 738 if (restart_syscall) 739 syscall_restart32(orig_i0, regs, &ksig.ka.sa); 740 handle_signal32(&ksig, regs); 741 } else { 742 if (restart_syscall) { 743 switch (regs->u_regs[UREG_I0]) { 744 case ERESTARTNOHAND: 745 case ERESTARTSYS: 746 case ERESTARTNOINTR: 747 /* replay the system call when we are done */ 748 regs->u_regs[UREG_I0] = orig_i0; 749 regs->tpc -= 4; 750 regs->tnpc -= 4; 751 pt_regs_clear_syscall(regs); 752 case ERESTART_RESTARTBLOCK: 753 regs->u_regs[UREG_G1] = __NR_restart_syscall; 754 regs->tpc -= 4; 755 regs->tnpc -= 4; 756 pt_regs_clear_syscall(regs); 757 } 758 } 759 restore_saved_sigmask(); 760 } 761 } 762 763 struct sigstack32 { 764 u32 the_stack; 765 int cur_status; 766 }; 767 768 asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp) 769 { 770 struct sigstack32 __user *ssptr = 771 (struct sigstack32 __user *)((unsigned long)(u_ssptr)); 772 struct sigstack32 __user *ossptr = 773 (struct sigstack32 __user *)((unsigned long)(u_ossptr)); 774 int ret = -EFAULT; 775 776 /* First see if old state is wanted. */ 777 if (ossptr) { 778 if (put_user(current->sas_ss_sp + current->sas_ss_size, 779 &ossptr->the_stack) || 780 __put_user(on_sig_stack(sp), &ossptr->cur_status)) 781 goto out; 782 } 783 784 /* Now see if we want to update the new state. */ 785 if (ssptr) { 786 u32 ss_sp; 787 788 if (get_user(ss_sp, &ssptr->the_stack)) 789 goto out; 790 791 /* If the current stack was set with sigaltstack, don't 792 * swap stacks while we are on it. 793 */ 794 ret = -EPERM; 795 if (current->sas_ss_sp && on_sig_stack(sp)) 796 goto out; 797 798 /* Since we don't know the extent of the stack, and we don't 799 * track onstack-ness, but rather calculate it, we must 800 * presume a size. Ho hum this interface is lossy. 801 */ 802 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ; 803 current->sas_ss_size = SIGSTKSZ; 804 } 805 806 ret = 0; 807 out: 808 return ret; 809 } 810