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

Jon*_*ovi 4 arm qemu gdbserver arm64

我在QEMU中运行一些裸机AARCH64软件。我将GDB连接到它作为远程目标。GDB多体系结构显示了从x0到x30的通用寄存器,SP和PC。

但是,我找不到访问系统寄存器以检查DAIF系统寄存器,故障地址寄存器,故障综合症寄存器等内容的方法。这些对于调试至关重要。我已经在QEMU中使用info all-registers进行了尝试,但是输出似乎并不相关。

我是否缺少明显的东西?

PS,QEMU模型如下:

qemu-system-aarch64-机器病毒,gic_version = 3 -cpu cortex-a57 -smp 4 -m 4096

Jet*_*ura 5

不,您不会丢失任何东西:不可能将带有库存qemu的aarch64系统寄存器视为gdb远程目标。

但是您可以对qemu进行一些小的更改以查看它们。

Gdb客户端通过GDB RSP协议连接到QEMU 。在QEMU实施的该协议的服务器部分称为“ gdb存根”(也是许多其他模拟器/嵌入式软件的通用术语)。

在客户端和存根通信的最开始,存根向客户端发送目标描述 -一个xml文件,其中包含客户端允许请求的所有寄存器。是qemu aarch64目标的此类文件。如您所见,客户端的info all-registers命令将打印所有这些寄存器,而不是更多。

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

之后构建qemu,您就知道了。

同时这个问题 将帮助您查看客户端/存根通信细节,如果出现错误。


小智 5

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
...
Run Code Online (Sandbox Code Playgroud)

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