All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC[PATCH 0/4] POWER9 machine check handler
@ 2017-02-16 17:01 Nicholas Piggin
  2017-02-16 17:01 ` [PATCH 1/4] powerpc: machine check allow handler to set severity and initiator Nicholas Piggin
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Nicholas Piggin @ 2017-02-16 17:01 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Nicholas Piggin

So far I've only got this tested in mambo simulator, but
some recoverable and unrecoverable events seem to work.

Thanks,
Nick

Nicholas Piggin (4):
  powerpc: machine check allow handler to set severity and initiator
  powerpc/powernv: machine check rework recovery flushing
  powerpc/powernv: cope with non-synchronous machine checks
  powerpc/powernv: handle POWER9 machine checks

 arch/powerpc/include/asm/bitops.h     |   4 +
 arch/powerpc/include/asm/mce.h        | 108 +++++++++++-
 arch/powerpc/kernel/cputable.c        |   3 +
 arch/powerpc/kernel/mce.c             |  90 +++++++++-
 arch/powerpc/kernel/mce_power.c       | 324 +++++++++++++++++++++++++++-------
 arch/powerpc/platforms/powernv/opal.c |  19 +-
 6 files changed, 465 insertions(+), 83 deletions(-)

-- 
2.11.0

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/4] powerpc: machine check allow handler to set severity and initiator
  2017-02-16 17:01 [RFC[PATCH 0/4] POWER9 machine check handler Nicholas Piggin
@ 2017-02-16 17:01 ` Nicholas Piggin
  2017-02-16 17:01 ` [PATCH 2/4] powerpc/powernv: machine check rework recovery flushing Nicholas Piggin
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Nicholas Piggin @ 2017-02-16 17:01 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Nicholas Piggin

Currently these are hardcoded values.

mce_error_info should not have to be versioned because it's only used
for passing data from within the MCE subsystem.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 arch/powerpc/include/asm/mce.h  | 3 ++-
 arch/powerpc/kernel/mce.c       | 7 ++++---
 arch/powerpc/kernel/mce_power.c | 6 ++++++
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/include/asm/mce.h b/arch/powerpc/include/asm/mce.h
index f97d8cb6bdf6..b2a5865ccd87 100644
--- a/arch/powerpc/include/asm/mce.h
+++ b/arch/powerpc/include/asm/mce.h
@@ -177,7 +177,8 @@ struct mce_error_info {
 		enum MCE_EratErrorType erat_error_type:8;
 		enum MCE_TlbErrorType tlb_error_type:8;
 	} u;
-	uint8_t		reserved[2];
+	enum MCE_Severity	severity:8;
+	enum MCE_Initiator	initiator:8;
 };
 
 #define MAX_MC_EVT	100
diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
index c6923ff45131..d7a88dce67e8 100644
--- a/arch/powerpc/kernel/mce.c
+++ b/arch/powerpc/kernel/mce.c
@@ -90,13 +90,14 @@ void save_mce_event(struct pt_regs *regs, long handled,
 	mce->gpr3 = regs->gpr[3];
 	mce->in_use = 1;
 
-	mce->initiator = MCE_INITIATOR_CPU;
 	/* Mark it recovered if we have handled it and MSR(RI=1). */
 	if (handled && (regs->msr & MSR_RI))
 		mce->disposition = MCE_DISPOSITION_RECOVERED;
 	else
 		mce->disposition = MCE_DISPOSITION_NOT_RECOVERED;
-	mce->severity = MCE_SEV_ERROR_SYNC;
+
+	mce->initiator = mce_err->initiator;
+	mce->severity = mce_err->severity;
 
 	/*
 	 * Populate the mce error_type and type-specific error_type.
@@ -268,7 +269,7 @@ void machine_check_print_event_info(struct machine_check_event *evt)
 
 	printk("%s%s Machine check interrupt [%s]\n", level, sevstr,
 	       evt->disposition == MCE_DISPOSITION_RECOVERED ?
-	       "Recovered" : "[Not recovered");
+	       "Recovered" : "Not recovered");
 	printk("%s  Initiator: %s\n", level,
 	       evt->initiator == MCE_INITIATOR_CPU ? "CPU" : "Unknown");
 	switch (evt->error_type) {
diff --git a/arch/powerpc/kernel/mce_power.c b/arch/powerpc/kernel/mce_power.c
index 7353991c4ece..c37fc5fdd433 100644
--- a/arch/powerpc/kernel/mce_power.c
+++ b/arch/powerpc/kernel/mce_power.c
@@ -281,6 +281,9 @@ long __machine_check_early_realmode_p7(struct pt_regs *regs)
 	long handled = 1;
 	struct mce_error_info mce_error_info = { 0 };
 
+	mce_error_info.severity = MCE_SEV_ERROR_SYNC;
+	mce_error_info.initiator = MCE_INITIATOR_CPU;
+
 	srr1 = regs->msr;
 	nip = regs->nip;
 
@@ -352,6 +355,9 @@ long __machine_check_early_realmode_p8(struct pt_regs *regs)
 	long handled = 1;
 	struct mce_error_info mce_error_info = { 0 };
 
+	mce_error_info.severity = MCE_SEV_ERROR_SYNC;
+	mce_error_info.initiator = MCE_INITIATOR_CPU;
+
 	srr1 = regs->msr;
 	nip = regs->nip;
 
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/4] powerpc/powernv: machine check rework recovery flushing
  2017-02-16 17:01 [RFC[PATCH 0/4] POWER9 machine check handler Nicholas Piggin
  2017-02-16 17:01 ` [PATCH 1/4] powerpc: machine check allow handler to set severity and initiator Nicholas Piggin
@ 2017-02-16 17:01 ` Nicholas Piggin
  2017-02-16 17:01 ` [PATCH 3/4] powerpc/powernv: cope with non-synchronous machine checks Nicholas Piggin
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Nicholas Piggin @ 2017-02-16 17:01 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Nicholas Piggin

Put the ifdefs into a flush handler call, and have callers ask for
particular type of flushes. Also add an ERAT flush.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 arch/powerpc/kernel/mce_power.c | 124 +++++++++++++++++++---------------------
 1 file changed, 59 insertions(+), 65 deletions(-)

diff --git a/arch/powerpc/kernel/mce_power.c b/arch/powerpc/kernel/mce_power.c
index c37fc5fdd433..79a7488593fa 100644
--- a/arch/powerpc/kernel/mce_power.c
+++ b/arch/powerpc/kernel/mce_power.c
@@ -114,83 +114,74 @@ static void flush_and_reload_slb(void)
 		asm volatile("slbmte %0,%1" : : "r" (rs), "r" (rb));
 	}
 }
-#endif
 
-static long mce_handle_derror(uint64_t dsisr, uint64_t slb_error_bits)
+static void flush_erat(void)
 {
-	long handled = 1;
+	asm volatile(PPC_INVALIDATE_ERAT : : :"memory");
+}
+#endif
 
