summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorrobj <none@none>2008-05-27 15:01:57 -0700
committerrobj <none@none>2008-05-27 15:01:57 -0700
commite1a24155fa4a9f69c2b1a6759fbe0180645724f0 (patch)
treed610221c838626bf3cd5176323e42f502b7add7c /usr/src
parent43b9c05035ac59f7f7a8e7827598db5a15f30ed3 (diff)
downloadillumos-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.c2
-rw-r--r--usr/src/lib/libipmi/common/ipmi_sdr.c72
-rw-r--r--usr/src/lib/libipmi/common/ipmi_sel.c21
-rw-r--r--usr/src/lib/libipmi/common/ipmi_sensor.c7
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;