Merge branch 'master' of git://git.kernel.org/pub/scm/utils/cpu/mce/mce-inject
diff --git a/Makefile b/Makefile
index 48a871e..b8e119f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,12 @@
prefix := /usr
manprefix := ${prefix}/share
CFLAGS := -Os -g -Wall
-LDFLAGS += -lpthread
+LDFLAGS += -pthread
OBJ := mce.tab.o lex.yy.o mce-inject.o util.o
-GENSRC := mce.tab.c mce.tab.h lex.yy.c
+GENSRC := mce.tab.c lex.yy.c
SRC := mce-inject.c util.c
-CLEAN := ${OBJ} ${GENSRC} inject mce-inject .depend
+CLEAN := ${OBJ} ${GENSRC} mce.tab.h inject mce-inject .depend
DISTCLEAN := .depend .gdb_history
.PHONY: clean depend install
diff --git a/mce-inject.8 b/mce-inject.8
index aca3e40..373e6e5 100644
--- a/mce-inject.8
+++ b/mce-inject.8
@@ -61,6 +61,12 @@
.I NOBROADCAST
Don't broadcast exceptions to all CPUs. Default is to broadcast UC
+.I IRQBROADCAST
+Broadcast IRQ to all CPUs that not getting error injection.
+
+.I NMIBROADCAST
+Broadcast NMI to all CPUs that not getting error injection.
+
.I IN_IRQ
MCE should be injected in interrupt context
diff --git a/mce-inject.c b/mce-inject.c
index 9bfd2ef..b2d5c19 100644
--- a/mce-inject.c
+++ b/mce-inject.c
@@ -219,8 +219,13 @@
err("pthread_create");
}
- if (has_random)
- m->inject_flags |= MCJ_NMI_BROADCAST;
+ if (has_random) {
+ if (mce_flags & MCE_IRQBROADCAST)
+ m->inject_flags |= MCJ_IRQ_BRAODCAST;
+ else
+ /* default using NMI BROADCAST */
+ m->inject_flags |= MCJ_NMI_BROADCAST;
+ }
/* could wait here for the threads to start up, but the kernel
timeout should be long enough to catch slow ones */
@@ -261,8 +266,11 @@
inject_fd = open("/dev/mcelog", O_RDWR);
if (inject_fd < 0)
err("opening of /dev/mcelog");
- if (!(m->inject_flags & MCJ_EXCEPTION))
+ if (!(m->inject_flags & MCJ_EXCEPTION)) {
mce_flags |= MCE_NOBROADCAST;
+ mce_flags &= ~MCE_IRQBROADCAST;
+ mce_flags &= ~MCE_NMIBROADCAST;
+ }
do_inject_mce(inject_fd, m);
for (i = 0; i < cpu_num; i++) {
diff --git a/mce.h b/mce.h
index ce9d5a1..c0668ad 100644
--- a/mce.h
+++ b/mce.h
@@ -39,6 +39,7 @@
#define MCJ_CTX_IRQ 2 /* inject context: IRQ */
#define MCJ_NMI_BROADCAST 4 /* do NMI broadcasting */
#define MCJ_EXCEPTION 8 /* raise as exception */
+#define MCJ_IRQ_BRAODCAST 0x10 /* do IRQ broadcasting */
#define MCJ_CTX_SET(flags, ctx) \
do { \
diff --git a/mce.lex b/mce.lex
index cc324b2..ce8a9ae 100644
--- a/mce.lex
+++ b/mce.lex
@@ -77,6 +77,8 @@
KEY(MCGSTATUS),
KEY(PROCESSOR),
KEY(NOBROADCAST),
+ KEY(IRQBROADCAST),
+ KEY(NMIBROADCAST),
KEY(HOLD),
KEY(IN_IRQ),
KEY(IN_PROC),
diff --git a/mce.y b/mce.y
index 9a8bb03..a9421ee 100644
--- a/mce.y
+++ b/mce.y
@@ -40,7 +40,8 @@
%}
-%token STATUS RIP TSC ADDR MISC CPU BANK MCGSTATUS NOBROADCAST HOLD
+%token STATUS RIP TSC ADDR MISC CPU BANK MCGSTATUS HOLD
+%token NOBROADCAST IRQBROADCAST NMIBROADCAST
%token IN_IRQ IN_PROC PROCESSOR TIME SOCKETID APICID MCGCAP
%token POLL EXCP
%token CORRECTED UNCORRECTED FATAL MCE
@@ -62,8 +63,8 @@
| CPU NUMBER ':'
MACHINE CHECK EXCEPTION ':' NUMBER BANK NUMBER ':'
NUMBER { init();
- m.cpu = $2; m.mcgstatus = $6;
- m.bank = $8; m.status = $10; }
+ m.cpu = $2; m.mcgstatus = $8;
+ m.bank = $10; m.status = $12; }
;
mce: mce_term
@@ -87,6 +88,8 @@
| MISC NUMBER { m.misc = $2; m.status |= MCI_STATUS_MISCV; }
| PROCESSOR NUMBER ':' NUMBER { m.cpuvendor = $2; m.cpuid = $4; }
| NOBROADCAST { mce_flags |= MCE_NOBROADCAST; }
+ | IRQBROADCAST { mce_flags |= MCE_IRQBROADCAST; }
+ | NMIBROADCAST { mce_flags |= MCE_NMIBROADCAST; }
| HOLD { mce_flags |= MCE_HOLD; }
| IN_IRQ { MCJ_CTX_SET(m.inject_flags, MCJ_CTX_IRQ); }
| IN_PROC { MCJ_CTX_SET(m.inject_flags, MCJ_CTX_PROCESS); }
diff --git a/parser.h b/parser.h
index c25b777..37dfa28 100644
--- a/parser.h
+++ b/parser.h
@@ -14,6 +14,8 @@
MCE_NOBROADCAST = (1 << 0),
MCE_HOLD = (1 << 1),
MCE_RAISE_MODE = (1 << 2),
+ MCE_IRQBROADCAST = (1 << 3),
+ MCE_NMIBROADCAST = (1 << 4),
};
extern enum mceflags mce_flags;