Mercurial > illumos > illumos-gate
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) {