aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShuai Xue <xueshuai@linux.alibaba.com>2022-09-05 20:50:35 +0800
committerShuai Xue <xueshuai@linux.alibaba.com>2022-09-05 21:07:32 +0800
commita98884b2782ab8e3d0e4465fa3788f29be00f171 (patch)
treecf8de1461663851729185e57f0c128e6f9a35202
parentcb000779db6e81845e3b19f24eea9ba53378bccb (diff)
downloadras-tools-a98884b2782ab8e3d0e4465fa3788f29be00f171.tar.gz
einj_mem_uc: trigger single with an offset
The Advanced ECC X4 employs symbol-based Reed-Solomon encoding. One symbol is 8 bits, message (data) length is 32 symbols (256 bits), ECC parity length is 4 symbols (32 bits). When we inject a UC error, the platfrom may only poison 32 symbols, in other words, only half cacheline is poisoned. Therefore, add a parameter to trigger with offset, e.g: ./einj_mem_uc single #equals to ./einj_mem_uc -z 0 single ./einj_mem_uc -z 32 single In such scenario, the former will signal a exception while the latter will not. Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com>
-rw-r--r--einj_mem_uc.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/einj_mem_uc.c b/einj_mem_uc.c
index 9be39a2..44b8358 100644
--- a/einj_mem_uc.c
+++ b/einj_mem_uc.c
@@ -510,10 +510,17 @@ static void *instr_alloc(void)
return (void *)((long)p & ~(pagesize - 1));
}
+/*
+ * parameters to the single and write tests.
+ */
+int trigger_offset = 0; /* where to hit after the poison addr */
+
int trigger_single(char *addr)
{
+ char *target = addr + trigger_offset;
+
PRINT_TRIGGERING;
- return addr[0];
+ return target[0];
}
int trigger_double(char *addr)
@@ -530,16 +537,11 @@ int trigger_split(char *addr)
return a[0];
}
-/*
- * parameters to the write tests.
- */
-int write_offset = 0; /* where to hit after the poison addr */
-
int trigger_write(char *addr)
{
- PRINT_TRIGGERING;
- char *target = addr + write_offset;
+ char *target = addr + trigger_offset;
+ PRINT_TRIGGERING;
target[0] = 'a';
return 0;
}
@@ -554,7 +556,7 @@ int trigger_write(char *addr)
int trigger_write_byte(char *addr)
{
int8_t __pu_val = 0x1E;
- char *target = addr + write_offset;
+ char *target = addr + trigger_offset;
PRINT_TRIGGERING;
__put_mem_asm("strb", "%w", __pu_val, target);
@@ -565,7 +567,7 @@ int trigger_write_byte(char *addr)
int trigger_write_word(char *addr)
{
int16_t __pu_val = 0x1EFF;
- char *target = addr + write_offset;
+ char *target = addr + trigger_offset;
PRINT_TRIGGERING;
__put_mem_asm("strh", "%w", __pu_val, target);
@@ -576,7 +578,7 @@ int trigger_write_word(char *addr)
int trigger_write_dword(char *addr)
{
int32_t __pu_val = 0x1FFFEEEE;
- char *target = addr + write_offset;
+ char *target = addr + trigger_offset;
PRINT_TRIGGERING;
__put_mem_asm("str", "%w", __pu_val, target);
@@ -586,7 +588,7 @@ int trigger_write_dword(char *addr)
int trigger_write_qword(char *addr)
{
int64_t __pu_val = 0x1EEEFFFFFEEEE;
- char *target = addr + write_offset;
+ char *target = addr + trigger_offset;
PRINT_TRIGGERING;
__put_mem_asm("str", "%x", __pu_val, target);
@@ -965,7 +967,7 @@ int main(int argc, char **argv)
parse_memcpy(optarg);
break;
case 'z':
- write_offset = strtod(optarg, NULL);
+ trigger_offset = strtod(optarg, NULL);
break;
case 'S':
Sflag = 1;