-	/*
-	 * flush and reload SLBs for SLB errors and flush TLBs for TLB errors.
-	 * reset the error bits whenever we handle them so that at the end
-	 * we can check whether we handled all of them or not.
-	 * */
+#define MCE_FLUSH_SLB 1
+#define MCE_FLUSH_TLB 1
+#define MCE_FLUSH_ERAT 1
+
+static int mce_flush(int what)
+{
 #ifdef CONFIG_PPC_STD_MMU_64
-	if (dsisr & slb_error_bits) {
+	if (what == MCE_FLUSH_SLB) {
 		flush_and_reload_slb();
-		/* reset error bits */
-		dsisr &= ~(slb_error_bits);
+		return 1;
 	}
-	if (dsisr & P7_DSISR_MC_TLB_MULTIHIT_MFTLB) {
-		if (cur_cpu_spec && cur_cpu_spec->flush_tlb)
-			cur_cpu_spec->flush_tlb(TLB_INVAL_SCOPE_GLOBAL);
-		/* reset error bits */
-		dsisr &= ~P7_DSISR_MC_TLB_MULTIHIT_MFTLB;
+	if (what == MCE_FLUSH_ERAT) {
+		flush_erat();
+		return 1;
 	}
 #endif
-	/* Any other errors we don't understand? */
-	if (dsisr & 0xffffffffUL)
-		handled = 0;
+	if (what == MCE_FLUSH_TLB) {
+		if (cur_cpu_spec && cur_cpu_spec->flush_tlb) {
+			cur_cpu_spec->flush_tlb(TLB_INVAL_SCOPE_GLOBAL);
+			return 1;
+		}
+	}
 
-	return handled;
+	return 0;
 }
 
-static long mce_handle_derror_p7(uint64_t dsisr)
+static int mce_handle_flush_derrors(uint64_t dsisr, uint64_t slb, uint64_t tlb, uint64_t erat)
 {
-	return mce_handle_derror(dsisr, P7_DSISR_MC_SLB_ERRORS);
+	if ((dsisr & slb) && mce_flush(MCE_FLUSH_SLB))
+		dsisr &= ~slb;
+	if ((dsisr & erat) && mce_flush(MCE_FLUSH_ERAT))
+		dsisr &= ~erat;
+	if ((dsisr & tlb) && mce_flush(MCE_FLUSH_TLB))
+		dsisr &= ~tlb;
+	/* Any other errors we don't understand? */
+	if (dsisr)
+		return 0;
+	return 1;
 }
 
-static long mce_handle_common_ierror(uint64_t srr1)
+static long mce_handle_derror_p7(uint64_t dsisr)
 {
-	long handled = 0;
+	return mce_handle_flush_derrors(dsisr,
+			P7_DSISR_MC_SLB_ERRORS,
+			P7_DSISR_MC_TLB_MULTIHIT_MFTLB,
+			0);
+}
 
+static long mce_handle_ierror_p7(uint64_t srr1)
+{
 	switch (P7_SRR1_MC_IFETCH(srr1)) {
-	case 0:
-		break;
-#ifdef CONFIG_PPC_STD_MMU_64
 	case P7_SRR1_MC_IFETCH_SLB_PARITY:
 	case P7_SRR1_MC_IFETCH_SLB_MULTIHIT:
-		/* flush and reload SLBs for SLB errors. */
-		flush_and_reload_slb();
-		handled = 1;
-		break;
+	case P7_SRR1_MC_IFETCH_SLB_BOTH:
+		return mce_flush(MCE_FLUSH_SLB);
+
 	case P7_SRR1_MC_IFETCH_TLB_MULTIHIT:
-		if (cur_cpu_spec && cur_cpu_spec->flush_tlb) {
-			cur_cpu_spec->flush_tlb(TLB_INVAL_SCOPE_GLOBAL);
-			handled = 1;
-		}
-		break;
-#endif
+		return mce_flush(MCE_FLUSH_TLB);
 	default:
-		break;
-	}
-
-	return handled;
-}
-
-static long mce_handle_ierror_p7(uint64_t srr1)
-{
-	long handled = 0;
-
-	handled = mce_handle_common_ierror(srr1);
-
-#ifdef CONFIG_PPC_STD_MMU_64
-	if (P7_SRR1_MC_IFETCH(srr1) == P7_SRR1_MC_IFETCH_SLB_BOTH) {
-		flush_and_reload_slb();
-		handled = 1;
+		return 0;
 	}
-#endif
-	return handled;
 }
 
 static void mce_get_common_ierror(struct mce_error_info *mce_err, uint64_t srr1)
@@ -331,22 +322,25 @@ static void mce_get_derror_p8(struct mce_error_info *mce_err, uint64_t dsisr)
 
 static long mce_handle_ierror_p8(uint64_t srr1)
 {
-	long handled = 0;
-
-	handled = mce_handle_common_ierror(srr1);
+	switch (P7_SRR1_MC_IFETCH(srr1)) {
+	case P7_SRR1_MC_IFETCH_SLB_PARITY:
+	case P7_SRR1_MC_IFETCH_SLB_MULTIHIT:
+	case P8_SRR1_MC_IFETCH_ERAT_MULTIHIT:
+		return mce_flush(MCE_FLUSH_SLB);
 
-#ifdef CONFIG_PPC_STD_MMU_64
-	if (P7_SRR1_MC_IFETCH(srr1) == P8_SRR1_MC_IFETCH_ERAT_MULTIHIT) {
-		flush_and_reload_slb();
-		handled = 1;
+	case P7_SRR1_MC_IFETCH_TLB_MULTIHIT:
+		return mce_flush(MCE_FLUSH_TLB);
+	default:
+		return 0;
 	}
-#endif
-	return handled;
 }
 
 static long mce_handle_derror_p8(uint64_t dsisr)
 {
-	return mce_handle_derror(dsisr, P8_DSISR_MC_SLB_ERRORS);
+	return mce_handle_flush_derrors(dsisr,
+			P8_DSISR_MC_SLB_ERRORS,
+			P7_DSISR_MC_TLB_MULTIHIT_MFTLB,
+			0);
 }
 
 long __machine_check_early_realmode_p8(struct pt_regs *regs)
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/4] powerpc/powernv: cope with non-synchronous machine checks
  2017-02-16 17:01 [RFC[PATCH 0/4] POWER9 machine check handler Nicholas Piggin
  2017-02-16 17:01 ` [PATCH 1/4] powerpc: machine check allow handler to set severity and initiator Nicholas Piggin
  2017-02-16 17:01 ` [PATCH 2/4] powerpc/powernv: machine check rework recovery flushing Nicholas Piggin
@ 2017-02-16 17:01 ` Nicholas Piggin
  2017-02-17  0:04   ` kbuild test robot
  2017-02-16 17:01 ` [PATCH 4/4] powerpc/powernv: handle POWER9 " Nicholas Piggin
  2017-02-16 17:47 ` [RFC[PATCH 0/4] POWER9 machine check handler Nicholas Piggin
  4 siblings, 1 reply; 9+ messages in thread
From: Nicholas Piggin @ 2017-02-16 17:01 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Nicholas Piggin

Asynchronous machine checks don't correspond to the instruction or
even task that is currently running. Therefore only synchronous
machine checks should attempt to kill the currently running task
to recover.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 arch/powerpc/platforms/powernv/opal.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
index 282293572dc8..8cd1656f0535 100644
--- a/arch/powerpc/platforms/powernv/opal.c
+++ b/arch/powerpc/platforms/powernv/opal.c
@@ -404,26 +404,17 @@ static int opal_recover_mce(struct pt_regs *regs,
 	} else if (evt->disposition == MCE_DISPOSITION_RECOVERED) {
 		/* Platform corrected itself */
 		recovered = 1;
-	} else if (ea && !is_kernel_addr(ea)) {
+	} else if (evt->severity == MCE_SEV_FATAL) {
+		/* Async or otherwise fatal machine check */
+		pr_err("Machine check interrupt unrecoverable\n");
+		recovered = 0;
+	} else if (user_mode(regs) && !is_global_init(current)) {
 		/*
-		 * Faulting address is not in kernel text. We should be fine.
-		 * We need to find which process uses this address.
 		 * For now, kill the task if we have received exception when
 		 * in userspace.
 		 *
 		 * TODO: Queue up this address for hwpoisioning later.
 		 */
-		if (user_mode(regs) && !is_global_init(current)) {
-			_exception(SIGBUS, regs, BUS_MCEERR_AR, regs->nip);
-			recovered = 1;
-		} else
-			recovered = 0;
-	} else if (user_mode(regs) && !is_global_init(current) &&
-		evt->severity == MCE_SEV_ERROR_SYNC) {
-		/*
-		 * If we have received a synchronous error when in userspace
-		 * kill the task.
-		 */
 		_exception(SIGBUS, regs, BUS_MCEERR_AR, regs->nip);
 		recovered = 1;
 	}
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 4/4] powerpc/powernv: handle POWER9 machine checks
  2017-02-16 17:01 [RFC[PATCH 0/4] POWER9 machine check handler Nicholas Piggin
                   ` (2 preceding siblings ...)
  2017-02-16 17:01 ` [PATCH 3/4] powerpc/powernv: cope with non-synchronous machine checks Nicholas Piggin
@ 2017-02-16 17:01 ` Nicholas Piggin
  2017-02-16 21:15   ` kbuild test robot
  2017-02-17  0:36   ` kbuild test robot
  2017-02-16 17:47 ` [RFC[PATCH 0/4] POWER9 machine check handler Nicholas Piggin
  4 siblings, 2 replies; 9+ messages in thread
From: Nicholas Piggin @ 2017-02-16 17:01 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Nicholas Piggin

This creates several new error types, and includes non-synchronous
exceptions. I don't know if that affects the API beyond there being
some unknown types in older code.

Some exceptions seem to be initiated by nest or remote/fabric, but
reporting of these is not implemented yet.

I started with mostly new values and functions rather than replicate
P7/8, because it was getting precarious with some values changing meaning.
It will need to all be converted into a table/data driven approach soon.
But for now it works.

Tested by manually constructing errors in simulator, so who knows if it
works on real hardware.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 arch/powerpc/include/asm/bitops.h |   4 +
 arch/powerpc/include/asm/mce.h    | 105 +++++++++++++++++++++
 arch/powerpc/kernel/cputable.c    |   3 +
 arch/powerpc/kernel/mce.c         |  83 ++++++++++++++++
 arch/powerpc/kernel/mce_power.c   | 194 ++++++++++++++++++++++++++++++++++++++
 5 files changed, 389 insertions(+)

diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h
index 59abc620f8e8..5f057c74bf21 100644
--- a/arch/powerpc/include/asm/bitops.h
+++ b/arch/powerpc/include/asm/bitops.h
@@ -51,6 +51,10 @@
 #define PPC_BIT(bit)		(1UL << PPC_BITLSHIFT(bit))
 #define PPC_BITMASK(bs, be)	((PPC_BIT(bs) - PPC_BIT(be)) | PPC_BIT(bs))
 
+/* Put a PPC bit into a "normal" bit position */
+#define PPC_BITEXTRACT(bits, ppc_bit, dst_bit)			\
+	((((bits) >> PPC_BITLSHIFT(ppc_bit)) & 1) << (dst_bit))
+
 #include <asm/barrier.h>
 
 /* Macro for generating the ***_bits() functions */
diff --git a/arch/powerpc/include/asm/mce.h b/arch/powerpc/include/asm/mce.h
index b2a5865ccd87..ed62efe01e49 100644
--- a/arch/powerpc/include/asm/mce.h
+++ b/arch/powerpc/include/asm/mce.h
@@ -66,6 +66,55 @@
 
 #define P8_DSISR_MC_SLB_ERRORS		(P7_DSISR_MC_SLB_ERRORS | \
 					 P8_DSISR_MC_ERAT_MULTIHIT_SEC)
+
+/*
+ * Machine Check bits on power9
+ */
+#define P9_SRR1_MC_LOADSTORE(srr1)	(((srr1) >> PPC_BITLSHIFT(42)) & 1)
+
+#define P9_SRR1_MC_IFETCH(srr1)	(	\
+	PPC_BITEXTRACT(srr1, 45, 0) |	\
+	PPC_BITEXTRACT(srr1, 44, 1) |	\
+	PPC_BITEXTRACT(srr1, 43, 2) |	\
+	PPC_BITEXTRACT(srr1, 36, 3) )
+
+/* 0 is reserved */
+#define P9_SRR1_MC_IFETCH_UE				1
+#define P9_SRR1_MC_IFETCH_SLB_PARITY			2
+#define P9_SRR1_MC_IFETCH_SLB_MULTIHIT			3
+#define P9_SRR1_MC_IFETCH_ERAT_MULTIHIT			4
+#define P9_SRR1_MC_IFETCH_TLB_MULTIHIT			5
+#define P9_SRR1_MC_IFETCH_UE_TLB_RELOAD			6
+/* 7 is reserved */
+#define P9_SRR1_MC_IFETCH_LINK_TIMEOUT			8
+#define P9_SRR1_MC_IFETCH_LINK_TABLEWALK_TIMEOUT	9
+/* 10 ? */
+#define P9_SRR1_MC_IFETCH_RA			11
+#define P9_SRR1_MC_IFETCH_RA_TABLEWALK		12
+#define P9_SRR1_MC_IFETCH_RA_ASYNC_STORE		13
+#define P9_SRR1_MC_IFETCH_LINK_ASYNC_STORE_TIMEOUT	14
+#define P9_SRR1_MC_IFETCH_RA_TABLEWALK_FOREIGN	15
+
+/* DSISR bits for machine check (On Power9) */
+#define P9_DSISR_MC_UE					(PPC_BIT(48))
+#define P9_DSISR_MC_UE_TABLEWALK			(PPC_BIT(49))
+#define P9_DSISR_MC_LINK_LOAD_TIMEOUT			(PPC_BIT(50))
+#define P9_DSISR_MC_LINK_TABLEWALK_TIMEOUT		(PPC_BIT(51))
+#define P9_DSISR_MC_ERAT_MULTIHIT			(PPC_BIT(52))
+#define P9_DSISR_MC_TLB_MULTIHIT_MFTLB			(PPC_BIT(53))
+#define P9_DSISR_MC_USER_TLBIE				(PPC_BIT(54))
+#define P9_DSISR_MC_SLB_PARITY_MFSLB			(PPC_BIT(55))
+#define P9_DSISR_MC_SLB_MULTIHIT_MFSLB			(PPC_BIT(56))
+#define P9_DSISR_MC_RA_LOAD				(PPC_BIT(57))
+#define P9_DSISR_MC_RA_TABLEWALK			(PPC_BIT(58))
+#define P9_DSISR_MC_RA_TABLEWALK_FOREIGN		(PPC_BIT(59))
+#define P9_DSISR_MC_RA_FOREIGN				(PPC_BIT(60))
+
+/* SLB error bits */
+#define P9_DSISR_MC_SLB_ERRORS		(P9_DSISR_MC_ERAT_MULTIHIT | \
+					 P9_DSISR_MC_SLB_PARITY_MFSLB | \
+					 P9_DSISR_MC_SLB_MULTIHIT_MFSLB)
+
 enum MCE_Version {
 	MCE_V1 = 1,
 };
@@ -93,6 +142,9 @@ enum MCE_ErrorType {
 	MCE_ERROR_TYPE_SLB = 2,
 	MCE_ERROR_TYPE_ERAT = 3,
 	MCE_ERROR_TYPE_TLB = 4,
+	MCE_ERROR_TYPE_USER = 5,
+	MCE_ERROR_TYPE_RA = 6,
+	MCE_ERROR_TYPE_LINK = 7,
 };
 
 enum MCE_UeErrorType {
@@ -121,6 +173,32 @@ enum MCE_TlbErrorType {
 	MCE_TLB_ERROR_MULTIHIT = 2,
 };
 
+enum MCE_UserErrorType {
+	MCE_USER_ERROR_INDETERMINATE = 0,
+	MCE_USER_ERROR_TLBIE = 1,
+};
+
+enum MCE_RaErrorType {
+	MCE_RA_ERROR_INDETERMINATE = 0,
+	MCE_RA_ERROR_IFETCH = 1,
+	MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH = 2,
+	MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN = 3,
+	MCE_RA_ERROR_LOAD = 4,
+	MCE_RA_ERROR_STORE = 5,
+	MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 6,
+	MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN = 7,
+	MCE_RA_ERROR_LOAD_STORE_FOREIGN = 8,
+};
+
+enum MCE_LinkErrorType {
+	MCE_LINK_ERROR_INDETERMINATE = 0,
+	MCE_LINK_ERROR_IFETCH_TIMEOUT = 1,
+	MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT = 2,
+	MCE_LINK_ERROR_LOAD_TIMEOUT = 3,
+	MCE_LINK_ERROR_STORE_TIMEOUT = 4,
+	MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT = 5,
+};
+
 struct machine_check_event {
 	enum MCE_Version	version:8;	/* 0x00 */
 	uint8_t			in_use;		/* 0x01 */
@@ -166,6 +244,30 @@ struct machine_check_event {
 			uint64_t	effective_address;
 			uint8_t		reserved_2[16];
 		} tlb_error;
+
+		struct {
+			enum MCE_UserErrorType user_error_type:8;
+			uint8_t		effective_address_provided;
+			uint8_t		reserved_1[6];
+			uint64_t	effective_address;
+			uint8_t		reserved_2[16];
+		} user_error;
+
+		struct {
+			enum MCE_RaErrorType ra_error_type:8;
+			uint8_t		effective_address_provided;
+			uint8_t		reserved_1[6];
+			uint64_t	effective_address;
+			uint8_t		reserved_2[16];
+		} ra_error;
+
+		struct {
+			enum MCE_LinkErrorType link_error_type:8;
+			uint8_t		effective_address_provided;
+			uint8_t		reserved_1[6];
+			uint64_t	effective_address;
+			uint8_t		reserved_2[16];
+		} link_error;
 	} u;
 };
 
@@ -176,6 +278,9 @@ struct mce_error_info {
 		enum MCE_SlbErrorType slb_error_type:8;
 		enum MCE_EratErrorType erat_error_type:8;
 		enum MCE_TlbErrorType tlb_error_type:8;
+		enum MCE_UserErrorType user_error_type:8;
+		enum MCE_RaErrorType ra_error_type:8;
+		enum MCE_LinkErrorType link_error_type:8;
 	} u;
 	enum MCE_Severity	severity:8;
 	enum MCE_Initiator	initiator:8;
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c
index 6a82ef039c50..5feefdacaea8 100644
--- a/arch/powerpc/kernel/cputable.c
+++ b/arch/powerpc/kernel/cputable.c
@@ -77,6 +77,7 @@ extern void __flush_tlb_power8(unsigned int action);
 extern void __flush_tlb_power9(unsigned int action);
 extern long __machine_check_early_realmode_p7(struct pt_regs *regs);
 extern long __machine_check_early_realmode_p8(struct pt_regs *regs);
+extern long __machine_check_early_realmode_p9(struct pt_regs *regs);
 #endif /* CONFIG_PPC64 */
 #if defined(CONFIG_E500)
 extern void __setup_cpu_e5500(unsigned long offset, struct cpu_spec* spec);
@@ -523,6 +524,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
 		.cpu_setup		= __setup_cpu_power9,
 		.cpu_restore		= __restore_cpu_power9,
 		.flush_tlb		= __flush_tlb_power9,
+		.machine_check_early	= __machine_check_early_realmode_p9,
 		.platform		= "power9",
 	},
 	{	/* Power9 */
@@ -542,6 +544,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
 		.cpu_setup		= __setup_cpu_power9,
 		.cpu_restore		= __restore_cpu_power9,
 		.flush_tlb		= __flush_tlb_power9,
+		.machine_check_early	= __machine_check_early_realmode_p9,
 		.platform		= "power9",
 	},
 	{	/* Cell Broadband Engine */
diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
index d7a88dce67e8..4348ed83b77c 100644
--- a/arch/powerpc/kernel/mce.c
+++ b/arch/powerpc/kernel/mce.c
@@ -58,6 +58,15 @@ static void mce_set_error_info(struct machine_check_event *mce,
 	case MCE_ERROR_TYPE_TLB:
 		mce->u.tlb_error.tlb_error_type = mce_err->u.tlb_error_type;
 		break;
+	case MCE_ERROR_TYPE_USER:
+		mce->u.user_error.user_error_type = mce_err->u.user_error_type;
+		break;
+	case MCE_ERROR_TYPE_RA:
+		mce->u.ra_error.ra_error_type = mce_err->u.ra_error_type;
+		break;
+	case MCE_ERROR_TYPE_LINK:
+		mce->u.link_error.link_error_type = mce_err->u.link_error_type;
+		break;
 	case MCE_ERROR_TYPE_UNKNOWN:
 	default:
 		break;
@@ -116,6 +125,15 @@ void save_mce_event(struct pt_regs *regs, long handled,
 	} else if (mce->error_type == MCE_ERROR_TYPE_ERAT) {
 		mce->u.erat_error.effective_address_provided = true;
 		mce->u.erat_error.effective_address = addr;
+	} else if (mce->error_type == MCE_ERROR_TYPE_USER) {
+		mce->u.user_error.effective_address_provided = true;
+		mce->u.user_error.effective_address = addr;
+	} else if (mce->error_type == MCE_ERROR_TYPE_RA) {
+		mce->u.ra_error.effective_address_provided = true;
+		mce->u.ra_error.effective_address = addr;
+	} else if (mce->error_type == MCE_ERROR_TYPE_LINK) {
+		mce->u.link_error.effective_address_provided = true;
+		mce->u.link_error.effective_address = addr;
 	} else if (mce->error_type == MCE_ERROR_TYPE_UE) {
 		mce->u.ue_error.effective_address_provided = true;
 		mce->u.ue_error.effective_address = addr;
@@ -240,6 +258,29 @@ void machine_check_print_event_info(struct machine_check_event *evt)
 		"Parity",
 		"Multihit",
 	};
+	static const char *mc_user_types[] = {
+		"Indeterminate",
+		"tlbie(l) invalid",
+	};
+	static const char *mc_ra_types[] = {
+		"Indeterminate",
+		"Instruction fetch (bad)",
+		"Page table walk ifetch (bad)",
+		"Page table walk ifetch (foreign)",
+		"Load (bad)",
+		"Store (bad)",
+		"Page table walk Load/Store (bad)",
+		"Page table walk Load/Store (foreign)",
+		"Load/Store (foreign)",
+	};
+	static const char *mc_link_types[] = {
+		"Indeterminate",
+		"Instruction fetch (timeout)",
+		"Page table walk ifetch (timeout)",
+		"Load (timeout)",
+		"Store (timeout)",
+		"Page table walk Load/Store (timeout)",
+	};
 
 	/* Print things out */
 	if (evt->version != MCE_V1) {
@@ -316,6 +357,36 @@ void machine_check_print_event_info(struct machine_check_event *evt)
 			printk("%s    Effective address: %016llx\n",
 			       level, evt->u.tlb_error.effective_address);
 		break;
+	case MCE_ERROR_TYPE_USER:
+		subtype = evt->u.user_error.user_error_type <
+			ARRAY_SIZE(mc_user_types) ?
+			mc_user_types[evt->u.user_error.user_error_type]
+			: "Unknown";
+		printk("%s  Error type: User [%s]\n", level, subtype);
+		if (evt->u.user_error.effective_address_provided)
+			printk("%s    Effective address: %016llx\n",
+			       level, evt->u.user_error.effective_address);
+		break;
+	case MCE_ERROR_TYPE_RA:
+		subtype = evt->u.ra_error.ra_error_type <
+			ARRAY_SIZE(mc_ra_types) ?
+			mc_ra_types[evt->u.ra_error.ra_error_type]
+			: "Unknown";
+		printk("%s  Error type: Real address [%s]\n", level, subtype);
+		if (evt->u.ra_error.effective_address_provided)
+			printk("%s    Effective address: %016llx\n",
+			       level, evt->u.ra_error.effective_address);
+		break;
+	case MCE_ERROR_TYPE_LINK:
+		subtype = evt->u.link_error.link_error_type <
+			ARRAY_SIZE(mc_link_types) ?
+			mc_link_types[evt->u.link_error.link_error_type]
+			: "Unknown";
+		printk("%s  Error type: Link [%s]\n", level, subtype);
+		if (evt->u.link_error.effective_address_provided)
+			printk("%s    Effective address: %016llx\n",
+			       level, evt->u.link_error.effective_address);
+		break;
 	default:
 	case MCE_ERROR_TYPE_UNKNOWN:
 		printk("%s  Error type: Unknown\n", level);
@@ -342,6 +413,18 @@ uint64_t get_mce_fault_addr(struct machine_check_event *evt)
 		if (evt->u.tlb_error.effective_address_provided)
 			return evt->u.tlb_error.effective_address;
 		break;
+	case MCE_ERROR_TYPE_USER:
+		if (evt->u.user_error.effective_address_provided)
+			return evt->u.user_error.effective_address;
+		break;
+	case MCE_ERROR_TYPE_RA:
+		if (evt->u.ra_error.effective_address_provided)
+			return evt->u.ra_error.effective_address;
+		break;
+	case MCE_ERROR_TYPE_LINK:
+		if (evt->u.link_error.effective_address_provided)
+			return evt->u.link_error.effective_address;
+		break;
 	default:
 	case MCE_ERROR_TYPE_UNKNOWN:
 		break;
diff --git a/arch/powerpc/kernel/mce_power.c b/arch/powerpc/kernel/mce_power.c
index 79a7488593fa..54497d6dc76b 100644
--- a/arch/powerpc/kernel/mce_power.c
+++ b/arch/powerpc/kernel/mce_power.c
@@ -372,3 +372,197 @@ long __machine_check_early_realmode_p8(struct pt_regs *regs)
 	save_mce_event(regs, handled, &mce_error_info, nip, addr);
 	return handled;
 }
+
+static int mce_handle_derror_p9(struct pt_regs *regs, uint64_t *addr,
+		enum MCE_Severity *severity, enum MCE_Initiator *initiator)
+{
+	uint64_t dsisr = regs->dsisr;
+
+#if 0
+	/* Could invalidate all tlbs then step over failing tlbie(l)? */
+	if (dsisr & P9_DSISR_MC_USER_TLBIE) {
+		regs->nip += 4;
+		dsisr &= ~P9_DSISR_MC_USER_TLBIE;
+	}
+#endif
+
+	return mce_handle_flush_derrors(dsisr,
+			P9_DSISR_MC_SLB_PARITY_MFSLB |
+			P9_DSISR_MC_SLB_MULTIHIT_MFSLB,
+
+			P9_DSISR_MC_TLB_MULTIHIT_MFTLB,
+
+			P9_DSISR_MC_ERAT_MULTIHIT);
+}
+
+static int mce_handle_ierror_p9(struct pt_regs *regs, uint64_t *addr,
+		enum MCE_Severity *severity, enum MCE_Initiator *initiator)
+{
+	uint64_t srr1 = regs->msr;
+
+	switch (P9_SRR1_MC_IFETCH(srr1)) {
+	case P9_SRR1_MC_IFETCH_SLB_PARITY:
+	case P9_SRR1_MC_IFETCH_SLB_MULTIHIT:
+		return mce_flush(MCE_FLUSH_SLB);
+	case P9_SRR1_MC_IFETCH_TLB_MULTIHIT:
+		return mce_flush(MCE_FLUSH_TLB);
+	case P9_SRR1_MC_IFETCH_ERAT_MULTIHIT:
+		return mce_flush(MCE_FLUSH_ERAT);
+	default:
+		return 0;
+	}
+}
+
+static void mce_get_derror_p9(struct mce_error_info *mce_err,
+				uint64_t *addr, uint64_t dsisr)
+{
+	mce_err->severity = MCE_SEV_ERROR_SYNC;
+	mce_err->initiator = MCE_INITIATOR_CPU;
+
+	if (dsisr & P9_DSISR_MC_USER_TLBIE)
+		*addr = regs->nip;
+	else
+		*addr = regs->dar;
+
+	if (dsisr & P9_DSISR_MC_UE) {
+		mce_err->error_type = MCE_ERROR_TYPE_UE;
+		mce_err->u.ue_error_type = MCE_UE_ERROR_LOAD_STORE;
+	} else if (dsisr & P9_DSISR_MC_UE_TABLEWALK) {
+		mce_err->error_type = MCE_ERROR_TYPE_UE;
+		mce_err->u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE;
+	} else if (dsisr & P9_DSISR_MC_LINK_LOAD_TIMEOUT) {
+		mce_err->error_type = MCE_ERROR_TYPE_LINK;
+		mce_err->u.link_error_type = MCE_LINK_ERROR_LOAD_TIMEOUT;
+	} else if (dsisr & P9_DSISR_MC_LINK_TABLEWALK_TIMEOUT) {
+		mce_err->error_type = MCE_ERROR_TYPE_LINK;
+		mce_err->u.link_error_type = MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT;
+	} else if (dsisr & P9_DSISR_MC_ERAT_MULTIHIT) {
+		mce_err->error_type = MCE_ERROR_TYPE_ERAT;
+		mce_err->u.erat_error_type = MCE_ERAT_ERROR_MULTIHIT;
+	} else if (dsisr & P9_DSISR_MC_TLB_MULTIHIT_MFTLB) {
+		mce_err->error_type = MCE_ERROR_TYPE_TLB;
+		mce_err->u.tlb_error_type = MCE_TLB_ERROR_MULTIHIT;
+	} else if (dsisr & P9_DSISR_MC_USER_TLBIE) {
+		mce_err->error_type = MCE_ERROR_TYPE_USER;
+		mce_err->u.user_error_type = MCE_USER_ERROR_TLBIE;
+	} else if (dsisr & P9_DSISR_MC_SLB_PARITY_MFSLB) {
+		mce_err->error_type = MCE_ERROR_TYPE_SLB;
+		mce_err->u.slb_error_type = MCE_SLB_ERROR_PARITY;
+	} else if (dsisr & P9_DSISR_MC_SLB_MULTIHIT_MFSLB) {
+		mce_err->error_type = MCE_ERROR_TYPE_SLB;
+		mce_err->u.slb_error_type = MCE_SLB_ERROR_MULTIHIT;
+	} else if (dsisr & P9_DSISR_MC_RA_LOAD) {
+		mce_err->error_type = MCE_ERROR_TYPE_RA;
+		mce_err->u.ra_error_type = MCE_RA_ERROR_LOAD;
+	} else if (dsisr & P9_DSISR_MC_RA_TABLEWALK) {
+		mce_err->error_type = MCE_ERROR_TYPE_RA;
+		mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE;
+	} else if (dsisr & P9_DSISR_MC_RA_TABLEWALK_FOREIGN) {
+		mce_err->error_type = MCE_ERROR_TYPE_RA;
+		mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN;
+	} else if (dsisr & P9_DSISR_MC_RA_FOREIGN) {
+		mce_err->error_type = MCE_ERROR_TYPE_RA;
+		mce_err->u.ra_error_type = MCE_RA_ERROR_LOAD_STORE_FOREIGN;
+	}
+}
+
+static void mce_get_ierror_p9(struct mce_error_info *mce_err,
+				uint64_t *addr, uint64_t srr1)
+{
+	switch (P9_SRR1_MC_IFETCH(srr1)) {
+	case P9_SRR1_MC_IFETCH_RA_ASYNC_STORE:
+	case P9_SRR1_MC_IFETCH_LINK_ASYNC_STORE_TIMEOUT:
+		mce_err->severity = MCE_SEV_FATAL;
+		break;
+	default:
+		mce_err->severity = MCE_SEV_ERROR_SYNC;
+		break;
+	}
+
+	mce_err->initiator = MCE_INITIATOR_CPU;
+
+	*addr = regs->nip;
+
+	switch (P9_SRR1_MC_IFETCH(srr1)) {
+	case P9_SRR1_MC_IFETCH_UE:
+		mce_err->error_type = MCE_ERROR_TYPE_UE;
+		mce_err->u.ue_error_type = MCE_UE_ERROR_IFETCH;
+		break;
+	case P9_SRR1_MC_IFETCH_SLB_PARITY:
+		mce_err->error_type = MCE_ERROR_TYPE_SLB;
+		mce_err->u.slb_error_type = MCE_SLB_ERROR_PARITY;
+		break;
+	case P9_SRR1_MC_IFETCH_SLB_MULTIHIT:
+		mce_err->error_type = MCE_ERROR_TYPE_SLB;
+		mce_err->u.slb_error_type = MCE_SLB_ERROR_MULTIHIT;
+		break;
+	case P9_SRR1_MC_IFETCH_ERAT_MULTIHIT:
+		mce_err->error_type = MCE_ERROR_TYPE_ERAT;
+		mce_err->u.erat_error_type = MCE_ERAT_ERROR_MULTIHIT;
+		break;
+	case P9_SRR1_MC_IFETCH_TLB_MULTIHIT:
+		mce_err->error_type = MCE_ERROR_TYPE_TLB;
+		mce_err->u.tlb_error_type = MCE_TLB_ERROR_MULTIHIT;
+		break;
+	case P9_SRR1_MC_IFETCH_UE_TLB_RELOAD:
+		mce_err->error_type = MCE_ERROR_TYPE_UE;
+		mce_err->u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH;
+		break;
+	case P9_SRR1_MC_IFETCH_LINK_TIMEOUT:
+		mce_err->error_type = MCE_ERROR_TYPE_LINK;
+		mce_err->u.link_error_type = MCE_LINK_ERROR_IFETCH_TIMEOUT;
+		break;
+	case P9_SRR1_MC_IFETCH_LINK_TABLEWALK_TIMEOUT:
+		mce_err->error_type = MCE_ERROR_TYPE_LINK;
+		mce_err->u.link_error_type = MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT;
+		break;
+	case P9_SRR1_MC_IFETCH_RA:
+		mce_err->error_type = MCE_ERROR_TYPE_RA;
+		mce_err->u.ra_error_type = MCE_RA_ERROR_IFETCH;
+		break;
+	case P9_SRR1_MC_IFETCH_RA_TABLEWALK:
+		mce_err->error_type = MCE_ERROR_TYPE_RA;
+		mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH;
+		break;
+	case P9_SRR1_MC_IFETCH_RA_ASYNC_STORE:
+		mce_err->error_type = MCE_ERROR_TYPE_RA;
+		mce_err->u.ra_error_type = MCE_RA_ERROR_STORE;
+		break;
+	case P9_SRR1_MC_IFETCH_LINK_ASYNC_STORE_TIMEOUT:
+		mce_err->error_type = MCE_ERROR_TYPE_LINK;
+		mce_err->u.link_error_type = MCE_LINK_ERROR_STORE_TIMEOUT;
+		break;
+	case P9_SRR1_MC_IFETCH_RA_TABLEWALK_FOREIGN:
+		mce_err->error_type = MCE_ERROR_TYPE_RA;
+		mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN;
+		break;
+	default:
+		break;
+	}
+}
+
+long __machine_check_early_realmode_p9(struct pt_regs *regs)
+{
+	uint64_t nip, addr;
+	long handled;
+	struct mce_error_info mce_error_info = { 0 };
+	enum MCE_Severity severity = MCE_SEV_ERROR_SYNC;
+	enum MCE_Initiator initiator = MCE_INITIATOR_CPU;
+
+	nip = regs->nip;
+
+	if (P9_SRR1_MC_LOADSTORE(regs->msr)) {
+		handled = mce_handle_derror_p9(regs);
+		mce_get_derror_p9(&mce_error_info, &addr, regs->dsisr);
+	} else {
+		handled = mce_handle_ierror_p9(regs);
+		mce_get_ierror_p9(&mce_error_info, &addr, regs->msr);
+	}
+
+	/* Handle UE error. */
+	if (mce_error_info.error_type == MCE_ERROR_TYPE_UE)
+		handled = mce_handle_ue_error(regs);
+
+	save_mce_event(regs, handled, &mce_error_info, nip, addr);
+	return handled;
+}
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [RFC[PATCH 0/4] POWER9 machine check handler
  2017-02-16 17:01 [RFC[PATCH 0/4] POWER9 machine check handler Nicholas Piggin
                   ` (3 preceding siblings ...)
  2017-02-16 17:01 ` [PATCH 4/4] powerpc/powernv: handle POWER9 " Nicholas Piggin
@ 2017-02-16 17:47 ` Nicholas Piggin
  4 siblings, 0 replies; 9+ messages in thread
From: Nicholas Piggin @ 2017-02-16 17:47 UTC (permalink / raw)
  To: linuxppc-dev

On Fri, 17 Feb 2017 03:01:10 +1000
Nicholas Piggin <npiggin@gmail.com> wrote:

> So far I've only got this tested in mambo simulator, but
> some recoverable and unrecoverable events seem to work.

Ugh, I forgot to update before sending sorry. It's just a
couple of small compiler bugs so I'll resend after getting
feedback first.

Thanks,
Nick

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] powerpc/powernv: handle POWER9 machine checks
  2017-02-16 17:01 ` [PATCH 4/4] powerpc/powernv: handle POWER9 " Nicholas Piggin
@ 2017-02-16 21:15   ` kbuild test robot
  2017-02-17  0:36   ` kbuild test robot
  1 sibling, 0 replies; 9+ messages in thread
From: kbuild test robot @ 2017-02-16 21:15 UTC (permalink / raw)
  To: Nicholas Piggin; +Cc: kbuild-all, linuxppc-dev, Nicholas Piggin

[-- Attachment #1: Type: text/plain, Size: 8904 bytes --]

Hi Nicholas,

[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.10-rc8 next-20170216]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Nicholas-Piggin/POWER9-machine-check-handler/20170217-023423
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-allyesconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=powerpc 

All errors (new ones prefixed by >>):

   arch/powerpc/kernel/mce_power.c: In function 'mce_get_derror_p9':
>> arch/powerpc/kernel/mce_power.c:423:11: error: 'regs' undeclared (first use in this function)
      *addr = regs->nip;
              ^~~~
   arch/powerpc/kernel/mce_power.c:423:11: note: each undeclared identifier is reported only once for each function it appears in
   arch/powerpc/kernel/mce_power.c: In function 'mce_get_ierror_p9':
   arch/powerpc/kernel/mce_power.c:484:10: error: 'regs' undeclared (first use in this function)
     *addr = regs->nip;
             ^~~~
   arch/powerpc/kernel/mce_power.c: In function '__machine_check_early_realmode_p9':
>> arch/powerpc/kernel/mce_power.c:555:13: error: too few arguments to function 'mce_handle_derror_p9'
      handled = mce_handle_derror_p9(regs);
                ^~~~~~~~~~~~~~~~~~~~
   arch/powerpc/kernel/mce_power.c:376:12: note: declared here
    static int mce_handle_derror_p9(struct pt_regs *regs, uint64_t *addr,
               ^~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/kernel/mce_power.c:558:13: error: too few arguments to function 'mce_handle_ierror_p9'
      handled = mce_handle_ierror_p9(regs);
                ^~~~~~~~~~~~~~~~~~~~
   arch/powerpc/kernel/mce_power.c:398:12: note: declared here
    static int mce_handle_ierror_p9(struct pt_regs *regs, uint64_t *addr,
               ^~~~~~~~~~~~~~~~~~~~
   arch/powerpc/kernel/mce_power.c:550:21: warning: unused variable 'initiator' [-Wunused-variable]
     enum MCE_Initiator initiator = MCE_INITIATOR_CPU;
                        ^~~~~~~~~
   arch/powerpc/kernel/mce_power.c:549:20: warning: unused variable 'severity' [-Wunused-variable]
     enum MCE_Severity severity = MCE_SEV_ERROR_SYNC;
                       ^~~~~~~~

vim +/regs +423 arch/powerpc/kernel/mce_power.c

   417					uint64_t *addr, uint64_t dsisr)
   418	{
   419		mce_err->severity = MCE_SEV_ERROR_SYNC;
   420		mce_err->initiator = MCE_INITIATOR_CPU;
   421	
   422		if (dsisr & P9_DSISR_MC_USER_TLBIE)
 > 423			*addr = regs->nip;
   424		else
   425			*addr = regs->dar;
   426	
   427		if (dsisr & P9_DSISR_MC_UE) {
   428			mce_err->error_type = MCE_ERROR_TYPE_UE;
   429			mce_err->u.ue_error_type = MCE_UE_ERROR_LOAD_STORE;
   430		} else if (dsisr & P9_DSISR_MC_UE_TABLEWALK) {
   431			mce_err->error_type = MCE_ERROR_TYPE_UE;
   432			mce_err->u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE;
   433		} else if (dsisr & P9_DSISR_MC_LINK_LOAD_TIMEOUT) {
   434			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   435			mce_err->u.link_error_type = MCE_LINK_ERROR_LOAD_TIMEOUT;
   436		} else if (dsisr & P9_DSISR_MC_LINK_TABLEWALK_TIMEOUT) {
   437			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   438			mce_err->u.link_error_type = MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT;
   439		} else if (dsisr & P9_DSISR_MC_ERAT_MULTIHIT) {
   440			mce_err->error_type = MCE_ERROR_TYPE_ERAT;
   441			mce_err->u.erat_error_type = MCE_ERAT_ERROR_MULTIHIT;
   442		} else if (dsisr & P9_DSISR_MC_TLB_MULTIHIT_MFTLB) {
   443			mce_err->error_type = MCE_ERROR_TYPE_TLB;
   444			mce_err->u.tlb_error_type = MCE_TLB_ERROR_MULTIHIT;
   445		} else if (dsisr & P9_DSISR_MC_USER_TLBIE) {
   446			mce_err->error_type = MCE_ERROR_TYPE_USER;
   447			mce_err->u.user_error_type = MCE_USER_ERROR_TLBIE;
   448		} else if (dsisr & P9_DSISR_MC_SLB_PARITY_MFSLB) {
   449			mce_err->error_type = MCE_ERROR_TYPE_SLB;
   450			mce_err->u.slb_error_type = MCE_SLB_ERROR_PARITY;
   451		} else if (dsisr & P9_DSISR_MC_SLB_MULTIHIT_MFSLB) {
   452			mce_err->error_type = MCE_ERROR_TYPE_SLB;
   453			mce_err->u.slb_error_type = MCE_SLB_ERROR_MULTIHIT;
   454		} else if (dsisr & P9_DSISR_MC_RA_LOAD) {
   455			mce_err->error_type = MCE_ERROR_TYPE_RA;
   456			mce_err->u.ra_error_type = MCE_RA_ERROR_LOAD;
   457		} else if (dsisr & P9_DSISR_MC_RA_TABLEWALK) {
   458			mce_err->error_type = MCE_ERROR_TYPE_RA;
   459			mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE;
   460		} else if (dsisr & P9_DSISR_MC_RA_TABLEWALK_FOREIGN) {
   461			mce_err->error_type = MCE_ERROR_TYPE_RA;
   462			mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN;
   463		} else if (dsisr & P9_DSISR_MC_RA_FOREIGN) {
   464			mce_err->error_type = MCE_ERROR_TYPE_RA;
   465			mce_err->u.ra_error_type = MCE_RA_ERROR_LOAD_STORE_FOREIGN;
   466		}
   467	}
   468	
   469	static void mce_get_ierror_p9(struct mce_error_info *mce_err,
   470					uint64_t *addr, uint64_t srr1)
   471	{
   472		switch (P9_SRR1_MC_IFETCH(srr1)) {
   473		case P9_SRR1_MC_IFETCH_RA_ASYNC_STORE:
   474		case P9_SRR1_MC_IFETCH_LINK_ASYNC_STORE_TIMEOUT:
   475			mce_err->severity = MCE_SEV_FATAL;
   476			break;
   477		default:
   478			mce_err->severity = MCE_SEV_ERROR_SYNC;
   479			break;
   480		}
   481	
   482		mce_err->initiator = MCE_INITIATOR_CPU;
   483	
   484		*addr = regs->nip;
   485	
   486		switch (P9_SRR1_MC_IFETCH(srr1)) {
   487		case P9_SRR1_MC_IFETCH_UE:
   488			mce_err->error_type = MCE_ERROR_TYPE_UE;
   489			mce_err->u.ue_error_type = MCE_UE_ERROR_IFETCH;
   490			break;
   491		case P9_SRR1_MC_IFETCH_SLB_PARITY:
   492			mce_err->error_type = MCE_ERROR_TYPE_SLB;
   493			mce_err->u.slb_error_type = MCE_SLB_ERROR_PARITY;
   494			break;
   495		case P9_SRR1_MC_IFETCH_SLB_MULTIHIT:
   496			mce_err->error_type = MCE_ERROR_TYPE_SLB;
   497			mce_err->u.slb_error_type = MCE_SLB_ERROR_MULTIHIT;
   498			break;
   499		case P9_SRR1_MC_IFETCH_ERAT_MULTIHIT:
   500			mce_err->error_type = MCE_ERROR_TYPE_ERAT;
   501			mce_err->u.erat_error_type = MCE_ERAT_ERROR_MULTIHIT;
   502			break;
   503		case P9_SRR1_MC_IFETCH_TLB_MULTIHIT:
   504			mce_err->error_type = MCE_ERROR_TYPE_TLB;
   505			mce_err->u.tlb_error_type = MCE_TLB_ERROR_MULTIHIT;
   506			break;
   507		case P9_SRR1_MC_IFETCH_UE_TLB_RELOAD:
   508			mce_err->error_type = MCE_ERROR_TYPE_UE;
   509			mce_err->u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH;
   510			break;
   511		case P9_SRR1_MC_IFETCH_LINK_TIMEOUT:
   512			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   513			mce_err->u.link_error_type = MCE_LINK_ERROR_IFETCH_TIMEOUT;
   514			break;
   515		case P9_SRR1_MC_IFETCH_LINK_TABLEWALK_TIMEOUT:
   516			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   517			mce_err->u.link_error_type = MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT;
   518			break;
   519		case P9_SRR1_MC_IFETCH_RA:
   520			mce_err->error_type = MCE_ERROR_TYPE_RA;
   521			mce_err->u.ra_error_type = MCE_RA_ERROR_IFETCH;
   522			break;
   523		case P9_SRR1_MC_IFETCH_RA_TABLEWALK:
   524			mce_err->error_type = MCE_ERROR_TYPE_RA;
   525			mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH;
   526			break;
   527		case P9_SRR1_MC_IFETCH_RA_ASYNC_STORE:
   528			mce_err->error_type = MCE_ERROR_TYPE_RA;
   529			mce_err->u.ra_error_type = MCE_RA_ERROR_STORE;
   530			break;
   531		case P9_SRR1_MC_IFETCH_LINK_ASYNC_STORE_TIMEOUT:
   532			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   533			mce_err->u.link_error_type = MCE_LINK_ERROR_STORE_TIMEOUT;
   534			break;
   535		case P9_SRR1_MC_IFETCH_RA_TABLEWALK_FOREIGN:
   536			mce_err->error_type = MCE_ERROR_TYPE_RA;
   537			mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN;
   538			break;
   539		default:
   540			break;
   541		}
   542	}
   543	
   544	long __machine_check_early_realmode_p9(struct pt_regs *regs)
   545	{
   546		uint64_t nip, addr;
   547		long handled;
   548		struct mce_error_info mce_error_info = { 0 };
   549		enum MCE_Severity severity = MCE_SEV_ERROR_SYNC;
   550		enum MCE_Initiator initiator = MCE_INITIATOR_CPU;
   551	
   552		nip = regs->nip;
   553	
   554		if (P9_SRR1_MC_LOADSTORE(regs->msr)) {
 > 555			handled = mce_handle_derror_p9(regs);
   556			mce_get_derror_p9(&mce_error_info, &addr, regs->dsisr);
   557		} else {
 > 558			handled = mce_handle_ierror_p9(regs);
   559			mce_get_ierror_p9(&mce_error_info, &addr, regs->msr);
   560		}
   561	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 51876 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/4] powerpc/powernv: cope with non-synchronous machine checks
  2017-02-16 17:01 ` [PATCH 3/4] powerpc/powernv: cope with non-synchronous machine checks Nicholas Piggin
@ 2017-02-17  0:04   ` kbuild test robot
  0 siblings, 0 replies; 9+ messages in thread
From: kbuild test robot @ 2017-02-17  0:04 UTC (permalink / raw)
  To: Nicholas Piggin; +Cc: kbuild-all, linuxppc-dev, Nicholas Piggin

[-- Attachment #1: Type: text/plain, Size: 2297 bytes --]

Hi Nicholas,

[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.10-rc8 next-20170216]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Nicholas-Piggin/POWER9-machine-check-handler/20170217-023423
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=powerpc 

All errors (new ones prefixed by >>):

   arch/powerpc/platforms/powernv/opal.c: In function 'opal_recover_mce':
>> arch/powerpc/platforms/powernv/opal.c:398:11: error: unused variable 'ea' [-Werror=unused-variable]
     uint64_t ea = get_mce_fault_addr(evt);
              ^~
   cc1: all warnings being treated as errors

vim +/ea +398 arch/powerpc/platforms/powernv/opal.c

14a43e69 Benjamin Herrenschmidt 2011-09-19  392  }
14a43e69 Benjamin Herrenschmidt 2011-09-19  393  
b63a0ffe Mahesh Salgaonkar      2013-10-30  394  static int opal_recover_mce(struct pt_regs *regs,
b63a0ffe Mahesh Salgaonkar      2013-10-30  395  					struct machine_check_event *evt)
b63a0ffe Mahesh Salgaonkar      2013-10-30  396  {
b63a0ffe Mahesh Salgaonkar      2013-10-30  397  	int recovered = 0;
b63a0ffe Mahesh Salgaonkar      2013-10-30 @398  	uint64_t ea = get_mce_fault_addr(evt);
b63a0ffe Mahesh Salgaonkar      2013-10-30  399  
b63a0ffe Mahesh Salgaonkar      2013-10-30  400  	if (!(regs->msr & MSR_RI)) {
b63a0ffe Mahesh Salgaonkar      2013-10-30  401  		/* If MSR_RI isn't set, we cannot recover */

:::::: The code at line 398 was first introduced by commit
:::::: b63a0ffe35de7e5f9b907bbc2c783e702f7e15af powerpc/powernv: Machine check exception handling.

:::::: TO: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
:::::: CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 22864 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] powerpc/powernv: handle POWER9 machine checks
  2017-02-16 17:01 ` [PATCH 4/4] powerpc/powernv: handle POWER9 " Nicholas Piggin
  2017-02-16 21:15   ` kbuild test robot
@ 2017-02-17  0:36   ` kbuild test robot
  1 sibling, 0 replies; 9+ messages in thread
From: kbuild test robot @ 2017-02-17  0:36 UTC (permalink / raw)
  To: Nicholas Piggin; +Cc: kbuild-all, linuxppc-dev, Nicholas Piggin

[-- Attachment #1: Type: text/plain, Size: 10476 bytes --]

Hi Nicholas,

[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.10-rc8 next-20170216]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Nicholas-Piggin/POWER9-machine-check-handler/20170217-023423
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=powerpc 

All errors (new ones prefixed by >>):

   arch/powerpc/kernel/mce_power.c: In function 'mce_get_derror_p9':
   arch/powerpc/kernel/mce_power.c:423:11: error: 'regs' undeclared (first use in this function)
      *addr = regs->nip;
              ^~~~
   arch/powerpc/kernel/mce_power.c:423:11: note: each undeclared identifier is reported only once for each function it appears in
   arch/powerpc/kernel/mce_power.c: In function 'mce_get_ierror_p9':
   arch/powerpc/kernel/mce_power.c:484:10: error: 'regs' undeclared (first use in this function)
     *addr = regs->nip;
             ^~~~
   arch/powerpc/kernel/mce_power.c: In function '__machine_check_early_realmode_p9':
   arch/powerpc/kernel/mce_power.c:555:13: error: too few arguments to function 'mce_handle_derror_p9'
      handled = mce_handle_derror_p9(regs);
                ^~~~~~~~~~~~~~~~~~~~
   arch/powerpc/kernel/mce_power.c:376:12: note: declared here
    static int mce_handle_derror_p9(struct pt_regs *regs, uint64_t *addr,
               ^~~~~~~~~~~~~~~~~~~~
   arch/powerpc/kernel/mce_power.c:558:13: error: too few arguments to function 'mce_handle_ierror_p9'
      handled = mce_handle_ierror_p9(regs);
                ^~~~~~~~~~~~~~~~~~~~
   arch/powerpc/kernel/mce_power.c:398:12: note: declared here
    static int mce_handle_ierror_p9(struct pt_regs *regs, uint64_t *addr,
               ^~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/kernel/mce_power.c:550:21: error: unused variable 'initiator' [-Werror=unused-variable]
     enum MCE_Initiator initiator = MCE_INITIATOR_CPU;
                        ^~~~~~~~~
>> arch/powerpc/kernel/mce_power.c:549:20: error: unused variable 'severity' [-Werror=unused-variable]
     enum MCE_Severity severity = MCE_SEV_ERROR_SYNC;
                       ^~~~~~~~
   cc1: all warnings being treated as errors

vim +/initiator +550 arch/powerpc/kernel/mce_power.c

   370			handled = mce_handle_ue_error(regs);
   371	
   372		save_mce_event(regs, handled, &mce_error_info, nip, addr);
   373		return handled;
   374	}
   375	
 > 376	static int mce_handle_derror_p9(struct pt_regs *regs, uint64_t *addr,
   377			enum MCE_Severity *severity, enum MCE_Initiator *initiator)
   378	{
   379		uint64_t dsisr = regs->dsisr;
   380	
   381	#if 0
   382		/* Could invalidate all tlbs then step over failing tlbie(l)? */
   383		if (dsisr & P9_DSISR_MC_USER_TLBIE) {
   384			regs->nip += 4;
   385			dsisr &= ~P9_DSISR_MC_USER_TLBIE;
   386		}
   387	#endif
   388	
   389		return mce_handle_flush_derrors(dsisr,
   390				P9_DSISR_MC_SLB_PARITY_MFSLB |
   391				P9_DSISR_MC_SLB_MULTIHIT_MFSLB,
   392	
   393				P9_DSISR_MC_TLB_MULTIHIT_MFTLB,
   394	
   395				P9_DSISR_MC_ERAT_MULTIHIT);
   396	}
   397	
   398	static int mce_handle_ierror_p9(struct pt_regs *regs, uint64_t *addr,
   399			enum MCE_Severity *severity, enum MCE_Initiator *initiator)
   400	{
   401		uint64_t srr1 = regs->msr;
   402	
   403		switch (P9_SRR1_MC_IFETCH(srr1)) {
   404		case P9_SRR1_MC_IFETCH_SLB_PARITY:
   405		case P9_SRR1_MC_IFETCH_SLB_MULTIHIT:
   406			return mce_flush(MCE_FLUSH_SLB);
   407		case P9_SRR1_MC_IFETCH_TLB_MULTIHIT:
   408			return mce_flush(MCE_FLUSH_TLB);
   409		case P9_SRR1_MC_IFETCH_ERAT_MULTIHIT:
   410			return mce_flush(MCE_FLUSH_ERAT);
   411		default:
   412			return 0;
   413		}
   414	}
   415	
   416	static void mce_get_derror_p9(struct mce_error_info *mce_err,
   417					uint64_t *addr, uint64_t dsisr)
   418	{
   419		mce_err->severity = MCE_SEV_ERROR_SYNC;
   420		mce_err->initiator = MCE_INITIATOR_CPU;
   421	
   422		if (dsisr & P9_DSISR_MC_USER_TLBIE)
   423			*addr = regs->nip;
   424		else
   425			*addr = regs->dar;
   426	
   427		if (dsisr & P9_DSISR_MC_UE) {
   428			mce_err->error_type = MCE_ERROR_TYPE_UE;
   429			mce_err->u.ue_error_type = MCE_UE_ERROR_LOAD_STORE;
   430		} else if (dsisr & P9_DSISR_MC_UE_TABLEWALK) {
   431			mce_err->error_type = MCE_ERROR_TYPE_UE;
   432			mce_err->u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE;
   433		} else if (dsisr & P9_DSISR_MC_LINK_LOAD_TIMEOUT) {
   434			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   435			mce_err->u.link_error_type = MCE_LINK_ERROR_LOAD_TIMEOUT;
   436		} else if (dsisr & P9_DSISR_MC_LINK_TABLEWALK_TIMEOUT) {
   437			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   438			mce_err->u.link_error_type = MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT;
   439		} else if (dsisr & P9_DSISR_MC_ERAT_MULTIHIT) {
   440			mce_err->error_type = MCE_ERROR_TYPE_ERAT;
   441			mce_err->u.erat_error_type = MCE_ERAT_ERROR_MULTIHIT;
   442		} else if (dsisr & P9_DSISR_MC_TLB_MULTIHIT_MFTLB) {
   443			mce_err->error_type = MCE_ERROR_TYPE_TLB;
   444			mce_err->u.tlb_error_type = MCE_TLB_ERROR_MULTIHIT;
   445		} else if (dsisr & P9_DSISR_MC_USER_TLBIE) {
   446			mce_err->error_type = MCE_ERROR_TYPE_USER;
   447			mce_err->u.user_error_type = MCE_USER_ERROR_TLBIE;
   448		} else if (dsisr & P9_DSISR_MC_SLB_PARITY_MFSLB) {
   449			mce_err->error_type = MCE_ERROR_TYPE_SLB;
   450			mce_err->u.slb_error_type = MCE_SLB_ERROR_PARITY;
   451		} else if (dsisr & P9_DSISR_MC_SLB_MULTIHIT_MFSLB) {
   452			mce_err->error_type = MCE_ERROR_TYPE_SLB;
   453			mce_err->u.slb_error_type = MCE_SLB_ERROR_MULTIHIT;
   454		} else if (dsisr & P9_DSISR_MC_RA_LOAD) {
   455			mce_err->error_type = MCE_ERROR_TYPE_RA;
   456			mce_err->u.ra_error_type = MCE_RA_ERROR_LOAD;
   457		} else if (dsisr & P9_DSISR_MC_RA_TABLEWALK) {
   458			mce_err->error_type = MCE_ERROR_TYPE_RA;
   459			mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE;
   460		} else if (dsisr & P9_DSISR_MC_RA_TABLEWALK_FOREIGN) {
   461			mce_err->error_type = MCE_ERROR_TYPE_RA;
   462			mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN;
   463		} else if (dsisr & P9_DSISR_MC_RA_FOREIGN) {
   464			mce_err->error_type = MCE_ERROR_TYPE_RA;
   465			mce_err->u.ra_error_type = MCE_RA_ERROR_LOAD_STORE_FOREIGN;
   466		}
   467	}
   468	
   469	static void mce_get_ierror_p9(struct mce_error_info *mce_err,
   470					uint64_t *addr, uint64_t srr1)
   471	{
   472		switch (P9_SRR1_MC_IFETCH(srr1)) {
   473		case P9_SRR1_MC_IFETCH_RA_ASYNC_STORE:
   474		case P9_SRR1_MC_IFETCH_LINK_ASYNC_STORE_TIMEOUT:
   475			mce_err->severity = MCE_SEV_FATAL;
   476			break;
   477		default:
   478			mce_err->severity = MCE_SEV_ERROR_SYNC;
   479			break;
   480		}
   481	
   482		mce_err->initiator = MCE_INITIATOR_CPU;
   483	
   484		*addr = regs->nip;
   485	
   486		switch (P9_SRR1_MC_IFETCH(srr1)) {
   487		case P9_SRR1_MC_IFETCH_UE:
   488			mce_err->error_type = MCE_ERROR_TYPE_UE;
   489			mce_err->u.ue_error_type = MCE_UE_ERROR_IFETCH;
   490			break;
   491		case P9_SRR1_MC_IFETCH_SLB_PARITY:
   492			mce_err->error_type = MCE_ERROR_TYPE_SLB;
   493			mce_err->u.slb_error_type = MCE_SLB_ERROR_PARITY;
   494			break;
   495		case P9_SRR1_MC_IFETCH_SLB_MULTIHIT:
   496			mce_err->error_type = MCE_ERROR_TYPE_SLB;
   497			mce_err->u.slb_error_type = MCE_SLB_ERROR_MULTIHIT;
   498			break;
   499		case P9_SRR1_MC_IFETCH_ERAT_MULTIHIT:
   500			mce_err->error_type = MCE_ERROR_TYPE_ERAT;
   501			mce_err->u.erat_error_type = MCE_ERAT_ERROR_MULTIHIT;
   502			break;
   503		case P9_SRR1_MC_IFETCH_TLB_MULTIHIT:
   504			mce_err->error_type = MCE_ERROR_TYPE_TLB;
   505			mce_err->u.tlb_error_type = MCE_TLB_ERROR_MULTIHIT;
   506			break;
   507		case P9_SRR1_MC_IFETCH_UE_TLB_RELOAD:
   508			mce_err->error_type = MCE_ERROR_TYPE_UE;
   509			mce_err->u.ue_error_type = MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH;
   510			break;
   511		case P9_SRR1_MC_IFETCH_LINK_TIMEOUT:
   512			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   513			mce_err->u.link_error_type = MCE_LINK_ERROR_IFETCH_TIMEOUT;
   514			break;
   515		case P9_SRR1_MC_IFETCH_LINK_TABLEWALK_TIMEOUT:
   516			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   517			mce_err->u.link_error_type = MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT;
   518			break;
   519		case P9_SRR1_MC_IFETCH_RA:
   520			mce_err->error_type = MCE_ERROR_TYPE_RA;
   521			mce_err->u.ra_error_type = MCE_RA_ERROR_IFETCH;
   522			break;
   523		case P9_SRR1_MC_IFETCH_RA_TABLEWALK:
   524			mce_err->error_type = MCE_ERROR_TYPE_RA;
   525			mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH;
   526			break;
   527		case P9_SRR1_MC_IFETCH_RA_ASYNC_STORE:
   528			mce_err->error_type = MCE_ERROR_TYPE_RA;
   529			mce_err->u.ra_error_type = MCE_RA_ERROR_STORE;
   530			break;
   531		case P9_SRR1_MC_IFETCH_LINK_ASYNC_STORE_TIMEOUT:
   532			mce_err->error_type = MCE_ERROR_TYPE_LINK;
   533			mce_err->u.link_error_type = MCE_LINK_ERROR_STORE_TIMEOUT;
   534			break;
   535		case P9_SRR1_MC_IFETCH_RA_TABLEWALK_FOREIGN:
   536			mce_err->error_type = MCE_ERROR_TYPE_RA;
   537			mce_err->u.ra_error_type = MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN;
   538			break;
   539		default:
   540			break;
   541		}
   542	}
   543	
   544	long __machine_check_early_realmode_p9(struct pt_regs *regs)
   545	{
   546		uint64_t nip, addr;
   547		long handled;
   548		struct mce_error_info mce_error_info = { 0 };
 > 549		enum MCE_Severity severity = MCE_SEV_ERROR_SYNC;
 > 550		enum MCE_Initiator initiator = MCE_INITIATOR_CPU;
   551	
   552		nip = regs->nip;
   553	
   554		if (P9_SRR1_MC_LOADSTORE(regs->msr)) {
   555			handled = mce_handle_derror_p9(regs);
   556			mce_get_derror_p9(&mce_error_info, &addr, regs->dsisr);
   557		} else {
 > 558			handled = mce_handle_ierror_p9(regs);
   559			mce_get_ierror_p9(&mce_error_info, &addr, regs->msr);
   560		}
   561	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 22864 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2017-02-17  0:37 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-16 17:01 [RFC[PATCH 0/4] POWER9 machine check handler Nicholas Piggin
2017-02-16 17:01 ` [PATCH 1/4] powerpc: machine check allow handler to set severity and initiator Nicholas Piggin
2017-02-16 17:01 ` [PATCH 2/4] powerpc/powernv: machine check rework recovery flushing Nicholas Piggin
2017-02-16 17:01 ` [PATCH 3/4] powerpc/powernv: cope with non-synchronous machine checks Nicholas Piggin
2017-02-17  0:04   ` kbuild test robot
2017-02-16 17:01 ` [PATCH 4/4] powerpc/powernv: handle POWER9 " Nicholas Piggin
2017-02-16 21:15   ` kbuild test robot
2017-02-17  0:36   ` kbuild test robot
2017-02-16 17:47 ` [RFC[PATCH 0/4] POWER9 machine check handler Nicholas Piggin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.