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