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