aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiu Xinpeng <liuxp11@chinatelecom.cn>2022-03-20 18:25:40 +0800
committerTony Luck <tony.luck@intel.com>2022-03-21 09:45:31 -0700
commit38f47153c2c1679b72d1f1039ee27f636c466701 (patch)
tree7c4ebf4208eedf232d9bd0d9e889b705eab86936
parentba225f30fb762d3a6be5b5f29ad3e52af7b1d70a (diff)
downloadras-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.c34
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);