summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authortd122701 <none@none>2007-03-16 10:02:10 -0700
committertd122701 <none@none>2007-03-16 10:02:10 -0700
commit33e2ff10f5d0b798fa5f72e1d4d60a1bf59df16b (patch)
tree6599be71fe4d2f1149722d117e22f7f9cbaa3f16 /usr/src
parent324baee521b7360f7bc4027190c768db9ed6faa7 (diff)
downloadillumos-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.c7
-rw-r--r--usr/src/cmd/fm/schemes/mem/mem.c96
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);
}