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

How to observe aarch64 system registers in QEMU?

我在 QEMU 中有一些裸机 AARCH64 软件 运行。我将 GDB 作为远程目标连接到它。 GDB 多体系结构显示从 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

不,您没有遗漏任何东西:不可能将带有 stock qemu 的 aarch64 系统寄存器作为 gdb 远程目标查看。

但您可以对 qemu 添加一些小的更改以查看它们。

对于许多其他 simulators/embedded 软件,Gdb 客户端通过 GDB RSP protocol. Server part of this protocol implemented at QEMU is called "gdb stub" (also it is common term 连接到 QEMU)。

very beginning of client and stub communications, stub sends to client a target desription - a xml file with all registers that client allowed to request. Here 处有一个用于 qemu aarch64 目标的此类文件。如您所见,客户端的 info all-registers 命令打印所有这些寄存器,而不是更多。

如果您简单地向该文件添加所需的寄存器它不起作用,您还需要向 aarch64_cpu_gdb_read_register 添加几行 - 该函数从 qemu 内部读取寄存器并将它们传递给 gdbstub。

之后构建 qemu,你就搞定了。

还有that question 如果出现问题,将帮助您查看 client/stub 通信详细信息。

QEMU 通过发送 XML GDB 目标描述格式的文件告诉 GDB 它知道哪些寄存器:https://sourceware.org/gdb/onlinedocs/gdb/Target-Descriptions.html#Target-Descriptions

其中一些直接在树中作为 XML 文件进行跟踪:https://github.com/qemu/qemu/tree/v3.0.0/gdb-xml and may be from the GDB tree: 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 发送补丁 :-)

QEMU 3.x+ 在普通的 info registers 命令中公开了 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 中实现。