aboutsummaryrefslogtreecommitdiff
path: root/sys/cddl/dev
diff options
context:
space:
mode:
authorJustin Hibbits <jhibbits@FreeBSD.org>2019-05-17 19:57:08 +0000
committerJustin Hibbits <jhibbits@FreeBSD.org>2019-05-17 19:57:08 +0000
commitd69b94bab0e2a72c62747c188e9df7170824c034 (patch)
treea22507d97bc9698f5d6f67ff2a96380ef2061b95 /sys/cddl/dev
parent942886743b18da416fd96e85787a49a8e160e060 (diff)
Notes
Diffstat (limited to 'sys/cddl/dev')
-rw-r--r--sys/cddl/dev/dtrace/powerpc/dtrace_asm.S10
-rw-r--r--sys/cddl/dev/dtrace/powerpc/dtrace_isa.c37
2 files changed, 25 insertions, 22 deletions
diff --git a/sys/cddl/dev/dtrace/powerpc/dtrace_asm.S b/sys/cddl/dev/dtrace/powerpc/dtrace_asm.S
index d5af4d11ca7d0..3371068896dbb 100644
--- a/sys/cddl/dev/dtrace/powerpc/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/powerpc/dtrace_asm.S
@@ -179,3 +179,13 @@ ASENTRY_NOPROF(dtrace_caller)
li %r3, -1
blr
END(dtrace_caller)
+
+/*
+greg_t
+dtrace_getfp(void)
+*/
+ASENTRY_NOPROF(dtrace_getfp)
+ mr %r3,%r31
+ blr
+END(dtrace_getfp)
+
diff --git a/sys/cddl/dev/dtrace/powerpc/dtrace_isa.c b/sys/cddl/dev/dtrace/powerpc/dtrace_isa.c
index e3e93317f4881..a188eafa777dc 100644
--- a/sys/cddl/dev/dtrace/powerpc/dtrace_isa.c
+++ b/sys/cddl/dev/dtrace/powerpc/dtrace_isa.c
@@ -61,8 +61,10 @@
#define FRAME_OFFSET 8
#endif
-#define INKERNEL(x) ((x) <= VM_MAX_KERNEL_ADDRESS && \
- (x) >= VM_MIN_KERNEL_ADDRESS)
+#define INKERNEL(x) (((x) <= VM_MAX_KERNEL_ADDRESS && \
+ (x) >= VM_MIN_KERNEL_ADDRESS) || \
+ (PMAP_HAS_DMAP && (x) >= DMAP_BASE_ADDRESS && \
+ (x) <= DMAP_MAX_ADDRESS))
static __inline int
dtrace_sp_inkernel(uintptr_t sp)
@@ -70,6 +72,9 @@ dtrace_sp_inkernel(uintptr_t sp)
struct trapframe *frame;
vm_offset_t callpc;
+ /* Not within the kernel, or not aligned. */
+ if (!INKERNEL(sp) || (sp & 0xf) != 0)
+ return (0);
#ifdef __powerpc64__
callpc = *(vm_offset_t *)(sp + RETURN_OFFSET64);
#else
@@ -84,8 +89,6 @@ dtrace_sp_inkernel(uintptr_t sp)
*/
if (callpc + OFFSET == (vm_offset_t) &trapexit ||
callpc + OFFSET == (vm_offset_t) &asttrapexit) {
- if (sp == 0)
- return (0);
frame = (struct trapframe *)(sp + FRAME_OFFSET);
return ((frame->srr1 & PSL_PR) == 0);
@@ -119,6 +122,7 @@ dtrace_next_sp_pc(uintptr_t sp, uintptr_t *nsp, uintptr_t *pc)
*nsp = frame->fixreg[1];
if (pc != NULL)
*pc = frame->srr0;
+ return;
}
if (nsp != NULL)
@@ -127,12 +131,6 @@ dtrace_next_sp_pc(uintptr_t sp, uintptr_t *nsp, uintptr_t *pc)
*pc = callpc;
}
-greg_t
-dtrace_getfp(void)
-{
- return (greg_t)__builtin_frame_address(0);
-}
-
void
dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
uint32_t *intrpc)
@@ -148,7 +146,7 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
aframes++;
- sp = dtrace_getfp();
+ sp = (uintptr_t)__builtin_frame_address(0);
while (depth < pcstack_limit) {
if (sp <= osp)
@@ -418,7 +416,7 @@ uint64_t
dtrace_getarg(int arg, int aframes)
{
uintptr_t val;
- uintptr_t *fp = (uintptr_t *)dtrace_getfp();
+ uintptr_t *fp = (uintptr_t *)__builtin_frame_address(0);
uintptr_t *stack;
int i;
@@ -432,8 +430,8 @@ dtrace_getarg(int arg, int aframes)
fp = (uintptr_t *)*fp;
/*
- * On ppc32 AIM, and booke, trapexit() is the immediately following
- * label. On ppc64 AIM trapexit() follows a nop.
+ * On ppc32 trapexit() is the immediately following label. On
+ * ppc64 AIM trapexit() follows a nop.
*/
#ifdef __powerpc64__
if ((long)(fp[2]) + 4 == (long)trapexit) {
@@ -506,9 +504,7 @@ dtrace_getstackdepth(int aframes)
vm_offset_t callpc;
osp = PAGE_SIZE;
- aframes++;
- sp = dtrace_getfp();
- depth++;
+ sp = (uintptr_t)__builtin_frame_address(0);
for(;;) {
if (sp <= osp)
break;
@@ -516,17 +512,14 @@ dtrace_getstackdepth(int aframes)
if (!dtrace_sp_inkernel(sp))
break;
- if (aframes == 0)
- depth++;
- else
- aframes--;
+ depth++;
osp = sp;
dtrace_next_sp_pc(sp, &sp, NULL);
}
if (depth < aframes)
return (0);
- return (depth);
+ return (depth - aframes);
}
ulong_t