aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuang Ying <ying.huang@intel.com>2008-12-05 17:35:31 +0100
committerAndi Kleen <ak@linux.intel.com>2008-12-05 17:35:31 +0100
commitad7ee221692a56dc1600d596f445368fd4b9525b (patch)
tree85f10366a86a7485b77381d3e9d6628ddfd26604
parent487e04ab04e0f485e859a2036a864e81a64a8428 (diff)
downloadmce-inject-ad7ee221692a56dc1600d596f445368fd4b9525b.tar.gz
Support multiple CPUs better
Add a cpu information collection function init_cpu_info(). Add an array of struct mce*, each element of array corresponds MCE for one CPU. That can be used to specify MCE for each CPU. Signed-off-by: Huang Ying <ying.huang@intel.com>
-rw-r--r--inject.c44
-rw-r--r--inject.h2
-rw-r--r--mce.lex3
3 files changed, 49 insertions, 0 deletions
diff --git a/inject.c b/inject.c
index ae216c6..cddbc96 100644
--- a/inject.c
+++ b/inject.c
@@ -12,6 +12,50 @@
#include "parser.h"
#include "util.h"
+#define MAX_CPU_NUM 1024
+
+static int cpu_num;
+/* map from cpu index to cpu id */
+static int cpu_map[MAX_CPU_NUM];
+static struct mce **cpu_mce;
+
+void init_cpu_info(void)
+{
+ FILE *f = fopen("/proc/cpuinfo", "r");
+ char *line = NULL;
+ size_t linesz = 0;
+
+ if (!f)
+ err("opening of /proc/cpuinfo");
+
+ while (getdelim(&line, &linesz, '\n', f) > 0) {
+ unsigned cpu;
+ if (sscanf(line, "processor : %u\n", &cpu) == 1)
+ cpu_map[cpu_num++] = cpu;
+ }
+ free(line);
+ fclose(f);
+
+ if (!cpu_num)
+ err("geting cpu ids from /proc/cpuinfo");
+}
+
+void init_inject(void)
+{
+ cpu_mce = calloc(cpu_num, sizeof(struct mce *));
+}
+
+static inline int cpu_id_to_index(int id)
+{
+ int i;
+
+ for (i = 0; i < cpu_num; i++)
+ if (cpu_map[i] == id)
+ return i;
+ err("invalid cpu id");
+ return -1;
+}
+
static void write_mce(int fd, struct mce *m)
{
int n = write(fd, m, sizeof(struct mce));
diff --git a/inject.h b/inject.h
index 769c213..acaf94e 100644
--- a/inject.h
+++ b/inject.h
@@ -2,5 +2,7 @@ struct mce;
extern int do_dump;
+void init_cpu_info(void);
+void init_inject(void);
void submit_mce(struct mce *m);
void init_mce(struct mce *m);
diff --git a/mce.lex b/mce.lex
index 876f26c..3c4f55d 100644
--- a/mce.lex
+++ b/mce.lex
@@ -8,6 +8,7 @@
#include "parser.h"
#include "mce.tab.h"
#include "util.h"
+#include "inject.h"
int yylineno;
@@ -115,6 +116,8 @@ int main(int ac, char **av)
do_dump = 1;
av++;
}
+ init_cpu_info();
+ init_inject();
if (*argv)
yywrap();
return yyparse();