Re: aarch64 devel/gdb for kgdb use on main [so: 15] (and, likely, 14.0-????): dump core.txt.?'s kgdb backtraces are messed up

Mark Millard <[email protected]>
Newsgroups gmane.os.freebsd.devel.arm,gmane.os.freebsd.devel.ports
Message-ID <[email protected]>

On Sep 12, 2023, at 22:11, Kyle Evans <[email protected]> wrote:

> On 9/12/23 23:28, Mark Millard wrote:
>> [Trying to send to freebsd-ports accurately this time.]
>> On Sep 12, 2023, at 21:23, Mark Millard <[email protected]> wrote:
>> [I've cc'd the last 2 devel/gdb authors of kgdb-related material.]
>> kgdb 13.1_4 is an improvement over 13.1_3 for aarch64 but is still
>> broken. 13.1_3 example:
>> 0x0000000000000000 in ?? ()
>> (kgdb) #0  0x0000000000000000 in ?? ()
>> #1  <unavailable> in ?? ()
>> Backtrace stopped: not enough registers or memory available to unwind further
>> (kgdb)
>> 13.1_4 example:
>> get_curthread () at /usr/src/sys/arm64/include/pcpu.h:77
>> 77 __asm __volatile("ldr %0, [x18]" : "=&r"(td));
>> (kgdb) #0 get_curthread () at /usr/src/sys/arm64/include/pcpu.h:77
>> #1 doadump (textdump=0, textdump@entry=1576585744)
>> at /usr/src/sys/kern/kern_shutdown.c:405
>> #2 0xffff0000000ec18c in db_dump (dummy=<optimized out>, dummy2=<optimized out>, dummy3=<optimized out>, dummy4=<optimized out>)
>> at /usr/src/sys/ddb/db_command.c:591
>> #3 0xffff0000000ebf88 in db_command (last_cmdp=<optimized out>, cmd_table=<optimized out>, dopager=true)
>> at /usr/src/sys/ddb/db_command.c:504
>> #4 0xffff0000000ebc80 in db_command_loop ()
>> at /usr/src/sys/ddb/db_command.c:551
>> #5 0xffff0000000ef440 in db_trap (type=<optimized out>, code=<optimized out>)
>> at /usr/src/sys/ddb/db_main.c:268
>> #6 0xffff0000004b4860 in kdb_trap (type=60, code=0, tf=<optimized out>)
>> at /usr/src/sys/kern/subr_kdb.c:790
>> #7 <signal handler called>
>> #8 <signal handler called>
>> #9 <signal handler called>
>> #10 <signal handler called>
>> #11 <signal handler called>
>> #12 <signal handler called>
>> #13 <signal handler called>
>> #14 <signal handler called>
>> #15 <signal handler called>
>> #16 <signal handler called>
>> #17 <signal handler called>
>> #18 <signal handler called>
>> #19 <signal handler called>
>> #20 <signal handler called>
>> #21 <signal handler called>
>> #22 <signal handler called>
>> #23 <signal handler called>
>> Backtrace stopped: Cannot access memory at address 0x10
>> (kgdb)
> 
> Yeah, sorry, I see the problem now; looks like I didn't test it after one last change I ported from jhb's cheri branch:
> 
> >      tf_size = regcache_map_entry_size (trapframe_map);
> 
> regcache_map_entry_size() is in-fact what we want, but I didn't realize that it doesn't do the magical translation from 0 -> register_size that seems to be done everywhere else.  With the below patch[0] to populate all of the sizes, things look sane again.
> 
> Thanks,
> 
> Kyle Evans
> 
> [0] https://people.freebsd.org/~kevans/kgdb-fix.diff
> 
> @@ -126,13 +126,13 @@ aarch64_fbsd_supply_pcb(struct regcache *regcache, CORE_ADDR pcb_addr) 
> 
> 
> static const struct regcache_map_entry aarch64_fbsd_trapframe_map[] = 
>   { 
> -    { 1, AARCH64_SP_REGNUM, 0 },
> -    { 1, AARCH64_LR_REGNUM, 0 },
> -    { 1, AARCH64_PC_REGNUM, 0 },
> -    { 1, AARCH64_CPSR_REGNUM, 0 },
> +    { 1, AARCH64_SP_REGNUM, 8 },
> +    { 1, AARCH64_LR_REGNUM, 8 },
> +    { 1, AARCH64_PC_REGNUM, 8 },
> +    { 1, AARCH64_CPSR_REGNUM, 8 },
>     { 1, REGCACHE_MAP_SKIP, 8 },       /* esr */
>     { 1, REGCACHE_MAP_SKIP, 8 },       /* far */
> -    { 30, AARCH64_X0_REGNUM, 0 },      /* x0 ... x29 */
> +    { 30, AARCH64_X0_REGNUM, 8 },      /* x0 ... x29 */
>     { 0 },
>   };
> 
> @@ -141,12 +141,12 @@ static const struct regcache_map_entry aarch64_fbsd_trapframe_map[] =
> 
> static const struct regcache_map_entry aarch64_fbsd13_trapframe_map[] =
>   {
> -    { 1, AARCH64_SP_REGNUM, 0 },
> -    { 1, AARCH64_LR_REGNUM, 0 },
> -    { 1, AARCH64_PC_REGNUM, 0 },
> +    { 1, AARCH64_SP_REGNUM, 8 },
> +    { 1, AARCH64_LR_REGNUM, 8 },
> +    { 1, AARCH64_PC_REGNUM, 8 },
>     { 1, AARCH64_CPSR_REGNUM, 4 },
>     { 1, REGCACHE_MAP_SKIP, 4 },       /* esr */
> -    { 30, AARCH64_X0_REGNUM, 0 },      /* x0 ... x29 */
> +    { 30, AARCH64_X0_REGNUM, 8 },      /* x0 ... x29 */
>     { 0 },
>   };
> 

