SCP Error Injection Utility
RAS Error Injection Feature
Error injection feature is a micro-architecture feature defined by RAS to inject errors in the RAS supported system components. Components, supporting RAS, have registers for Error injection. Software can use these registers to inject an error and verify the error handling software.
Overview of Error Injection Utility
The error injection utility is referred to as einj-util in this document. Einj-util is a command-line utility designed for SCP. This utility integrates with the SCP CLI Debugger, enabling users to insert commands at runtime. Einj-util facilitates error injection into various RAS-supported components when a user provides error injection command input in the CLI. This utility helps in validating the RAS capable hardware components’ behavior when error is detected and reported.
The term “Component” defines the RAS-supported components for which error injection is supported. “Sub-component” signifies the next level of error categorization for each component, and it varies for different components. For instance, in the context of SRAM, subcomponents represent error injection in different worlds: Root, Secure, Realm, and Non-Secure. “Type” defines the various types of errors supported by each component. Error types supported are Correctable Error(CE), Deferred Error(DE), Uncorrectable Error(UE).
Procedure to inject errors into various components
Boot upto SCP CLI Debugger Shell
Launch the FVP and access the SCP UART.
Once in the SCP UART terminal, use Ctrl+e to enter the CLI.
To access the help menu for the einj-util utility, run the command einj-util -h.
The “help” command displays the CLI usage.
To exit the CLI Debugger, press Ctrl + D.
- > einj-util -h
Inject error into various components.
Usage: einj-util -comp <n> -subcomp <n> -type <n>
-comp: sram (0), tcm (1), cpu (2), rsm (3)
-subcomp:
sram: root (0), secure (1), non-secure (2), realm (3)
tcm: itcm (0), dtcm (1)
cpu: always 0 for now
rsm: secure (0), non-secure (1)
-type:
sram/tcm/rsm: correctable (0), uncorrectable (1)
cpu: correctable (0), uncorrectable (1), deferred (2)
example:
- ce into shared sram from secure world:
einj-util -comp 0 -subcomp 1 -type 0
- ce into scp itcm:
einj-util -comp 1 -subcomp 0 -type 0
- cpu ue:
einj-util -comp 2 -subcomp 0 -type 1
Various Error Injection Scenarios
Component |
Subcomponent |
Type of Error |
Error Status |
---|---|---|---|
Shared SRAM |
Secure World |
CE |
0x86000000 |
Root World |
UE |
0xa4000000 |
|
RSM SRAM |
Secure World |
CE |
0x86000000 |
Non-Secure World |
UE |
0xa4000000 |
|
TCM |
ITCM |
CE |
0x5 |
DTCM |
UE |
0x7 |
|
CPU |
Core |
CE |
0xC6000000 |
UE |
0x60000000 |
||
DE |
0x40800000 |
SRAM ECC Error Status register bit descriptions
AV[31:31] : Address Valid
MV[26:26] : Miscellaneous Registers Valid
CE[25:24] : Correctable error has occurred
DE[23:23] : Deferred Error
UET[21:20] : Uncorrected Error Type
SERR[7:0] : Primary Error code
CPU error injection
Run the following command to inject a CPU correctable error.
> einj-util -comp 2 -subcomp 0 -type 0
The ErrorStatus register captures information about the triggered CPU error.
Injecting CPU CE ErrStatus 0xC6000000 ErrAddress 0x0
Core error injection ERXSTATUS_EL1 register description
AV[31:31] : Address Valid
V[30:30] : Status Register Valid
MV[26:26] : Miscellaneous Registers Valid
CE[25:24] : Corrected Error
DE[24:24] : Deferred Error
UET[21:20] : Uncorrected Error Type
SERR[4:0] : Primary Error code
SCP ITCM/DTCM error injection
Invoke the following command to inject a correctable error into SCP ITCM.
> einj-util -comp 1 -subcomp 0 -type 0
The error record information will be logged in the following manner.
ITCM Injecting CE [TCM_INT] fwk_int number = 21 [TCM_INT] ErrCode = 0x9 [TCM_INT] ErrStatus = 0x5 [TCM_INT] ErrAddr = 0x34d8
TCMECC_ERRSTATUS bit descriptions
OF[2:2] : Multiple errors occurred before SW cleared the current error
UE[1:1] : Uncorrectable and uncontainable error have occurred
CE[0:0] : Correctable error has occurred
RSM SRAM error injection
Invoke the following command to trigger a correctable error in RSM SRAM from the secure world.
> einj-util -comp 3 -subcomp 0 -type 0
The error record information is logged as follows:
Injecting CE into RSM SRAM [RSM_INT] ErrStatus = 0x86000000 [RSM_INT] fwk_int number = 29 [RSM_INT] ErrAddr = 0x10
Note: Refer to the SRAM ECC Error Status register bit descriptions to decode the error status for RSM SRAM errors.
Expected output for various error injection scenarios
Component, Subcomp, Type of Error |
Expected Output |
---|---|
Shared SRAM Secure World CE einj-util -comp 0 -subcomp 1 -type 0 |
Injecting CE into Shared SRAM [SRAM_INT] ErrStatus = 0x86000000 [SRAM_INT] fwk_int number = 24 [SRAM_INT] ErrAddr = 0x10 |
Shared SRAM Secure World UE einj-util -comp 0 -subcomp 1 -type 1 |
Injecting UE into Shared SRAM [SRAM_INT] ErrStatus = 0xa4000000 [SRAM_INT] fwk_int number = 24 [SRAM_INT] ErrAddr = 0x1 |
Shared SRAM Root CE einj-util -comp 0 -subcomp 0 -type 0 |
Injecting CE into Shared SRAM [SRAM_INT] ErrStatus = 0x86000000 [SRAM_INT] fwk_int number = 26 [SRAM_INT] ErrAddr = 0x10 |
Shared SRAM Root UE einj-util -comp 0 -subcomp 0 -type 1 |
Injecting UE into Shared SRAM [SRAM_INT] ErrStatus = 0xa4000000 [SRAM_INT] fwk_int number = 26 [SRAM_INT] ErrAddr = 0x10 |
RSM SRAM Secure World CE einj-util -comp 3 -subcomp 0 -type 0 |
Injecting CE into RSM SRAM [RSM_INT] ErrStatus = 0x86000000 [RSM_INT] fwk_int number = 29 [RSM_INT] ErrAddr = 0x10 |
RSM SRAM Secure World UE einj-util -comp 3 -subcomp 0 -type 1 |
Injecting UE into RSM SRAM [RSM_INT] ErrStatus = 0xa4000000 [RSM_INT] fwk_int number = 29 [RSM_INT] ErrAddr = 0x10 |
RSM SRAM Non-secure World CE einj-util -comp 3 -subcomp 1 -type 0 |
Injecting CE into RSM SRAM [RSM_INT] ErrStatus = 0x86000000 [RSM_INT] fwk_int number = 29 [RSM_INT] ErrAddr = 0x10 |
RSM SRAM Non-secure World UE einj-util -comp 3 -subcomp 1 -type 1 |
Injecting UE into RSM SRAM [RSM_INT] ErrStatus = 0xa4000000 [RSM_INT] fwk_int number = 29 [RSM_INT] ErrAddr = 0x10 |
TCM ITCM CE einj-util -comp 1 -subcomp 0 -type 0 |
ITCM Injecting CE [TCM_INT] ErrStatus = 0x5 [TCM_INT] fwk_int number = 21 [TCM_INT] ErrCode = 0x9 [TCM_INT] ErrAddr = 0x6b38 |
TCM ITCM UE einj-util -comp 1 -subcomp 0 -type 1 |
[TCM_INT] ErrStatus = 0x7 [TCM_INT] fwk_int number = 21 [TCM_INT] ErrCode = 0x9 [TCM_INT] ErrAddr = 0x6a46 ITCM Injecting UE |
TCM DTCM CE einj-util -comp 1 -subcomp 1 -type 0 |
DTCM Injecting CE [TCM_INT] ErrStatus = 0x7 [TCM_INT] fwk_int number = 21 [TCM_INT] ErrCode = 0xb [TCM_INT] ErrAddr = 0x6b3c |
TCM DTCM UE einj-util -comp 1 -subcomp 1 -type 1 |
[TCM_INT] ErrStatus = 0x7 [TCM_INT] fwk_int number = 21 [TCM_INT] ErrCode = 0xb [TCM_INT] ErrAddr = 0x6a46 DTCM Injecting UE |
CPU Core CE einj-util -comp 2 -subcomp 0 -type 0 |
Injecting CPU CE ErrStatus 0xC6000000 ErrAddress 0x0 |
CPU Core UE einj-util -comp 2 -subcomp 0 -type 1 |
Injecting CPU UE ErrStatus 0x60000000 ErrAddress 0x0 |
CPU Core DE einj-util -comp 2 -subcomp 0 -type 2 |
Injecting CPU DE ErrStatus 0x40800000 ErrAddress 0x0 |
Copyright (c) 2024 Arm Limited. All rights reserved.