summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/aim
diff options
context:
space:
mode:
authorjhibbits <jhibbits@FreeBSD.org>2013-03-18 05:30:18 +0000
committerjhibbits <jhibbits@FreeBSD.org>2013-03-18 05:30:18 +0000
commit7b62f31cdf0ac5e5b9e97e38a21caf00e4897a45 (patch)
treeed98c02f053007502714151382d6652f85f4b682 /sys/powerpc/aim
parentc1c3be94b5168f8fb3d5164cef52767192eb6505 (diff)
downloadFreeBSD-src-7b62f31cdf0ac5e5b9e97e38a21caf00e4897a45.zip
FreeBSD-src-7b62f31cdf0ac5e5b9e97e38a21caf00e4897a45.tar.gz
Add FBT for PowerPC DTrace. Also, clean up the DTrace assembly code,
much of which is not necessary for PowerPC. The FBT module can likely be factored into 3 separate files: common, intel, and powerpc, rather than duplicating most of the code between the x86 and PowerPC flavors. All DTrace modules for PowerPC will be MFC'd together once Fasttrap is completed.
Diffstat (limited to 'sys/powerpc/aim')
-rw-r--r--sys/powerpc/aim/trap.c19
-rw-r--r--sys/powerpc/aim/trap_subr32.S7
-rw-r--r--sys/powerpc/aim/trap_subr64.S7
3 files changed, 14 insertions, 19 deletions
diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c
index d30aded..9a496fe 100644
--- a/sys/powerpc/aim/trap.c
+++ b/sys/powerpc/aim/trap.c
@@ -130,6 +130,7 @@ systrace_probe_func_t systrace_probe_func;
dtrace_fasttrap_probe_ptr_t dtrace_fasttrap_probe_ptr;
dtrace_pid_probe_ptr_t dtrace_pid_probe_ptr;
dtrace_return_probe_ptr_t dtrace_return_probe_ptr;
+int (*dtrace_invop_jump_addr)(struct trapframe *);
#endif
static struct powerpc_exception powerpc_exceptions[] = {
@@ -220,10 +221,8 @@ trap(struct trapframe *frame)
/*
* XXXDTRACE: add fasttrap and pid probes handlers here (if ever)
*/
- if (!user) {
- if (dtrace_trap_func != NULL && (*dtrace_trap_func)(frame, type))
- return;
- }
+ if (dtrace_trap_func != NULL && (*dtrace_trap_func)(frame, type))
+ return;
#endif
if (user) {
@@ -296,7 +295,7 @@ trap(struct trapframe *frame)
/* Identify the trap reason */
if (frame->srr1 & EXC_PGM_TRAP)
sig = SIGTRAP;
- else if (ppc_instr_emulate(frame) == 0)
+ else if (ppc_instr_emulate(frame) == 0)
frame->srr0 += 4;
else
sig = SIGILL;
@@ -311,6 +310,16 @@ trap(struct trapframe *frame)
KASSERT(cold || td->td_ucred != NULL,
("kernel trap doesn't have ucred"));
switch (type) {
+#ifdef KDTRACE_HOOKS
+ case EXC_PGM:
+ if (frame->srr1 & EXC_PGM_TRAP) {
+ if (*(uintptr_t *)frame->srr0 == 0x7c810808) {
+ if (dtrace_invop_jump_addr != NULL) {
+ dtrace_invop_jump_addr(frame);
+ }
+ }
+ }
+#endif
#ifdef __powerpc64__
case EXC_DSE:
if ((frame->cpu.aim.dar & SEGMENT_MASK) == USER_ADDR) {
diff --git a/sys/powerpc/aim/trap_subr32.S b/sys/powerpc/aim/trap_subr32.S
index a00cc3d..d137fd4 100644
--- a/sys/powerpc/aim/trap_subr32.S
+++ b/sys/powerpc/aim/trap_subr32.S
@@ -242,13 +242,6 @@
#ifdef KDTRACE_HOOKS
.data
- .globl dtrace_invop_jump_addr
- .align 4
- .type dtrace_invop_jump_addr, @object
- .size dtrace_invop_jump_addr, 4
-dtrace_invop_jump_addr:
- .word 0
- .word 0
.globl dtrace_invop_calltrap_addr
.align 4
.type dtrace_invop_calltrap_addr, @object
diff --git a/sys/powerpc/aim/trap_subr64.S b/sys/powerpc/aim/trap_subr64.S
index 0a12753..8550227 100644
--- a/sys/powerpc/aim/trap_subr64.S
+++ b/sys/powerpc/aim/trap_subr64.S
@@ -276,13 +276,6 @@ restore_kernsrs:
#ifdef KDTRACE_HOOKS
.data
- .globl dtrace_invop_jump_addr
- .align 8
- .type dtrace_invop_jump_addr, @object
- .size dtrace_invop_jump_addr, 8
-dtrace_invop_jump_addr:
- .word 0
- .word 0
.globl dtrace_invop_calltrap_addr
.align 8
.type dtrace_invop_calltrap_addr, @object
OpenPOWER on IntegriCloud