diff options
author | Shuai Xue <xueshuai@linux.alibaba.com> | 2022-08-12 14:58:44 +0800 |
---|---|---|
committer | Shuai Xue <xueshuai@linux.alibaba.com> | 2022-08-30 17:11:59 +0800 |
commit | af0669f8305057bb415b56b02bea70c7cc45fef0 (patch) | |
tree | 1abee82e783754a97719aef8a034dc166d985040 | |
parent | 49bded454d33278c1b40a73af04513fefc7da0d6 (diff) | |
download | ras-tools-af0669f8305057bb415b56b02bea70c7cc45fef0.tar.gz |
einj_mem_uc: add a case for hugetlb page
Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com>
-rw-r--r-- | einj_mem_uc.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/einj_mem_uc.c b/einj_mem_uc.c index 2438110..de0082a 100644 --- a/einj_mem_uc.c +++ b/einj_mem_uc.c @@ -24,6 +24,10 @@ #include <sys/syscall.h> #include <linux/futex.h> +#ifndef MAP_HUGETLB +#define MAP_HUGETLB 0x40000 +#endif + extern long long vtop(long long); extern void proc_cpuinfo(int *nsockets, int *ncpus, char *model, int *modelnum, int **apicmap); extern void proc_interrupts(long *nmce, long *ncmci); @@ -319,6 +323,41 @@ static void *thp_data_alloc(void) return p + MB(64); } +int get_huge_pagesize(void) +{ + FILE *fp; + char *line = NULL; + size_t linelen = 0; + int hpagesize = 0; + if ((fp = fopen("/proc/meminfo", "r")) == NULL) { + fprintf(stderr, "open /proc/meminfo"); + exit(1); + } + while (getline(&line, &linelen, fp) > 0) { + if (sscanf(line, "Hugepagesize: %d kB", &hpagesize) >= 1) + break; + } + free(line); + fclose(fp); + return hpagesize * 1024; +} + +static void *hugetlb_alloc(void) +{ + int HPS = get_huge_pagesize(); + char *p = mmap(NULL, HPS, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON|MAP_HUGETLB, -1, 0); + int i; + + if (p == NULL) { + fprintf(stderr, "%s: cannot allocate memory\n", progname); + exit(1); + } + srandom(getpid() * time(NULL)); + for (i = 0; i < HPS; i++) + p[i] = random(); + return p + HPS / 4; +} + static void *data_alloc(void) { char *p = mmap(NULL, pagesize, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0); @@ -649,6 +688,10 @@ struct test { thp_data_alloc, inject_uc, 1, trigger_single, F_MCE|F_CMCI|F_SIGBUS, }, { + "hugetlb", "Try to inject in hugetlb page, generates SRAR machine check", + hugetlb_alloc, inject_uc, 1, trigger_single, F_MCE|F_CMCI|F_SIGBUS, + }, + { "store", "Write to target address. Should generate a UCNA/CMCI", data_alloc, inject_uc, 1, trigger_write, F_CMCI, }, |