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始终是分支目标(=工具的基本块的开始),调试器应该能够发现许多这些情况并将样本归属到正确的基本块。