我在QEMU中运行了一些裸机AARCH64软件。我将GDB作为远程目标连接到它。 GDB multi-arch显示从x0到x30,SP和PC的通用寄存器。
但是,我无法找到访问系统寄存器的方法来检查DAIF系统寄存器,故障地址寄存器,故障综合症寄存器等等。这些对于调试至关重要。我在QEMU内使用 info all-registers 进行了尝试,但输出看起来并不相关。
我错过了一些明显的东西吗?
PS,QEMU模型如下:
qemu-system-aarch64 -machine virt,gic_version = 3 -cpu cortex-a57 -smp 4 -m 4096
答案 0 :(得分:4)
不,你不会遗漏任何东西:无法查看aarch64系统寄存器和库存qemu作为gdb远程目标。
但你可以在qemu上添加一些小改动来查看它们。
Gdb客户端通过GDB RSP协议连接到QEMU。在QEMU中实现的此协议的服务器部分称为“gdb存根”(对于许多其他模拟器/嵌入式软件,它也是common term)。
在客户端和存根通信的very beginning处,存根向客户端发送target desription - 一个xml文件,其中包含客户端允许请求的所有寄存器。 Here是qemu aarch64目标的此类文件。如您所见,客户端的 info all-registers 命令打印所有这些寄存器,而不是更多。
如果您简单地将所需的寄存器添加到该文件它不起作用,您还需要向aarch64_cpu_gdb_read_register添加几行 - 该函数从qemu内部读取寄存器并将它们传递给gdbstub。
之后构建qemu,你就明白了。
另外that question 如果出现问题,将帮助您查看客户端/存根通信详细信息。
答案 1 :(得分:0)
QEMU通过发送GDB的目标描述格式为https://sourceware.org/gdb/onlinedocs/gdb/Target-Descriptions.html#Target-Descriptions
的XML文件来告诉GDB它知道哪些注册信息其中一些可以直接作为XML文件在树中直接跟踪:https://github.com/qemu/qemu/tree/v3.0.0/gdb-xml,并且可能来自GDB树:https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gdb/features/aarch64-core.xml;h=eb6364eb0996313420a4098509cb7f0e0fc32bec
但是其他一些动态生成以反映系统配置。
特别是,系统寄存器是即时生成的,并以system-registers.xml
的形式发送,请参见:https://github.com/qemu/qemu/blob/v3.0.0/target/arm/gdbstub.c#L174
因此,无论您缺少什么寄存器,都应将它们添加到该XML中,并使用与其他值相同的正确值填充它们。
然后将补丁发送到上游QEMU:-)
答案 2 :(得分:0)
QEMU 3.x +在常规信息寄存器命令中公开了aarch64系统寄存器。例如:
(gdb) info registers
...
MVFR1_EL1 0x12111111 303108369
MDRAR_EL1 0x0 0
OSLSR_EL1 0xa 10
CTR_EL0 0x8444c004 2219098116
REVIDR_EL1 0x0 0
SCTLR 0xc50838 12912696
ACTLR_EL1 0x0 0
CPACR 0x0 0
...