Shrikanth R K
2010-Jun-22 17:52 UTC
[dtrace-discuss] [DTrace]Should kernel global variable reference land up in dtrace_canstore?
Although this is in a FreeBSD 6.1 env, I wanted to get some basic question clarified... I have the following simple DTrace script % cat fbt_test.d BEGIN { trace(kernel`my_kern_variable); } When I run the script I get the following error dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid kernel access in action #1 at DIF offset 4 This is a FreeBSD 6.1 base (I am attempting to get DTrace to work in a FreeBSD 6.1 cross compiler env) On limited debugging... I see this ''dtrace_dif_emulate'' sets the CPU_DTRACE_KPRIV error... case DIF_OP_RLDX: if (!dtrace_canstore(regs[r1], 8, mstate, vstate)) { *flags |= CPU_DTRACE_KPRIV; *illval = regs[r1]; I tried figuring out the semantics of "dtrace_canstore", looks like it checks if the asked variable resides anywhere in the DTrace ''scratch base'' or in the space of thread local variables. My query is since I marked the variable in the script with a back quote should it not consider it as a external reference? The function dtrace_canstore should it run validation on such a reference... I have inlined the following lines from my debugging session (kgdb) info address my_kern_variable Symbol "my_kern_variable" is static storage at address 0xc0bd68ec. (kgdb) up #3 0xc5018967 in dtrace_dif_emulate (difo=0xc5bf38c0, mstate=0xee972b00, vstate=0xc4f59c1c, state=0xc4f59c00) (kgdb) p /x regs[1] $165 = 0xc0bd68ec <== Same as my_kern_variable, and this gets passed to dtrace_canstore as shown above (kgdb) p /x mstate->dtms_scratch_base <== Starting at 0xc6a52010 which is greater than the global my_kern_variable $166 = 0xc6a52010 (kgdb) p /x mstate->dtms_scratch_size $167 = 0xbffff0 (kgdb) p /x vstate->dtvs_dynvars.dtds_base <== Thread locals base, 0xc7652000 which is also greater than my_kern_variable $169 = 0xc7652000 (kgdb) p /x vstate->dtvs_dynvars.dtds_size $170 = 0x100000 If we look at the implementation of "dtrace_canstore" it looks very obvious to fail...with the above parameters. In a dumb way, what I am trying to figure out is whether to a reference to a kernel global which is external to the dtrace memory areas land up for validation in dtrace_canstore? Any pointers where to look, how to debug further? -- Shrikanth R K -- This message posted from opensolaris.org