aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShuai Xue <xueshuai@linux.alibaba.com>2022-08-12 14:58:44 +0800
committerShuai Xue <xueshuai@linux.alibaba.com>2022-08-30 17:11:59 +0800
commitaf0669f8305057bb415b56b02bea70c7cc45fef0 (patch)
tree1abee82e783754a97719aef8a034dc166d985040
parent49bded454d33278c1b40a73af04513fefc7da0d6 (diff)
downloadras-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.c43
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,
},