diff options
author | robj <none@none> | 2008-05-27 15:01:57 -0700 |
---|---|---|
committer | robj <none@none> | 2008-05-27 15:01:57 -0700 |
commit | e1a24155fa4a9f69c2b1a6759fbe0180645724f0 (patch) | |
tree | d610221c838626bf3cd5176323e42f502b7add7c /usr/src | |
parent | 43b9c05035ac59f7f7a8e7827598db5a15f30ed3 (diff) | |
download | illumos-joyent-e1a24155fa4a9f69c2b1a6759fbe0180645724f0.tar.gz |
6706453 libipmi: fix for 6674208 needs more work
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_misc.c | 2 | ||||
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_sdr.c | 72 | ||||
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_sel.c | 21 | ||||
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_sensor.c | 7 |
4 files changed, 70 insertions, 32 deletions
diff --git a/usr/src/lib/libipmi/common/ipmi_misc.c b/usr/src/lib/libipmi/common/ipmi_misc.c index 6df676e91e..ef24e3551e 100644 --- a/usr/src/lib/libipmi/common/ipmi_misc.c +++ b/usr/src/lib/libipmi/common/ipmi_misc.c @@ -63,7 +63,7 @@ ipmi_get_deviceid(ipmi_handle_t *ihp) (void) memcpy(ihp->ih_deviceid, resp->ic_data, resp->ic_dlen); id_prod = LE_IN16(&ihp->ih_deviceid->id_product); - (void) memcpy(&id_prod, &ihp->ih_deviceid->id_product, + (void) memcpy(&ihp->ih_deviceid->id_product, &id_prod, sizeof (id_prod)); ihp->ih_deviceid_len = resp->ic_dlen; diff --git a/usr/src/lib/libipmi/common/ipmi_sdr.c b/usr/src/lib/libipmi/common/ipmi_sdr.c index 83ac2848b0..44d41df721 100644 --- a/usr/src/lib/libipmi/common/ipmi_sdr.c +++ b/usr/src/lib/libipmi/common/ipmi_sdr.c @@ -59,6 +59,8 @@ ipmi_sdr_get_info(ipmi_handle_t *ihp) { ipmi_cmd_t cmd, *rsp; ipmi_sdr_info_t *sip; + uint16_t tmp16; + uint32_t tmp32; cmd.ic_netfn = IPMI_NETFN_STORAGE; cmd.ic_lun = 0; @@ -71,10 +73,17 @@ ipmi_sdr_get_info(ipmi_handle_t *ihp) sip = rsp->ic_data; - 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); + tmp16 = LE_IN16(&sip->isi_record_count); + (void) memcpy(&sip->isi_record_count, &tmp16, sizeof (tmp16)); + + tmp16 = LE_IN16(&sip->isi_free_space); + (void) memcpy(&sip->isi_free_space, &tmp16, sizeof (tmp16)); + + tmp32 = LE_IN32(&sip->isi_add_ts); + (void) memcpy(&sip->isi_add_ts, &tmp32, sizeof (tmp32)); + + tmp32 = LE_IN32(&sip->isi_erase_ts); + (void) memcpy(&sip->isi_erase_ts, &tmp32, sizeof (tmp32)); return (sip); } @@ -182,34 +191,48 @@ ipmi_sdr_refresh(ipmi_handle_t *ihp) ipmi_sdr_compact_sensor_t *csp = (ipmi_sdr_compact_sensor_t *) sdr->is_record; + uint16_t tmp; + namelen = csp->is_cs_idlen; type = csp->is_cs_idtype; name = csp->is_cs_idstring; - csp->is_cs_assert_mask = - LE_IN16(&csp->is_cs_assert_mask); - csp->is_cs_deassert_mask = - LE_IN16(&csp->is_cs_deassert_mask); - csp->is_cs_reading_mask = - LE_IN16(&csp->is_cs_reading_mask); + tmp = LE_IN16(&csp->is_cs_assert_mask); + (void) memcpy(&csp->is_cs_assert_mask, &tmp, + sizeof (tmp)); + + tmp = LE_IN16(&csp->is_cs_deassert_mask); + (void) memcpy(&csp->is_cs_deassert_mask, &tmp, + sizeof (tmp)); + + tmp = LE_IN16(&csp->is_cs_reading_mask); + (void) memcpy(&csp->is_cs_reading_mask, &tmp, + sizeof (tmp)); break; } case IPMI_SDR_TYPE_FULL_SENSOR: { - ipmi_sdr_full_sensor_t *csp = + ipmi_sdr_full_sensor_t *fsp = (ipmi_sdr_full_sensor_t *) sdr->is_record; - namelen = csp->is_fs_idlen; - type = csp->is_fs_idtype; - name = csp->is_fs_idstring; - - csp->is_fs_assert_mask = - LE_IN16(&csp->is_fs_assert_mask); - csp->is_fs_deassert_mask = - LE_IN16(&csp->is_fs_deassert_mask); - csp->is_fs_reading_mask = - LE_IN16(&csp->is_fs_reading_mask); + uint16_t tmp; + + namelen = fsp->is_fs_idlen; + type = fsp->is_fs_idtype; + name = fsp->is_fs_idstring; + + tmp = LE_IN16(&fsp->is_fs_assert_mask); + (void) memcpy(&fsp->is_fs_assert_mask, &tmp, + sizeof (tmp)); + + tmp = LE_IN16(&fsp->is_fs_deassert_mask); + (void) memcpy(&fsp->is_fs_deassert_mask, &tmp, + sizeof (tmp)); + + tmp = LE_IN16(&fsp->is_fs_reading_mask); + (void) memcpy(&fsp->is_fs_reading_mask, &tmp, + sizeof (tmp)); break; } @@ -240,9 +263,12 @@ ipmi_sdr_refresh(ipmi_handle_t *ihp) ipmi_sdr_management_confirmation_t *mcp = (ipmi_sdr_management_confirmation_t *) sdr->is_record; + uint16_t tmp; + name = NULL; - mcp->is_mc_product = - LE_IN16(&mcp->is_mc_product); + tmp = LE_IN16(&mcp->is_mc_product); + (void) memcpy(&mcp->is_mc_product, &tmp, + sizeof (tmp)); break; } diff --git a/usr/src/lib/libipmi/common/ipmi_sel.c b/usr/src/lib/libipmi/common/ipmi_sel.c index f14247efa9..528be35463 100644 --- a/usr/src/lib/libipmi/common/ipmi_sel.c +++ b/usr/src/lib/libipmi/common/ipmi_sel.c @@ -41,6 +41,8 @@ ipmi_sel_get_info(ipmi_handle_t *ihp) { ipmi_cmd_t cmd, *rsp; ipmi_sel_info_t *ip; + uint16_t tmp16; + uint32_t tmp32; cmd.ic_netfn = IPMI_NETFN_STORAGE; cmd.ic_lun = 0; @@ -53,10 +55,14 @@ ipmi_sel_get_info(ipmi_handle_t *ihp) ip = (ipmi_sel_info_t *)rsp->ic_data; - 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); + tmp16 = LE_IN16(&ip->isel_entries); + (void) memcpy(&ip->isel_entries, &tmp16, sizeof (tmp16)); + tmp16 = LE_IN16(&ip->isel_free); + (void) memcpy(&ip->isel_free, &tmp16, sizeof (tmp16)); + tmp32 = LE_IN32(&ip->isel_add_ts); + (void) memcpy(&ip->isel_add_ts, &tmp32, sizeof (tmp32)); + tmp32 = LE_IN32(&ip->isel_erase_ts); + (void) memcpy(&ip->isel_erase_ts, &tmp32, sizeof (tmp32)); return (ip); } @@ -74,6 +80,7 @@ ipmi_sel_get_entry(ipmi_handle_t *ihp, uint16_t id) ipmi_cmd_t cmd, *rsp; ipmi_sel_event_t *evp; ipmi_cmd_get_sel_entry_t data; + uint32_t tmp; data.ic_sel_ent_resid = 0; data.ic_sel_ent_recid = LE_16(id); @@ -99,9 +106,11 @@ ipmi_sel_get_entry(ipmi_handle_t *ihp, uint16_t id) 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_IN32(&evp->isel_ev_ts); + evp->isel_ev_rectype >= IPMI_SEL_OEM_LO) { + tmp = LE_IN32(&evp->isel_ev_ts); + (void) memcpy(&evp->isel_ev_ts, &tmp, sizeof (tmp)); + } return (evp); } diff --git a/usr/src/lib/libipmi/common/ipmi_sensor.c b/usr/src/lib/libipmi/common/ipmi_sensor.c index 7a491e24bc..0b035709a3 100644 --- a/usr/src/lib/libipmi/common/ipmi_sensor.c +++ b/usr/src/lib/libipmi/common/ipmi_sensor.c @@ -69,14 +69,17 @@ ipmi_set_sensor_reading(ipmi_handle_t *ihp, ipmi_set_sensor_reading_t *req) { ipmi_set_sensor_reading_t realreq; ipmi_cmd_t cmd, *resp; + uint16_t tmp; /* * Convert states to little endian. */ (void) memcpy(&realreq, req, sizeof (realreq)); - realreq.iss_assert_state = LE_IN16(&realreq.iss_assert_state); - realreq.iss_deassert_state = LE_IN16(&realreq.iss_deassert_state); + tmp = LE_IN16(&realreq.iss_assert_state); + (void) memcpy(&realreq.iss_assert_state, &tmp, sizeof (tmp)); + tmp = LE_IN16(&realreq.iss_deassert_state); + (void) memcpy(&realreq.iss_deassert_state, &tmp, sizeof (tmp)); cmd.ic_netfn = IPMI_NETFN_SE; cmd.ic_cmd = IPMI_CMD_SET_SENSOR_READING; |