diff options
author | robj <none@none> | 2008-04-04 16:44:23 -0700 |
---|---|---|
committer | robj <none@none> | 2008-04-04 16:44:23 -0700 |
commit | 918a0d8ae0916c29c35aae9b95c22b02a0c6e390 (patch) | |
tree | 99f05bb7504cb66e00e5ad0e667d47c21fe84555 | |
parent | 5f28a8273cda869edd1af63f0b8cca5b7af42541 (diff) | |
download | illumos-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.c | 18 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/libtopo/common/hc.c | 18 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/libtopo/common/topo_snap.c | 6 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/maps/i86pc/chip-hc-topology.xml | 7 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/modules/i86pc/chip/chip.h | 4 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/modules/i86pc/chip/chip_amd.c | 2 | ||||
-rw-r--r-- | usr/src/lib/fm/topo/modules/i86pc/chip/chip_label.c | 57 | ||||
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_misc.c | 5 | ||||
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_sdr.c | 23 | ||||
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_sel.c | 18 | ||||
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_sensor.c | 8 | ||||
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_sunoem.c | 4 |
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); } |