第十二章RAS extension support
12. RAS扩展支持
DynamIQ™ Shared Unit-120(DSU-120)支持可靠性、可用性、可维护性(RAS)扩展,包括Arm®v9.0-A之前的所有扩展。您可以在构建时配置选项中启用L3缓存RAM和窥探过滤RAM的错误更正码(ECC)支持。
DSU-120支持:
- L3缓存RAM和窥探过滤RAM的ECC缓存保护
- 总线传输中的污染属性
- 错误数据记录寄存器
- 故障处理中断(FHI)
- 错误恢复中断(ERI)
- 严重错误中断(CRI)
- 错误注入
节点0由核心观察,包括DSU-120的L3内存系统。有关核心或复杂观察的其他节点,请参见您的核心技术参考手册(TRM)。
有关架构RAS扩展和节点定义的更多信息,请参见Arm®的可靠性、可用性和可维护性(RAS)规范Armv8,以及Armv8-A架构配置文件。
12.1 缓存保护行为
DynamIQ™ Shared Unit-120(DSU-120)中实现的可靠性、可用性、可维护性(RAS)扩展的配置包括错误更正码(ECC)缓存保护。在这种情况下,DSU-120保护防止RAM比特单元保持不正确值的错误。
DSU-120中的RAM支持单错误更正双错误检测(SECDED)。SECDED允许检测和更正任何1位错误,并在所有受保护的RAM中检测任何2位错误。当数据和代码位全为零或全为一时,表示发生了ECC方案无法更正的错误。但是,可能通过其他方式纠正,例如重新获取缓存数据。
以下表格描述了应用于每个RAM的保护类型。DSU-120可以在任何RAM中存在单比特错误的情况下继续运行并保持功能正确。
错误更正
如果不同RAM中存在多个单比特错误,或同一RAM中不同保护粒度内存在多个单比特错误,则DSU-120保持功能正常。
如果在同一保护粒度内的单个RAM中出现双比特错误,DSU-120会检测并根据SECDED行为报告或推迟该错误。如果错误发生在包含脏数据的缓存行中,则该数据可能会丢失。
如果在同一保护粒度内出现三个或更多比特错误,则根据RAM及错误在RAM中的位置,DSU-120可能会或可能不会检测到这些错误。DSU-120的缓存保护功能在没有错误的情况下对性能影响较小。
当在L3缓存数据RAM中检测到可更正错误时,数据会在线更正后返回给请求者。
当在L3缓存标签RAM或窥探过滤RAM中检测到可更正错误时,采用以下更正机制:
- 值被更正并写回源地址(读-更正-写)。
- 进行查找重放。
DSU-120具有额外硬件,提供对硬错误更正的有限支持。硬错误是指RAM中的物理错误,导致无法写入正确值。单个硬错误可以被更正,并保证能够进展。然而,如果存在多个硬错误,在某些情况下可能导致活锁,因为该行可能会持续重放。
不可更正的错误和数据污染
如果在受ECC保护的RAM中检测到错误为2位错误,则该错误不可更正。在这种情况下,行为取决于RAM的类型,如下所示:
数据RAM或长期数据缓冲RAM
当在L3数据RAM或长期数据缓冲(LTDB)RAM中检测到不可更正错误时,带有错误的数据块会被标记为污染状态。该污染状态随后会随数据传输并存储:
- 如果数据重新分配回缓存,则存储在缓存中。
- 如果数据被移至LTDB RAM,则存储在LTDB RAM中。
污染状态为每64位数据存储一次。
如果互连支持毒性标记,则在从集群中驱逐或侦听数据时,毒性状态会与数据一起传输。当一条缓存行被标记为毒性时,不会生成中止;中止会延迟到加载或指令获取消耗了毒性数据时进行处理。
如果互连不支持毒性标记,并且一条毒性缓存行从集群中驱逐或侦听,则 DSU-120 会生成中断 nCLUSTERERRIRQ,通知软件数据可能已经丢失。
软件可以通过在集群扩展控制寄存器中设置互连数据毒性支持位来指示互连是否支持毒性标记。有关详细信息,请参见 A.1.5 IMP_CLUSTERECTLR_EL1(集群扩展控制寄存器,第 239 页)或 B.1.1.11 CLUSTERECTLR(集群扩展控制寄存器,第 379 页),具体取决于您访问寄存器的方式。
标签 RAM
当在 L3 标签 RAM 中检测到不可纠正错误时,地址或一致性状态未知,因此数据无法被标记为毒性。在这种情况下,缓存行被失效,DSU-120 生成中断 nCLUSTERERRIRQ,通知软件数据可能已经丢失。
侦听过滤器标签 RAM
当在侦听过滤器标签 RAM 中检测到不可纠正错误时,地址或一致性状态未知,因此数据无法被标记为毒性。在这种情况下,侦听过滤器条目被失效,但该行仍然保留在一个或多个核心中。DSU-120 生成中断 nCLUSTERCRITIRQ,通知软件数据可能已经丢失。
Arm 建议系统在收到此中断后尽快执行系统重置。这是因为核心缓存和侦听过滤器在此错误后变得不一致,可能导致不可预测的行为。错误的影响取决于核心类型,但可能导致进一步的数据损坏或死锁,使得无法干净地从此类错误中恢复。
12.2 错误隔离
DynamIQ™ Shared Unit-120 (DSU-120) 支持错误隔离,这意味着错误会被检测到而不会被静默传播。
错误隔离还意味着在驱逐时支持毒性标记的双重错误。这确保在消耗相关数据时报告错误。
核心中支持错误同步屏障(ESB)指令也允许进一步隔离在消耗毒性数据时报告的不精确异常。
故障检测与报告
当DynamIQ™ Shared Unit-120(DSU-120)检测到故障时,会通过故障信号触发故障处理中断(FHI)异常。FHI会反映在错误数据记录寄存器中,这些寄存器会在检测到错误的节点中更新。
故障处理中断
当ERR0CTLR.FI
被设置时,所有被DSU-120检测到的延迟错误和未更正错误都会通过nCLUSTERFAULTIRQ
信号生成FHI。如果设置了ERR0CTLR.CFI
或其他CE计数器溢出位,则所有检测到的更正错误也会生成FHI。
错误恢复中断
当ERR0CTLR.UI
被设置时,所有未更正的错误会生成错误恢复中断,通过nCLUSTERERRIRQ
信号报告。
严重错误中断
当ERR0CTLR.CI
被设置时,所有检测到的严重错误都会通过nCLUSTERCRITIRQ
信号生成严重错误中断。
清除报告的故障
信号nCLUSTERFAULTIRQ
、nCLUSTERERRIRQ
和nCLUSTERCRITIRQ
在软件通过写入ERR0STATUS
寄存器清除它们之前会一直保持激活状态。
错误检测与报告
当DSU-120消费错误时,会触发错误恢复中断(ERI)。
错误检测与报告寄存器
以下寄存器用于错误检测与报告:
- 集群错误记录特性寄存器:
CLUSTERRAS_ERR0FR
(只读寄存器),指定各种错误记录设置。 - 集群错误记录控制寄存器:
CLUSTERRAS_ERR0CTLR
。 - 集群错误记录杂项寄存器0-3:
CLUSTERRAS_ERR0MISC0-3
,记录错误位置和计数的详细信息。 - 集群伪故障生成特性寄存器:
CLUSTERRAS_ERR0PFGF
(只读寄存器)。 - 集群错误记录主状态寄存器:
CLUSTERRAS_ERR0STATUS
。
集群的可靠性、可用性和可维护性(RAS)寄存器可以通过实用总线的内存映射访问或通过核心的系统寄存器访问。
错误类型
以下描述了在 DSU-120 中可能发生的不同类型的错误及其影响:
- 已更正错误。
- 在被核心读取时,L3 数据 RAM 中的不可纠正错误可能导致精确或不精确的数据中止或预取中止,这取决于核心的实现。
- 在驱逐缓存中的行时,L3 数据 RAM 中的不可纠正错误会导致数据被标记为毒性。驱逐可能是由于自然驱逐、高级缓存的行填充、缓存维护操作或侦听。如果毒性行因任何原因从集群中被驱逐,并且互连不支持数据毒性,则会触发 nCLUSTERERRIRQ 信号。
- 在 L3 标签 RAM 或侦听控制单元(SCU)过滤器 RAM 中的不可纠正错误会导致 nCLUSTERERRIRQ 信号被触发。
Arm 建议将 ERRIRQ 信号连接到中断控制器,以便在信号被触发时生成中断或系统错误。可以通过写入 CLUSTERRAS_ERR0STATUS 寄存器来清除故障和错误中断引脚。
当带有数据 RAM 错误的脏缓存行从集群中驱逐时,主接口上的写入仍会发生。然而,如果错误是不可纠正的,则:
- 如果 DSU-120 配置为 AXI 主端口,则未更正的数据会被写入,并且错误会在 RAS 寄存器中报告。
- 如果 DSU-120 配置为 CHI 主端口,则未更正的数据会被写入,但数据毒性字段会指示存在数据错误。
当侦听命中具有不可纠正数据错误的行时,会发生以下情况:
- 如果侦听需要数据,则数据将被返回。
- 如果 DSU-120 配置为 CHI 主端口,侦听响应将指示数据是毒性(如果支持),或者存在错误。
如果侦听命中具有不可纠正错误的标签,则视为侦听未命中。因为错误意味着不清楚缓存行是否有效。
如果加速器一致性端口(ACP)访问读取具有不可纠正错误的缓存行,则返回 ACP 响应以指示从设备错误。
有时,错误可能会被多次计数。例如,在行被驱逐之前,多次访问可能会读取具有错误的位置。
12.4.1 错误报告和性能监测
所有检测到的内存错误和错误更正代码(ECC)错误都会触发 MEMORY_ERROR 事件。如果选择了该事件并且计数器已启用,则性能监测单元(PMU)计数器会对其进行计数。在安全状态下,仅在 IMP_CLUSTERPMMDCR_EL3.SPME 被断言时,事件才会被计数。
12.4.2 不计数的错误
即使存在多个已更正错误、来源或同时存在错误和来源,每个时钟周期最多只能计数一个错误。
12.4.3 双重错误报告
如果 DSU-120 在 L3 数据 RAM 中检测到错误更正代码(ECC)错误,DSU-120 会执行一个两阶段序列,通常会导致在错误记录寄存器中报告两个错误,即使原始错误只有一个。这是因为,当 DSU-120 在 L3 数据 RAM 中检测到错误时,它会在错误记录寄存器中报告该错误,并将数据移动到长期数据缓冲区(LTDB)RAM,而不进行更正。LTDB RAM 然后读取该数据并进行更正。当这种情况发生时,DSU-120 会在错误记录寄存器中报告第二个错误。因此,L3 数据 RAM 中的 ECC 错误会被报告为发生了两个错误。
在 L3 数据 RAM 的单次读取中,如果假设错误记录最初为空,则会导致以下错误记录内容:
- 1 位错误会因报告第二个可更正错误而增加 ERR0MISC0.CECO。ERR0STATUS 的内容准确显示错误来自 L3 数据 RAM。例如,ERR0STATUS.SERR=6,ERR0STATUS.V=1 和 ERR0STATUS.CE=1。
- 2 位错误可能是延迟的或无法包含的,具体取决于数据的目标是否支持毒性。这是在 LTDB RAM 读取期间确定的。L3 数据 RAM 总是会在发生 2 位错误时生成延迟错误。
根据错误是延迟的还是无法包含的,错误记录的更新如下:
- 对于延迟错误,错误记录的内容准确显示来自 L3 数据 RAM 的错误。例如,ERR0STATUS.V=1,ERR0STATUS.DE=1 和 ERR0STATUS.SERR=6。然而,来自 LTDB RAM 的额外错误也会将 ERR0STATUS.OF 设置为 1。
无法处理的错误
对于无法处理的错误,错误记录的内容显示了LTDB RAM错误,但并未提供原始L3数据RAM错误的详细信息。例如,ERR0STATUS.V=1
、ERR0STATUS.UE=1
、ERR0STATUS.SERR=2
。额外的错误还意味着ERR0STATUS.OF=1
。即使L3数据RAM对数据进行了污染,ERR0STATUS.PN=0
。
错误注入
错误注入用于测试错误检测、报告和记录结构,通过故意在错误报告逻辑中插入错误来实现。注入的错误仅为伪错误,它们会导致错误报告被信号化,但不会破坏目标位置。因此,注入的伪错误不会激活任何自动错误校正逻辑。
错误注入使用错误注入和报告寄存器插入错误。DynamIQ™ Shared Unit-120(DSU-120)可以注入以下任何错误类型:
- 更正错误(CE)
- 延迟错误(DE)
- 无法处理的错误(UC)
- UC错误,即严重(CI)错误
错误可以立即注入,也可以在32位计数器达到零时注入。可以通过ERRPFGCDN_EL1
寄存器控制计数器的值。计数器的值按时钟周期递减。
伪错误通过CLUSTERRAS_ERR0PFGCTL
(伪故障生成控制寄存器)注入。伪错误的触发取决于对缓存过滤器RAM实例或长期数据缓冲(LTDB)RAM的读取,具体取决于编程的错误类型。
通过读取缓存过滤器RAM触发的错误
UC伪错误(即CI错误)可以在查找缓存过滤器RAM实例时触发。Arm期望典型软件的执行会触发伪故障。可以通过执行对当前未在核心缓存中的可共享、可缓存地址范围的连续加载或存储事务序列,故意触发伪故障。
通过读取LTDB RAM触发的错误
所有三种错误类型(DE、CE和UC)——这些非关键错误——可以在读取LTDB RAM实例时触发。LTDB RAM的读取通常由以下操作触发:
- 从核心到集群的正常、非缓存存储事务。
- 从核心到集群的脏缓存行驱逐。
Arm 预计典型软件的执行会触发伪故障。伪故障可以通过向一个正常非缓存地址范围执行一系列连续的正常非缓存存储操作来故意触发。错误注入机制仅在错误报告寄存器中注入伪故障报告,以测试实际系统中的错误处理和错误识别软件。它不会将实际错误注入到硬件中。
12.6 电源转换期间的 ECC 错误
如果在集群关闭电源时发生 RAS 寄存器错误,则集群将被阻止关闭电源。在电源转换期间,RAM 中可能发生错误更正代码(ECC)错误。例如,这可能在硬件序列开始之前的某个软件序列期间发生。另一个可能发生错误的例子是在关闭电源序列中,当 L3 缓存被清除和失效时。尽管这些错误会在 RAS 错误记录寄存器中报告,但一旦集群或核心关闭电源,RAS 寄存器将不再可访问。
如果 RAS 寄存器报告错误,将发生以下序列:
- 适当核心或集群的 RAS 中断信号被断言。这些 RAS 中断信号为 nERRIRQ、nFAULTIRQ 和 nCTITIRQ,其中 type 可以是 CORE、CLUSTER 或 COMPLEX。例如,nCLUSTERFAULTIRQ、nCOREFAULTIRQ[CN:0] 和 nCOMPLEXFAULTIRQ[CX:0]。
- 如果电源策略单元(PPU)当前正在过渡到 OFF 电源模式,则该 OFF 电源模式请求将被拒绝。
- 如果在核心 RAM 中检测到错误,则核心会从关闭电源的 WFI 指令中唤醒。
- 如果在复杂体的共享 L2 缓存中检测到错误,并且该复杂体的最后一个核心已经完成了关闭电源序列,则该核心将唤醒并开始从复位向量执行代码。
12.7 集群 RAS 寄存器
集群的可靠性、可用性和可维护性(RAS)寄存器在内存映射视图中被视为一个单独的节点。集群 RAS 寄存器可以通过实用总线的内存映射访问或通过核心的系统寄存器访问。您必须从安全地址空间访问集群 RAS 寄存器。
- 如果以下任一情况成立,集群 RAS 寄存器被视为 RAZ/WI:
- 寄存器被标记为保留。
- 在错误的安全状态下访问寄存器。
- 任何未记录的地址被视为 RAZ/WI。
- 如果启用领域管理扩展(RME),则集群 RAS 寄存器将不存在。这是因为启用 RME 后,集群处于直接连接状态,并且直接连接配置不包含集群 RAS 寄存器。
12.7.1 AArch64 RAS 寄存器
实现定义的集群 RAS 寄存器可以通过核心的系统寄存器访问或通过实用总线的内存映射访问。以下摘要表提供了 DSU-120 中实现定义的 AArch64 集群 RAS 寄存器的概述。有关寄存器的更多信息,请点击表中的寄存器名称。
- 如果 DSU-120 配置为直接连接,则这些寄存器均不在,并且对这些寄存器的任何访问都视为 RAZ/WI。因此,如果 DSU-120 启用了领域管理扩展(RME),则这些寄存器均不在。
- 对于未列出重置值的寄存器,请参考寄存器描述页面中记录的各字段重置信息。
脏缓存行驱逐
脏缓存行从核心驱逐到集群时,Arm期望典型软件的执行会触发伪故障。可以通过对正常非缓存地址范围执行连续的正常非缓存存储操作,故意触发伪故障。错误注入机制仅将伪故障报告注入到错误报告寄存器中,以测试实际系统中的错误处理和识别软件,并不向硬件注入实际错误。
电源转换期间的ECC错误
在集群断电时,如果RAS寄存器发生错误,集群将被阻止断电。在电源转换期间,RAM中可能会发生错误更正码(ECC)错误。例如,这可能发生在硬件序列启动之前的某个软件序列中,或在清除和失效L3缓存的断电序列中。虽然这些错误会在RAS错误记录寄存器中报告,但一旦集群或核心断电,RAS寄存器将无法再访问。
如果RAS寄存器报告错误,则会发生以下序列:
- 为适当的核心或集群断言RAS中断信号。这些信号包括
n<type>ERRIRQ
、n<type>FAULTIRQ
和n<type>CTITIRQ
,其中type可以是CORE、CLUSTER或COMPLEX,例如nCLUSTERFAULTIRQ
、nCOREFAULTIRQ[CN:0]
和nCOMPLEXFAULTIRQ[CX:0]
。 - 如果电源策略单元(PPU)当前正处于向OFF电源模式过渡,则该请求将被拒绝。
- 如果在核心RAM中检测到错误,则核心将从断电的WFI指令中唤醒。
- 如果在复杂的共享L2缓存中检测到错误,且该复杂中的最后一个核心已完成其断电序列,则该核心将唤醒并从重置向量开始执行代码。
集群RAS寄存器
集群的可靠性、可用性和可维护性(RAS)寄存器在内存映射视图中被视为单独的节点。这些寄存器可以通过实用总线的内存映射访问或通过核心的系统寄存器访问。必须从安全地址空间访问集群RAS寄存器。