如何在QEMU中观察aarch64系统寄存器?

时间:2017-09-25 22:21:56

标签: arm qemu arm64 gdbserver

我在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

3 个答案:

答案 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
...

它是在https://github.com/qemu/qemu/commit/200bf5b7ffe中实现的。