Zynq-7000,APU - 调试程序计数器采样(DBGPCSR)寄存器格式不正确

描述

DBGPCSR寄存器格式不正确,但调试工具可以计算预期的PC值和指令状态。

影响:

次要。调试工具必须识别何时正确计算程序计数器,处理器的程序计数器(PC)。

解决方法:

调试器工具可以通过读取DBGPCSR寄存器来查找预期的PC值和指令状态。

受影响的配置:

使用一个或两个ARM处理器的系统。

受影响的器件版本: 全部,没有计划修复。请参阅Zynq-7000器件咨询主答复记录

ARM体系结构将DBGPCSR寄存器指定为:

  • DBGPCSR [31:2]包含PC的位[31:2]的采样值。采样值是指令地址加上取决于处理器指令集状态的偏移量。
  • DBGPCSR [1:0]包含PC Sample Value的含义,具有以下允许值:
    • 0b00((DBGPCSR [31:2] << 2) - 8)引用ARM状态指令
    • 0bx1((DBGPCSR [31:1] << 1) - 4)引用Thumb / ThumbEE状态指令
    • 0b10实施定义。

该字段对处理器指令集状态进行编码,因此分析工具可以通过从寄存器的位[31:2]中采样的值中减去适当的偏移量来计算真实的指令地址。

在Cortex-A9中,DBGPCSR采样执行分支的目标地址(但可能仍然是推测数据中止),具有以下编码:

  • DBGPCSR [31:2]包含没有偏移的目标分支指令的地址
  • DBGPCSR [1:0]包含目标分支指令的执行状态:
    • 对于ARM状态指令,0xb00
    • 用于Thumb2状态指令的0xb01
    • 对于Jazelle状态指令,0xb10
    • 用于Thumb2EE状态指令的0xb11

影响细节

影响很小。此问题的含义是调试器工具不得依赖DBGPCSR [1:0]的指定值或从DBGPCSR [31:2]中删除任何偏移量以获得预期的PC值。从DBGPCSR [31:2]值中减去4或8将导致代码区域不太可能最近被执行或甚至不包含任何可执行代码。

半字边界的Thumb指令也是如此,在这种情况下PC [1] = 1但DBGPCSR [1] = 0,或者字边界处的ThumbEE指令,PC [1] = 0且DBGPCSR [1] = 1。

在Cortex-A9中,因为DBGPCSR始终是分支目标(=工具的基本块的开始),调试器应该能够发现许多这些情况并将样本归属到正确的基本块。

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2018-07-31 14:48:50 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它