Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Sep 2023 23:28:33 -0700
From:      Mark Millard <marklmi@yahoo.com>
To:        Kyle Evans <kevans@FreeBSD.org>
Cc:        FreeBSD Mailing List <freebsd-ports@freebsd.org>, freebsd-arm <freebsd-arm@freebsd.org>, Mark Johnston <markj@FreeBSD.org>, "jhb@freebsd.org" <jhb@FreeBSD.org>
Subject:   Re: aarch64 devel/gdb for kgdb use on main [so: 15] (and, likely, 14.0-????): dump core.txt.?'s kgdb backtraces are messed up
Message-ID:  <008EEE6D-893C-4205-9E2C-D9922B870CBC@yahoo.com>
In-Reply-To: <1b3313d2-1054-8df3-4244-4e67d3778e75@FreeBSD.org>
References:  <31BB2D7D-3A91-48AC-B29E-BDEA0CA59A73@yahoo.com> <6610DEB1-D2D7-48E8-8DC5-0B1E99C2041A@yahoo.com> <1b3313d2-1054-8df3-4244-4e67d3778e75@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help


On Sep 12, 2023, at 22:11, Kyle Evans <kevans@FreeBSD.org> 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 <marklmi@yahoo.com> 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]" : "=3D&r"(td));
>> (kgdb) #0 get_curthread () at /usr/src/sys/arm64/include/pcpu.h:77
>> #1 doadump (textdump=3D0, textdump@entry=3D1576585744)
>> at /usr/src/sys/kern/kern_shutdown.c:405
>> #2 0xffff0000000ec18c in db_dump (dummy=3D<optimized out>, =
dummy2=3D<optimized out>, dummy3=3D<optimized out>, dummy4=3D<optimized =
out>)
>> at /usr/src/sys/ddb/db_command.c:591
>> #3 0xffff0000000ebf88 in db_command (last_cmdp=3D<optimized out>, =
cmd_table=3D<optimized out>, dopager=3Dtrue)
>> 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=3D<optimized out>, =
code=3D<optimized out>)
>> at /usr/src/sys/ddb/db_main.c:268
>> #6 0xffff0000004b4860 in kdb_trap (type=3D60, code=3D0, tf=3D<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)
>=20
> 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:
>=20
> >      tf_size =3D regcache_map_entry_size (trapframe_map);
>=20
> 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.
>=20
> Thanks,
>=20
> Kyle Evans
>=20
> [0] https://people.freebsd.org/~kevans/kgdb-fix.diff
>=20
> @@ -126,13 +126,13 @@ aarch64_fbsd_supply_pcb(struct regcache =
*regcache, CORE_ADDR pcb_addr)=20
>=20
>=20
> static const struct regcache_map_entry aarch64_fbsd_trapframe_map[] =3D=20=

>   {=20
> -    { 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 },
>   };
>=20
> @@ -141,12 +141,12 @@ static const struct regcache_map_entry =
aarch64_fbsd_trapframe_map[] =3D
>=20
> static const struct regcache_map_entry aarch64_fbsd13_trapframe_map[] =
=3D
>   {
> -    { 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 },
>   };
>=20

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]" : "=3D&r"(td));
(kgdb) #0  get_curthread () at /usr/main-src/sys/arm64/include/pcpu.h:77
#1  doadump (textdump=3D0, textdump@entry=3D1648929296)
    at /usr/main-src/sys/kern/kern_shutdown.c:405
#2  0xffff0000000f7704 in db_dump (dummy=3D<optimized out>,      =
dummy2=3D<optimized out>, dummy3=3D<optimized out>, dummy4=3D<optimized =
out>)
    at /usr/main-src/sys/ddb/db_command.c:591
#3  0xffff0000000f74e0 in db_command (last_cmdp=3D<optimized out>,      =
cmd_table=3D<optimized out>, dopager=3Dtrue)
    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=3D<optimized out>, =
code=3D<optimized out>)
    at /usr/main-src/sys/ddb/db_main.c:268
#6  0xffff0000004f4ec4 in kdb_trap (type=3D60, code=3D0, tf=3D<optimized =
out>)
    at /usr/main-src/sys/kern/subr_kdb.c:790
#7  <signal handler called>
#8  kdb_enter (why=3D<optimized out>, msg=3D<optimized out>)
    at /usr/main-src/sys/kern/subr_kdb.c:556
