diff options
-rw-r--r-- | usr/src/cmd/fm/eversholt/files/i386/i86pc/amd64.esc | 7 | ||||
-rw-r--r-- | usr/src/common/mc/mc-amd/mcamd_api.h | 2 | ||||
-rw-r--r-- | usr/src/common/mc/mc-amd/mcamd_err.c | 10 | ||||
-rw-r--r-- | usr/src/common/mc/mc-amd/mcamd_err.h | 8 | ||||
-rw-r--r-- | usr/src/common/mc/mc-amd/mcamd_patounum.c | 56 | ||||
-rw-r--r-- | usr/src/uts/i86pc/Makefile | 2 | ||||
-rw-r--r-- | usr/src/uts/i86pc/cpu/amd_opteron/ao.h | 16 | ||||
-rw-r--r-- | usr/src/uts/i86pc/cpu/amd_opteron/ao_mc.c | 13 | ||||
-rw-r--r-- | usr/src/uts/i86pc/cpu/amd_opteron/ao_mca.c | 32 | ||||
-rw-r--r-- | usr/src/uts/i86pc/cpu/amd_opteron/ao_mca_disp.in | 396 | ||||
-rw-r--r-- | usr/src/uts/i86pc/cpu/scripts/Makefile | 7 | ||||
-rw-r--r-- | usr/src/uts/i86pc/cpu/scripts/ao_gendisp.pl | 164 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/mc/mcamd_subr.c | 8 | ||||
-rw-r--r-- | usr/src/uts/i86pc/os/cmi.c | 6 | ||||
-rw-r--r-- | usr/src/uts/i86pc/sys/cpu_module.h | 3 | ||||
-rw-r--r-- | usr/src/uts/i86pc/sys/cpu_module_impl.h | 3 | ||||
-rw-r--r-- | usr/src/uts/intel/sys/mc_amd.h | 17 |
17 files changed, 448 insertions, 302 deletions
diff --git a/usr/src/cmd/fm/eversholt/files/i386/i86pc/amd64.esc b/usr/src/cmd/fm/eversholt/files/i386/i86pc/amd64.esc index 0bf5f5d600..b52ff16986 100644 --- a/usr/src/cmd/fm/eversholt/files/i386/i86pc/amd64.esc +++ b/usr/src/cmd/fm/eversholt/files/i386/i86pc/amd64.esc @@ -321,10 +321,11 @@ prop fault.memory.page_ck@chip/memory-controller/dimm/rank ereport.cpu.amd.nb.mem_ce@chip/cpu { CONTAINS_RANK && GET_ADDR && GET_OFFSET }; +/* + * Discard memory ereports that do not indicate a resource. + */ prop upset.memory.discard1@chip/cpu (1)-> - ereport.cpu.amd.ic.inf_sys_ecc1@chip/cpu; /* always discard - no resource */ - -prop upset.memory.discard1@chip/cpu (1)-> + ereport.cpu.amd.ic.inf_sys_ecc1@chip/cpu { !RESOURCE_EXISTS }, ereport.cpu.amd.dc.inf_sys_ecc1@chip/cpu { !RESOURCE_EXISTS }, ereport.cpu.amd.bu.s_ecc1@chip/cpu { !RESOURCE_EXISTS }, ereport.cpu.amd.nb.mem_ce@chip/cpu { !RESOURCE_EXISTS }; diff --git a/usr/src/common/mc/mc-amd/mcamd_api.h b/usr/src/common/mc/mc-amd/mcamd_api.h index 977b9dfe94..4053199ebd 100644 --- a/usr/src/common/mc/mc-amd/mcamd_api.h +++ b/usr/src/common/mc/mc-amd/mcamd_api.h @@ -197,7 +197,7 @@ union mcamd_dimm_offset_un { extern const char *mcamd_get_propname(mcamd_propcode_t); extern int mcamd_patounum(struct mcamd_hdl *, mcamd_node_t *, uint64_t, - uint32_t, int, mc_unum_t *); + uint8_t, uint8_t, uint32_t, int, mc_unum_t *); extern int mcamd_unumtopa(struct mcamd_hdl *, mcamd_node_t *, mc_unum_t *, uint64_t *); extern int mc_pa_to_offset(struct mcamd_hdl *, mcamd_node_t *, mcamd_node_t *, diff --git a/usr/src/common/mc/mc-amd/mcamd_err.c b/usr/src/common/mc/mc-amd/mcamd_err.c index d0e1666423..689e556cd4 100644 --- a/usr/src/common/mc/mc-amd/mcamd_err.c +++ b/usr/src/common/mc/mc-amd/mcamd_err.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -31,8 +30,9 @@ static const char *const _mcamd_errlist[] = { "Invalid syndrome", /* EMCAMD_SYNDINVALID */ "Invalid configuration tree", /* EMCAMD_TREEINVALID */ - "Address not found" /* EMCAMD_NOADDR */ - "Operation not supported" /* EMCAMD_NOTSUP */ + "Address not found", /* EMCAMD_NOADDR */ + "Operation not supported", /* EMCAMD_NOTSUP */ + "Too few valid address bits", /* EMCAMD_INSUFF_RES */ }; static const int _mcamd_nerr = sizeof (_mcamd_errlist) / diff --git a/usr/src/common/mc/mc-amd/mcamd_err.h b/usr/src/common/mc/mc-amd/mcamd_err.h index f9a762e211..f9dc53f32d 100644 --- a/usr/src/common/mc/mc-amd/mcamd_err.h +++ b/usr/src/common/mc/mc-amd/mcamd_err.h @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -38,7 +37,8 @@ enum { EMCAMD_SYNDINVALID = EMCAMD_BASE, /* invalid syndrome */ EMCAMD_TREEINVALID, /* invalid configuration tree */ EMCAMD_NOADDR, /* address not found */ - EMCAMD_NOTSUP /* operation not supported */ + EMCAMD_NOTSUP, /* operation not supported */ + EMCAMD_INSUFF_RES /* insufficient resolution */ }; extern const char *mcamd_errmsg(struct mcamd_hdl *); diff --git a/usr/src/common/mc/mc-amd/mcamd_patounum.c b/usr/src/common/mc/mc-amd/mcamd_patounum.c index b58a751d60..594af7e7cc 100644 --- a/usr/src/common/mc/mc-amd/mcamd_patounum.c +++ b/usr/src/common/mc/mc-amd/mcamd_patounum.c @@ -36,6 +36,8 @@ #include <mcamd_api.h> #include <mcamd_err.h> +#define MC_SYSADDR_MSB 39 +#define MC_SYSADDR_LSB 3 #define CSDIMM1 0x1 #define CSDIMM2 0x2 @@ -342,7 +344,7 @@ unum_fill(struct mcamd_hdl *hdl, mcamd_node_t *cs, int which, */ static int mc_whichdimm(struct mcamd_hdl *hdl, mcamd_node_t *cs, uint64_t pa, - uint32_t synd, int syndtype) + uint8_t valid_lo, uint32_t synd, int syndtype) { int lobit, hibit, data, check; uint64_t dimm1, dimm2; @@ -379,14 +381,22 @@ mc_whichdimm(struct mcamd_hdl *hdl, mcamd_node_t *cs, uint64_t pa, /* * 64/8 ECC is checked separately for the upper and lower * halves, so even an uncorrectable error is contained within - * one of the two halves. The error address is accurate to - * 8 bytes, so bit 4 distinguises upper from lower. + * one of the two halves. If we have sufficient address resolution + * then we can determine which DIMM. */ if (syndtype == AMD_SYNDTYPE_ECC) { - mcamd_dprintf(hdl, MCAMD_DBG_FLOW, "mc_whichdimm: 64/8 ECC " - "and PA 0x%llx is in %s half\n", pa, - pa & 8 ? "lower" : "upper"); - return (pa & 8 ? CSDIMM2 : CSDIMM1); + if (valid_lo <= MC_SYSADDR_LSB) { + mcamd_dprintf(hdl, MCAMD_DBG_FLOW, "mc_whichdimm: 64/8 " + "ECC in 128-bit mode, PA 0x%llx is in %s half\n", + pa, pa & 0x8 ? "upper" : "lower"); + return (pa & 0x8 ? CSDIMM2 : CSDIMM1); + } else { + mcamd_dprintf(hdl, MCAMD_DBG_FLOW, "mc_whichdimm: " + "64/8 ECC in 128-bit mode, PA 0x%llx with least " + "significant valid bit %d cannot be resolved to " + "a single DIMM\n", pa, valid_lo); + return (mcamd_set_errno(hdl, EMCAMD_INSUFF_RES)); + } } /* @@ -430,7 +440,8 @@ mc_whichdimm(struct mcamd_hdl *hdl, mcamd_node_t *cs, uint64_t pa, */ static int mc_bkdg_patounum(struct mcamd_hdl *hdl, mcamd_node_t *mc, uint64_t pa, - uint32_t synd, int syndtype, mc_unum_t *unump) + uint8_t valid_lo, uint32_t synd, int syndtype, + mc_unum_t *unump) { int which; uint64_t mcnum, rev; @@ -565,8 +576,8 @@ mc_bkdg_patounum(struct mcamd_hdl *hdl, mcamd_node_t *mc, uint64_t pa, if ((sparecs = cs_sparedto(hdl, cs, mc)) != NULL) cs = sparecs; - if ((which = mc_whichdimm(hdl, cs, pa, synd, - syndtype)) < 0) + if ((which = mc_whichdimm(hdl, cs, pa, valid_lo, + synd, syndtype)) < 0) return (-1); /* errno is set for us */ /* @@ -597,7 +608,7 @@ mc_bkdg_patounum(struct mcamd_hdl *hdl, mcamd_node_t *mc, uint64_t pa, /*ARGSUSED*/ static int mc_patounum(struct mcamd_hdl *hdl, mcamd_node_t *mc, uint64_t pa, - uint32_t synd, int syndtype, mc_unum_t *unump) + uint8_t valid_lo, uint32_t synd, int syndtype, mc_unum_t *unump) { uint64_t iaddr; mcamd_node_t *cs, *sparecs; @@ -612,7 +623,8 @@ mc_patounum(struct mcamd_hdl *hdl, mcamd_node_t *mc, uint64_t pa, * difficult to review against the BKDG approach. */ mcamd_dprintf(hdl, MCAMD_DBG_FLOW, "BKDG brute-force method begins\n"); - bkdgres = mc_bkdg_patounum(hdl, mc, pa, synd, syndtype, &bkdg_unum); + bkdgres = mc_bkdg_patounum(hdl, mc, pa, valid_lo, synd, + syndtype, &bkdg_unum); mcamd_dprintf(hdl, MCAMD_DBG_FLOW, "BKDG brute-force method ends\n"); #endif @@ -639,7 +651,8 @@ mc_patounum(struct mcamd_hdl *hdl, mcamd_node_t *mc, uint64_t pa, cs = sparecs; } - if ((which = mc_whichdimm(hdl, cs, pa, synd, syndtype)) < 0) + if ((which = mc_whichdimm(hdl, cs, pa, valid_lo, synd, + syndtype)) < 0) return (-1); /* errno is set for us */ if (unum_fill(hdl, cs, which, iaddr, unump, 1) < 0) @@ -676,24 +689,27 @@ mc_patounum(struct mcamd_hdl *hdl, mcamd_node_t *mc, uint64_t pa, int mcamd_patounum(struct mcamd_hdl *hdl, mcamd_node_t *root, uint64_t pa, - uint32_t synd, int syndtype, mc_unum_t *unump) + uint8_t valid_hi, uint8_t valid_lo, uint32_t synd, int syndtype, + mc_unum_t *unump) { mcamd_node_t *mc; mcamd_dprintf(hdl, MCAMD_DBG_FLOW, "mcamd_patounum: pa=0x%llx, " "synd=0x%x, syndtype=%d\n", pa, synd, syndtype); - /* - * Consider allowing syndrome 0 to act as a generic multibit - * syndrome. For example icache inf_sys_ecc1 captures an address - * but no syndrome - we can still resolve this to a dimm or dimms. - */ + if (valid_hi < MC_SYSADDR_MSB) { + mcamd_dprintf(hdl, MCAMD_DBG_FLOW, "mcamd_patounum: require " + "pa<%d> to be valid\n", MC_SYSADDR_MSB); + return (mcamd_set_errno(hdl, EMCAMD_INSUFF_RES)); + } + if (!mcamd_synd_validate(hdl, synd, syndtype)) return (mcamd_set_errno(hdl, EMCAMD_SYNDINVALID)); for (mc = mcamd_mc_next(hdl, root, NULL); mc != NULL; mc = mcamd_mc_next(hdl, root, mc)) { - if (mc_patounum(hdl, mc, pa, synd, syndtype, unump) == 0) + if (mc_patounum(hdl, mc, pa, valid_lo, synd, + syndtype, unump) == 0) return (0); if (mcamd_errno(hdl) != EMCAMD_NOADDR) diff --git a/usr/src/uts/i86pc/Makefile b/usr/src/uts/i86pc/Makefile index 2ae5ed9c24..cfd649a46b 100644 --- a/usr/src/uts/i86pc/Makefile +++ b/usr/src/uts/i86pc/Makefile @@ -96,7 +96,7 @@ genassym unix $(KMODS): FRC @cd $@; pwd; $(MAKE) $(NO_STATE) $(TARGET) setup: FRC - @cd cpu/scripts; pwd; $(MAKE) setup + @cd cpu/scripts; pwd; $(MAKE) $(TARGET) $(XMODS): FRC @if [ -f $@/Makefile ]; then \ diff --git a/usr/src/uts/i86pc/cpu/amd_opteron/ao.h b/usr/src/uts/i86pc/cpu/amd_opteron/ao.h index 82e58bb638..89cc07ab1d 100644 --- a/usr/src/uts/i86pc/cpu/amd_opteron/ao.h +++ b/usr/src/uts/i86pc/cpu/amd_opteron/ao.h @@ -32,6 +32,7 @@ #include <sys/types.h> #include <sys/mc.h> #include <sys/mca_amd.h> +#include <sys/mc_amd.h> #include <sys/cpu_module_impl.h> #include <sys/nvpair.h> #include <sys/cyclic.h> @@ -77,6 +78,13 @@ extern ao_bank_regs_t ao_bank_regs[AMD_MCA_BANK_COUNT]; #define AO_AED_F_CORRECTABLE 0x01 #define AO_AED_F_LOFAULT_OK 0x02 +#define AO_AED_F_LINEAR 0x04 /* MCi_ADDR is a linear address */ +#define AO_AED_F_PHYSICAL 0x08 /* MCi_ADDR is a physical address */ +#define AO_AED_F_PAGEALIGNED 0x10 /* MCi_ADDR aligns to page size */ +#define AO_AED_F_L2SETWAY 0x20 /* 3:0 = way, 15/14/13/12:6 = set */ + +#define AO_AED_FLAGS_ADDRTYPE (AO_AED_F_LINEAR | AO_AED_F_PHYSICAL | \ + AO_AED_F_PAGEALIGNED | AO_AED_F_L2SETWAY) typedef struct ao_error_disp { const char *aed_class; /* ereport class for use if match */ @@ -88,6 +96,8 @@ typedef struct ao_error_disp { uint8_t aed_stat_pp_bits:4; /* AO_MCA_PP_BIT_* for pp matching */ uint8_t aed_stat_ii_bits:4; /* AO_MCA_II_BIT_* for ii matching */ uint16_t aed_stat_r4_bits; /* AO_MCA_R4_BIT_* for r4 matching */ + uint8_t aed_addrvalid_hi; /* most significant valid addr bit */ + uint8_t aed_addrvalid_lo; /* least significant valid addr bit */ uint8_t aed_panic_when; /* extra conditions for panic */ uint8_t aed_flags; /* AO_AED_F_* */ } ao_error_disp_t; @@ -141,6 +151,9 @@ typedef struct ao_bank_logout { uint64_t abl_status; /* Saved MCi_STATUS register */ uint64_t abl_addr; /* Saved MCi_ADDR register */ uint64_t abl_misc; /* Saved MCi_MISC register */ + uint8_t abl_addr_type; /* flags & AO_AED_FLAGS_ADDRTYPE */ + uint8_t abl_addr_valid_hi; /* most significant valid addr bit */ + uint8_t abl_addr_valid_lo; /* least significant valid addr bit */ } ao_bank_logout_t; #define AO_ACL_F_PRIV 0x1 /* #mc in kernel mode (else user) */ @@ -245,7 +258,8 @@ extern nvlist_t *ao_fmri_create(ao_data_t *, nv_alloc_t *); extern void ao_mc_register(void *, const cmi_mc_ops_t *, void *); extern const struct cmi_mc_ops *ao_mc_getops(void *); -extern int ao_mc_patounum(ao_data_t *, uint64_t, uint32_t, int, mc_unum_t *); +extern int ao_mc_patounum(ao_data_t *, uint64_t, uint8_t, uint8_t, uint32_t, + int, mc_unum_t *); extern int ao_mc_unumtopa(ao_data_t *, mc_unum_t *, nvlist_t *, uint64_t *); extern void ao_pcicfg_write(uint_t, uint_t, uint_t, uint32_t); diff --git a/usr/src/uts/i86pc/cpu/amd_opteron/ao_mc.c b/usr/src/uts/i86pc/cpu/amd_opteron/ao_mc.c index b2fd0ca82f..b958cfc31e 100644 --- a/usr/src/uts/i86pc/cpu/amd_opteron/ao_mc.c +++ b/usr/src/uts/i86pc/cpu/amd_opteron/ao_mc.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -51,14 +50,14 @@ ao_mc_getops(void *data) } int -ao_mc_patounum(ao_data_t *ao, uint64_t pa, uint32_t synd, int syndtype, - mc_unum_t *unump) +ao_mc_patounum(ao_data_t *ao, uint64_t pa, uint8_t valid_hi, uint8_t valid_lo, + uint32_t synd, int syndtype, mc_unum_t *unump) { if (ao->ao_mc_ops == NULL) return (0); /* mc not registered, or failed to load */ - return (ao->ao_mc_ops->cmi_mc_patounum(ao->ao_mc_data, pa, synd, - syndtype, unump)); + return (ao->ao_mc_ops->cmi_mc_patounum(ao->ao_mc_data, pa, + valid_hi, valid_lo, synd, syndtype, unump)); } int diff --git a/usr/src/uts/i86pc/cpu/amd_opteron/ao_mca.c b/usr/src/uts/i86pc/cpu/amd_opteron/ao_mca.c index 5b36685e9f..a4dc3e7660 100644 --- a/usr/src/uts/i86pc/cpu/amd_opteron/ao_mca.c +++ b/usr/src/uts/i86pc/cpu/amd_opteron/ao_mca.c @@ -130,11 +130,17 @@ static const ao_error_disp_t ao_disp_unknown = { */ static const struct ao_smi_disable { const char *asd_sys_vendor; /* SMB_TYPE_SYSTEM vendor prefix */ + const char *asd_sys_product; /* SMB_TYPE_SYSTEM product prefix */ const char *asd_bios_vendor; /* SMB_TYPE_BIOS vendor prefix */ uint8_t asd_code; /* output code for SMI disable */ } ao_smi_disable[] = { - { "Sun Microsystems", "American Megatrends", 0x59 }, - { NULL, NULL, 0 } + { "Sun Microsystems", "Galaxy12", + "American Megatrends", 0x59 }, + { "Sun Microsystems", "Sun Fire X4100 Server", + "American Megatrends", 0x59 }, + { "Sun Microsystems", "Sun Fire X4200 Server", + "American Megatrends", 0x59 }, + { NULL, NULL, NULL, 0 } }; static int @@ -603,7 +609,7 @@ ao_mca_logout(ao_cpu_logout_t *acl, struct regs *rp, int *np, int skipnb, /* * Iterate over the banks of machine-check registers, read the address * and status registers into the logout area, and clear status as we go. - * Also read the MCi_MISC register is MCi_STATUS.MISCV indicates that + * Also read the MCi_MISC register if MCi_STATUS.MISCV indicates that * there is valid info there (as it will in revisions F and G for * NorthBridge ECC errors). */ @@ -716,6 +722,9 @@ ao_mca_logout(ao_cpu_logout_t *acl, struct regs *rp, int *np, int skipnb, if (rp != NULL && aed == &ao_disp_unknown) fatal++; + abl->abl_addr_type = aed->aed_flags & AO_AED_FLAGS_ADDRTYPE; + abl->abl_addr_valid_hi = aed->aed_addrvalid_hi; + abl->abl_addr_valid_lo = aed->aed_addrvalid_lo; n++; } @@ -855,14 +864,17 @@ ao_ereport_add_logout(ao_data_t *ao, nvlist_t *payload, nv_alloc_t *nva, if (members & FM_EREPORT_PAYLOAD_FLAG_RESOURCE) { mc_unum_t unum; - int addrvalid; + int addrvalid = 0; - addrvalid = (members & FM_EREPORT_PAYLOAD_FLAG_ADDR) && - (members & FM_EREPORT_PAYLOAD_FLAG_ADDR_VALID) && - (abl->abl_status & AMD_BANK_STAT_ADDRV); + if (abl->abl_addr_type & AO_AED_F_PHYSICAL) { + addrvalid = (members & FM_EREPORT_PAYLOAD_FLAG_ADDR) && + (members & FM_EREPORT_PAYLOAD_FLAG_ADDR_VALID) && + (abl->abl_status & AMD_BANK_STAT_ADDRV); + } - if (addrvalid && ao_mc_patounum(ao, abl->abl_addr, synd, - syndtype, &unum)) + if (addrvalid && ao_mc_patounum(ao, abl->abl_addr, + abl->abl_addr_valid_hi, abl->abl_addr_valid_lo, + synd, syndtype, &unum)) ao_ereport_add_resource(payload, nva, &unum); } @@ -1183,6 +1195,8 @@ ao_mca_post_init(void *data) for (asd = ao_smi_disable; asd->asd_sys_vendor != NULL; asd++) { if (strncmp(asd->asd_sys_vendor, si.smbi_manufacturer, strlen(asd->asd_sys_vendor)) != 0 || + strncmp(asd->asd_sys_product, si.smbi_product, + strlen(asd->asd_sys_product)) != 0 || strncmp(asd->asd_bios_vendor, sb.smbb_vendor, strlen(asd->asd_bios_vendor)) != 0) continue; diff --git a/usr/src/uts/i86pc/cpu/amd_opteron/ao_mca_disp.in b/usr/src/uts/i86pc/cpu/amd_opteron/ao_mca_disp.in index 281f14301e..2a97a900e5 100644 --- a/usr/src/uts/i86pc/cpu/amd_opteron/ao_mca_disp.in +++ b/usr/src/uts/i86pc/cpu/amd_opteron/ao_mca_disp.in @@ -31,12 +31,12 @@ error = ereport.cpu.amd.dc.inf_sys_ecc1 mask on = AMD_BANK_STAT_CECC mask off = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src 0 drd mem/io lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src 0 drd <39:6> mem/io lg - panic = never -flags = correctable +flags = correctable,physical # --- @@ -46,12 +46,12 @@ error = ereport.cpu.amd.dc.inf_l2_ecc1 mask on = AMD_BANK_STAT_CECC mask off = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - drd - l2 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - drd <39:6> - l2 data panic = never -flags = correctable +flags = correctable,physical # --- @@ -61,12 +61,12 @@ error = ereport.cpu.amd.dc.inf_sys_eccm mask on = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src 0 drd mem/io lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src 0 drd <39:6> mem/io lg - panic = always -flags = +flags = physical # --- @@ -76,12 +76,12 @@ error = ereport.cpu.amd.dc.inf_l2_eccm mask on = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - drd - l2 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - drd <39:6> - l2 data panic = always -flags = correctable +flags = physical # --- @@ -91,12 +91,12 @@ error = ereport.cpu.amd.dc.data_ecc1 mask on = AMD_BANK_STAT_CECC, AMD_BANK_STAT_SCRUB mask off = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - gen - l1 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - gen <11:3> - l1 data panic = never -flags = correctable +flags = correctable,physical # --- @@ -106,12 +106,13 @@ error = ereport.cpu.amd.dc.data_ecc1_uc mask on = AMD_BANK_STAT_UC, AMD_BANK_STAT_CECC mask off = AMD_BANK_STAT_SCRUB -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - drd/dwr/ev/snp - l1 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - drd/dwr <39:3> - l1 data +code = 0000 mem - - ev/snp <11:6> - l1 data panic = always -flags = +flags = physical # --- @@ -121,12 +122,13 @@ error = ereport.cpu.amd.dc.data_eccm mask on = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_SCRUB -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - drd/dwr/ev/snp - l1 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - drd/dwr <39:3> - l1 data +code = 0000 mem - - ev/snp <11:6> - l1 data panic = always -flags = +flags = physical # --- @@ -136,12 +138,12 @@ error = ereport.cpu.amd.dc.data_eccm mask on = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC, AMD_BANK_STAT_SCRUB mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - gen - l1 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - gen <11:3> - l1 data panic = always -flags = +flags = physical # --- @@ -151,12 +153,12 @@ error = ereport.cpu.amd.dc.tag_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - drd/dwr - l1 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - drd/dwr <39:3> - l1 data panic = always -flags = +flags = physical # --- @@ -166,12 +168,12 @@ error = ereport.cpu.amd.dc.stag_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - snp/ev - l1 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - snp/ev <11:6> - l1 data panic = always -flags = +flags = physical # --- @@ -181,12 +183,12 @@ error = ereport.cpu.amd.dc.l1tlb_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 tlb - - - - l1 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 tlb - - - <47:12> - l1 data panic = always -flags = +flags = linear # --- @@ -196,12 +198,12 @@ error = ereport.cpu.amd.dc.l1tlb_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0001 tlb - - - - l1 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0001 tlb - - - <47:12> - l1 data panic = always -flags = +flags = linear # --- @@ -211,12 +213,12 @@ error = ereport.cpu.amd.dc.l2tlb_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 tlb - - - - l2 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 tlb - - - <47:12> - l2 data panic = always -flags = +flags = linear # --- @@ -226,12 +228,12 @@ error = ereport.cpu.amd.dc.l2tlb_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0001 tlb - - - - l2 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0001 tlb - - - <47:12> - l2 data panic = always -flags = +flags = linear # # Instruction Cache Functional Unit @@ -245,12 +247,12 @@ error = ereport.cpu.amd.ic.inf_sys_ecc1 mask on = AMD_BANK_STAT_CECC mask off = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src 0 ird mem lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src 0 ird <39:6> mem lg - panic = never -flags = correctable +flags = correctable,physical # ---- @@ -260,12 +262,12 @@ error = ereport.cpu.amd.ic.inf_l2_ecc1 mask on = AMD_BANK_STAT_CECC mask off = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - ird - l2 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - ird <39:6> - l2 instr panic = never -flags = correctable +flags = correctable,physical # ---- @@ -275,12 +277,12 @@ error = ereport.cpu.amd.ic.inf_sys_eccm mask on = AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src 0 ird mem lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src 0 ird <39:6> mem lg - panic = always -flags = +flags = physical # --- @@ -290,12 +292,12 @@ error = ereport.cpu.amd.ic.inf_l2_eccm mask on = AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - ird - l2 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - ird <39:6> - l2 instr panic = always -flags = +flags = physical # --- @@ -305,12 +307,12 @@ error = ereport.cpu.amd.ic.data_par mask on = mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - ird - l1 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - ird <47:4> - l1 instr panic = never -flags = correctable +flags = correctable,linear # --- @@ -320,12 +322,13 @@ error = ereport.cpu.amd.ic.tag_par mask on = mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - ird/ev - l1 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - ird <47:6> - l1 instr +code = 0000 mem - - ev none - l1 instr panic = never -flags = correctable +flags = correctable,linear # --- @@ -335,12 +338,13 @@ error = ereport.cpu.amd.ic.stag_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - snp/ev - l1 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - snp <39:6> - l1 instr +code = 0000 mem - - ev none - l1 instr panic = always -flags = +flags = physical # --- @@ -350,12 +354,12 @@ error = ereport.cpu.amd.ic.l1tlb_par mask on = mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 tlb - - - - l1 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 tlb - - - <47:12> - l1 instr panic = never -flags = correctable +flags = correctable,linear,pagealigned # --- @@ -365,12 +369,12 @@ error = ereport.cpu.amd.ic.l1tlb_par mask on = mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0001 tlb - - - - l1 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0001 tlb - - - <47:12> - l1 instr panic = never -flags = correctable +flags = correctable,linear,pagealigned # --- @@ -380,12 +384,12 @@ error = ereport.cpu.amd.ic.l2tlb_par mask on = mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 tlb - - - - l2 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 tlb - - - <47:12> - l2 instr panic = never -flags = correctable +flags = correctable,linear # --- @@ -395,12 +399,12 @@ error = ereport.cpu.amd.ic.l2tlb_par mask on = mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0001 tlb - - - - l2 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0001 tlb - - - <47:12> - l2 instr panic = never -flags = correctable +flags = correctable,linear # --- @@ -410,9 +414,9 @@ error = ereport.cpu.amd.ic.rdde mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src 0 ird mem lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src 0 ird none mem lg - panic = ifmce flags = @@ -431,12 +435,12 @@ error = ereport.cpu.amd.bu.l2d_ecc1 mask on = AMD_BANK_STAT_CECC mask off = AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - rd/snp/ev - l2 gen +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - rd/snp/ev <39:6> - l2 gen panic = never -flags = correctable +flags = correctable,physical # --- @@ -446,12 +450,12 @@ error = ereport.cpu.amd.bu.l2d_eccm mask on = AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 mem - - rd/snp/ev - l2 gen +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 mem - - rd/snp/ev <39:6> - l2 gen panic = always -flags = +flags = physical # --- @@ -461,12 +465,12 @@ error = ereport.cpu.amd.bu.l2t_ecc1 mask on = AMD_BANK_STAT_CECC, AMD_BANK_STAT_SCRUB mask off = AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0010 mem - - gen - l2 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0010 mem - - gen <15:0> - l2 instr panic = never -flags = correctable +flags = correctable,physical,l2setway # --- @@ -476,12 +480,12 @@ error = ereport.cpu.amd.bu.l2t_eccm mask on = AMD_BANK_STAT_UECC, AMD_BANK_STAT_UC, AMD_BANK_STAT_SCRUB mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0010 mem - - gen - l2 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0010 mem - - gen <15:0> - l2 instr panic = always -flags = +flags = physical,l2setway # --- @@ -491,12 +495,12 @@ error = ereport.cpu.amd.bu.l2t_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0010 mem - - ird - l2 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0010 mem - - ird <15:0> - l2 instr panic = always -flags = +flags = physical,l2setway # --- @@ -506,12 +510,12 @@ error = ereport.cpu.amd.bu.l2t_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0010 mem - - drd - l2 data +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0010 mem - - drd <15:0> - l2 data panic = always -flags = +flags = physical,l2setway # --- @@ -521,12 +525,12 @@ error = ereport.cpu.amd.bu.l2t_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0010 mem - - rd/snp/ev - l2 gen +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0010 mem - - rd/snp/ev <15:0> - l2 gen panic = always -flags = +flags = physical,l2setway # --- @@ -536,12 +540,12 @@ error = ereport.cpu.amd.bu.l2t_par mask on = AMD_BANK_STAT_UC, AMD_BANK_STAT_SCRUB mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0010 mem - - gen - l2 instr +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0010 mem - - gen <15:0> - l2 instr panic = always -flags = +flags = physical,l2setway # --- @@ -551,12 +555,13 @@ error = ereport.cpu.amd.bu.s_ecc1 mask on = AMD_BANK_STAT_CECC mask off = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src 0 rd/pf mem/io lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src 0 rd <39:6> mem/io lg - +code = 0000 bus src 0 pf none mem/io lg - panic = never -flags = correctable +flags = correctable,physical # --- @@ -566,12 +571,13 @@ error = ereport.cpu.amd.bu.s_eccm mask on = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src 0 rd/pf mem/io lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src 0 rd <39:6> mem/io lg - +code = 0000 bus src 0 pf none mem/io lg - panic = always -flags = +flags = physical # --- @@ -581,12 +587,12 @@ error = ereport.cpu.amd.bu.s_rde mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src 0 rd/pf mem/io lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src 0 rd/pf <39:6> mem/io lg - panic = ifmce -flags = +flags = physical # # --- @@ -600,12 +606,12 @@ error = ereport.cpu.amd.ls.s_rde mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src 0 rd/wr mem/io lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src 0 rd/wr <39:6> mem/io lg - panic = ifmce -flags = +flags = physical # # --- @@ -619,12 +625,12 @@ error = ereport.cpu.amd.nb.mem_ce mask on = AMD_BANK_STAT_CECC mask off = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src/rsp 0 rd/wr mem lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src/rsp 0 rd/wr <39:3> mem lg - panic = never -flags = correctable +flags = correctable,physical # --- @@ -634,12 +640,12 @@ error = ereport.cpu.amd.nb.mem_ue mask on = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0000 bus src/rsp 0 rd/wr mem lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0000 bus src/rsp 0 rd/wr <39:3> mem lg - panic = always -flags = +flags = physical # --- @@ -649,12 +655,12 @@ error = ereport.cpu.amd.nb.mem_ce mask on = AMD_BANK_STAT_CECC mask off = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 1000 bus src/rsp 0 rd/wr mem lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 1000 bus src/rsp 0 rd/wr <39:3> mem lg - panic = never -flags = correctable +flags = correctable,physical # --- @@ -664,12 +670,12 @@ error = ereport.cpu.amd.nb.mem_ue mask on = AMD_BANK_STAT_UC, AMD_BANK_STAT_UECC mask off = AMD_BANK_STAT_CECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 1000 bus src/rsp 0 rd/wr mem lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 1000 bus src/rsp 0 rd/wr <39:3> mem lg - panic = always -flags = +flags = physical # --- @@ -679,9 +685,9 @@ error = ereport.cpu.amd.nb.ht_crc mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0001 bus obs 0 gen gen lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0001 bus obs 0 gen none gen lg - panic = always flags = @@ -694,9 +700,9 @@ error = ereport.cpu.amd.nb.ht_sync mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0010 bus obs 0 gen gen lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0010 bus obs 0 gen none gen lg - panic = always flags = @@ -709,12 +715,12 @@ error = ereport.cpu.amd.nb.ma mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0011 bus src/obs 0 rd/wr mem/io lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0011 bus src/obs 0 rd/wr <39:3> mem/io lg - panic = never -flags = +flags = physical # --- @@ -724,12 +730,12 @@ error = ereport.cpu.amd.nb.ta mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0100 bus src/obs 0 rd/wr mem/io lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0100 bus src/obs 0 rd/wr <39:3> mem/io lg - panic = never -flags = +flags = physical # --- @@ -739,12 +745,12 @@ error = ereport.cpu.amd.nb.gart_walk mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0101 tlb - - - - lg gen +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0101 tlb - - - <39:3> - lg gen panic = ifmce -flags = +flags = physical # --- @@ -754,12 +760,12 @@ error = ereport.cpu.amd.nb.rmw mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0110 bus obs 0 gen io lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0110 bus obs 0 gen <39:3> io lg - panic = always -flags = +flags = physical # --- @@ -769,9 +775,9 @@ error = ereport.cpu.amd.nb.wdog mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 0111 bus gen 1 gen gen lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 0111 bus gen 1 gen <39:3> gen lg - panic = always flags = @@ -784,9 +790,9 @@ error = ereport.cpu.amd.nb.dramaddr_par mask on = AMD_BANK_STAT_UC mask off = AMD_BANK_STAT_CECC, AMD_BANK_STAT_UECC -# ext type pp t rrrr ii ll tt -# ------- ------- ------- ------- --------------- ------- ------- ----- -code = 1101 bus obs 0 gen mem lg - +# ext type pp t rrrr addr ii ll tt +# ------- ------- ------- ------- ------- ------- ------- ------- ----- +code = 1101 bus obs 0 gen none mem lg - panic = always flags = diff --git a/usr/src/uts/i86pc/cpu/scripts/Makefile b/usr/src/uts/i86pc/cpu/scripts/Makefile index f3509aa90e..4d40d76a64 100644 --- a/usr/src/uts/i86pc/cpu/scripts/Makefile +++ b/usr/src/uts/i86pc/cpu/scripts/Makefile @@ -2,9 +2,8 @@ # CDDL HEADER START # # The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. @@ -39,7 +38,7 @@ GROUP= bin all install setup: $(PERLFILES) -clean: +clean clobber: $(RM) $(PERLFILES) include ../../../Makefile.targ diff --git a/usr/src/uts/i86pc/cpu/scripts/ao_gendisp.pl b/usr/src/uts/i86pc/cpu/scripts/ao_gendisp.pl index 268631f9dd..fa73ce0fa4 100644 --- a/usr/src/uts/i86pc/cpu/scripts/ao_gendisp.pl +++ b/usr/src/uts/i86pc/cpu/scripts/ao_gendisp.pl @@ -34,6 +34,10 @@ my $PROGNAME = basename($0); my ($funcunit, $error); my @funcunits = (); +my @errorrefs = (); + +my $codelinesin = 0; # number of input 'code' lines for an ereport type +my $codeoutlen = 0; # number of output lines from sub state_code my $state = "initial"; @@ -52,12 +56,66 @@ sub parsebail() { exit(1); } +sub error_alloc() { + my @a = (); + + push(@::errorrefs, \@a); + return (\@a); +} + +sub error_dup() { + my ($drop) = @_; + my $newref = &error_alloc(); + + my $zeroref = $::errorrefs[0]; + + my $n = $#$zeroref - $drop; + + @$newref = @$zeroref[0 .. $n]; +} + +sub code_lines() { + return ($::codelinesin++); +} + +sub error_init() { + &error_alloc(); + $::codelinesin = 0; +} + +sub error_reset() { + @::errorrefs = (); + $::codelinesin = 0; + $::codeoutlen = 0; +} + +sub errout() { + my ($line) = @_; + + foreach my $ref (@::errorrefs) { + push(@$ref, $line); + } +} + +sub errout_N() { + my ($instance, $line) = @_; + my $ref = @::errorrefs[$instance]; + push(@$ref, $line); + return 1; +} + +sub print_errout() { + foreach my $ref (@::errorrefs) { + print @$ref; + } +} + sub print_header() { print "#include \"ao_mca_disp.h\"\n\n"; } sub print_footer() { - print "const ao_error_disp_t *ao_error_disp[] = {\n"; + print 'const ao_error_disp_t *ao_error_disp[] = {' . "\n"; foreach my $name (@funcunits) { print "\t$name,\n"; @@ -74,7 +132,7 @@ sub funcunit_begin() { } sub funcunit_end() { - print "\tNULL\n};\n\n"; + print "\t{ NULL }\n};\n\n"; } sub error_begin() { @@ -84,27 +142,34 @@ sub error_begin() { my $flags_name = $ereport_name; $flags_name =~ s/EREPORT_/EREPORT_PAYLOAD_FLAGS_/; - print "\tFM_$ereport_name,\n\tFM_$flags_name,\n"; + &errout("\tFM_$ereport_name,\n\tFM_$flags_name,\n"); } sub error_end() { - print "\t},\n\n"; + &errout("\t},\n\n"); + + &print_errout(); + + &error_reset(); } sub print_bits() { my $name = $_[0]; my @bits = @_[1..$#_]; + my $out = ""; if (@bits == 0) { - print "\t0,"; + $out = "\t0,"; } elsif (@bits == 1) { - print "\t$bits[0],"; + $out = "\t$bits[0],"; } else { - print "\t( ", join(" | ", @bits), " ),"; + $out = "\t( " . join(" | ", @bits) . " ),"; } - print " /* $name */" if (defined $name); - print "\n"; + $out .= " /* $name */" if (defined $name); + $out .= "\n"; + + return ($out); } sub field_burst() { @@ -150,7 +215,9 @@ sub state_funcunit() { sub state_desc() { my $desc = $_[0]; - print "\t/* $desc */\n\t{\n"; + &error_init(); + + &errout("\t/* $desc */\n\t{\n"); } sub state_error() { @@ -165,12 +232,13 @@ sub state_mask_on() { sub state_mask_off() { my @mask_off = map { tr/[a-z]/[A-Z]/; $_; } split(/,\s*/, $_[0]); - &print_bits("mask", @::mask_on, @mask_off); - &print_bits("mask_res", @::mask_on); + &errout(&print_bits("mask", @::mask_on, @mask_off)); + &errout(&print_bits("mask_res", @::mask_on)); } sub state_code() { - my ($ext, $type, $pp, $t, $r4, $ii, $ll, $tt) = split(/\s+/, $_[0]); + my ($ext, $type, $pp, $t, $r4, $addr, $ii, $ll, $tt) = + split(/\s+/, $_[0]); my %tt_values = ( instr => 1, data => 1, gen => 1, '-' => 1 ); my %ll_values = ( l0 => 1, l1 => 1, l2 => 1, lg => 1 ); @@ -202,6 +270,11 @@ sub state_code() { gen => 'gen', '-' => '-' ); + my $instance = &code_lines(); + if ($instance > 0) { + &error_dup($::codeoutlen); # dup info thus far + } + if (!defined $tt_values{$tt}) { &parsebail("unknown tt value `$tt'"); } @@ -233,12 +306,12 @@ sub state_code() { &parsebail("invalid members for bus code type"); } - print "\tAMD_ERRCODE_MKBUS(" . + $::codeoutlen += &errout_N($instance, "\tAMD_ERRCODE_MKBUS(" . "0, " . # pp "AMD_ERRCODE_T_" . ($t ? "TIMEOUT" : "NONE") . ", " . "0, " . # r4 "0, " . # ii - "AMD_ERRCODE_LL_$ll),\n"; + "AMD_ERRCODE_LL_$ll),\n"); } elsif ($type eq "mem") { if ($r4 eq "-" || $tt eq "-" || $ll eq "-" || @@ -246,10 +319,10 @@ sub state_code() { &parsebail("invalid members for mem code type"); } - print "\tAMD_ERRCODE_MKMEM(" . + $::codeoutlen += &errout_N($instance, "\tAMD_ERRCODE_MKMEM(" . "0, " . # r4 "AMD_ERRCODE_TT_$tt, " . - "AMD_ERRCODE_LL_$ll),\n"; + "AMD_ERRCODE_LL_$ll),\n"); } elsif ($type eq "tlb") { if ($tt eq "-" || $ll eq "-" || @@ -257,28 +330,45 @@ sub state_code() { &parsebail("invalid members for tlb code type"); } - print "\tAMD_ERRCODE_MKTLB(" . + $::codeoutlen += &errout_N($instance, "\tAMD_ERRCODE_MKTLB(" . "AMD_ERRCODE_TT_$tt, " . - "AMD_ERRCODE_LL_$ll),\n"; + "AMD_ERRCODE_LL_$ll),\n"); } else { &parsebail("unknown code type `$type'"); } - print "\t" . &bin2dec($ext) . ", /* ext code $ext */\n"; + $::codeoutlen += &errout_N($instance, "\t" . &bin2dec($ext) . + ", /* ext code $ext */\n"); - &print_bits("pp_bits", @pp); - &print_bits("ii_bits", @ii); - &print_bits("r4_bits", @r4); + $::codeoutlen += &errout_N($instance, &print_bits("pp_bits", @pp)); + $::codeoutlen += &errout_N($instance, &print_bits("ii_bits", @ii)); + $::codeoutlen += &errout_N($instance, &print_bits("r4_bits", @r4)); + + my $valid_hi; + my $valid_lo; + + if ($addr eq "none") { + $valid_hi = $valid_lo = 0; + } elsif ($addr =~ /<(\d+):(\d+)>/) { + $valid_hi = $1; + $valid_lo = $2; + } else { + &parsebail("invalid addr specification"); + } + $::codeoutlen += &errout_N($instance, "\t" . $valid_hi . + ", /* addr valid hi */\n"); + $::codeoutlen += &errout_N($instance, "\t" . $valid_lo . + ", /* addr valid lo */\n"); } sub state_panic() { my @vals = split(/,\s*/, $_[0]); if ($#vals < 0) { - print "\t0, /* panic_when */\n"; + &errout("\t0, /* panic_when */\n"); } else { @vals = map { tr/[a-z]/[A-Z]/; "AO_AED_PANIC_" . $_; } @vals; - &print_bits("panic_when", @vals); + &errout(&print_bits("panic_when", @vals)); } } @@ -287,18 +377,18 @@ sub state_flags() { @flags = map { tr/[a-z]/[A-Z]/; "AO_AED_F_" . $_; } @flags; - &print_bits("flags", @flags); + &errout(&print_bits("flags", @flags)); } my %stateparse = ( - funcunit => [ \&state_funcunit, "desc" ], - desc => [ \&state_desc, "error" ], - error => [ \&state_error, "mask on" ], - 'mask on' => [ \&state_mask_on, "mask off" ], - 'mask off' => [ \&state_mask_off, "code" ], - code => [ \&state_code, "panic" ], - panic => [ \&state_panic, "flags" ], - flags => [ \&state_flags, "initial" ] + funcunit => [ \&state_funcunit, 'desc' ], + desc => [ \&state_desc, 'error' ], + error => [ \&state_error, 'mask on' ], + 'mask on' => [ \&state_mask_on, 'mask off' ], + 'mask off' => [ \&state_mask_off, 'code' ], + code => [ \&state_code, 'code|panic' ], + panic => [ \&state_panic, 'flags' ], + flags => [ \&state_flags, 'initial' ] ); usage unless (@ARGV == 1); @@ -336,9 +426,11 @@ while (<INFILE>) { } } - if ($keyword ne $state) { - &parsebail("keyword `$keyword' invalid here; expected `$state'"); + if (!($keyword =~ /$state/)) { + &parsebail("keyword `$keyword' invalid here; expected " . + "`$state'"); } + $state = $keyword; # disambiguate between multiple legal states if (!defined $stateparse{$state}) { &parsebail("attempt to transition to invalid state `$state'"); diff --git a/usr/src/uts/i86pc/io/mc/mcamd_subr.c b/usr/src/uts/i86pc/io/mc/mcamd_subr.c index 4b4fccf4ec..7ce0633a56 100644 --- a/usr/src/uts/i86pc/io/mc/mcamd_subr.c +++ b/usr/src/uts/i86pc/io/mc/mcamd_subr.c @@ -427,8 +427,8 @@ mcamd_mkhdl(mcamd_hdl_t *hdl) /*ARGSUSED*/ static int -mcamd_patounum_wrap(void *arg, uint64_t pa, uint32_t synd, int syndtype, - mc_unum_t *unump) +mcamd_patounum_wrap(void *arg, uint64_t pa, uint8_t valid_hi, uint8_t valid_lo, + uint32_t synd, int syndtype, mc_unum_t *unump) { mcamd_hdl_t mcamd; int rc; @@ -437,8 +437,8 @@ mcamd_patounum_wrap(void *arg, uint64_t pa, uint32_t synd, int syndtype, rw_enter(&mc_lock, RW_READER); - rc = mcamd_patounum(&mcamd, - (mcamd_node_t *)mc_list, pa, synd, syndtype, unump); + rc = mcamd_patounum(&mcamd, (mcamd_node_t *)mc_list, pa, + valid_hi, valid_lo, synd, syndtype, unump); #ifdef DEBUG /* diff --git a/usr/src/uts/i86pc/os/cmi.c b/usr/src/uts/i86pc/os/cmi.c index 1b788a4e99..fb1c494565 100644 --- a/usr/src/uts/i86pc/os/cmi.c +++ b/usr/src/uts/i86pc/os/cmi.c @@ -312,7 +312,8 @@ cmi_mc_register(cpu_t *cp, const cmi_mc_ops_t *mcops, void *mcdata) } int -cmi_mc_patounum(uint64_t pa, uint32_t synd, int syndtype, mc_unum_t *up) +cmi_mc_patounum(uint64_t pa, uint8_t valid_hi, uint8_t valid_lo, uint32_t synd, + int syndtype, mc_unum_t *up) { const struct cmi_mc_ops *mcops; cpu_t *cp = CPU; @@ -321,7 +322,8 @@ cmi_mc_patounum(uint64_t pa, uint32_t synd, int syndtype, mc_unum_t *up) (mcops = CMI_OPS(cp)->cmi_mc_getops(CMI_DATA(cp))) == NULL) return (-1); /* not registered yet */ - return (mcops->cmi_mc_patounum(CMI_DATA(cp), pa, synd, syndtype, up)); + return (mcops->cmi_mc_patounum(CMI_DATA(cp), pa, valid_hi, valid_lo, + synd, syndtype, up)); } int diff --git a/usr/src/uts/i86pc/sys/cpu_module.h b/usr/src/uts/i86pc/sys/cpu_module.h index 65f21a4565..1ae4e149cc 100644 --- a/usr/src/uts/i86pc/sys/cpu_module.h +++ b/usr/src/uts/i86pc/sys/cpu_module.h @@ -59,7 +59,8 @@ extern int cmi_mca_inject(cmi_mca_regs_t *, uint_t); extern void cmi_mca_poke(void); extern void cmi_mc_register(struct cpu *, const struct cmi_mc_ops *, void *); -extern int cmi_mc_patounum(uint64_t, uint32_t, int, mc_unum_t *); +extern int cmi_mc_patounum(uint64_t, uint8_t, uint8_t, uint32_t, int, + mc_unum_t *); extern int cmi_mc_unumtopa(mc_unum_t *, nvlist_t *, uint64_t *); #ifdef __cplusplus diff --git a/usr/src/uts/i86pc/sys/cpu_module_impl.h b/usr/src/uts/i86pc/sys/cpu_module_impl.h index c68f537d64..5cec3131db 100644 --- a/usr/src/uts/i86pc/sys/cpu_module_impl.h +++ b/usr/src/uts/i86pc/sys/cpu_module_impl.h @@ -38,7 +38,8 @@ extern "C" { #endif typedef struct cmi_mc_ops { - int (*cmi_mc_patounum)(void *, uint64_t, uint32_t, int, mc_unum_t *); + int (*cmi_mc_patounum)(void *, uint64_t, uint8_t, uint8_t, uint32_t, + int, mc_unum_t *); int (*cmi_mc_unumtopa)(void *, mc_unum_t *, nvlist_t *, uint64_t *); } cmi_mc_ops_t; diff --git a/usr/src/uts/intel/sys/mc_amd.h b/usr/src/uts/intel/sys/mc_amd.h index c1fc1f2513..764c7a43d6 100644 --- a/usr/src/uts/intel/sys/mc_amd.h +++ b/usr/src/uts/intel/sys/mc_amd.h @@ -34,7 +34,8 @@ * The mc-amd driver exports an nvlist to userland, where the primary * consumer is the "chip" topology enumerator for this platform type which * builds a full topology subtree from this information. Others can use - * it, too, but don't depend on it not changing without an ARC contract. + * it, too, but don't depend on it not changing without an ARC contract + * (and the contract should probably concern the topology, not this nvlist). * * In the initial mc-amd implementation this nvlist was not versioned; * we'll think of that as version 0 and it may be recognised by the absence @@ -313,7 +314,7 @@ union mcreg_csbase { } _fmt_revFG; }; -#define MC_CSBASE(up, rev) (MC_REV_MATCH(rev, MC_REV_F) ? \ +#define MC_CSBASE(up, rev) (MC_REV_MATCH(rev, MC_REVS_FG) ? \ (uint64_t)MCREG_FIELD_revFG(up, BaseAddrHi) << 27 | \ (uint64_t)MCREG_FIELD_revFG(up, BaseAddrLo) << 13 : \ (uint64_t)MCREG_FIELD_preF(up, BaseAddrHi) << 25 | \ @@ -347,15 +348,15 @@ union mcreg_csmask { } _fmt_revFG; }; -#define MC_CSMASKLO_LOBIT(rev) (MC_REV_MATCH(rev, MC_REV_F) ? 13 : 13) -#define MC_CSMASKLO_HIBIT(rev) (MC_REV_MATCH(rev, MC_REV_F) ? 21 : 19) +#define MC_CSMASKLO_LOBIT(rev) (MC_REV_MATCH(rev, MC_REVS_FG) ? 13 : 13) +#define MC_CSMASKLO_HIBIT(rev) (MC_REV_MATCH(rev, MC_REVS_FG) ? 21 : 19) -#define MC_CSMASKHI_LOBIT(rev) (MC_REV_MATCH(rev, MC_REV_F) ? 27 : 25) -#define MC_CSMASKHI_HIBIT(rev) (MC_REV_MATCH(rev, MC_REV_F) ? 36 : 33) +#define MC_CSMASKHI_LOBIT(rev) (MC_REV_MATCH(rev, MC_REVS_FG) ? 27 : 25) +#define MC_CSMASKHI_HIBIT(rev) (MC_REV_MATCH(rev, MC_REVS_FG) ? 36 : 33) -#define MC_CSMASK_UNMASKABLE(rev) (MC_REV_MATCH(rev, MC_REV_F) ? 0 : 2) +#define MC_CSMASK_UNMASKABLE(rev) (MC_REV_MATCH(rev, MC_REVS_FG) ? 0 : 2) -#define MC_CSMASK(up, rev) (MC_REV_MATCH(rev, MC_REV_F) ? \ +#define MC_CSMASK(up, rev) (MC_REV_MATCH(rev, MC_REVS_FG) ? \ (uint64_t)MCREG_FIELD_revFG(up, AddrMaskHi) << 27 | \ (uint64_t)MCREG_FIELD_revFG(up, AddrMaskLo) << 13 | 0x7c01fff : \ (uint64_t)MCREG_FIELD_preF(up, AddrMaskHi) << 25 | \ |