diff options
author | Liu Xinpeng <liuxp11@chinatelecom.cn> | 2022-03-20 18:25:40 +0800 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2022-03-21 09:45:31 -0700 |
commit | 38f47153c2c1679b72d1f1039ee27f636c466701 (patch) | |
tree | 7c4ebf4208eedf232d9bd0d9e889b705eab86936 | |
parent | ba225f30fb762d3a6be5b5f29ad3e52af7b1d70a (diff) | |
download | ras-tools-38f47153c2c1679b72d1f1039ee27f636c466701.tar.gz |
Check the injected error type available before write error type
before:
0: llc vaddr = 0x7fee6b865400 paddr = f90e0eb400
./einj_mem_uc: write error on '/sys/kernel/debug/apei/einj/error_type'
after:
0: llc vaddr = 0x7f86e6bac400 paddr = f915477400
./einj_mem_uc: no support for error type: 0x2
[Tony: re-word error message]
Signed-off-by: Liu Xinpeng <liuxp11@chinatelecom.cn>
Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r-- | einj_mem_uc.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/einj_mem_uc.c b/einj_mem_uc.c index 843a382..d42937c 100644 --- a/einj_mem_uc.c +++ b/einj_mem_uc.c @@ -40,6 +40,7 @@ static int *apicmap; #define CACHE_LINE_SIZE 64 #define EINJ_ETYPE "/sys/kernel/debug/apei/einj/error_type" +#define EINJ_ETYPE_AVAILABLE "/sys/kernel/debug/apei/einj/available_error_type" #define EINJ_ADDR "/sys/kernel/debug/apei/einj/param1" #define EINJ_MASK "/sys/kernel/debug/apei/einj/param2" #define EINJ_APIC "/sys/kernel/debug/apei/einj/param3" @@ -47,10 +48,41 @@ static int *apicmap; #define EINJ_NOTRIGGER "/sys/kernel/debug/apei/einj/notrigger" #define EINJ_DOIT "/sys/kernel/debug/apei/einj/error_inject" +static int check_errortype_available(char *file, unsigned long long val) +{ + FILE *fp; + int ret = -1; + unsigned long long available_error_type; + + if (strcmp(file, EINJ_ETYPE) != 0) return 0; + + fp = fopen(EINJ_ETYPE_AVAILABLE, "r"); + if (!fp) { + fprintf(stderr, "%s: cannot open '%s'\n", progname, file); + exit(1); + } + + while (fscanf(fp, "%llx ", &available_error_type)) { + if (val == available_error_type) { + ret = 0; + break; + } + } + + fclose(fp); + return ret; +} + static void wfile(char *file, unsigned long long val) { - FILE *fp = fopen(file, "w"); + FILE *fp; + + if (check_errortype_available(file, val) != 0) { + fprintf(stderr, "%s: no support for error type: 0x%llx\n", progname, val); + exit(1); + } + fp = fopen(file, "w"); if (fp == NULL) { fprintf(stderr, "%s: cannot open '%s'\n", progname, file); exit(1); |