diff options
author | Huang Ying <ying.huang@intel.com> | 2008-12-05 17:35:31 +0100 |
---|---|---|
committer | Andi Kleen <ak@linux.intel.com> | 2008-12-05 17:35:31 +0100 |
commit | ad7ee221692a56dc1600d596f445368fd4b9525b (patch) | |
tree | 85f10366a86a7485b77381d3e9d6628ddfd26604 | |
parent | 487e04ab04e0f485e859a2036a864e81a64a8428 (diff) | |
download | mce-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.c | 44 | ||||
-rw-r--r-- | inject.h | 2 | ||||
-rw-r--r-- | mce.lex | 3 |
3 files changed, 49 insertions, 0 deletions
@@ -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)); @@ -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); @@ -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(); |