changeset 11069:e4b1c921f2de

6502086 DBU errors should be diagnosed as HV defect/fault 6502089 ferg.invalid errors should be diagnosed as a fault
author Trang Do <Trang.Do@Sun.COM>
date Mon, 16 Nov 2009 11:09:15 -0800
parents 9003c5184f28
children 3ac202191cfa
files usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_main.c usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_mem.h usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c
diffstat 3 files changed, 64 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_main.c	Mon Nov 16 09:55:18 2009 -0800
+++ b/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_main.c	Mon Nov 16 11:09:15 2009 -0800
@@ -320,7 +320,7 @@
 	{ "ereport.cpu.*.dac",		cmd_ce,		CMD_ERRCL_DAC },
 	{ "ereport.cpu.*.dsc",		cmd_ce,		CMD_ERRCL_DSC },
 	{ "ereport.cpu.*.dau",		cmd_ue_train,	CMD_ERRCL_DAU },
-	{ "ereport.cpu.*.dbu",		cmd_nop_train,	CMD_ERRCL_DBU },
+	{ "ereport.cpu.*.dbu",		cmd_fw_defect,	CMD_ERRCL_DBU },
 	{ "ereport.cpu.*.dsu",		cmd_ue,		CMD_ERRCL_DSU },
 	{ "ereport.cpu.*.sbdpc",	cmd_miscregs_train,
 	    CMD_ERRCL_SBDPC | CMD_CPU_LEVEL_THREAD },
@@ -367,6 +367,7 @@
 	{ "ereport.cpu.*.fdr", 		cmd_lfu_pe,	CMD_CPU_LEVEL_CHIP },
 	{ "ereport.cpu.*.to",  		cmd_lfu_pe,	CMD_CPU_LEVEL_CHIP },
 	{ "ereport.cpu.*.snptyp",	cmd_lfu_pe,	CMD_CPU_LEVEL_CHIP },
+	{ "ereport.fm.ferg.invalid",	cmd_fw_defect },
 #endif /* sun4u */
 	{ "ereport.cpu.*.fpu.hwcopy",	cmd_fpu },
 	{ NULL, NULL }
@@ -680,6 +681,7 @@
 	fmd_hdl_subscribe(hdl, "ereport.cpu.ultraSPARC-T2.*");
 	fmd_hdl_subscribe(hdl, "ereport.cpu.ultraSPARC-T2plus.*");
 	fmd_hdl_subscribe(hdl, "ereport.cpu.ultraSPARC-T1.*");
+	fmd_hdl_subscribe(hdl, "ereport.fm.ferg.invalid");
 
 	fmd_hdl_subscribe(hdl, "ereport.io.tom.ecc.drce");
 	fmd_hdl_subscribe(hdl, "ereport.io.tom.ecc.dwce");
--- a/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_mem.h	Mon Nov 16 09:55:18 2009 -0800
+++ b/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_mem.h	Mon Nov 16 11:09:15 2009 -0800
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -134,6 +134,8 @@
 extern void cmd_branch_close(fmd_hdl_t *, void *);
 extern cmd_evdisp_t cmd_fb(fmd_hdl_t *, fmd_event_t *, nvlist_t *,
     const char *, cmd_errcl_t);
+extern cmd_evdisp_t cmd_fw_defect(fmd_hdl_t *, fmd_event_t *, nvlist_t *,
+    const char *, cmd_errcl_t);
 extern cmd_evdisp_t cmd_fb_train(fmd_hdl_t *, fmd_event_t *, nvlist_t *,
     const char *, cmd_errcl_t);
 extern cmd_evdisp_t cmd_ue_train(fmd_hdl_t *, fmd_event_t *, nvlist_t *,
--- a/usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c	Mon Nov 16 09:55:18 2009 -0800
+++ b/usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c	Mon Nov 16 11:09:15 2009 -0800
@@ -59,11 +59,15 @@
 #define	UTS2_CPUS_PER_CHIP	64
 #define	FBR_ERROR	".fbr"
 #define	DSU_ERROR	".dsu"
+#define	FERG_INVALID	".invalid"
+#define	DBU_ERROR 	".dbu"
 
 extern ldom_hdl_t *cpumem_diagnosis_lhp;
 
 static fmd_hdl_t *cpumem_hdl = NULL;
 
+#define	ERR_CLASS(x, y)	(strcmp(strrchr(x, '.'), y))
+
 static void *
 cpumem_alloc(size_t size)
 {
@@ -389,7 +393,7 @@
 		    &branch->branch_header, CMD_PTR_BRANCH_CASE, &uuid);
 	}
 
-	if (strcmp(strrchr(class, '.'), FBR_ERROR) == 0) {
+	if (ERR_CLASS(class, FBR_ERROR) == 0) {
 		if (nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_NAME_TS3_FCR,
 		    &ts3_fcr) == 0 && (ts3_fcr != VF_TS3_FCR)) {
 			fmd_hdl_debug(hdl,
@@ -422,7 +426,7 @@
 			cmd_branch_create_fault(hdl, branch,
 			    "fault.memory.link-c", det);
 		}
-	} else if (strcmp(strrchr(class, '.'), DSU_ERROR) == 0) {
+	} else if (ERR_CLASS(class, DSU_ERROR) == 0) {
 		fmd_hdl_debug(hdl, "Processing dsu event");
 		cmd_branch_create_fault(hdl, branch, "fault.memory.bank", det);
 	} else {
@@ -470,6 +474,58 @@
 	return (rc);
 }
 
+
+/*ARGSUSED*/
+cmd_evdisp_t
+cmd_fw_defect(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
+    cmd_errcl_t clcode)
+{
+	const char *fltclass = NULL;
+	nvlist_t *rsc = NULL;
+	int solve = 0;
+
+	if ((rsc = init_mb(hdl)) == NULL)
+		return (CMD_EVD_UNUSED);
+
+	if (ERR_CLASS(class, FERG_INVALID) == 0) {
+		fltclass = "defect.fw.generic-sparc.erpt-gen";
+	} else if (ERR_CLASS(class, DBU_ERROR) == 0) {
+		cmd_evdisp_t rc;
+		fltclass = "defect.fw.generic-sparc.addr-oob";
+		/*
+		 * add dbu to nop error train
+		 */
+		rc = cmd_xxcu_initial(hdl, ep, nvl, class, clcode,
+		    CMD_XR_HDLR_NOP);
+		if (rc != 0)
+			fmd_hdl_debug(hdl,
+			    "Failed to add error (%llx) to the train, rc = %d",
+			    clcode, rc);
+	} else {
+		fmd_hdl_debug(hdl, "Unexpected fw defect event %s", class);
+	}
+
+	if (fltclass) {
+		fmd_case_t *cp = NULL;
+		nvlist_t *fault = NULL;
+
+		fault = fmd_nvl_create_fault(hdl, fltclass, 100, NULL,
+		    NULL, rsc);
+		if (fault != NULL) {
+			cp = fmd_case_open(hdl, NULL);
+			fmd_case_add_ereport(hdl, cp, ep);
+			fmd_case_add_suspect(hdl, cp, fault);
+			fmd_case_solve(hdl, cp);
+			solve = 1;
+		}
+	}
+
+	if (rsc)
+		nvlist_free(rsc);
+
+	return (solve ? CMD_EVD_OK : CMD_EVD_UNUSED);
+}
+
 void
 cmd_branch_close(fmd_hdl_t *hdl, void *arg)
 {