[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [XEN][POWERPC] Machine check now inspects the SCOM for more information



# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# Node ID 7f3ae39112cd5fb662621d7d6e7a43e39ecb335a
# Parent  95cead06e4abd4b81c995ce4a70273b74eff929b
[XEN][POWERPC] Machine check now inspects the SCOM for more information
Also fixes suggested by <segher@xxxxxxxxxxxxxxxxxxx>
Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
 xen/arch/powerpc/powerpc64/ppc970_machinecheck.c |    7 +++
 xen/arch/powerpc/powerpc64/ppc970_scom.c         |   41 ++++++++++-------------
 2 files changed, 25 insertions(+), 23 deletions(-)

diff -r 95cead06e4ab -r 7f3ae39112cd 
xen/arch/powerpc/powerpc64/ppc970_machinecheck.c
--- a/xen/arch/powerpc/powerpc64/ppc970_machinecheck.c  Thu Sep 21 13:48:24 
2006 -0400
+++ b/xen/arch/powerpc/powerpc64/ppc970_machinecheck.c  Fri Sep 22 11:02:47 
2006 -0400
@@ -24,6 +24,8 @@
 #include <public/xen.h>
 #include <asm/processor.h>
 #include <asm/percpu.h>
+#include <asm/debugger.h>
+#include "scom.h"
 
 #define MCK_SRR1_INSN_FETCH_UNIT    0x0000000000200000 /* 42 */
 #define MCK_SRR1_LOAD_STORE         0x0000000000100000 /* 43 */
@@ -54,6 +56,8 @@ int cpu_machinecheck(struct cpu_user_reg
     if (mck_cpu_stats[mfpir()] != 0)
         printk("While in CI IO\n");
 
+    show_backtrace_regs(regs);
+
     printk("SRR1: 0x%016lx\n", regs->msr);
     if (regs->msr & MCK_SRR1_INSN_FETCH_UNIT)
         printk("42: Exception caused by Instruction Fetch Unit (IFU)\n"
@@ -67,6 +71,7 @@ int cpu_machinecheck(struct cpu_user_reg
     case 0:
         printk("0b00: Likely caused by an asynchronous machine check,\n"
                "      see SCOM Asynchronous Machine Check Register\n");
+        cpu_scom_AMCR();
         break;
     case MCK_SRR1_CAUSE_SLB_PAR:
         printk("0b01: Exception caused by an SLB parity error detected\n"
@@ -116,5 +121,5 @@ int cpu_machinecheck(struct cpu_user_reg
         dump_segments(0);
     }
 
-    return 0; /* for now lets not recover; */
+    return 0; /* for now lets not recover */
 }
diff -r 95cead06e4ab -r 7f3ae39112cd xen/arch/powerpc/powerpc64/ppc970_scom.c
--- a/xen/arch/powerpc/powerpc64/ppc970_scom.c  Thu Sep 21 13:48:24 2006 -0400
+++ b/xen/arch/powerpc/powerpc64/ppc970_scom.c  Fri Sep 22 11:02:47 2006 -0400
@@ -24,6 +24,7 @@
 #include <xen/console.h>
 #include <xen/errno.h>
 #include <asm/delay.h>
+#include "scom.h"
 
 #define SPRN_SCOMC 276
 #define SPRN_SCOMD 277
@@ -48,7 +49,7 @@ union scomc {
 };
 
 
-static inline int read_scom(uint addr, ulong *d)
+int cpu_scom_read(uint addr, ulong *d)
 {
     union scomc c;
     ulong flags;
@@ -56,9 +57,9 @@ static inline int read_scom(uint addr, u
     /* drop the low 8bits (including parity) */
     addr >>= 8;
 
-    /* these give iface errors because the address is ambiguous after
-     * the above bit dropping */
-    BUG_ON(addr == 0x8000);
+    /* these give iface errors because the addresses are not software
+     * accessible */
+    BUG_ON(addr & 0x8000);
 
     for (;;) {
         c.word = 0;
@@ -100,7 +101,7 @@ static inline int read_scom(uint addr, u
     }
 }
 
-static inline int write_scom(uint addr, ulong d)
+int cpu_scom_write(uint addr, ulong d)
 {
     union scomc c;
     ulong flags;
@@ -108,9 +109,9 @@ static inline int write_scom(uint addr, 
     /* drop the low 8bits (including parity) */
     addr >>= 8;
 
-    /* these give iface errors because the address is ambiguous after
-     * the above bit dropping */
-    BUG_ON(addr == 0x8000);
+    /* these give iface errors because the addresses are not software
+     * accessible */
+    BUG_ON(addr & 0x8000);
 
     for (;;) {
         c.word = 0;
@@ -150,25 +151,21 @@ static inline int write_scom(uint addr, 
     }
 }
 
-/* SCOMC addresses are 16bit but we are given 24 bits in the
- * books. The low oerder 8 bits are some kinda parity thin and should
- * be ignored */
-#define SCOM_AMCS_REG      0x022601
-#define SCOM_AMCS_AND_MASK 0x022700
-#define SCOM_AMCS_OR_MASK  0x022800
-#define SCOM_CMCE          0x030901
-#define SCOM_PMCR          0x400801
-#define SCOM_PTSR          0x408001
-
-/* cannot access these since only top 16bits are considered */
-#define SCOM_STATUS        0x800003
-
 void cpu_scom_init(void)
 {
     ulong val;
     console_start_sync();
-    if (!read_scom(SCOM_PTSR, &val))
+    if (!cpu_scom_read(SCOM_PTSR, &val))
         printk("SCOM PTSR: 0x%016lx\n", val);
 
     console_end_sync();
 }
+
+void cpu_scom_AMCR(void)
+{
+    ulong val;
+
+    cpu_scom_read(SCOM_AMC_REG, &val);
+    printk("SCOM AMCR: 0x%016lx\n", val);
+}
+

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.