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 <mark...@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]" : "=&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 },
};