Re: DTrace panic while probing syscall::open (and possibly many others)

From: Mel Flynn <mel.flynn+fbsd.current_at_mailing.thruhere.net>
Date: Thu, 21 May 2009 21:29:47 +0200
On Thursday 21 May 2009 18:53:56 Thomas Backman wrote:
> On May 13, 2009, at 03:19 PM, Thomas Backman wrote:

<snip electrons>

> > #11 0xffffffff8123c200 in dtrace_copycheck
> > (uaddr=18446744071581326184, kaddr=Variable "kaddr" is not available.
> > ) at dtrace_isa.c:527

> In /sys/cddl/dev/dtrace/amd64/dtrace_isa.c:
> static int
> dtrace_copycheck(uintptr_t uaddr, uintptr_t kaddr, size_t size)
> {
>      printf("in dtrace_copycheck(), pre-ASSERT:\n");
>      printf("kaddr = %u, kernelbase = %u, size = %d, kaddr+size = %u\n
> \n",
>         (unsigned int)kaddr, (unsigned int)kernelbase, (unsigned
> int)size, (unsigned int)(kaddr+size));
>      ASSERT(kaddr >= kernelbase && kaddr + size >= kaddr);
>
>      if (uaddr + size >= kernelbase || uaddr + size < uaddr) {
>      ...
>
> So, I added two printf statements. What happens? IT BECOMES STABLE.

I'm no kernel hacker, but.. if you apply the patch below, does it still panic? 
Make sure to get rid of the printf() you added.

The theory behind this patch is that kernbase isn't initialized at the time of 
that assert, yet code from printf initializes it.

--- dtrace_isa.c.orig   2009-05-21 21:18:54.000000000 +0200
+++ dtrace_isa.c        2009-05-21 21:23:40.000000000 +0200
_at__at_ -40,7 +40,8 _at__at_
 #include <vm/vm_param.h>
 #include <vm/pmap.h>

-extern uintptr_t kernbase;
+//extern uintptr_t kernbase;
+static uintptr_t kernbase = KERNBASE;
 uintptr_t kernelbase = (uintptr_t) &kernbase;

 #define INKERNEL(va) (((vm_offset_t)(va)) >= USRSTACK && \
 
-- 
Mel
Received on Thu May 21 2009 - 17:29:51 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:48 UTC