aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi Kleen <ak@linux.intel.com>2009-11-25 17:48:09 +0100
committerAndi Kleen <ak@linux.intel.com>2009-11-25 17:48:09 +0100
commita014d78a2716d3cbc1903d074a4ff78b483309a1 (patch)
treef80945a69723b2a6548621cc49f1ce6939914927
parent62c81cee6a935b8a0f6921806d0fa2e695fad122 (diff)
downloadmce-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.c35
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)