1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * Copyright (c) 2012 Joyent, Inc. All rights reserved. 29 */ 30 31 #include <sys/mmu.h> 32 #include <sys/systm.h> 33 #include <sys/trap.h> 34 #include <sys/machtrap.h> 35 #include <sys/vtrace.h> 36 #include <sys/prsystm.h> 37 #include <sys/archsystm.h> 38 #include <sys/machsystm.h> 39 #include <sys/fpu/fpusystm.h> 40 #include <sys/tnf.h> 41 #include <sys/tnf_probe.h> 42 #include <sys/simulate.h> 43 #include <sys/ftrace.h> 44 #include <sys/ontrap.h> 45 #include <sys/kcpc.h> 46 #include <sys/kobj.h> 47 #include <sys/procfs.h> 48 #include <sys/sun4asi.h> 49 #include <sys/sdt.h> 50 #include <sys/fpras.h> 51 #include <sys/contract/process_impl.h> 52 53 #ifdef TRAPTRACE 54 #include <sys/traptrace.h> 55 #endif 56 57 int tudebug = 0; 58 static int tudebugbpt = 0; 59 static int tudebugfpe = 0; 60 61 static int alignfaults = 0; 62 63 #if defined(TRAPDEBUG) || defined(lint) 64 static int lodebug = 0; 65 #else 66 #define lodebug 0 67 #endif /* defined(TRAPDEBUG) || defined(lint) */ 68 69 70 int vis1_partial_support(struct regs *rp, k_siginfo_t *siginfo, uint_t *fault); 71 #pragma weak vis1_partial_support 72 73 void showregs(unsigned, struct regs *, caddr_t, uint_t); 74 #pragma weak showregs 75 76 void trap_async_hwerr(void); 77 #pragma weak trap_async_hwerr 78 79 void trap_async_berr_bto(int, struct regs *); 80 #pragma weak trap_async_berr_bto 81 82 static enum seg_rw get_accesstype(struct regs *); 83 static int nfload(struct regs *, int *); 84 static int swap_nc(struct regs *, int); 85 static int ldstub_nc(struct regs *, int); 86 void trap_cleanup(struct regs *, uint_t, k_siginfo_t *, int); 87 void trap_rtt(void); 88 89 static int __NORETURN 90 die(unsigned type, struct regs *rp, caddr_t addr, uint_t mmu_fsr) 91 { 92 struct panic_trap_info ti; 93 94 #ifdef TRAPTRACE 95 TRAPTRACE_FREEZE; 96 #endif 97 98 ti.trap_regs = rp; 99 ti.trap_type = type; 100 ti.trap_addr = addr; 101 ti.trap_mmu_fsr = mmu_fsr; 102 103 curthread->t_panic_trap = &ti; 104 105 if (type == T_DATA_MMU_MISS && addr < (caddr_t)KERNELBASE) { 106 panic("BAD TRAP: type=%x rp=%p addr=%p mmu_fsr=%x " 107 "occurred in module \"%s\" due to %s", 108 type, (void *)rp, (void *)addr, mmu_fsr, 109 mod_containing_pc((caddr_t)rp->r_pc), 110 addr < (caddr_t)PAGESIZE ? 111 "a NULL pointer dereference" : 112 "an illegal access to a user address"); 113 } else { 114 panic("BAD TRAP: type=%x rp=%p addr=%p mmu_fsr=%x", 115 type, (void *)rp, (void *)addr, mmu_fsr); 116 } 117 } 118 119 #if defined(SF_ERRATA_23) || defined(SF_ERRATA_30) /* call ... illegal-insn */ 120 int ill_calls; 121 #endif 122 123 /* 124 * Currently, the only PREFETCH/PREFETCHA instructions which cause traps 125 * are the "strong" prefetches (fcn=20-23). But we check for all flavors of 126 * PREFETCH, in case some future variant also causes a DATA_MMU_MISS. 127 */ 128 #define IS_PREFETCH(i) (((i) & 0xc1780000) == 0xc1680000) 129 130 #define IS_FLUSH(i) (((i) & 0xc1f80000) == 0x81d80000) 131 #define IS_SWAP(i) (((i) & 0xc1f80000) == 0xc0780000) 132 #define IS_LDSTUB(i) (((i) & 0xc1f80000) == 0xc0680000) 133 #define IS_FLOAT(i) (((i) & 0x1000000) != 0) 134 #define IS_STORE(i) (((i) >> 21) & 1) 135 136 /* 137 * Called from the trap handler when a processor trap occurs. 138 */ 139 /*VARARGS2*/ 140 void 141 trap(struct regs *rp, caddr_t addr, uint32_t type, uint32_t mmu_fsr) 142 { 143 proc_t *p = ttoproc(curthread); 144 klwp_id_t lwp = ttolwp(curthread); 145 struct machpcb *mpcb = NULL; 146 k_siginfo_t siginfo; 147 uint_t op3, fault = 0; 148 int stepped = 0; 149 greg_t oldpc; 150 int mstate; 151 char *badaddr; 152 faultcode_t res; 153 enum fault_type fault_type; 154 enum seg_rw rw; 155 uintptr_t lofault; 156 label_t *onfault; 157 int instr; 158 int iskernel; 159 int watchcode; 160 int watchpage; 161 extern faultcode_t pagefault(caddr_t, enum fault_type, 162 enum seg_rw, int); 163 #ifdef sun4v 164 extern boolean_t tick_stick_emulation_active; 165 #endif /* sun4v */ 166 167 CPU_STATS_ADDQ(CPU, sys, trap, 1); 168 169 #ifdef SF_ERRATA_23 /* call causes illegal-insn */ 170 ASSERT((curthread->t_schedflag & TS_DONT_SWAP) || 171 (type == T_UNIMP_INSTR)); 172 #else 173 ASSERT(curthread->t_schedflag & TS_DONT_SWAP); 174 #endif /* SF_ERRATA_23 */ 175 176 if (USERMODE(rp->r_tstate) || (type & T_USER)) { 177 /* 178 * Set lwp_state before trying to acquire any 179 * adaptive lock 180 */ 181 ASSERT(lwp != NULL); 182 lwp->lwp_state = LWP_SYS; 183 /* 184 * Set up the current cred to use during this trap. u_cred 185 * no longer exists. t_cred is used instead. 186 * The current process credential applies to the thread for 187 * the entire trap. If trapping from the kernel, this 188 * should already be set up. 189 */ 190 if (curthread->t_cred != p->p_cred) { 191 cred_t *oldcred = curthread->t_cred; 192 /* 193 * DTrace accesses t_cred in probe context. t_cred 194 * must always be either NULL, or point to a valid, 195 * allocated cred structure. 196 */ 197 curthread->t_cred = crgetcred(); 198 crfree(oldcred); 199 } 200 type |= T_USER; 201 ASSERT((type == (T_SYS_RTT_PAGE | T_USER)) || 202 (type == (T_SYS_RTT_ALIGN | T_USER)) || 203 lwp->lwp_regs == rp); 204 mpcb = lwptompcb(lwp); 205 switch (type) { 206 case T_WIN_OVERFLOW + T_USER: 207 case T_WIN_UNDERFLOW + T_USER: 208 case T_SYS_RTT_PAGE + T_USER: 209 case T_DATA_MMU_MISS + T_USER: 210 mstate = LMS_DFAULT; 211 break; 212 case T_INSTR_MMU_MISS + T_USER: 213 mstate = LMS_TFAULT; 214 break; 215 default: 216 mstate = LMS_TRAP; 217 break; 218 } 219 /* Kernel probe */ 220 TNF_PROBE_1(thread_state, "thread", /* CSTYLED */, 221 tnf_microstate, state, (char)mstate); 222 mstate = new_mstate(curthread, mstate); 223 siginfo.si_signo = 0; 224 stepped = 225 lwp->lwp_pcb.pcb_step != STEP_NONE && 226 ((oldpc = rp->r_pc), prundostep()) && 227 mmu_btop((uintptr_t)addr) == mmu_btop((uintptr_t)oldpc); 228 /* this assignment must not precede call to prundostep() */ 229 oldpc = rp->r_pc; 230 } 231 232 TRACE_1(TR_FAC_TRAP, TR_C_TRAP_HANDLER_ENTER, 233 "C_trap_handler_enter:type %x", type); 234 235 #ifdef F_DEFERRED 236 /* 237 * Take any pending floating point exceptions now. 238 * If the floating point unit has an exception to handle, 239 * just return to user-level to let the signal handler run. 240 * The instruction that got us to trap() will be reexecuted on 241 * return from the signal handler and we will trap to here again. 242 * This is necessary to disambiguate simultaneous traps which 243 * happen when a floating-point exception is pending and a 244 * machine fault is incurred. 245 */ 246 if (type & USER) { 247 /* 248 * FP_TRAPPED is set only by sendsig() when it copies 249 * out the floating-point queue for the signal handler. 250 * It is set there so we can test it here and in syscall(). 251 */ 252 mpcb->mpcb_flags &= ~FP_TRAPPED; 253 syncfpu(); 254 if (mpcb->mpcb_flags & FP_TRAPPED) { 255 /* 256 * trap() has have been called recursively and may 257 * have stopped the process, so do single step 258 * support for /proc. 259 */ 260 mpcb->mpcb_flags &= ~FP_TRAPPED; 261 goto out; 262 } 263 } 264 #endif 265 switch (type) { 266 case T_DATA_MMU_MISS: 267 case T_INSTR_MMU_MISS + T_USER: 268 case T_DATA_MMU_MISS + T_USER: 269 case T_DATA_PROT + T_USER: 270 case T_AST + T_USER: 271 case T_SYS_RTT_PAGE + T_USER: 272 case T_FLUSH_PCB + T_USER: 273 case T_FLUSHW + T_USER: 274 break; 275 276 default: 277 FTRACE_3("trap(): type=0x%lx, regs=0x%lx, addr=0x%lx", 278 (ulong_t)type, (ulong_t)rp, (ulong_t)addr); 279 break; 280 } 281 282 switch (type) { 283 284 default: 285 /* 286 * Check for user software trap. 287 */ 288 if (type & T_USER) { 289 if (tudebug) 290 showregs(type, rp, (caddr_t)0, 0); 291 if ((type & ~T_USER) >= T_SOFTWARE_TRAP) { 292 bzero(&siginfo, sizeof (siginfo)); 293 siginfo.si_signo = SIGILL; 294 siginfo.si_code = ILL_ILLTRP; 295 siginfo.si_addr = (caddr_t)rp->r_pc; 296 siginfo.si_trapno = type &~ T_USER; 297 fault = FLTILL; 298 break; 299 } 300 } 301 addr = (caddr_t)rp->r_pc; 302 (void) die(type, rp, addr, 0); 303 /*NOTREACHED*/ 304 305 case T_ALIGNMENT: /* supv alignment error */ 306 if (nfload(rp, NULL)) 307 goto cleanup; 308 309 if (curthread->t_lofault) { 310 if (lodebug) { 311 showregs(type, rp, addr, 0); 312 traceback((caddr_t)rp->r_sp); 313 } 314 rp->r_g1 = EFAULT; 315 rp->r_pc = curthread->t_lofault; 316 rp->r_npc = rp->r_pc + 4; 317 goto cleanup; 318 } 319 (void) die(type, rp, addr, 0); 320 /*NOTREACHED*/ 321 322 case T_INSTR_EXCEPTION: /* sys instruction access exception */ 323 addr = (caddr_t)rp->r_pc; 324 (void) die(type, rp, addr, mmu_fsr); 325 /*NOTREACHED*/ 326 327 case T_INSTR_MMU_MISS: /* sys instruction mmu miss */ 328 addr = (caddr_t)rp->r_pc; 329 (void) die(type, rp, addr, 0); 330 /*NOTREACHED*/ 331 332 case T_DATA_EXCEPTION: /* system data access exception */ 333 switch (X_FAULT_TYPE(mmu_fsr)) { 334 case FT_RANGE: 335 /* 336 * This happens when we attempt to dereference an 337 * address in the address hole. If t_ontrap is set, 338 * then break and fall through to T_DATA_MMU_MISS / 339 * T_DATA_PROT case below. If lofault is set, then 340 * honour it (perhaps the user gave us a bogus 341 * address in the hole to copyin from or copyout to?) 342 */ 343 344 if (curthread->t_ontrap != NULL) 345 break; 346 347 addr = (caddr_t)((uintptr_t)addr & TAGACC_VADDR_MASK); 348 if (curthread->t_lofault) { 349 if (lodebug) { 350 showregs(type, rp, addr, 0); 351 traceback((caddr_t)rp->r_sp); 352 } 353 rp->r_g1 = EFAULT; 354 rp->r_pc = curthread->t_lofault; 355 rp->r_npc = rp->r_pc + 4; 356 goto cleanup; 357 } 358 (void) die(type, rp, addr, mmu_fsr); 359 /*NOTREACHED*/ 360 361 case FT_PRIV: 362 /* 363 * This can happen if we access ASI_USER from a kernel 364 * thread. To support pxfs, we need to honor lofault if 365 * we're doing a copyin/copyout from a kernel thread. 366 */ 367 368 if (nfload(rp, NULL)) 369 goto cleanup; 370 addr = (caddr_t)((uintptr_t)addr & TAGACC_VADDR_MASK); 371 if (curthread->t_lofault) { 372 if (lodebug) { 373 showregs(type, rp, addr, 0); 374 traceback((caddr_t)rp->r_sp); 375 } 376 rp->r_g1 = EFAULT; 377 rp->r_pc = curthread->t_lofault; 378 rp->r_npc = rp->r_pc + 4; 379 goto cleanup; 380 } 381 (void) die(type, rp, addr, mmu_fsr); 382 /*NOTREACHED*/ 383 384 default: 385 if (nfload(rp, NULL)) 386 goto cleanup; 387 addr = (caddr_t)((uintptr_t)addr & TAGACC_VADDR_MASK); 388 (void) die(type, rp, addr, mmu_fsr); 389 /*NOTREACHED*/ 390 391 case FT_NFO: 392 break; 393 } 394 /* fall into ... */ 395 396 case T_DATA_MMU_MISS: /* system data mmu miss */ 397 case T_DATA_PROT: /* system data protection fault */ 398 if (nfload(rp, &instr)) 399 goto cleanup; 400 401 /* 402 * If we're under on_trap() protection (see <sys/ontrap.h>), 403 * set ot_trap and return from the trap to the trampoline. 404 */ 405 if (curthread->t_ontrap != NULL) { 406 on_trap_data_t *otp = curthread->t_ontrap; 407 408 TRACE_0(TR_FAC_TRAP, TR_C_TRAP_HANDLER_EXIT, 409 "C_trap_handler_exit"); 410 TRACE_0(TR_FAC_TRAP, TR_TRAP_END, "trap_end"); 411 412 if (otp->ot_prot & OT_DATA_ACCESS) { 413 otp->ot_trap |= OT_DATA_ACCESS; 414 rp->r_pc = otp->ot_trampoline; 415 rp->r_npc = rp->r_pc + 4; 416 goto cleanup; 417 } 418 } 419 lofault = curthread->t_lofault; 420 onfault = curthread->t_onfault; 421 curthread->t_lofault = 0; 422 423 mstate = new_mstate(curthread, LMS_KFAULT); 424 425 switch (type) { 426 case T_DATA_PROT: 427 fault_type = F_PROT; 428 rw = S_WRITE; 429 break; 430 case T_INSTR_MMU_MISS: 431 fault_type = F_INVAL; 432 rw = S_EXEC; 433 break; 434 case T_DATA_MMU_MISS: 435 case T_DATA_EXCEPTION: 436 /* 437 * The hardware doesn't update the sfsr on mmu 438 * misses so it is not easy to find out whether 439 * the access was a read or a write so we need 440 * to decode the actual instruction. 441 */ 442 fault_type = F_INVAL; 443 rw = get_accesstype(rp); 444 break; 445 default: 446 cmn_err(CE_PANIC, "trap: unknown type %x", type); 447 break; 448 } 449 /* 450 * We determine if access was done to kernel or user 451 * address space. The addr passed into trap is really the 452 * tag access register. 453 */ 454 iskernel = (((uintptr_t)addr & TAGACC_CTX_MASK) == KCONTEXT); 455 addr = (caddr_t)((uintptr_t)addr & TAGACC_VADDR_MASK); 456 457 res = pagefault(addr, fault_type, rw, iskernel); 458 if (!iskernel && res == FC_NOMAP && 459 addr < p->p_usrstack && grow(addr)) 460 res = 0; 461 462 (void) new_mstate(curthread, mstate); 463 464 /* 465 * Restore lofault and onfault. If we resolved the fault, exit. 466 * If we didn't and lofault wasn't set, die. 467 */ 468 curthread->t_lofault = lofault; 469 curthread->t_onfault = onfault; 470 471 if (res == 0) 472 goto cleanup; 473 474 if (IS_PREFETCH(instr)) { 475 /* skip prefetch instructions in kernel-land */ 476 rp->r_pc = rp->r_npc; 477 rp->r_npc += 4; 478 goto cleanup; 479 } 480 481 if ((lofault == 0 || lodebug) && 482 (calc_memaddr(rp, &badaddr) == SIMU_SUCCESS)) 483 addr = badaddr; 484 if (lofault == 0) 485 (void) die(type, rp, addr, 0); 486 /* 487 * Cannot resolve fault. Return to lofault. 488 */ 489 if (lodebug) { 490 showregs(type, rp, addr, 0); 491 traceback((caddr_t)rp->r_sp); 492 } 493 if (FC_CODE(res) == FC_OBJERR) 494 res = FC_ERRNO(res); 495 else 496 res = EFAULT; 497 rp->r_g1 = res; 498 rp->r_pc = curthread->t_lofault; 499 rp->r_npc = curthread->t_lofault + 4; 500 goto cleanup; 501 502 case T_INSTR_EXCEPTION + T_USER: /* user insn access exception */ 503 bzero(&siginfo, sizeof (siginfo)); 504 siginfo.si_addr = (caddr_t)rp->r_pc; 505 siginfo.si_signo = SIGSEGV; 506 siginfo.si_code = X_FAULT_TYPE(mmu_fsr) == FT_PRIV ? 507 SEGV_ACCERR : SEGV_MAPERR; 508 fault = FLTBOUNDS; 509 break; 510 511 case T_WIN_OVERFLOW + T_USER: /* window overflow in ??? */ 512 case T_WIN_UNDERFLOW + T_USER: /* window underflow in ??? */ 513 case T_SYS_RTT_PAGE + T_USER: /* window underflow in user_rtt */ 514 case T_INSTR_MMU_MISS + T_USER: /* user instruction mmu miss */ 515 case T_DATA_MMU_MISS + T_USER: /* user data mmu miss */ 516 case T_DATA_PROT + T_USER: /* user data protection fault */ 517 switch (type) { 518 case T_INSTR_MMU_MISS + T_USER: 519 addr = (caddr_t)rp->r_pc; 520 fault_type = F_INVAL; 521 rw = S_EXEC; 522 break; 523 524 case T_DATA_MMU_MISS + T_USER: 525 addr = (caddr_t)((uintptr_t)addr & TAGACC_VADDR_MASK); 526 fault_type = F_INVAL; 527 /* 528 * The hardware doesn't update the sfsr on mmu misses 529 * so it is not easy to find out whether the access 530 * was a read or a write so we need to decode the 531 * actual instruction. XXX BUGLY HW 532 */ 533 rw = get_accesstype(rp); 534 break; 535 536 case T_DATA_PROT + T_USER: 537 addr = (caddr_t)((uintptr_t)addr & TAGACC_VADDR_MASK); 538 fault_type = F_PROT; 539 rw = S_WRITE; 540 break; 541 542 case T_WIN_OVERFLOW + T_USER: 543 addr = (caddr_t)((uintptr_t)addr & TAGACC_VADDR_MASK); 544 fault_type = F_INVAL; 545 rw = S_WRITE; 546 break; 547 548 case T_WIN_UNDERFLOW + T_USER: 549 case T_SYS_RTT_PAGE + T_USER: 550 addr = (caddr_t)((uintptr_t)addr & TAGACC_VADDR_MASK); 551 fault_type = F_INVAL; 552 rw = S_READ; 553 break; 554 555 default: 556 cmn_err(CE_PANIC, "trap: unknown type %x", type); 557 break; 558 } 559 560 /* 561 * If we are single stepping do not call pagefault 562 */ 563 if (stepped) { 564 res = FC_NOMAP; 565 } else { 566 caddr_t vaddr = addr; 567 size_t sz; 568 int ta; 569 570 ASSERT(!(curthread->t_flag & T_WATCHPT)); 571 watchpage = (pr_watch_active(p) && 572 type != T_WIN_OVERFLOW + T_USER && 573 type != T_WIN_UNDERFLOW + T_USER && 574 type != T_SYS_RTT_PAGE + T_USER && 575 pr_is_watchpage(addr, rw)); 576 577 if (!watchpage || 578 (sz = instr_size(rp, &vaddr, rw)) <= 0) 579 /* EMPTY */; 580 else if ((watchcode = pr_is_watchpoint(&vaddr, &ta, 581 sz, NULL, rw)) != 0) { 582 if (ta) { 583 do_watch_step(vaddr, sz, rw, 584 watchcode, rp->r_pc); 585 fault_type = F_INVAL; 586 } else { 587 bzero(&siginfo, sizeof (siginfo)); 588 siginfo.si_signo = SIGTRAP; 589 siginfo.si_code = watchcode; 590 siginfo.si_addr = vaddr; 591 siginfo.si_trapafter = 0; 592 siginfo.si_pc = (caddr_t)rp->r_pc; 593 fault = FLTWATCH; 594 break; 595 } 596 } else { 597 if (rw != S_EXEC && 598 pr_watch_emul(rp, vaddr, rw)) 599 goto out; 600 do_watch_step(vaddr, sz, rw, 0, 0); 601 fault_type = F_INVAL; 602 } 603 604 if (pr_watch_active(p) && 605 (type == T_WIN_OVERFLOW + T_USER || 606 type == T_WIN_UNDERFLOW + T_USER || 607 type == T_SYS_RTT_PAGE + T_USER)) { 608 int dotwo = (type == T_WIN_UNDERFLOW + T_USER); 609 if (copy_return_window(dotwo)) 610 goto out; 611 fault_type = F_INVAL; 612 } 613 614 res = pagefault(addr, fault_type, rw, 0); 615 616 /* 617 * If pagefault succeed, ok. 618 * Otherwise grow the stack automatically. 619 */ 620 if (res == 0 || 621 (res == FC_NOMAP && 622 type != T_INSTR_MMU_MISS + T_USER && 623 addr < p->p_usrstack && 624 grow(addr))) { 625 int ismem = prismember(&p->p_fltmask, FLTPAGE); 626 627 /* 628 * instr_size() is used to get the exact 629 * address of the fault, instead of the 630 * page of the fault. Unfortunately it is 631 * very slow, and this is an important 632 * code path. Don't call it unless 633 * correctness is needed. ie. if FLTPAGE 634 * is set, or we're profiling. 635 */ 636 637 if (curthread->t_rprof != NULL || ismem) 638 (void) instr_size(rp, &addr, rw); 639 640 lwp->lwp_lastfault = FLTPAGE; 641 lwp->lwp_lastfaddr = addr; 642 643 if (ismem) { 644 bzero(&siginfo, sizeof (siginfo)); 645 siginfo.si_addr = addr; 646 (void) stop_on_fault(FLTPAGE, &siginfo); 647 } 648 goto out; 649 } 650 651 if (type != (T_INSTR_MMU_MISS + T_USER)) { 652 /* 653 * check for non-faulting loads, also 654 * fetch the instruction to check for 655 * flush 656 */ 657 if (nfload(rp, &instr)) 658 goto out; 659 660 /* skip userland prefetch instructions */ 661 if (IS_PREFETCH(instr)) { 662 rp->r_pc = rp->r_npc; 663 rp->r_npc += 4; 664 goto out; 665 /*NOTREACHED*/ 666 } 667 668 /* 669 * check if the instruction was a 670 * flush. ABI allows users to specify 671 * an illegal address on the flush 672 * instruction so we simply return in 673 * this case. 674 * 675 * NB: the hardware should set a bit 676 * indicating this trap was caused by 677 * a flush instruction. Instruction 678 * decoding is bugly! 679 */ 680 if (IS_FLUSH(instr)) { 681 /* skip the flush instruction */ 682 rp->r_pc = rp->r_npc; 683 rp->r_npc += 4; 684 goto out; 685 /*NOTREACHED*/ 686 } 687 } else if (res == FC_PROT) { 688 report_stack_exec(p, addr); 689 } 690 691 if (tudebug) 692 showregs(type, rp, addr, 0); 693 } 694 695 /* 696 * In the case where both pagefault and grow fail, 697 * set the code to the value provided by pagefault. 698 */ 699 (void) instr_size(rp, &addr, rw); 700 bzero(&siginfo, sizeof (siginfo)); 701 siginfo.si_addr = addr; 702 if (FC_CODE(res) == FC_OBJERR) { 703 siginfo.si_errno = FC_ERRNO(res); 704 if (siginfo.si_errno != EINTR) { 705 siginfo.si_signo = SIGBUS; 706 siginfo.si_code = BUS_OBJERR; 707 fault = FLTACCESS; 708 } 709 } else { /* FC_NOMAP || FC_PROT */ 710 siginfo.si_signo = SIGSEGV; 711 siginfo.si_code = (res == FC_NOMAP) ? 712 SEGV_MAPERR : SEGV_ACCERR; 713 fault = FLTBOUNDS; 714 } 715 /* 716 * If this is the culmination of a single-step, 717 * reset the addr, code, signal and fault to 718 * indicate a hardware trace trap. 719 */ 720 if (stepped) { 721 pcb_t *pcb = &lwp->lwp_pcb; 722 723 siginfo.si_signo = 0; 724 fault = 0; 725 if (pcb->pcb_step == STEP_WASACTIVE) { 726 pcb->pcb_step = STEP_NONE; 727 pcb->pcb_tracepc = NULL; 728 oldpc = rp->r_pc - 4; 729 } 730 /* 731 * If both NORMAL_STEP and WATCH_STEP are in 732 * effect, give precedence to WATCH_STEP. 733 * One or the other must be set at this point. 734 */ 735 ASSERT(pcb->pcb_flags & (NORMAL_STEP|WATCH_STEP)); 736 if ((fault = undo_watch_step(&siginfo)) == 0 && 737 (pcb->pcb_flags & NORMAL_STEP)) { 738 siginfo.si_signo = SIGTRAP; 739 siginfo.si_code = TRAP_TRACE; 740 siginfo.si_addr = (caddr_t)rp->r_pc; 741 fault = FLTTRACE; 742 } 743 pcb->pcb_flags &= ~(NORMAL_STEP|WATCH_STEP); 744 } 745 break; 746 747 case T_DATA_EXCEPTION + T_USER: /* user data access exception */ 748 749 if (&vis1_partial_support != NULL) { 750 bzero(&siginfo, sizeof (siginfo)); 751 if (vis1_partial_support(rp, 752 &siginfo, &fault) == 0) 753 goto out; 754 } 755 756 if (nfload(rp, &instr)) 757 goto out; 758 if (IS_FLUSH(instr)) { 759 /* skip the flush instruction */ 760 rp->r_pc = rp->r_npc; 761 rp->r_npc += 4; 762 goto out; 763 /*NOTREACHED*/ 764 } 765 bzero(&siginfo, sizeof (siginfo)); 766 siginfo.si_addr = addr; 767 switch (X_FAULT_TYPE(mmu_fsr)) { 768 case FT_ATOMIC_NC: 769 if ((IS_SWAP(instr) && swap_nc(rp, instr)) || 770 (IS_LDSTUB(instr) && ldstub_nc(rp, instr))) { 771 /* skip the atomic */ 772 rp->r_pc = rp->r_npc; 773 rp->r_npc += 4; 774 goto out; 775 } 776 /* FALLTHROUGH */ 777 case FT_PRIV: 778 siginfo.si_signo = SIGSEGV; 779 siginfo.si_code = SEGV_ACCERR; 780 fault = FLTBOUNDS; 781 break; 782 case FT_SPEC_LD: 783 case FT_ILL_ALT: 784 siginfo.si_signo = SIGILL; 785 siginfo.si_code = ILL_ILLADR; 786 fault = FLTILL; 787 break; 788 default: 789 siginfo.si_signo = SIGSEGV; 790 siginfo.si_code = SEGV_MAPERR; 791 fault = FLTBOUNDS; 792 break; 793 } 794 break; 795 796 case T_SYS_RTT_ALIGN + T_USER: /* user alignment error */ 797 case T_ALIGNMENT + T_USER: /* user alignment error */ 798 if (tudebug) 799 showregs(type, rp, addr, 0); 800 /* 801 * If the user has to do unaligned references 802 * the ugly stuff gets done here. 803 */ 804 alignfaults++; 805 if (&vis1_partial_support != NULL) { 806 bzero(&siginfo, sizeof (siginfo)); 807 if (vis1_partial_support(rp, 808 &siginfo, &fault) == 0) 809 goto out; 810 } 811 812 bzero(&siginfo, sizeof (siginfo)); 813 if (type == T_SYS_RTT_ALIGN + T_USER) { 814 if (nfload(rp, NULL)) 815 goto out; 816 /* 817 * Can't do unaligned stack access 818 */ 819 siginfo.si_signo = SIGBUS; 820 siginfo.si_code = BUS_ADRALN; 821 siginfo.si_addr = addr; 822 fault = FLTACCESS; 823 break; 824 } 825 826 /* 827 * Try to fix alignment before non-faulting load test. 828 */ 829 if (p->p_fixalignment) { 830 if (do_unaligned(rp, &badaddr) == SIMU_SUCCESS) { 831 rp->r_pc = rp->r_npc; 832 rp->r_npc += 4; 833 goto out; 834 } 835 if (nfload(rp, NULL)) 836 goto out; 837 siginfo.si_signo = SIGSEGV; 838 siginfo.si_code = SEGV_MAPERR; 839 siginfo.si_addr = badaddr; 840 fault = FLTBOUNDS; 841 } else { 842 if (nfload(rp, NULL)) 843 goto out; 844 siginfo.si_signo = SIGBUS; 845 siginfo.si_code = BUS_ADRALN; 846 if (rp->r_pc & 3) { /* offending address, if pc */ 847 siginfo.si_addr = (caddr_t)rp->r_pc; 848 } else { 849 if (calc_memaddr(rp, &badaddr) == SIMU_UNALIGN) 850 siginfo.si_addr = badaddr; 851 else 852 siginfo.si_addr = (caddr_t)rp->r_pc; 853 } 854 fault = FLTACCESS; 855 } 856 break; 857 858 case T_PRIV_INSTR + T_USER: /* privileged instruction fault */ 859 if (tudebug) 860 showregs(type, rp, (caddr_t)0, 0); 861 862 bzero(&siginfo, sizeof (siginfo)); 863 #ifdef sun4v 864 /* 865 * If this instruction fault is a non-privileged %tick 866 * or %stick trap, and %tick/%stick user emulation is 867 * enabled as a result of an OS suspend, then simulate 868 * the register read. We rely on simulate_rdtick to fail 869 * if the instruction is not a %tick or %stick read, 870 * causing us to fall through to the normal privileged 871 * instruction handling. 872 */ 873 if (tick_stick_emulation_active && 874 (X_FAULT_TYPE(mmu_fsr) == FT_NEW_PRVACT) && 875 simulate_rdtick(rp) == SIMU_SUCCESS) { 876 /* skip the successfully simulated instruction */ 877 rp->r_pc = rp->r_npc; 878 rp->r_npc += 4; 879 goto out; 880 } 881 #endif 882 siginfo.si_signo = SIGILL; 883 siginfo.si_code = ILL_PRVOPC; 884 siginfo.si_addr = (caddr_t)rp->r_pc; 885 fault = FLTILL; 886 break; 887 888 case T_UNIMP_INSTR: /* priv illegal instruction fault */ 889 if (fpras_implemented) { 890 /* 891 * Call fpras_chktrap indicating that 892 * we've come from a trap handler and pass 893 * the regs. That function may choose to panic 894 * (in which case it won't return) or it may 895 * determine that a reboot is desired. In the 896 * latter case it must alter pc/npc to skip 897 * the illegal instruction and continue at 898 * a controlled address. 899 */ 900 if (&fpras_chktrap) { 901 if (fpras_chktrap(rp)) 902 goto cleanup; 903 } 904 } 905 #if defined(SF_ERRATA_23) || defined(SF_ERRATA_30) /* call ... illegal-insn */ 906 instr = *(int *)rp->r_pc; 907 if ((instr & 0xc0000000) == 0x40000000) { 908 long pc; 909 910 rp->r_o7 = (long long)rp->r_pc; 911 pc = rp->r_pc + ((instr & 0x3fffffff) << 2); 912 rp->r_pc = rp->r_npc; 913 rp->r_npc = pc; 914 ill_calls++; 915 goto cleanup; 916 } 917 #endif /* SF_ERRATA_23 || SF_ERRATA_30 */ 918 /* 919 * It's not an fpras failure and it's not SF_ERRATA_23 - die 920 */ 921 addr = (caddr_t)rp->r_pc; 922 (void) die(type, rp, addr, 0); 923 /*NOTREACHED*/ 924 925 case T_UNIMP_INSTR + T_USER: /* illegal instruction fault */ 926 #if defined(SF_ERRATA_23) || defined(SF_ERRATA_30) /* call ... illegal-insn */ 927 instr = fetch_user_instr((caddr_t)rp->r_pc); 928 if ((instr & 0xc0000000) == 0x40000000) { 929 long pc; 930 931 rp->r_o7 = (long long)rp->r_pc; 932 pc = rp->r_pc + ((instr & 0x3fffffff) << 2); 933 rp->r_pc = rp->r_npc; 934 rp->r_npc = pc; 935 ill_calls++; 936 goto out; 937 } 938 #endif /* SF_ERRATA_23 || SF_ERRATA_30 */ 939 if (tudebug) 940 showregs(type, rp, (caddr_t)0, 0); 941 bzero(&siginfo, sizeof (siginfo)); 942 /* 943 * Try to simulate the instruction. 944 */ 945 switch (simulate_unimp(rp, &badaddr)) { 946 case SIMU_RETRY: 947 goto out; /* regs are already set up */ 948 /*NOTREACHED*/ 949 950 case SIMU_SUCCESS: 951 /* skip the successfully simulated instruction */ 952 rp->r_pc = rp->r_npc; 953 rp->r_npc += 4; 954 goto out; 955 /*NOTREACHED*/ 956 957 case SIMU_FAULT: 958 siginfo.si_signo = SIGSEGV; 959 siginfo.si_code = SEGV_MAPERR; 960 siginfo.si_addr = badaddr; 961 fault = FLTBOUNDS; 962 break; 963 964 case SIMU_DZERO: 965 siginfo.si_signo = SIGFPE; 966 siginfo.si_code = FPE_INTDIV; 967 siginfo.si_addr = (caddr_t)rp->r_pc; 968 fault = FLTIZDIV; 969 break; 970 971 case SIMU_UNALIGN: 972 siginfo.si_signo = SIGBUS; 973 siginfo.si_code = BUS_ADRALN; 974 siginfo.si_addr = badaddr; 975 fault = FLTACCESS; 976 break; 977 978 case SIMU_ILLEGAL: 979 default: 980 siginfo.si_signo = SIGILL; 981 op3 = (instr >> 19) & 0x3F; 982 if ((IS_FLOAT(instr) && (op3 == IOP_V8_STQFA) || 983 (op3 == IOP_V8_STDFA))) 984 siginfo.si_code = ILL_ILLADR; 985 else 986 siginfo.si_code = ILL_ILLOPC; 987 siginfo.si_addr = (caddr_t)rp->r_pc; 988 fault = FLTILL; 989 break; 990 } 991 break; 992 993 case T_UNIMP_LDD + T_USER: 994 case T_UNIMP_STD + T_USER: 995 if (tudebug) 996 showregs(type, rp, (caddr_t)0, 0); 997 switch (simulate_lddstd(rp, &badaddr)) { 998 case SIMU_SUCCESS: 999 /* skip the successfully simulated instruction */ 1000 rp->r_pc = rp->r_npc; 1001 rp->r_npc += 4; 1002 goto out; 1003 /*NOTREACHED*/ 1004 1005 case SIMU_FAULT: 1006 if (nfload(rp, NULL)) 1007 goto out; 1008 siginfo.si_signo = SIGSEGV; 1009 siginfo.si_code = SEGV_MAPERR; 1010 siginfo.si_addr = badaddr; 1011 fault = FLTBOUNDS; 1012 break; 1013 1014 case SIMU_UNALIGN: 1015 if (nfload(rp, NULL)) 1016 goto out; 1017 siginfo.si_signo = SIGBUS; 1018 siginfo.si_code = BUS_ADRALN; 1019 siginfo.si_addr = badaddr; 1020 fault = FLTACCESS; 1021 break; 1022 1023 case SIMU_ILLEGAL: 1024 default: 1025 siginfo.si_signo = SIGILL; 1026 siginfo.si_code = ILL_ILLOPC; 1027 siginfo.si_addr = (caddr_t)rp->r_pc; 1028 fault = FLTILL; 1029 break; 1030 } 1031 break; 1032 1033 case T_UNIMP_LDD: 1034 case T_UNIMP_STD: 1035 if (simulate_lddstd(rp, &badaddr) == SIMU_SUCCESS) { 1036 /* skip the successfully simulated instruction */ 1037 rp->r_pc = rp->r_npc; 1038 rp->r_npc += 4; 1039 goto cleanup; 1040 /*NOTREACHED*/ 1041 } 1042 /* 1043 * A third party driver executed an {LDD,STD,LDDA,STDA} 1044 * that we couldn't simulate. 1045 */ 1046 if (nfload(rp, NULL)) 1047 goto cleanup; 1048 1049 if (curthread->t_lofault) { 1050 if (lodebug) { 1051 showregs(type, rp, addr, 0); 1052 traceback((caddr_t)rp->r_sp); 1053 } 1054 rp->r_g1 = EFAULT; 1055 rp->r_pc = curthread->t_lofault; 1056 rp->r_npc = rp->r_pc + 4; 1057 goto cleanup; 1058 } 1059 (void) die(type, rp, addr, 0); 1060 /*NOTREACHED*/ 1061 1062 case T_IDIV0 + T_USER: /* integer divide by zero */ 1063 case T_DIV0 + T_USER: /* integer divide by zero */ 1064 if (tudebug && tudebugfpe) 1065 showregs(type, rp, (caddr_t)0, 0); 1066 bzero(&siginfo, sizeof (siginfo)); 1067 siginfo.si_signo = SIGFPE; 1068 siginfo.si_code = FPE_INTDIV; 1069 siginfo.si_addr = (caddr_t)rp->r_pc; 1070 fault = FLTIZDIV; 1071 break; 1072 1073 case T_INT_OVERFLOW + T_USER: /* integer overflow */ 1074 if (tudebug && tudebugfpe) 1075 showregs(type, rp, (caddr_t)0, 0); 1076 bzero(&siginfo, sizeof (siginfo)); 1077 siginfo.si_signo = SIGFPE; 1078 siginfo.si_code = FPE_INTOVF; 1079 siginfo.si_addr = (caddr_t)rp->r_pc; 1080 fault = FLTIOVF; 1081 break; 1082 1083 case T_BREAKPOINT + T_USER: /* breakpoint trap (t 1) */ 1084 if (tudebug && tudebugbpt) 1085 showregs(type, rp, (caddr_t)0, 0); 1086 bzero(&siginfo, sizeof (siginfo)); 1087 siginfo.si_signo = SIGTRAP; 1088 siginfo.si_code = TRAP_BRKPT; 1089 siginfo.si_addr = (caddr_t)rp->r_pc; 1090 fault = FLTBPT; 1091 break; 1092 1093 case T_TAG_OVERFLOW + T_USER: /* tag overflow (taddcctv, tsubcctv) */ 1094 if (tudebug) 1095 showregs(type, rp, (caddr_t)0, 0); 1096 bzero(&siginfo, sizeof (siginfo)); 1097 siginfo.si_signo = SIGEMT; 1098 siginfo.si_code = EMT_TAGOVF; 1099 siginfo.si_addr = (caddr_t)rp->r_pc; 1100 fault = FLTACCESS; 1101 break; 1102 1103 case T_FLUSH_PCB + T_USER: /* finish user window overflow */ 1104 case T_FLUSHW + T_USER: /* finish user window flush */ 1105 /* 1106 * This trap is entered from sys_rtt in locore.s when, 1107 * upon return to user is is found that there are user 1108 * windows in pcb_wbuf. This happens because they could 1109 * not be saved on the user stack, either because it 1110 * wasn't resident or because it was misaligned. 1111 */ 1112 { 1113 int error; 1114 caddr_t sp; 1115 1116 error = flush_user_windows_to_stack(&sp); 1117 /* 1118 * Possible errors: 1119 * error copying out 1120 * unaligned stack pointer 1121 * The first is given to us as the return value 1122 * from flush_user_windows_to_stack(). The second 1123 * results in residual windows in the pcb. 1124 */ 1125 if (error != 0) { 1126 /* 1127 * EINTR comes from a signal during copyout; 1128 * we should not post another signal. 1129 */ 1130 if (error != EINTR) { 1131 /* 1132 * Zap the process with a SIGSEGV - process 1133 * may be managing its own stack growth by 1134 * taking SIGSEGVs on a different signal stack. 1135 */ 1136 bzero(&siginfo, sizeof (siginfo)); 1137 siginfo.si_signo = SIGSEGV; 1138 siginfo.si_code = SEGV_MAPERR; 1139 siginfo.si_addr = sp; 1140 fault = FLTBOUNDS; 1141 } 1142 break; 1143 } else if (mpcb->mpcb_wbcnt) { 1144 bzero(&siginfo, sizeof (siginfo)); 1145 siginfo.si_signo = SIGILL; 1146 siginfo.si_code = ILL_BADSTK; 1147 siginfo.si_addr = (caddr_t)rp->r_pc; 1148 fault = FLTILL; 1149 break; 1150 } 1151 } 1152 1153 /* 1154 * T_FLUSHW is used when handling a ta 0x3 -- the old flush 1155 * window trap -- which is implemented by executing the 1156 * flushw instruction. The flushw can trap if any of the 1157 * stack pages are not writable for whatever reason. In this 1158 * case only, we advance the pc to the next instruction so 1159 * that the user thread doesn't needlessly execute the trap 1160 * again. Normally this wouldn't be a problem -- we'll 1161 * usually only end up here if this is the first touch to a 1162 * stack page -- since the second execution won't trap, but 1163 * if there's a watchpoint on the stack page the user thread 1164 * would spin, continuously executing the trap instruction. 1165 */ 1166 if (type == T_FLUSHW + T_USER) { 1167 rp->r_pc = rp->r_npc; 1168 rp->r_npc += 4; 1169 } 1170 goto out; 1171 1172 case T_AST + T_USER: /* profiling or resched pseudo trap */ 1173 if (lwp->lwp_pcb.pcb_flags & CPC_OVERFLOW) { 1174 lwp->lwp_pcb.pcb_flags &= ~CPC_OVERFLOW; 1175 if (kcpc_overflow_ast()) { 1176 /* 1177 * Signal performance counter overflow 1178 */ 1179 if (tudebug) 1180 showregs(type, rp, (caddr_t)0, 0); 1181 bzero(&siginfo, sizeof (siginfo)); 1182 siginfo.si_signo = SIGEMT; 1183 siginfo.si_code = EMT_CPCOVF; 1184 siginfo.si_addr = (caddr_t)rp->r_pc; 1185 /* for trap_cleanup(), below */ 1186 oldpc = rp->r_pc - 4; 1187 fault = FLTCPCOVF; 1188 } 1189 } 1190 1191 /* 1192 * The CPC_OVERFLOW check above may already have populated 1193 * siginfo and set fault, so the checks below must not 1194 * touch these and the functions they call must use 1195 * trapsig() directly. 1196 */ 1197 1198 if (lwp->lwp_pcb.pcb_flags & ASYNC_HWERR) { 1199 lwp->lwp_pcb.pcb_flags &= ~ASYNC_HWERR; 1200 trap_async_hwerr(); 1201 } 1202 1203 if (lwp->lwp_pcb.pcb_flags & ASYNC_BERR) { 1204 lwp->lwp_pcb.pcb_flags &= ~ASYNC_BERR; 1205 trap_async_berr_bto(ASYNC_BERR, rp); 1206 } 1207 1208 if (lwp->lwp_pcb.pcb_flags & ASYNC_BTO) { 1209 lwp->lwp_pcb.pcb_flags &= ~ASYNC_BTO; 1210 trap_async_berr_bto(ASYNC_BTO, rp); 1211 } 1212 1213 break; 1214 } 1215 1216 if (fault) { 1217 /* We took a fault so abort single step. */ 1218 lwp->lwp_pcb.pcb_flags &= ~(NORMAL_STEP|WATCH_STEP); 1219 } 1220 trap_cleanup(rp, fault, &siginfo, oldpc == rp->r_pc); 1221 1222 out: /* We can't get here from a system trap */ 1223 ASSERT(type & T_USER); 1224 trap_rtt(); 1225 (void) new_mstate(curthread, mstate); 1226 /* Kernel probe */ 1227 TNF_PROBE_1(thread_state, "thread", /* CSTYLED */, 1228 tnf_microstate, state, LMS_USER); 1229 1230 TRACE_0(TR_FAC_TRAP, TR_C_TRAP_HANDLER_EXIT, "C_trap_handler_exit"); 1231 return; 1232 1233 cleanup: /* system traps end up here */ 1234 ASSERT(!(type & T_USER)); 1235 1236 TRACE_0(TR_FAC_TRAP, TR_C_TRAP_HANDLER_EXIT, "C_trap_handler_exit"); 1237 } 1238 1239 void 1240 trap_cleanup( 1241 struct regs *rp, 1242 uint_t fault, 1243 k_siginfo_t *sip, 1244 int restartable) 1245 { 1246 extern void aio_cleanup(); 1247 proc_t *p = ttoproc(curthread); 1248 klwp_id_t lwp = ttolwp(curthread); 1249 1250 if (fault) { 1251 /* 1252 * Remember the fault and fault address 1253 * for real-time (SIGPROF) profiling. 1254 */ 1255 lwp->lwp_lastfault = fault; 1256 lwp->lwp_lastfaddr = sip->si_addr; 1257 1258 DTRACE_PROC2(fault, int, fault, ksiginfo_t *, sip); 1259 1260 /* 1261 * If a debugger has declared this fault to be an 1262 * event of interest, stop the lwp. Otherwise just 1263 * deliver the associated signal. 1264 */ 1265 if (sip->si_signo != SIGKILL && 1266 prismember(&p->p_fltmask, fault) && 1267 stop_on_fault(fault, sip) == 0) 1268 sip->si_signo = 0; 1269 } 1270 1271 if (sip->si_signo) 1272 trapsig(sip, restartable); 1273 1274 if (lwp->lwp_oweupc) 1275 profil_tick(rp->r_pc); 1276 1277 if (curthread->t_astflag | curthread->t_sig_check) { 1278 /* 1279 * Turn off the AST flag before checking all the conditions that 1280 * may have caused an AST. This flag is on whenever a signal or 1281 * unusual condition should be handled after the next trap or 1282 * syscall. 1283 */ 1284 astoff(curthread); 1285 curthread->t_sig_check = 0; 1286 1287 /* 1288 * The following check is legal for the following reasons: 1289 * 1) The thread we are checking, is ourselves, so there is 1290 * no way the proc can go away. 1291 * 2) The only time we need to be protected by the 1292 * lock is if the binding is changed. 1293 * 1294 * Note we will still take the lock and check the binding 1295 * if the condition was true without the lock held. This 1296 * prevents lock contention among threads owned by the 1297 * same proc. 1298 */ 1299 1300 if (curthread->t_proc_flag & TP_CHANGEBIND) { 1301 mutex_enter(&p->p_lock); 1302 if (curthread->t_proc_flag & TP_CHANGEBIND) { 1303 timer_lwpbind(); 1304 curthread->t_proc_flag &= ~TP_CHANGEBIND; 1305 } 1306 mutex_exit(&p->p_lock); 1307 } 1308 1309 /* 1310 * for kaio requests that are on the per-process poll queue, 1311 * aiop->aio_pollq, they're AIO_POLL bit is set, the kernel 1312 * should copyout their result_t to user memory. by copying 1313 * out the result_t, the user can poll on memory waiting 1314 * for the kaio request to complete. 1315 */ 1316 if (p->p_aio) 1317 aio_cleanup(0); 1318 1319 /* 1320 * If this LWP was asked to hold, call holdlwp(), which will 1321 * stop. holdlwps() sets this up and calls pokelwps() which 1322 * sets the AST flag. 1323 * 1324 * Also check TP_EXITLWP, since this is used by fresh new LWPs 1325 * through lwp_rtt(). That flag is set if the lwp_create(2) 1326 * syscall failed after creating the LWP. 1327 */ 1328 if (ISHOLD(p)) 1329 holdlwp(); 1330 1331 /* 1332 * All code that sets signals and makes ISSIG evaluate true must 1333 * set t_astflag afterwards. 1334 */ 1335 if (ISSIG_PENDING(curthread, lwp, p)) { 1336 if (issig(FORREAL)) 1337 psig(); 1338 curthread->t_sig_check = 1; 1339 } 1340 1341 if (curthread->t_rprof != NULL) { 1342 realsigprof(0, 0, 0); 1343 curthread->t_sig_check = 1; 1344 } 1345 } 1346 } 1347 1348 /* 1349 * Called from fp_traps when a floating point trap occurs. 1350 * Note that the T_DATA_EXCEPTION case does not use X_FAULT_TYPE(mmu_fsr), 1351 * because mmu_fsr (now changed to code) is always 0. 1352 * Note that the T_UNIMP_INSTR case does not call simulate_unimp(), 1353 * because the simulator only simulates multiply and divide instructions, 1354 * which would not cause floating point traps in the first place. 1355 * XXX - Supervisor mode floating point traps? 1356 */ 1357 void 1358 fpu_trap(struct regs *rp, caddr_t addr, uint32_t type, uint32_t code) 1359 { 1360 proc_t *p = ttoproc(curthread); 1361 klwp_id_t lwp = ttolwp(curthread); 1362 k_siginfo_t siginfo; 1363 uint_t op3, fault = 0; 1364 int mstate; 1365 char *badaddr; 1366 kfpu_t *fp; 1367 struct _fpq *pfpq; 1368 uint32_t inst; 1369 utrap_handler_t *utrapp; 1370 1371 CPU_STATS_ADDQ(CPU, sys, trap, 1); 1372 1373 ASSERT(curthread->t_schedflag & TS_DONT_SWAP); 1374 1375 if (USERMODE(rp->r_tstate)) { 1376 /* 1377 * Set lwp_state before trying to acquire any 1378 * adaptive lock 1379 */ 1380 ASSERT(lwp != NULL); 1381 lwp->lwp_state = LWP_SYS; 1382 /* 1383 * Set up the current cred to use during this trap. u_cred 1384 * no longer exists. t_cred is used instead. 1385 * The current process credential applies to the thread for 1386 * the entire trap. If trapping from the kernel, this 1387 * should already be set up. 1388 */ 1389 if (curthread->t_cred != p->p_cred) { 1390 cred_t *oldcred = curthread->t_cred; 1391 /* 1392 * DTrace accesses t_cred in probe context. t_cred 1393 * must always be either NULL, or point to a valid, 1394 * allocated cred structure. 1395 */ 1396 curthread->t_cred = crgetcred(); 1397 crfree(oldcred); 1398 } 1399 ASSERT(lwp->lwp_regs == rp); 1400 mstate = new_mstate(curthread, LMS_TRAP); 1401 siginfo.si_signo = 0; 1402 type |= T_USER; 1403 } 1404 1405 TRACE_1(TR_FAC_TRAP, TR_C_TRAP_HANDLER_ENTER, 1406 "C_fpu_trap_handler_enter:type %x", type); 1407 1408 if (tudebug && tudebugfpe) 1409 showregs(type, rp, addr, 0); 1410 1411 bzero(&siginfo, sizeof (siginfo)); 1412 siginfo.si_code = code; 1413 siginfo.si_addr = addr; 1414 1415 switch (type) { 1416 1417 case T_FP_EXCEPTION_IEEE + T_USER: /* FPU arithmetic exception */ 1418 /* 1419 * FPU arithmetic exception - fake up a fpq if we 1420 * came here directly from _fp_ieee_exception, 1421 * which is indicated by a zero fpu_qcnt. 1422 */ 1423 fp = lwptofpu(curthread->t_lwp); 1424 utrapp = curthread->t_procp->p_utraps; 1425 if (fp->fpu_qcnt == 0) { 1426 inst = fetch_user_instr((caddr_t)rp->r_pc); 1427 lwp->lwp_state = LWP_SYS; 1428 pfpq = &fp->fpu_q->FQu.fpq; 1429 pfpq->fpq_addr = (uint32_t *)rp->r_pc; 1430 pfpq->fpq_instr = inst; 1431 fp->fpu_qcnt = 1; 1432 fp->fpu_q_entrysize = sizeof (struct _fpq); 1433 #ifdef SF_V9_TABLE_28 1434 /* 1435 * Spitfire and blackbird followed the SPARC V9 manual 1436 * paragraph 3 of section 5.1.7.9 FSR_current_exception 1437 * (cexc) for setting fsr.cexc bits on underflow and 1438 * overflow traps when the fsr.tem.inexact bit is set, 1439 * instead of following Table 28. Bugid 1263234. 1440 */ 1441 { 1442 extern int spitfire_bb_fsr_bug; 1443 1444 if (spitfire_bb_fsr_bug && 1445 (fp->fpu_fsr & FSR_TEM_NX)) { 1446 if (((fp->fpu_fsr & FSR_TEM_OF) == 0) && 1447 (fp->fpu_fsr & FSR_CEXC_OF)) { 1448 fp->fpu_fsr &= ~FSR_CEXC_OF; 1449 fp->fpu_fsr |= FSR_CEXC_NX; 1450 _fp_write_pfsr(&fp->fpu_fsr); 1451 siginfo.si_code = FPE_FLTRES; 1452 } 1453 if (((fp->fpu_fsr & FSR_TEM_UF) == 0) && 1454 (fp->fpu_fsr & FSR_CEXC_UF)) { 1455 fp->fpu_fsr &= ~FSR_CEXC_UF; 1456 fp->fpu_fsr |= FSR_CEXC_NX; 1457 _fp_write_pfsr(&fp->fpu_fsr); 1458 siginfo.si_code = FPE_FLTRES; 1459 } 1460 } 1461 } 1462 #endif /* SF_V9_TABLE_28 */ 1463 rp->r_pc = rp->r_npc; 1464 rp->r_npc += 4; 1465 } else if (utrapp && utrapp[UT_FP_EXCEPTION_IEEE_754]) { 1466 /* 1467 * The user had a trap handler installed. Jump to 1468 * the trap handler instead of signalling the process. 1469 */ 1470 rp->r_pc = (long)utrapp[UT_FP_EXCEPTION_IEEE_754]; 1471 rp->r_npc = rp->r_pc + 4; 1472 break; 1473 } 1474 siginfo.si_signo = SIGFPE; 1475 fault = FLTFPE; 1476 break; 1477 1478 case T_DATA_EXCEPTION + T_USER: /* user data access exception */ 1479 siginfo.si_signo = SIGSEGV; 1480 fault = FLTBOUNDS; 1481 break; 1482 1483 case T_LDDF_ALIGN + T_USER: /* 64 bit user lddfa alignment error */ 1484 case T_STDF_ALIGN + T_USER: /* 64 bit user stdfa alignment error */ 1485 alignfaults++; 1486 lwp->lwp_state = LWP_SYS; 1487 if (&vis1_partial_support != NULL) { 1488 bzero(&siginfo, sizeof (siginfo)); 1489 if (vis1_partial_support(rp, 1490 &siginfo, &fault) == 0) 1491 goto out; 1492 } 1493 if (do_unaligned(rp, &badaddr) == SIMU_SUCCESS) { 1494 rp->r_pc = rp->r_npc; 1495 rp->r_npc += 4; 1496 goto out; 1497 } 1498 fp = lwptofpu(curthread->t_lwp); 1499 fp->fpu_qcnt = 0; 1500 siginfo.si_signo = SIGSEGV; 1501 siginfo.si_code = SEGV_MAPERR; 1502 siginfo.si_addr = badaddr; 1503 fault = FLTBOUNDS; 1504 break; 1505 1506 case T_ALIGNMENT + T_USER: /* user alignment error */ 1507 /* 1508 * If the user has to do unaligned references 1509 * the ugly stuff gets done here. 1510 * Only handles vanilla loads and stores. 1511 */ 1512 alignfaults++; 1513 if (p->p_fixalignment) { 1514 if (do_unaligned(rp, &badaddr) == SIMU_SUCCESS) { 1515 rp->r_pc = rp->r_npc; 1516 rp->r_npc += 4; 1517 goto out; 1518 } 1519 siginfo.si_signo = SIGSEGV; 1520 siginfo.si_code = SEGV_MAPERR; 1521 siginfo.si_addr = badaddr; 1522 fault = FLTBOUNDS; 1523 } else { 1524 siginfo.si_signo = SIGBUS; 1525 siginfo.si_code = BUS_ADRALN; 1526 if (rp->r_pc & 3) { /* offending address, if pc */ 1527 siginfo.si_addr = (caddr_t)rp->r_pc; 1528 } else { 1529 if (calc_memaddr(rp, &badaddr) == SIMU_UNALIGN) 1530 siginfo.si_addr = badaddr; 1531 else 1532 siginfo.si_addr = (caddr_t)rp->r_pc; 1533 } 1534 fault = FLTACCESS; 1535 } 1536 break; 1537 1538 case T_UNIMP_INSTR + T_USER: /* illegal instruction fault */ 1539 siginfo.si_signo = SIGILL; 1540 inst = fetch_user_instr((caddr_t)rp->r_pc); 1541 op3 = (inst >> 19) & 0x3F; 1542 if ((op3 == IOP_V8_STQFA) || (op3 == IOP_V8_STDFA)) 1543 siginfo.si_code = ILL_ILLADR; 1544 else 1545 siginfo.si_code = ILL_ILLTRP; 1546 fault = FLTILL; 1547 break; 1548 1549 default: 1550 (void) die(type, rp, addr, 0); 1551 /*NOTREACHED*/ 1552 } 1553 1554 /* 1555 * We can't get here from a system trap 1556 * Never restart any instruction which got here from an fp trap. 1557 */ 1558 ASSERT(type & T_USER); 1559 1560 trap_cleanup(rp, fault, &siginfo, 0); 1561 out: 1562 trap_rtt(); 1563 (void) new_mstate(curthread, mstate); 1564 } 1565 1566 void 1567 trap_rtt(void) 1568 { 1569 klwp_id_t lwp = ttolwp(curthread); 1570 1571 /* 1572 * Restore register window if a debugger modified it. 1573 * Set up to perform a single-step if a debugger requested it. 1574 */ 1575 if (lwp->lwp_pcb.pcb_xregstat != XREGNONE) 1576 xregrestore(lwp, 0); 1577 1578 /* 1579 * Set state to LWP_USER here so preempt won't give us a kernel 1580 * priority if it occurs after this point. Call CL_TRAPRET() to 1581 * restore the user-level priority. 1582 * 1583 * It is important that no locks (other than spinlocks) be entered 1584 * after this point before returning to user mode (unless lwp_state 1585 * is set back to LWP_SYS). 1586 */ 1587 lwp->lwp_state = LWP_USER; 1588 if (curthread->t_trapret) { 1589 curthread->t_trapret = 0; 1590 thread_lock(curthread); 1591 CL_TRAPRET(curthread); 1592 thread_unlock(curthread); 1593 } 1594 if (CPU->cpu_runrun || curthread->t_schedflag & TS_ANYWAITQ) 1595 preempt(); 1596 prunstop(); 1597 if (lwp->lwp_pcb.pcb_step != STEP_NONE) 1598 prdostep(); 1599 1600 TRACE_0(TR_FAC_TRAP, TR_C_TRAP_HANDLER_EXIT, "C_trap_handler_exit"); 1601 } 1602 1603 #define IS_LDASI(o) \ 1604 ((o) == (uint32_t)0xC0C00000 || (o) == (uint32_t)0xC0800000 || \ 1605 (o) == (uint32_t)0xC1800000) 1606 #define IS_IMM_ASI(i) (((i) & 0x2000) == 0) 1607 #define IS_ASINF(a) (((a) & 0xF6) == 0x82) 1608 #define IS_LDDA(i) (((i) & 0xC1F80000) == 0xC0980000) 1609 1610 static int 1611 nfload(struct regs *rp, int *instrp) 1612 { 1613 uint_t instr, asi, op3, rd; 1614 size_t len; 1615 struct as *as; 1616 caddr_t addr; 1617 FPU_DREGS_TYPE zero; 1618 extern int segnf_create(); 1619 1620 if (USERMODE(rp->r_tstate)) 1621 instr = fetch_user_instr((caddr_t)rp->r_pc); 1622 else 1623 instr = *(int *)rp->r_pc; 1624 1625 if (instrp) 1626 *instrp = instr; 1627 1628 op3 = (uint_t)(instr & 0xC1E00000); 1629 if (!IS_LDASI(op3)) 1630 return (0); 1631 if (IS_IMM_ASI(instr)) 1632 asi = (instr & 0x1FE0) >> 5; 1633 else 1634 asi = (uint_t)((rp->r_tstate >> TSTATE_ASI_SHIFT) & 1635 TSTATE_ASI_MASK); 1636 if (!IS_ASINF(asi)) 1637 return (0); 1638 if (calc_memaddr(rp, &addr) == SIMU_SUCCESS) { 1639 len = 1; 1640 as = USERMODE(rp->r_tstate) ? ttoproc(curthread)->p_as : &kas; 1641 as_rangelock(as); 1642 if (as_gap(as, len, &addr, &len, 0, addr) == 0) 1643 (void) as_map(as, addr, len, segnf_create, NULL); 1644 as_rangeunlock(as); 1645 } 1646 zero = 0; 1647 rd = (instr >> 25) & 0x1f; 1648 if (IS_FLOAT(instr)) { 1649 uint_t dbflg = ((instr >> 19) & 3) == 3; 1650 1651 if (dbflg) { /* clever v9 reg encoding */ 1652 if (rd & 1) 1653 rd = (rd & 0x1e) | 0x20; 1654 rd >>= 1; 1655 } 1656 if (fpu_exists) { 1657 if (!(_fp_read_fprs() & FPRS_FEF)) 1658 fp_enable(); 1659 1660 if (dbflg) 1661 _fp_write_pdreg(&zero, rd); 1662 else 1663 _fp_write_pfreg((uint_t *)&zero, rd); 1664 } else { 1665 kfpu_t *fp = lwptofpu(curthread->t_lwp); 1666 1667 if (!fp->fpu_en) 1668 fp_enable(); 1669 1670 if (dbflg) 1671 fp->fpu_fr.fpu_dregs[rd] = zero; 1672 else 1673 fp->fpu_fr.fpu_regs[rd] = 0; 1674 } 1675 } else { 1676 (void) putreg(&zero, rp, rd, &addr); 1677 if (IS_LDDA(instr)) 1678 (void) putreg(&zero, rp, rd + 1, &addr); 1679 } 1680 rp->r_pc = rp->r_npc; 1681 rp->r_npc += 4; 1682 return (1); 1683 } 1684 1685 kmutex_t atomic_nc_mutex; 1686 1687 /* 1688 * The following couple of routines are for userland drivers which 1689 * do atomics to noncached addresses. This sort of worked on previous 1690 * platforms -- the operation really wasn't atomic, but it didn't generate 1691 * a trap as sun4u systems do. 1692 */ 1693 static int 1694 swap_nc(struct regs *rp, int instr) 1695 { 1696 uint64_t rdata, mdata; 1697 caddr_t addr, badaddr; 1698 uint_t tmp, rd; 1699 1700 (void) flush_user_windows_to_stack(NULL); 1701 rd = (instr >> 25) & 0x1f; 1702 if (calc_memaddr(rp, &addr) != SIMU_SUCCESS) 1703 return (0); 1704 if (getreg(rp, rd, &rdata, &badaddr)) 1705 return (0); 1706 mutex_enter(&atomic_nc_mutex); 1707 if (fuword32(addr, &tmp) == -1) { 1708 mutex_exit(&atomic_nc_mutex); 1709 return (0); 1710 } 1711 mdata = (u_longlong_t)tmp; 1712 if (suword32(addr, (uint32_t)rdata) == -1) { 1713 mutex_exit(&atomic_nc_mutex); 1714 return (0); 1715 } 1716 (void) putreg(&mdata, rp, rd, &badaddr); 1717 mutex_exit(&atomic_nc_mutex); 1718 return (1); 1719 } 1720 1721 static int 1722 ldstub_nc(struct regs *rp, int instr) 1723 { 1724 uint64_t mdata; 1725 caddr_t addr, badaddr; 1726 uint_t rd; 1727 uint8_t tmp; 1728 1729 (void) flush_user_windows_to_stack(NULL); 1730 rd = (instr >> 25) & 0x1f; 1731 if (calc_memaddr(rp, &addr) != SIMU_SUCCESS) 1732 return (0); 1733 mutex_enter(&atomic_nc_mutex); 1734 if (fuword8(addr, &tmp) == -1) { 1735 mutex_exit(&atomic_nc_mutex); 1736 return (0); 1737 } 1738 mdata = (u_longlong_t)tmp; 1739 if (suword8(addr, (uint8_t)0xff) == -1) { 1740 mutex_exit(&atomic_nc_mutex); 1741 return (0); 1742 } 1743 (void) putreg(&mdata, rp, rd, &badaddr); 1744 mutex_exit(&atomic_nc_mutex); 1745 return (1); 1746 } 1747 1748 /* 1749 * This function helps instr_size() determine the operand size. 1750 * It is called for the extended ldda/stda asi's. 1751 */ 1752 int 1753 extended_asi_size(int asi) 1754 { 1755 switch (asi) { 1756 case ASI_PST8_P: 1757 case ASI_PST8_S: 1758 case ASI_PST16_P: 1759 case ASI_PST16_S: 1760 case ASI_PST32_P: 1761 case ASI_PST32_S: 1762 case ASI_PST8_PL: 1763 case ASI_PST8_SL: 1764 case ASI_PST16_PL: 1765 case ASI_PST16_SL: 1766 case ASI_PST32_PL: 1767 case ASI_PST32_SL: 1768 return (8); 1769 case ASI_FL8_P: 1770 case ASI_FL8_S: 1771 case ASI_FL8_PL: 1772 case ASI_FL8_SL: 1773 return (1); 1774 case ASI_FL16_P: 1775 case ASI_FL16_S: 1776 case ASI_FL16_PL: 1777 case ASI_FL16_SL: 1778 return (2); 1779 case ASI_BLK_P: 1780 case ASI_BLK_S: 1781 case ASI_BLK_PL: 1782 case ASI_BLK_SL: 1783 case ASI_BLK_COMMIT_P: 1784 case ASI_BLK_COMMIT_S: 1785 return (64); 1786 } 1787 1788 return (0); 1789 } 1790 1791 /* 1792 * Patch non-zero to disable preemption of threads in the kernel. 1793 */ 1794 int IGNORE_KERNEL_PREEMPTION = 0; /* XXX - delete this someday */ 1795 1796 struct kpreempt_cnts { /* kernel preemption statistics */ 1797 int kpc_idle; /* executing idle thread */ 1798 int kpc_intr; /* executing interrupt thread */ 1799 int kpc_clock; /* executing clock thread */ 1800 int kpc_blocked; /* thread has blocked preemption (t_preempt) */ 1801 int kpc_notonproc; /* thread is surrendering processor */ 1802 int kpc_inswtch; /* thread has ratified scheduling decision */ 1803 int kpc_prilevel; /* processor interrupt level is too high */ 1804 int kpc_apreempt; /* asynchronous preemption */ 1805 int kpc_spreempt; /* synchronous preemption */ 1806 } kpreempt_cnts; 1807 1808 /* 1809 * kernel preemption: forced rescheduling 1810 * preempt the running kernel thread. 1811 */ 1812 void 1813 kpreempt(int asyncspl) 1814 { 1815 if (IGNORE_KERNEL_PREEMPTION) { 1816 aston(CPU->cpu_dispthread); 1817 return; 1818 } 1819 /* 1820 * Check that conditions are right for kernel preemption 1821 */ 1822 do { 1823 if (curthread->t_preempt) { 1824 /* 1825 * either a privileged thread (idle, panic, interrupt) 1826 * or will check when t_preempt is lowered 1827 * We need to specifically handle the case where 1828 * the thread is in the middle of swtch (resume has 1829 * been called) and has its t_preempt set 1830 * [idle thread and a thread which is in kpreempt 1831 * already] and then a high priority thread is 1832 * available in the local dispatch queue. 1833 * In this case the resumed thread needs to take a 1834 * trap so that it can call kpreempt. We achieve 1835 * this by using siron(). 1836 * How do we detect this condition: 1837 * idle thread is running and is in the midst of 1838 * resume: curthread->t_pri == -1 && CPU->dispthread 1839 * != CPU->thread 1840 * Need to ensure that this happens only at high pil 1841 * resume is called at high pil 1842 * Only in resume_from_idle is the pil changed. 1843 */ 1844 if (curthread->t_pri < 0) { 1845 kpreempt_cnts.kpc_idle++; 1846 if (CPU->cpu_dispthread != CPU->cpu_thread) 1847 siron(); 1848 } else if (curthread->t_flag & T_INTR_THREAD) { 1849 kpreempt_cnts.kpc_intr++; 1850 if (curthread->t_pil == CLOCK_LEVEL) 1851 kpreempt_cnts.kpc_clock++; 1852 } else { 1853 kpreempt_cnts.kpc_blocked++; 1854 if (CPU->cpu_dispthread != CPU->cpu_thread) 1855 siron(); 1856 } 1857 aston(CPU->cpu_dispthread); 1858 return; 1859 } 1860 if (curthread->t_state != TS_ONPROC || 1861 curthread->t_disp_queue != CPU->cpu_disp) { 1862 /* this thread will be calling swtch() shortly */ 1863 kpreempt_cnts.kpc_notonproc++; 1864 if (CPU->cpu_thread != CPU->cpu_dispthread) { 1865 /* already in swtch(), force another */ 1866 kpreempt_cnts.kpc_inswtch++; 1867 siron(); 1868 } 1869 return; 1870 } 1871 1872 if (((asyncspl != KPREEMPT_SYNC) ? spltoipl(asyncspl) : 1873 getpil()) >= DISP_LEVEL) { 1874 /* 1875 * We can't preempt this thread if it is at 1876 * a PIL >= DISP_LEVEL since it may be holding 1877 * a spin lock (like sched_lock). 1878 */ 1879 siron(); /* check back later */ 1880 kpreempt_cnts.kpc_prilevel++; 1881 return; 1882 } 1883 1884 /* 1885 * block preemption so we don't have multiple preemptions 1886 * pending on the interrupt stack 1887 */ 1888 curthread->t_preempt++; 1889 if (asyncspl != KPREEMPT_SYNC) { 1890 splx(asyncspl); 1891 kpreempt_cnts.kpc_apreempt++; 1892 } else 1893 kpreempt_cnts.kpc_spreempt++; 1894 1895 preempt(); 1896 curthread->t_preempt--; 1897 } while (CPU->cpu_kprunrun); 1898 } 1899 1900 static enum seg_rw 1901 get_accesstype(struct regs *rp) 1902 { 1903 uint32_t instr; 1904 1905 if (USERMODE(rp->r_tstate)) 1906 instr = fetch_user_instr((caddr_t)rp->r_pc); 1907 else 1908 instr = *(uint32_t *)rp->r_pc; 1909 1910 if (IS_FLUSH(instr)) 1911 return (S_OTHER); 1912 1913 if (IS_STORE(instr)) 1914 return (S_WRITE); 1915 else 1916 return (S_READ); 1917 } 1918 1919 /* 1920 * Handle an asynchronous hardware error. 1921 * The policy is currently to send a hardware error contract event to 1922 * the process's process contract and to kill the process. Eventually 1923 * we may want to instead send a special signal whose default 1924 * disposition is to generate the contract event. 1925 */ 1926 void 1927 trap_async_hwerr(void) 1928 { 1929 k_siginfo_t si; 1930 proc_t *p = ttoproc(curthread); 1931 extern void print_msg_hwerr(ctid_t ct_id, proc_t *p); 1932 1933 errorq_drain(ue_queue); /* flush pending async error messages */ 1934 1935 print_msg_hwerr(p->p_ct_process->conp_contract.ct_id, p); 1936 1937 contract_process_hwerr(p->p_ct_process, p); 1938 1939 bzero(&si, sizeof (k_siginfo_t)); 1940 si.si_signo = SIGKILL; 1941 si.si_code = SI_NOINFO; 1942 trapsig(&si, 1); 1943 } 1944 1945 /* 1946 * Handle bus error and bus timeout for a user process by sending SIGBUS 1947 * The type is either ASYNC_BERR or ASYNC_BTO. 1948 */ 1949 void 1950 trap_async_berr_bto(int type, struct regs *rp) 1951 { 1952 k_siginfo_t si; 1953 1954 errorq_drain(ue_queue); /* flush pending async error messages */ 1955 bzero(&si, sizeof (k_siginfo_t)); 1956 1957 si.si_signo = SIGBUS; 1958 si.si_code = (type == ASYNC_BERR ? BUS_OBJERR : BUS_ADRERR); 1959 si.si_addr = (caddr_t)rp->r_pc; /* AFAR unavailable - future RFE */ 1960 si.si_errno = ENXIO; 1961 1962 trapsig(&si, 1); 1963 } 1964