Support register name resolution in debugger part of monitor for `x` commands for ARM platforms
Goal
Currently, QEMU Monitor x
commands seem to support only x86 name resolution for $eip
but not for the rest of the platforms I tried.
Lets focus on ARM platforms, I think the register names printed in info registers
should be available for the name resolution in the x
commands as well, e.g. printing instructions from the PC or stack contents from SP
Technical details
Running ARMv7 target:
(qemu) info registers
R00=00000002 R01=80000000 R02=00000000 R03=00000000
R04=0000045e R05=00000080 R06=00000001 R07=00000000
R08=45600000 R09=45678900 R10=0804566b R11=00000000
R12=0000000a R13=88345340 R14=08345571 R15=0800000c
XPSR=010f0003 ---- T handler
s00=40400000 s01=40400000 d00=4040000040400000
s02=40c00000 s03=00000000 d01=0000000040c00000
s04=00000000 s05=00000000 d02=0000000000000000
...
(qemu) x/4i $R15
unknown register
(qemu) x/4i $r15
unknown register
(qemu) x/4i $PC
unknown register
(qemu) x/4i $pc
unknown register
(qemu) x/4i $IP
unknown register
(qemu) x/4i $ip
unknown register
Additional information
From the looks of get_monitor_def()
function from monitor/misc.c
it seems to be cross-target but somehow still doesn't work for some targets anyway.
Then grepping for the actual target implementation, it seems only i386, PPC, SPARC, and M68K support it, but nor ARM, MIPS, RISC V, etc:
[i] ℤ rg monitor_defs
target/sparc/monitor.c
59:const MonitorDef monitor_defs[] = {
162:const MonitorDef *target_monitor_defs(void)
164: return monitor_defs;
target/ppc/monitor.c
86:const MonitorDef monitor_defs[] = {
102:const MonitorDef *target_monitor_defs(void)
104: return monitor_defs;
target/i386/monitor.c
611:const MonitorDef monitor_defs[] = {
647:const MonitorDef *target_monitor_defs(void)
649: return monitor_defs;
target/m68k/monitor.c
25:static const MonitorDef monitor_defs[] = {
59:const MonitorDef *target_monitor_defs(void)
61: return monitor_defs;