QEMU中'singlestep'和'singlestep_enabled'变量的区别

The difference between 'singlestep' and 'singlestep_enabled' variables in QEMU

因此,我正在将一个新的特定架构集成到 QEMU 模拟器中(QEMU 中的实现类似于 OpenRISC 架构,因此您在回答时可以依赖它),并且我 运行 进行了一些测试。
QEMU 的版本是 2.0.93

  1. 当我 运行 在正常模式下测试时,QEMU 以错误的答案结束
  2. 当我 运行 处于 -singlestep 模式时,QEMU 失败,我的断言在 运行 单步
  3. 时将超过 1 个命令进入 TargetBlock
  4. 当我使用 运行 QEMU with GDB 时,它提供 singlestep_enabled 模式,var 等于 7(意思是 SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER),我得到了测试的正确答案。

问题是,为什么会这样,这两种模式之间的实际执行差异是什么? 我在网上找不到太多东西,因为到目前为止 QEMU 的文档还很少

这两个标志执行不同的功能。

'singlestep' 是一个布尔值,指示是否给出了命令行“-singlestep”选项。这基本上将 QEMU 置于一种模式,即在每个 TB 中只放置一个访客指令。我们实际上并没有在每条指令后停止。

'singlestep_enabled' 是每个 CPU,当 gdb 存根想要执行单步时设置(通过 cpu_single_step() 函数)。然后,目标前端将发出执行单个指令并引发调试异常的代码。 (然后 gdb 存根将处理该异常并将 return 控制权交给调试器。)

您可能会在代码中看到的第三种单步是模拟目标 CPU 的内置调试单步行为,我们至少在 x86 和 ARM 上实现了这种行为。这通常以特定于目标的方式处理,以提供访客 CPU 所需的步进语义。

如果您的代码为单步操作和正常操作生成不同的答案,这可能意味着您在生成 TCG 代码的方式中存在错误:可能在辅助函数上没有正确的标志,或者对 TCG 处理不当当地人。或者,当发生 load/store 异常时,您可能无法正确恢复状态。

旁注:2.0.93 是 QEMU 的旧版本,甚至不是发行版(它是 2.1 的候选发行版)。如果您正在开发新的目标前端,您应该与当前的 git master 一起工作。