#9  0xffff0000004a5350 in vpanic (
    fmt=3D0xffff00000099d39c "vm_fault failed: 0x%lx error %d", ap=3D...)
    at /usr/main-src/sys/kern/kern_shutdown.c:958
#10 0xffff0000004a5168 in panic (
    fmt=3D0x12 <error: Cannot access memory at address 0x12>)
    at /usr/main-src/sys/kern/kern_shutdown.c:894
#11 0xffff00000083c708 in data_abort (td=3D0xffff000157796260,      =
frame=3D0xffff00016248b360, esr=3D2516582404, far=3D<optimized out>, =
lower=3D0)
    at /usr/main-src/sys/arm64/arm64/trap.c:392
#12 <signal handler called>
#13 dump_sa (nw=3Dnw@entry=3D0xffff00016248b7f0, attr=3Dattr@entry=3D1,  =
    sa=3D0x44572d4338374143) at =
/usr/main-src/sys/netlink/route/iface.c:226
#14 0xffff0000006b8fe0 in dump_iface (nw=3D0xffff00016248b7f0,      =
ifp=3D0xffffa00316119800, hdr=3D<optimized out>,      =
if_flags_mask=3D<optimized out>, if_flags_mask@entry=3D1648932336)
    at /usr/main-src/sys/netlink/route/iface.c:327
#15 0xffff0000006bb0bc in dump_cb (ifp=3D0x1, _arg=3D<optimized out>,    =
  _arg@entry=3D0xffff00016248b690)
    at /usr/main-src/sys/netlink/route/iface.c:433
#16 0xffff0000005cf488 in if_foreach_sleep (match_cb=3D<optimized out>,  =
    match_arg=3Dmatch_arg@entry=3D0xffff00016248b6d0,      =
cb=3D0xffff0000006bb0a0 <dump_cb>, =
cb_arg=3Dcb_arg@entry=3D0xffff00016248b690)
    at /usr/main-src/sys/net/if.c:4594
#17 0xffff0000006ba1c0 in rtnl_handle_getlink (hdr=3D0xffffa003198a6800, =
     nlp=3D0xffffa002ef454300, npt=3D<optimized out>)
    at /usr/main-src/sys/netlink/route/iface.c:503
#18 0xffff0000006b8390 in rtnl_handle_message (
    hdr=3Dhdr@entry=3D0xffffa003198a6800, =
npt=3Dnpt@entry=3D0xffff00016248b830)
    at /usr/main-src/sys/netlink/netlink_route.c:104
#19 0xffff0000006b5818 in nl_receive_message (hdr=3D0xffffa003198a6800,  =
    remaining_length=3D32, nlp=3D0xffffa002ef454300, =
npt=3D0xffff00016248b830)
    at /usr/main-src/sys/netlink/netlink_io.c:508
#20 nl_process_mbuf (m=3D<optimized out>, nlp=3D0xffffa002ef454300)
    at /usr/main-src/sys/netlink/netlink_io.c:582
#21 nl_process_received_one (nlp=3D0xffffa002ef454300)
    at /usr/main-src/sys/netlink/netlink_io.c:295
#22 nl_process_received (nlp=3D0xffffa002ef454300)
    at /usr/main-src/sys/netlink/netlink_io.c:322
#23 nl_taskqueue_handler (_arg=3D0xffffa002ef454300, pending=3D<optimized =
out>)
    at /usr/main-src/sys/netlink/netlink_io.c:373
#24 0xffff00000050c668 in taskqueue_run_locked (
    queue=3Dqueue@entry=3D0xffffa009ff851180)
    at /usr/main-src/sys/kern/subr_taskqueue.c:512
#25 0xffff00000050db70 in taskqueue_thread_loop (arg=3D<optimized out>,  =
    arg@entry=3D0xffffa002ef454360)
    at /usr/main-src/sys/kern/subr_taskqueue.c:824
#26 0xffff00000045b7bc in fork_exit (
    callout=3D0xffff00000050daa0 <taskqueue_thread_loop>,      =
arg=3D0xffffa002ef454360, frame=3D0xffff00016248ba00)
    at /usr/main-src/sys/kern/kern_fork.c:1160
#27 <signal handler called>
(kgdb)=20

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

Much better.

=3D=3D=3D
Mark Millard
marklmi at yahoo.com




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?008EEE6D-893C-4205-9E2C-D9922B870CBC>