Two things come to mind:

- was this the innermost (newest) frame?  If it wasn't something
earlier could be the problem
- is the dwarf debug info being used, or is it relying on heuristics
(annoyingly I can't spot an easy way to tell)

and when this happens, 'info frame' may help diagnose things.

Looking at:

>
>     void
>     kernfs_get_rrootdev(void)
>     {
>             static int tried = 0;
>
>             if (tried) {
>                     /* Already did it once. */
>                     return;
>             }
>             tried = 1;
>
>             if (rootdev == NODEV)
>                     return;
>             rrootdev = devsw_blk2chr(rootdev);
>             if (rrootdev != NODEV)
>                     return;
>             rrootdev = NODEV;
>             printf("kernfs_get_rrootdev: no raw root device\n");
>     }

I get:

000000000000043c <kernfs_get_rrootdev>:
 43c:   8b 05 00 00 00 00       mov    0x0(%rip),%eax        # 442
<kernfs_get_rrootdev+0x6>
 442:   85 c0                   test   %eax,%eax
 444:   75 2e                   jne    474 <kernfs_get_rrootdev+0x38>
 446:   c7 05 00 00 00 00 01    movl   $0x1,0x0(%rip)        # 450
<kernfs_get_rrootdev+0x14>
 44d:   00 00 00
 450:   48 8b 3d 00 00 00 00    mov    0x0(%rip),%rdi        # 457
<kernfs_get_rrootdev+0x1b>
 457:   48 83 ff ff             cmp    $0xffffffffffffffff,%rdi
 45b:   74 17                   je     474 <kernfs_get_rrootdev+0x38>
 45d:   55                      push   %rbp
 45e:   48 89 e5                mov    %rsp,%rbp
 ...

and has CFI (readelf --debug-dump=frames-interp
amd64/sys/arch/amd64/compile/GENERIC/kernfs_vfsops.o):

000001a4 0000000000000028 000001a8 FDE cie=00000000
pc=000000000000043c..0000000000000484
   LOC           CFA      rbp   ra
000000000000043c rsp+8    u     c-8
000000000000045e rsp+16   c-16  c-8
...

so, until the push, the CFI has't specified RBP, but a reasonable
interpretation s current value.  So this, to me looks ok.

Reply via email to