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;