aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShuai Xue <xueshuai@linux.alibaba.com>2022-08-12 19:39:02 +0800
committerShuai Xue <xueshuai@linux.alibaba.com>2022-08-25 09:09:54 +0800
commit9f1eadac8adb39918241865a53d624c32d6760d1 (patch)
tree70bc27b8d39f39422914845dd0d39b2263cbc842
parentb7b70cc62fb9737eff82fc191b6a0391b3f93b94 (diff)
downloadras-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.c21
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);