diff options
author | Shuai Xue <xueshuai@linux.alibaba.com> | 2022-08-12 19:39:02 +0800 |
---|---|---|
committer | Shuai Xue <xueshuai@linux.alibaba.com> | 2022-08-25 09:09:54 +0800 |
commit | 9f1eadac8adb39918241865a53d624c32d6760d1 (patch) | |
tree | 70bc27b8d39f39422914845dd0d39b2263cbc842 | |
parent | b7b70cc62fb9737eff82fc191b6a0391b3f93b94 (diff) | |
download | ras-tools-9f1eadac8adb39918241865a53d624c32d6760d1.tar.gz |
einj_mem_uc: explicitly print step when inject and trigger error
The error injection mechanism is a two-step process. First inject the
error, then perform some actions to trigger it. When the system is in
early kill mode, trigger step is not needed. Explicitly print step
which are runnig on, so we can tell the how the error occurs.
Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com>
-rw-r--r-- | einj_mem_uc.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/einj_mem_uc.c b/einj_mem_uc.c index fbe0257..9dc254e 100644 --- a/einj_mem_uc.c +++ b/einj_mem_uc.c @@ -62,6 +62,9 @@ struct vendor_error_type_extension { int8_t reserved[3]; }; +#define PRINT_INJECTING printf("injecting ...\n") +#define PRINT_TRIGGERING printf("triggering ...\n") + static int check_errortype_available(char *file, unsigned long long val) { FILE *fp; @@ -110,6 +113,8 @@ static void wfile(char *file, unsigned long long val) static void inject_uc(unsigned long long addr, void *vaddr, int notrigger) { + PRINT_INJECTING; + if (Sflag) { vaddr = (void *)((long)vaddr & ~(pagesize - 1)); madvise(vaddr, pagesize, MADV_HWPOISON); @@ -129,6 +134,7 @@ static void inject_llc(unsigned long long addr, void *vaddr, int notrigger) { unsigned cpu; + PRINT_INJECTING; cpu = sched_getcpu(); wfile(EINJ_ETYPE, 0x2); wfile(EINJ_ADDR, addr); @@ -338,11 +344,13 @@ static void *instr_alloc(void) int trigger_single(char *addr) { + PRINT_TRIGGERING; return addr[0]; } int trigger_double(char *addr) { + PRINT_TRIGGERING; return addr[0] + addr[1]; } @@ -350,11 +358,13 @@ int trigger_split(char *addr) { long *a = (long *)(addr - 1); + PRINT_TRIGGERING; return a[0]; } int trigger_write(char *addr) { + PRINT_TRIGGERING; addr[0] = 'a'; return 0; } @@ -403,6 +413,7 @@ int trigger_memcpy(char *addr) char *src = addr - memcpy_runup; char *dst = addr + pagesize / 2; + PRINT_TRIGGERING; dst -= memcpy_align; do_memcpy(dst, src, memcpy_size); return 0; @@ -420,6 +431,7 @@ int trigger_copyin(char *addr) return -1; } (void)unlink(filename); + PRINT_TRIGGERING; if ((ret = write(copyin_fd, addr - memcpy_runup, memcpy_size)) != memcpy_size) { if (ret == -1) fprintf(stderr, "%s: couldn't write temp file (errno=%d)\n", progname, errno); @@ -440,6 +452,7 @@ int trigger_copyout(char *addr) return -1; } rewind(pcfile); + PRINT_TRIGGERING; ret = fread(buf, 1, pagesize, pcfile); fprintf(stderr, "%s: read returned %d\n", progname); @@ -448,12 +461,14 @@ int trigger_copyout(char *addr) int trigger_patrol(char *addr) { + PRINT_TRIGGERING; sleep(1); } #ifdef __x86_64__ int trigger_llc(char *addr) { + PRINT_TRIGGERING; asm volatile("clflush %0" : "+m" (*addr)); } #elif __aarch64__ @@ -462,7 +477,10 @@ int trigger_llc(char *addr) {} int trigger_instr(char *addr) { - int ret = dosums(); + int ret; + + PRINT_TRIGGERING; + ret = dosums(); if (ret != 729) printf("Corruption during instruction fault recovery (%d)\n", ret); @@ -480,6 +498,7 @@ int trigger_futex(char *addr) { int ret; + PRINT_TRIGGERING; ret = futex((int *)addr, FUTEX_WAIT, 0, NULL, NULL, 0); if (ret == -1) printf("futex returned with errno=%d\n", errno); |