summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobj <none@none>2008-04-04 16:44:23 -0700
committerrobj <none@none>2008-04-04 16:44:23 -0700
commit918a0d8ae0916c29c35aae9b95c22b02a0c6e390 (patch)
tree99f05bb7504cb66e00e5ad0e667d47c21fe84555
parent5f28a8273cda869edd1af63f0b8cca5b7af42541 (diff)
downloadillumos-joyent-918a0d8ae0916c29c35aae9b95c22b02a0c6e390.tar.gz
6666186 topo_open() has some very busted rootdir logic
6674208 libipmi susceptible to unaligned loads/stores on sparc 6680572 Need DIMM FRU labels on Sun-Fire-X4100-M2 and Sun-Fire-X4200-M2 6683605 libtopo: multiple functions in hc.c can dump core on failure 6684324 fmd_fmri_contains() for fmd cpu scheme is broken on x86
-rw-r--r--usr/src/cmd/fm/schemes/cpu/cpu.c18
-rw-r--r--usr/src/lib/fm/topo/libtopo/common/hc.c18
-rw-r--r--usr/src/lib/fm/topo/libtopo/common/topo_snap.c6
-rw-r--r--usr/src/lib/fm/topo/maps/i86pc/chip-hc-topology.xml7
-rw-r--r--usr/src/lib/fm/topo/modules/i86pc/chip/chip.h4
-rw-r--r--usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c2
-rw-r--r--usr/src/lib/fm/topo/modules/i86pc/chip/chip_label.c57
-rw-r--r--usr/src/lib/libipmi/common/ipmi_misc.c5
-rw-r--r--usr/src/lib/libipmi/common/ipmi_sdr.c23
-rw-r--r--usr/src/lib/libipmi/common/ipmi_sel.c18
-rw-r--r--usr/src/lib/libipmi/common/ipmi_sensor.c8
-rw-r--r--usr/src/lib/libipmi/common/ipmi_sunoem.c4
12 files changed, 122 insertions, 48 deletions
diff --git a/usr/src/cmd/fm/schemes/cpu/cpu.c b/usr/src/cmd/fm/schemes/cpu/cpu.c
index 341b0ce6ef..4c74803932 100644
--- a/usr/src/cmd/fm/schemes/cpu/cpu.c
+++ b/usr/src/cmd/fm/schemes/cpu/cpu.c
@@ -339,7 +339,7 @@ fmd_fmri_unusable(nvlist_t *nvl)
int
fmd_fmri_contains(nvlist_t *er, nvlist_t *ee)
{
- int err;
+ int ret1, ret2;
char *erserstr, *eeserstr;
uint8_t ertype, eetype, erversion, eeversion;
uint64_t erserint, eeserint;
@@ -373,17 +373,19 @@ fmd_fmri_contains(nvlist_t *er, nvlist_t *ee)
return (0);
} else if (erversion == CPU_SCHEME_VERSION1) {
/* Serial ID is an optional element */
- if ((err = nvlist_lookup_string(er, FM_FMRI_CPU_SERIAL_ID,
+ if ((ret1 = nvlist_lookup_string(er, FM_FMRI_CPU_SERIAL_ID,
&erserstr)) != 0)
- if (err != ENOENT)
+ if (ret1 != ENOENT)
return (0);
- if ((err = nvlist_lookup_string(ee, FM_FMRI_CPU_SERIAL_ID,
+ if ((ret2 = nvlist_lookup_string(ee, FM_FMRI_CPU_SERIAL_ID,
&eeserstr)) != 0)
- if (err != ENOENT)
+ if (ret2 != ENOENT)
return (0);
- count = strlen(erserstr);
- if (strncmp(erserstr, eeserstr, count) != 0)
- return (0);
+ if (ret1 == 0 && ret2 == 0) {
+ count = strlen(erserstr);
+ if (strncmp(erserstr, eeserstr, count) != 0)
+ return (0);
+ }
}
if (nvlist_lookup_uint32(er, FM_FMRI_CPU_CACHE_INDEX, &erval) != 0)
return (0);
diff --git a/usr/src/lib/fm/topo/libtopo/common/hc.c b/usr/src/lib/fm/topo/libtopo/common/hc.c
index b39a39a780..81f3debe9e 100644
--- a/usr/src/lib/fm/topo/libtopo/common/hc.c
+++ b/usr/src/lib/fm/topo/libtopo/common/hc.c
@@ -1141,8 +1141,10 @@ hc_walk_init(topo_mod_t *mod, tnode_t *node, nvlist_t *rsrc,
struct hc_walk *hwp;
topo_walk_t *wp;
- if ((hwp = topo_mod_alloc(mod, sizeof (struct hc_walk))) == NULL)
+ if ((hwp = topo_mod_alloc(mod, sizeof (struct hc_walk))) == NULL) {
(void) topo_mod_seterrno(mod, EMOD_NOMEM);
+ return (NULL);
+ }
if (nvlist_lookup_nvlist_array(rsrc, FM_FMRI_HC_LIST, &hwp->hcw_list,
&sz) != 0) {
@@ -1236,12 +1238,11 @@ hc_fmri_prop_get(topo_mod_t *mod, tnode_t *node, topo_version_t version,
else
err = 0;
topo_walk_fini(hwp->hcw_wp);
+ topo_mod_free(mod, hwp, sizeof (struct hc_walk));
} else {
err = -1;
}
- topo_mod_free(mod, hwp, sizeof (struct hc_walk));
-
if (plp->pl_prop != NULL)
*out = plp->pl_prop;
@@ -1294,12 +1295,11 @@ hc_fmri_pgrp_get(topo_mod_t *mod, tnode_t *node, topo_version_t version,
else
err = 0;
topo_walk_fini(hwp->hcw_wp);
+ topo_mod_free(mod, hwp, sizeof (struct hc_walk));
} else {
err = -1;
}
- topo_mod_free(mod, hwp, sizeof (struct hc_walk));
-
if (plp->pl_prop != NULL)
*out = plp->pl_prop;
@@ -1366,11 +1366,11 @@ hc_fmri_prop_set(topo_mod_t *mod, tnode_t *node, topo_version_t version,
else
err = 0;
topo_walk_fini(hwp->hcw_wp);
+ topo_mod_free(mod, hwp, sizeof (struct hc_walk));
} else {
err = -1;
}
- topo_mod_free(mod, hwp, sizeof (struct hc_walk));
topo_mod_free(mod, plp, sizeof (struct prop_lookup));
return (err);
@@ -1433,12 +1433,11 @@ hc_fmri_present(topo_mod_t *mod, tnode_t *node, topo_version_t version,
else
err = 0;
topo_walk_fini(hwp->hcw_wp);
+ topo_mod_free(mod, hwp, sizeof (struct hc_walk));
} else {
err = -1;
}
- topo_mod_free(mod, hwp, sizeof (struct hc_walk));
-
if (hap->ha_nvl != NULL)
*out = hap->ha_nvl;
@@ -1499,12 +1498,11 @@ hc_fmri_unusable(topo_mod_t *mod, tnode_t *node, topo_version_t version,
else
err = 0;
topo_walk_fini(hwp->hcw_wp);
+ topo_mod_free(mod, hwp, sizeof (struct hc_walk));
} else {
err = -1;
}
- topo_mod_free(mod, hwp, sizeof (struct hc_walk));
-
if (hap->ha_nvl != NULL)
*out = hap->ha_nvl;
diff --git a/usr/src/lib/fm/topo/libtopo/common/topo_snap.c b/usr/src/lib/fm/topo/libtopo/common/topo_snap.c
index 866b09a64e..cc0d5b6faa 100644
--- a/usr/src/lib/fm/topo/libtopo/common/topo_snap.c
+++ b/usr/src/lib/fm/topo/libtopo/common/topo_snap.c
@@ -164,9 +164,9 @@ topo_open(int version, const char *rootdir, int *errp)
if (len >= PATH_MAX)
return (set_open_errno(thp, errp, EINVAL));
- if (rootdir[len] != '/') {
- rpath = alloca(len + 1);
- (void) snprintf(rpath, len + 1, "%s/", rootdir);
+ if (rootdir[len - 1] != '/') {
+ rpath = alloca(len + 2);
+ (void) snprintf(rpath, len + 2, "%s/", rootdir);
} else {
rpath = (char *)rootdir;
}
diff --git a/usr/src/lib/fm/topo/maps/i86pc/chip-hc-topology.xml b/usr/src/lib/fm/topo/maps/i86pc/chip-hc-topology.xml
index 8a1c3138e6..95d853b845 100644
--- a/usr/src/lib/fm/topo/maps/i86pc/chip-hc-topology.xml
+++ b/usr/src/lib/fm/topo/maps/i86pc/chip-hc-topology.xml
@@ -248,6 +248,13 @@
name-stability='Private'
data-stability='Private' >
+ <propmethod name='g12f_dimm_label' version='0'
+ propname='label' proptype='string' >
+
+ <argval name='format' type='string'
+ value='CPU %d %c%d' />
+
+ </propmethod>
<propmethod name='get_dimm_serial' version='0'
propname='serial' proptype='string' >
diff --git a/usr/src/lib/fm/topo/modules/i86pc/chip/chip.h b/usr/src/lib/fm/topo/modules/i86pc/chip/chip.h
index 85d478e892..caedcb2519 100644
--- a/usr/src/lib/fm/topo/modules/i86pc/chip/chip.h
+++ b/usr/src/lib/fm/topo/modules/i86pc/chip/chip.h
@@ -72,6 +72,7 @@ extern "C" {
#define SIMPLE_DIMM_LBL_MP "simple_dimm_label_mp"
#define SEQ_DIMM_LBL "seq_dimm_label"
#define G4_DIMM_LBL "g4_dimm_label"
+#define G12F_DIMM_LBL "g12f_dimm_label"
#define SIMPLE_CHIP_LBL "simple_chip_label"
#define G4_CHIP_LBL "g4_chip_label"
#define A4FPLUS_CHIP_LBL "a4fplus_chip_label"
@@ -100,6 +101,9 @@ extern int seq_dimm_label(topo_mod_t *, tnode_t *, topo_version_t,
extern int g4_dimm_label(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
nvlist_t **);
+extern int g12f_dimm_label(topo_mod_t *, tnode_t *, topo_version_t, nvlist_t *,
+ nvlist_t **);
+
extern int simple_chip_label(topo_mod_t *, tnode_t *, topo_version_t,
nvlist_t *, nvlist_t **);
diff --git a/usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c b/usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c
index 2df6d8ffde..789398cfac 100644
--- a/usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c
+++ b/usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c
@@ -67,6 +67,8 @@ static const topo_method_t dimm_methods[] = {
TOPO_STABILITY_INTERNAL, seq_dimm_label},
{ G4_DIMM_LBL, "Property method", 0,
TOPO_STABILITY_INTERNAL, g4_dimm_label},
+ { G12F_DIMM_LBL, "Property method", 0,
+ TOPO_STABILITY_INTERNAL, g12f_dimm_label},
{ GET_DIMM_SERIAL, "Property method", 0,
TOPO_STABILITY_INTERNAL, get_dimm_serial},
{ NULL }
diff --git a/usr/src/lib/fm/topo/modules/i86pc/chip/chip_label.c b/usr/src/lib/fm/topo/modules/i86pc/chip/chip_label.c
index 5aac19f850..0eb3b5ab3b 100644
--- a/usr/src/lib/fm/topo/modules/i86pc/chip/chip_label.c
+++ b/usr/src/lib/fm/topo/modules/i86pc/chip/chip_label.c
@@ -706,3 +706,60 @@ g4_dimm_label(topo_mod_t *mod, tnode_t *node, topo_version_t vers,
return (0);
}
+
+/*
+ * This method is used to compute the labels for DIMM slots on the Galaxy 1F and
+ * 2F platforms. It results in following dimm node label assignments:
+ *
+ * chip/dimm instances label
+ * ------------------- -----
+ * chip=0/dimm=0 CPU 1 DIMM A0
+ * chip=0/dimm=1 CPU 1 DIMM B0
+ * chip=0/dimm=2 CPU 1 DIMM A1
+ * chip=0/dimm=3 CPU 1 DIMM B1
+ *
+ * chip=1/dimm=0 CPU 2 DIMM A0
+ * chip=1/dimm=1 CPU 2 DIMM B0
+ * chip=1/dimm=2 CPU 2 DIMM A1
+ * chip=1/dimm=3 CPU 2 DIMM B1
+ */
+/* ARGSUSED */
+int
+g12f_dimm_label(topo_mod_t *mod, tnode_t *node, topo_version_t vers,
+ nvlist_t *in, nvlist_t **out)
+{
+ char *fmtstr, buf[BUFSZ], chan;
+ tnode_t *chip;
+ int ret, dimm_inst, slot_num;
+ nvlist_t *args;
+
+ topo_mod_dprintf(mod, "g12f_dimm_label() called\n");
+
+ if ((ret = nvlist_lookup_nvlist(in, TOPO_PROP_ARGS, &args)) != 0) {
+ topo_mod_dprintf(mod, "Failed to lookup 'args' list (%s)\n",
+ strerror(ret));
+ return (topo_mod_seterrno(mod, EMOD_NVL_INVAL));
+ }
+ if ((fmtstr = get_fmtstr(mod, in)) == NULL) {
+ topo_mod_dprintf(mod, "Failed to retrieve 'format' arg\n");
+ /* topo errno already set */
+ return (-1);
+ }
+
+ chip = topo_node_parent(topo_node_parent(node));
+ dimm_inst = topo_node_instance(node);
+ chan = dimm_inst == 0 || dimm_inst == 2 ? 'A': 'B';
+ slot_num = (dimm_inst <= 1 ? 0 : 1);
+
+ /* LINTED: E_SEC_PRINTF_VAR_FMT */
+ (void) snprintf(buf, BUFSZ, fmtstr, topo_node_instance(chip) + 1, chan,
+ slot_num);
+
+ if (store_prop_val(mod, buf, "label", out) != 0) {
+ topo_mod_dprintf(mod, "Failed to set label\n");
+ /* topo errno already set */
+ return (-1);
+ }
+
+ return (0);
+}
diff --git a/usr/src/lib/libipmi/common/ipmi_misc.c b/usr/src/lib/libipmi/common/ipmi_misc.c
index ce14a620a2..6df676e91e 100644
--- a/usr/src/lib/libipmi/common/ipmi_misc.c
+++ b/usr/src/lib/libipmi/common/ipmi_misc.c
@@ -35,6 +35,7 @@ ipmi_deviceid_t *
ipmi_get_deviceid(ipmi_handle_t *ihp)
{
ipmi_cmd_t cmd, *resp;
+ uint16_t id_prod;
if (ihp->ih_deviceid != NULL)
return (ihp->ih_deviceid);
@@ -61,7 +62,9 @@ ipmi_get_deviceid(ipmi_handle_t *ihp)
return (NULL);
(void) memcpy(ihp->ih_deviceid, resp->ic_data, resp->ic_dlen);
- ihp->ih_deviceid->id_product = LE_16(ihp->ih_deviceid->id_product);
+ id_prod = LE_IN16(&ihp->ih_deviceid->id_product);
+ (void) memcpy(&id_prod, &ihp->ih_deviceid->id_product,
+ sizeof (id_prod));
ihp->ih_deviceid_len = resp->ic_dlen;
return (ihp->ih_deviceid);
diff --git a/usr/src/lib/libipmi/common/ipmi_sdr.c b/usr/src/lib/libipmi/common/ipmi_sdr.c
index b90619c272..83ac2848b0 100644
--- a/usr/src/lib/libipmi/common/ipmi_sdr.c
+++ b/usr/src/lib/libipmi/common/ipmi_sdr.c
@@ -71,10 +71,10 @@ ipmi_sdr_get_info(ipmi_handle_t *ihp)
sip = rsp->ic_data;
- sip->isi_record_count = LE_16(sip->isi_record_count);
- sip->isi_free_space = LE_16(sip->isi_free_space);
- sip->isi_add_ts = LE_32(sip->isi_add_ts);
- sip->isi_erase_ts = LE_32(sip->isi_erase_ts);
+ sip->isi_record_count = LE_IN16(&sip->isi_record_count);
+ sip->isi_free_space = LE_IN16(&sip->isi_free_space);
+ sip->isi_add_ts = LE_IN32(&sip->isi_add_ts);
+ sip->isi_erase_ts = LE_IN32(&sip->isi_erase_ts);
return (sip);
}
@@ -187,11 +187,11 @@ ipmi_sdr_refresh(ipmi_handle_t *ihp)
name = csp->is_cs_idstring;
csp->is_cs_assert_mask =
- LE_16(csp->is_cs_assert_mask);
+ LE_IN16(&csp->is_cs_assert_mask);
csp->is_cs_deassert_mask =
- LE_16(csp->is_cs_deassert_mask);
+ LE_IN16(&csp->is_cs_deassert_mask);
csp->is_cs_reading_mask =
- LE_16(csp->is_cs_reading_mask);
+ LE_IN16(&csp->is_cs_reading_mask);
break;
}
@@ -205,11 +205,11 @@ ipmi_sdr_refresh(ipmi_handle_t *ihp)
name = csp->is_fs_idstring;
csp->is_fs_assert_mask =
- LE_16(csp->is_fs_assert_mask);
+ LE_IN16(&csp->is_fs_assert_mask);
csp->is_fs_deassert_mask =
- LE_16(csp->is_fs_deassert_mask);
+ LE_IN16(&csp->is_fs_deassert_mask);
csp->is_fs_reading_mask =
- LE_16(csp->is_fs_reading_mask);
+ LE_IN16(&csp->is_fs_reading_mask);
break;
}
@@ -241,7 +241,8 @@ ipmi_sdr_refresh(ipmi_handle_t *ihp)
(ipmi_sdr_management_confirmation_t *)
sdr->is_record;
name = NULL;
- mcp->is_mc_product = LE_16(mcp->is_mc_product);
+ mcp->is_mc_product =
+ LE_IN16(&mcp->is_mc_product);
break;
}
diff --git a/usr/src/lib/libipmi/common/ipmi_sel.c b/usr/src/lib/libipmi/common/ipmi_sel.c
index 2cdabfea72..f14247efa9 100644
--- a/usr/src/lib/libipmi/common/ipmi_sel.c
+++ b/usr/src/lib/libipmi/common/ipmi_sel.c
@@ -53,10 +53,10 @@ ipmi_sel_get_info(ipmi_handle_t *ihp)
ip = (ipmi_sel_info_t *)rsp->ic_data;
- ip->isel_entries = LE_16(ip->isel_entries);
- ip->isel_free = LE_16(ip->isel_free);
- ip->isel_add_ts = LE_32(ip->isel_add_ts);
- ip->isel_erase_ts = LE_32(ip->isel_erase_ts);
+ ip->isel_entries = LE_IN16(&ip->isel_entries);
+ ip->isel_free = LE_IN16(&ip->isel_free);
+ ip->isel_add_ts = LE_IN32(&ip->isel_add_ts);
+ ip->isel_erase_ts = LE_IN32(&ip->isel_erase_ts);
return (ip);
}
@@ -96,11 +96,11 @@ ipmi_sel_get_entry(ipmi_handle_t *ihp, uint16_t id)
evp = (ipmi_sel_event_t *)rsp->ic_data;
- evp->isel_ev_next = LE_16(evp->isel_ev_next);
- evp->isel_ev_recid = LE_16(evp->isel_ev_recid);
+ evp->isel_ev_next = LE_IN16(&evp->isel_ev_next);
+ evp->isel_ev_recid = LE_IN16(&evp->isel_ev_recid);
if (evp->isel_ev_rectype == IPMI_SEL_SYSTEM ||
evp->isel_ev_rectype >= IPMI_SEL_OEM_LO)
- evp->isel_ev_ts = LE_32(evp->isel_ev_ts);
+ evp->isel_ev_ts = LE_IN32(&evp->isel_ev_ts);
return (evp);
}
@@ -127,7 +127,7 @@ ipmi_sel_get_time(ipmi_handle_t *ihp, uint32_t *tp)
if (rsp->ic_dlen < sizeof (uint32_t))
return (ipmi_set_error(ihp, EIPMI_BAD_RESPONSE_LENGTH, NULL));
- *tp = LE_32(*((uint32_t *)rsp->ic_data));
+ *tp = LE_IN32(rsp->ic_data);
return (0);
}
@@ -169,7 +169,7 @@ ipmi_sel_get_utc_offset(ipmi_handle_t *ihp, int *offp)
if (rsp->ic_dlen < sizeof (uint16_t))
return (ipmi_set_error(ihp, EIPMI_BAD_RESPONSE_LENGTH, NULL));
- off16 = LE_16(*((int16_t *)rsp->ic_data));
+ off16 = LE_IN16(rsp->ic_data);
*offp = off16;
return (0);
diff --git a/usr/src/lib/libipmi/common/ipmi_sensor.c b/usr/src/lib/libipmi/common/ipmi_sensor.c
index e8ab2e50f3..7a491e24bc 100644
--- a/usr/src/lib/libipmi/common/ipmi_sensor.c
+++ b/usr/src/lib/libipmi/common/ipmi_sensor.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -60,7 +60,7 @@ ipmi_get_sensor_reading(ipmi_handle_t *ihp, uint8_t id)
(void) memset((char *)srp + resp->ic_dlen, '\0',
sizeof (ipmi_sensor_reading_t) - resp->ic_dlen);
- srp->isr_state = LE_16(srp->isr_state);
+ srp->isr_state = LE_IN16(&srp->isr_state);
return (srp);
}
@@ -75,8 +75,8 @@ ipmi_set_sensor_reading(ipmi_handle_t *ihp, ipmi_set_sensor_reading_t *req)
*/
(void) memcpy(&realreq, req, sizeof (realreq));
- realreq.iss_assert_state = LE_16(realreq.iss_assert_state);
- realreq.iss_deassert_state = LE_16(realreq.iss_deassert_state);
+ realreq.iss_assert_state = LE_IN16(&realreq.iss_assert_state);
+ realreq.iss_deassert_state = LE_IN16(&realreq.iss_deassert_state);
cmd.ic_netfn = IPMI_NETFN_SE;
cmd.ic_cmd = IPMI_CMD_SET_SENSOR_READING;
diff --git a/usr/src/lib/libipmi/common/ipmi_sunoem.c b/usr/src/lib/libipmi/common/ipmi_sunoem.c
index a1ed544456..695d0fd4f5 100644
--- a/usr/src/lib/libipmi/common/ipmi_sunoem.c
+++ b/usr/src/lib/libipmi/common/ipmi_sunoem.c
@@ -188,9 +188,9 @@ ipmi_sunoem_uptime(ipmi_handle_t *ihp, uint32_t *uptime, uint32_t *gen)
return (ipmi_set_error(ihp, EIPMI_BAD_RESPONSE_LENGTH, NULL));
if (uptime)
- *uptime = BE_32(((uint32_t *)resp->ic_data)[0]);
+ *uptime = BE_IN32(&((uint32_t *)resp->ic_data)[0]);
if (gen)
- *gen = BE_32(((uint32_t *)resp->ic_data)[1]);
+ *gen = BE_IN32(&((uint32_t *)resp->ic_data)[1]);
return (0);
}