diff options
| author | td122701 <none@none> | 2007-03-16 10:02:10 -0700 |
|---|---|---|
| committer | td122701 <none@none> | 2007-03-16 10:02:10 -0700 |
| commit | 33e2ff10f5d0b798fa5f72e1d4d60a1bf59df16b (patch) | |
| tree | 6599be71fe4d2f1149722d117e22f7f9cbaa3f16 /usr/src | |
| parent | 324baee521b7360f7bc4027190c768db9ed6faa7 (diff) | |
| download | illumos-joyent-33e2ff10f5d0b798fa5f72e1d4d60a1bf59df16b.tar.gz | |
6521861 Niagara-2 page retirement fault is missing DIMM part number
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c | 7 | ||||
| -rw-r--r-- | usr/src/cmd/fm/schemes/mem/mem.c | 96 |
2 files changed, 99 insertions, 4 deletions
diff --git a/usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c b/usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c index 975ebf6d49..58b312dcc7 100644 --- a/usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c +++ b/usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c @@ -449,7 +449,7 @@ breakup_components(char *str, char *sep, nvlist_t **hc_nvl) nvlist_t * cmd_mem2hc(fmd_hdl_t *hdl, nvlist_t *mem_fmri) { - char *nac_name, *s, *p, **sa; + char *nac_name, *s, **sa; const char *unum = cmd_fmri_get_unum(mem_fmri); nvlist_t *fp, **hc_list; int i, n; @@ -512,8 +512,9 @@ cmd_mem2hc(fmd_hdl_t *hdl, nvlist_t *mem_fmri) { return (NULL); } } - if (nvlist_lookup_string(mem_fmri, FM_FMRI_HC_PART, &p) == 0) { - if (nvlist_add_string(fp, FM_FMRI_HC_PART, p) != 0) { + if (nvlist_lookup_string_array(mem_fmri, FM_FMRI_HC_PART, + &sa, &usi) == 0) { + if (nvlist_add_string(fp, FM_FMRI_HC_PART, *sa) != 0) { nvlist_free(fp); return (NULL); } diff --git a/usr/src/cmd/fm/schemes/mem/mem.c b/usr/src/cmd/fm/schemes/mem/mem.c index 0a926c81ac..0c72f090b6 100644 --- a/usr/src/cmd/fm/schemes/mem/mem.c +++ b/usr/src/cmd/fm/schemes/mem/mem.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -292,9 +292,88 @@ mem_get_serids_from_mdesc(const char *unum, char ***seridsp, size_t *nseridsp) return (rc); } +/* + * Returns 0 with part numbers if found, returns -1 for errors. + */ +static int +mem_get_parts_from_mdesc(const char *unum, char ***partsp, size_t *npartsp) +{ + uint64_t drgen = fmd_fmri_get_drgen(); + char **dimms, **parts; + size_t ndimms, nparts; + mem_dimm_map_t *dm; + int i, rc = 0; + + if (mem_unum_burst(unum, &dimms, &ndimms) < 0) + return (-1); /* errno is set for us */ + + parts = fmd_fmri_zalloc(sizeof (char *) * ndimms); + nparts = ndimms; + + /* + * first go through dimms and see if dm_drgen entries are outdated + */ + for (i = 0; i < ndimms; i++) { + if ((dm = dm_lookup(dimms[i])) == NULL || + dm->dm_drgen != drgen) + break; + } + + if (i < ndimms && mem_update_mdesc() != 0) { + mem_strarray_free(dimms, ndimms); + mem_strarray_free(parts, nparts); + return (-1); + } + + /* + * get to this point if an up-to-date mdesc (and corresponding + * entries in the global mem list) exists + */ + for (i = 0; i < ndimms; i++) { + if ((dm = dm_lookup(dimms[i])) == NULL) { + rc = fmd_fmri_set_errno(EINVAL); + break; + } + + if (dm->dm_drgen != drgen) + dm->dm_drgen = drgen; + + /* + * mdesc and dm entry was updated by an earlier call to + * mem_update_mdesc, so we go ahead and dup the part + */ + if (dm->dm_part == NULL) { + rc = -1; + break; + } + parts[i] = fmd_fmri_strdup(dm->dm_part); + } + + mem_strarray_free(dimms, ndimms); + + if (rc == 0) { + *partsp = parts; + *npartsp = nparts; + } else { + mem_strarray_free(parts, nparts); + } + + return (rc); +} + +static int +mem_get_parts_by_unum(const char *unum, char ***partp, size_t *npartp) +{ + if (mem.mem_dm == NULL) + return (-1); + else + return (mem_get_parts_from_mdesc(unum, partp, npartp)); +} + #endif /* sparc */ /*ARGSUSED*/ + static int mem_get_serids_by_unum(const char *unum, char ***seridsp, size_t *nseridsp) { @@ -413,6 +492,10 @@ fmd_fmri_expand(nvlist_t *nvl) char *unum, **serids; uint_t nnvlserids; size_t nserids; +#ifdef sparc + char **parts; + size_t nparts; +#endif int rc; if (mem_fmri_get_unum(nvl, &unum) < 0) @@ -440,6 +523,17 @@ fmd_fmri_expand(nvlist_t *nvl) if (rc != 0) return (fmd_fmri_set_errno(EINVAL)); +#ifdef sparc + /* + * Continue with the process if there are no part numbers. + */ + if (mem_get_parts_by_unum(unum, &parts, &nparts) < 0) + return (0); + + rc = nvlist_add_string_array(nvl, FM_FMRI_HC_PART, parts, nparts); + + mem_strarray_free(parts, nparts); +#endif return (0); } |
