diff options
author | Andi Kleen <ak@linux.intel.com> | 2009-11-25 17:48:09 +0100 |
---|---|---|
committer | Andi Kleen <ak@linux.intel.com> | 2009-11-25 17:48:09 +0100 |
commit | a014d78a2716d3cbc1903d074a4ff78b483309a1 (patch) | |
tree | f80945a69723b2a6548621cc49f1ce6939914927 | |
parent | 62c81cee6a935b8a0f6921806d0fa2e695fad122 (diff) | |
download | mce-inject-a014d78a2716d3cbc1903d074a4ff78b483309a1.tar.gz |
Check for maximum machine check bank early
Give a suitable error message for out of bounds machine
check banks instead of silently eating the error.
Signed-off-by: Andi Kleen <ak@linux.intel.com>
-rw-r--r-- | mce-inject.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/mce-inject.c b/mce-inject.c index 2269bb8..57b39ec 100644 --- a/mce-inject.c +++ b/mce-inject.c @@ -27,6 +27,8 @@ #include <unistd.h> #include <pthread.h> #include <sched.h> +#include <dirent.h> +#include <errno.h> #include "mce.h" #include "inject.h" @@ -38,6 +40,34 @@ static int cpu_num; static int *cpu_map; static struct mce **cpu_mce; +#define BANKS "/sys/devices/system/machinecheck/machinecheck0" + +int max_bank(void) +{ + static int max; + int b = 0; + struct dirent *de; + DIR *d; + + if (max) + return max; + d = opendir(BANKS); + if (!d) { + fprintf(stderr, "warning: cannot open %s: %s\n", BANKS, + strerror(errno)); + return 0xff; + } + while ((de = readdir(d)) != NULL) { + if (sscanf(de->d_name, "bank%u", &b) == 1) + if (b > max) + max = b; + + } + closedir(d); + return max; + +} + void init_cpu_info(void) { FILE *f = fopen("/proc/cpuinfo", "r"); @@ -87,6 +117,11 @@ static inline int cpu_id_to_index(int id) static void validate_mce(struct mce *m) { cpu_id_to_index(m->extcpu); + if (m->bank > max_bank()) { + fprintf(stderr, "larger machine check bank %d than supported on this cpu (%d)\n", + (int)m->bank, max_bank()); + exit(1); + } } static void write_mce(int fd, struct mce *m) |