on 18/06/2009 14:42 Thomas Backman said the following: > > On Jun 18, 2009, at 12:55 PM, Andriy Gapon wrote: > >> on 18/06/2009 12:43 Thomas Backman said the following: >>> >>> at dtrace_isa.c:527 >>> #14 0xffffffff816b31fc in dtrace_copyinstr (uaddr=34365163021, >>> kaddr=18446743524025463312, size=256, flags=0xffffffff8146e0c0) >>> at dtrace_isa.c:558 >> >> kaddr=18446743524025463312 == FFFFFF8004467210 >> I think kernelbase on amd64 is 0xFFFFFFFF80000000. >> FFFFFF8004467210 kaddr >> is smaller than >> FFFFFFFF80000000 kernelbase >> >> The numbers do look suspiciously similar, so I am not sure if you are >> seeing a >> race or a real bug somewhere. >> -- >> Andriy Gapon > Hmmm... > Looking around a bit for these numbers, I found, in > /sys/amd64/include/vmparam.h: > > /* > * Virtual addresses of things. Derived from the page directory and > * page table indexes from pmap.h for precision. > * > * 0x0000000000000000 - 0x00007fffffffffff user map > * 0x0000800000000000 - 0xffff7fffffffffff does not exist (hole) > * 0xffff800000000000 - 0xffff804020100fff recursive page table (512GB > slot) > * 0xffff804020101000 - 0xfffffeffffffffff unused > * 0xffffff0000000000 - 0xffffff7fffffffff 512GB direct map mappings > * 0xffffff8000000000 - 0xffffffffffffffff 512GB kernel map > * > * Within the kernel map: > * > * 0xffffffff80000000 KERNBASE > */ > > So, kaddr is inside the "kernel map", but not KERNBASE. What this means, > I have no clue whatsoever. (I'm not a kernel developer and I don't know > too much about (virtual) memory either!) Thomas, I think that you were correct that one needs to be somewhat of a VM expert here. It seems that amd64 is the only[?] platform where KERNBASE != VM_MIN_KERNEL_ADDRESS (0xffffffff80000000 and 0xffffff8000000000 correspondingly). That makes the assert in sys/cddl/dev/dtrace/amd64/dtrace_isa.c bogus in my opinion: static int dtrace_copycheck(uintptr_t uaddr, uintptr_t kaddr, size_t size) { ASSERT(kaddr >= kernelbase && kaddr + size >= kaddr); If the purpose of the assert is to ensure that [kaddr:kaddr+size) is within kernel memory, then it should use VM_MIN_KERNEL_ADDRESS instead of KERNBASE. Or maybe even use something like the macro in sys/amd64/include/stack.h: #define INKERNEL(va) (((va) >= DMAP_MIN_ADDRESS && (va) < DMAP_MAX_ADDRESS) \ || ((va) >= VM_MIN_KERNEL_ADDRESS && (va) < VM_MAX_KERNEL_ADDRESS)) The above is just my understanding, not a fact, so I am CC-ing people that are really knowledgeable of our VM and the porter/author of our DTrace code too. -- Andriy GaponReceived on Fri Jun 19 2009 - 14:39:58 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:50 UTC