问题描述
<a>案例A:</a>
当以下三个条件同时发生时,PowerPC可能会挂起:
1.将操作存储到OCM。
2.围绕此OCM存储操作发生中断。
3.存储后立即进行加载操作。
上述情况可能导致存储和装入操作出现故障并最终导致基于PowerPC的系统挂起。
<a>案例B:</a>
此外,以下拐角条件也可能导致系统挂起:
(1)
store reg,DSOCM < – 此处发生异常
商店注册,DSOCM
要么
当异常命中存储多个操作(将多个寄存器保存到DSOCM)或者存储多个跟随加载时,会发生同样的问题:
(2)
存储多个29,DSOCM < – 此处发生异常
要么
(3)
加载reg,DSOCM
存储多个31,DSOCM < – 此处发生异常
如果异常在指示的指令内以某个周期命中,则会发生以下情况。在上述情况A和B-(1)中,第一个商店之后的加载或存储将显示在DPLB而不是DSOCM上。在情况B-(2)和B-(3)中,商店多个的全部或部分将显示在DPLB而不是DSOCM上。所有四种情况都会导致数据损坏,并且依赖于DPLB上总线错误中DSOCM和DPLB外设的映射。
该问题与PPC无关:OCM时钟比率。
解决/修复方法
针对“案例A”的建议解决方法:
1.在任何OCM存储之后立即插入“isync”指令,然后加载指令。
2.还建议您在步骤1中的“isync”之后发出“sync”指令,以便PowerPC完成任何未完成的商店交易。
代码示例(之前):
stw r4,0(r3)
lwz r9,4(r3)
代码示例(后):
stw r4,0(r3)
iSync中
同步
lwz r9,4(r3)
“案例A”也可以通过在商店和后续加载或商店之间添加“nop”指令来解决。
针对“案例B”的建议解决方法:
情况B-(1)可以通过在商店和后续商店之间添加“nop”指令来解决。
情况B-(2)和B-(3)不能通过软件解决。解决方案是指示编译器/汇编器不生成存储多个指令(现有编译器开关)。
如果禁用例外,则不会发生这四种情况。
注意:除非用户明确打开,否则GCC不会生成存储和加载倍数。
没有回复内容