diff options
author | Shuai Xue <xueshuai@linux.alibaba.com> | 2022-09-05 20:50:35 +0800 |
---|---|---|
committer | Shuai Xue <xueshuai@linux.alibaba.com> | 2022-09-05 21:07:32 +0800 |
commit | a98884b2782ab8e3d0e4465fa3788f29be00f171 (patch) | |
tree | cf8de1461663851729185e57f0c128e6f9a35202 | |
parent | cb000779db6e81845e3b19f24eea9ba53378bccb (diff) | |
download | ras-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.c | 28 |
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; |