Thanks. For my personal build's non-debug kernel the
updated kgdb that I built and installed produced:

get_curthread () at /usr/main-src/sys/arm64/include/pcpu.h:77
77              __asm __volatile("ldr   %0, [x18]" : "=&r"(td));
(kgdb) #0  get_curthread () at /usr/main-src/sys/arm64/include/pcpu.h:77
#1  doadump (textdump=0, textdump@entry=1648929296)
    at /usr/main-src/sys/kern/kern_shutdown.c:405
#2  0xffff0000000f7704 in db_dump (dummy=<optimized out>,      dummy2=<optimized out>, dummy3=<optimized out>, dummy4=<optimized out>)
    at /usr/main-src/sys/ddb/db_command.c:591
#3  0xffff0000000f74e0 in db_command (last_cmdp=<optimized out>,      cmd_table=<optimized out>, dopager=true)
    at /usr/main-src/sys/ddb/db_command.c:504
#4  0xffff0000000f71b8 in db_command_loop ()
    at /usr/main-src/sys/ddb/db_command.c:551
#5  0xffff0000000fad9c in db_trap (type=<optimized out>, code=<optimized out>)
    at /usr/main-src/sys/ddb/db_main.c:268
#6  0xffff0000004f4ec4 in kdb_trap (type=60, code=0, tf=<optimized out>)
    at /usr/main-src/sys/kern/subr_kdb.c:790
#7  <signal handler called>
#8  kdb_enter (why=<optimized out>, msg=<optimized out>)
    at /usr/main-src/sys/kern/subr_kdb.c:556
#9  0xffff0000004a5350 in vpanic (
    fmt=0xffff00000099d39c "vm_fault failed: 0x%lx error %d", ap=...)
    at /usr/main-src/sys/kern/kern_shutdown.c:958
#10 0xffff0000004a5168 in panic (
    fmt=0x12 <error: Cannot access memory at address 0x12>)
    at /usr/main-src/sys/kern/kern_shutdown.c:894
#11 0xffff00000083c708 in data_abort (td=0xffff000157796260,      frame=0xffff00016248b360, esr=2516582404, far=<optimized out>, lower=0)
    at /usr/main-src/sys/arm64/arm64/trap.c:392
#12 <signal handler called>
#13 dump_sa (nw=nw@entry=0xffff00016248b7f0, attr=attr@entry=1,      sa=0x44572d4338374143) at /usr/main-src/sys/netlink/route/iface.c:226
#14 0xffff0000006b8fe0 in dump_iface (nw=0xffff00016248b7f0,      ifp=0xffffa00316119800, hdr=<optimized out>,      if_flags_mask=<optimized out>, if_flags_mask@entry=1648932336)
    at /usr/main-src/sys/netlink/route/iface.c:327
#15 0xffff0000006bb0bc in dump_cb (ifp=0x1, _arg=<optimized out>,      _arg@entry=0xffff00016248b690)
    at /usr/main-src/sys/netlink/route/iface.c:433
#16 0xffff0000005cf488 in if_foreach_sleep (match_cb=<optimized out>,      match_arg=match_arg@entry=0xffff00016248b6d0,      cb=0xffff0000006bb0a0 <dump_cb>, cb_arg=cb_arg@entry=0xffff00016248b690)
    at /usr/main-src/sys/net/if.c:4594
#17 0xffff0000006ba1c0 in rtnl_handle_getlink (hdr=0xffffa003198a6800,      nlp=0xffffa002ef454300, npt=<optimized out>)
    at /usr/main-src/sys/netlink/route/iface.c:503
#18 0xffff0000006b8390 in rtnl_handle_message (
    hdr=hdr@entry=0xffffa003198a6800, npt=npt@entry=0xffff00016248b830)
    at /usr/main-src/sys/netlink/netlink_route.c:104
#19 0xffff0000006b5818 in nl_receive_message (hdr=0xffffa003198a6800,      remaining_length=32, nlp=0xffffa002ef454300, npt=0xffff00016248b830)
    at /usr/main-src/sys/netlink/netlink_io.c:508
#20 nl_process_mbuf (m=<optimized out>, nlp=0xffffa002ef454300)
    at /usr/main-src/sys/netlink/netlink_io.c:582
#21 nl_process_received_one (nlp=0xffffa002ef454300)
    at /usr/main-src/sys/netlink/netlink_io.c:295
#22 nl_process_received (nlp=0xffffa002ef454300)
    at /usr/main-src/sys/netlink/netlink_io.c:322
#23 nl_taskqueue_handler (_arg=0xffffa002ef454300, pending=<optimized out>)
    at /usr/main-src/sys/netlink/netlink_io.c:373
#24 0xffff00000050c668 in taskqueue_run_locked (
    queue=queue@entry=0xffffa009ff851180)
    at /usr/main-src/sys/kern/subr_taskqueue.c:512
#25 0xffff00000050db70 in taskqueue_thread_loop (arg=<optimized out>,      arg@entry=0xffffa002ef454360)
    at /usr/main-src/sys/kern/subr_taskqueue.c:824
#26 0xffff00000045b7bc in fork_exit (
    callout=0xffff00000050daa0 <taskqueue_thread_loop>,      arg=0xffffa002ef454360, frame=0xffff00016248ba00)
    at /usr/main-src/sys/kern/kern_fork.c:1160
#27 <signal handler called>
(kgdb) 

(I do not strip symbols and such from non-debug builds.)

Much better.

===
Mark Millard
marklmi at yahoo.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.