1/*- 2 * Copyright (C) 1995, 1996 Wolfgang Solfrank. 3 * Copyright (C) 1995, 1996 TooLs GmbH. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 18 unchanged lines hidden (view full) --- 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 * 31 * $NetBSD: trap.c,v 1.58 2002/03/04 04:07:35 dbj Exp $ 32 */ 33 34#include <sys/cdefs.h> |
35__FBSDID("$FreeBSD: stable/10/sys/powerpc/aim/trap.c 260670 2014-01-15 05:19:37Z jhibbits $"); |
36 37#include "opt_kdtrace.h" 38 39#include <sys/param.h> 40#include <sys/kdb.h> 41#include <sys/proc.h> 42#include <sys/ktr.h> 43#include <sys/lock.h> --- 126 unchanged lines hidden (view full) --- 170 return ("unknown"); 171} 172 173void 174trap(struct trapframe *frame) 175{ 176 struct thread *td; 177 struct proc *p; |
178#ifdef KDTRACE_HOOKS 179 uint32_t inst; 180#endif |
181 int sig, type, user; 182 u_int ucode; 183 ksiginfo_t ksi; 184 185 PCPU_INC(cnt.v_trap); 186 187 td = curthread; 188 p = td->td_proc; --- 88 unchanged lines hidden (view full) --- 277 if (fix_unaligned(td, frame) != 0) 278 sig = SIGBUS; 279 else 280 frame->srr0 += 4; 281 break; 282 283 case EXC_PGM: 284 /* Identify the trap reason */ |
285 if (frame->srr1 & EXC_PGM_TRAP) { 286#ifdef KDTRACE_HOOKS 287 inst = fuword32((const void *)frame->srr0); 288 if (inst == 0x0FFFDDDD && dtrace_pid_probe_ptr != NULL) { 289 struct reg regs; 290 fill_regs(td, ®s); 291 (*dtrace_pid_probe_ptr)(®s); 292 break; 293 } 294#endif |
295 sig = SIGTRAP; |
296 } else if (ppc_instr_emulate(frame) == 0) |
297 frame->srr0 += 4; 298 else 299 sig = SIGILL; 300 break; 301 302 default: 303 trap_fatal(frame); 304 } 305 } else { 306 /* Kernel Mode Traps */ 307 308 KASSERT(cold || td->td_ucred != NULL, 309 ("kernel trap doesn't have ucred")); 310 switch (type) { 311#ifdef KDTRACE_HOOKS 312 case EXC_PGM: 313 if (frame->srr1 & EXC_PGM_TRAP) { |
314 if (*(uint32_t *)frame->srr0 == 0x7c810808) { |
315 if (dtrace_invop_jump_addr != NULL) { 316 dtrace_invop_jump_addr(frame); 317 return; 318 } 319 } 320 } 321 break; 322#endif --- 498 unchanged lines hidden --- |