From 0d6fecc737cc46915c61d3afaddea45ec0410ad3 Mon Sep 17 00:00:00 2001 From: John Blair Date: Fri, 28 Jul 2006 20:43:50 +0000 Subject: [PATCH] There is a bug in ipmi_sdr.h which prevents ipmitool from correctly displaying thresholds and threshold mask. The "Discrete reading mask/Settable threshold mask, Readable threshold mask" field in SDR has two bytes (16 bits). The 16 bits should be treated as one uint16_t instead of two bytes. Otherwise, if someone sets the fields to 0x3f, it will be mistakenly interpreted as 0x3f00 instead of 0x003f. --- ipmitool/include/ipmitool/ipmi_sdr.h | 78 +++++++++++++++------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/ipmitool/include/ipmitool/ipmi_sdr.h b/ipmitool/include/ipmitool/ipmi_sdr.h index fb6d2d1..256e6b5 100644 --- a/ipmitool/include/ipmitool/ipmi_sdr.h +++ b/ipmitool/include/ipmitool/ipmi_sdr.h @@ -159,7 +159,7 @@ struct sdr_record_mask { struct { uint16_t assert_event; /* assertion event mask */ uint16_t deassert_event; /* de-assertion event mask */ - uint16_t read; /* discrete reaading mask */ + uint16_t read; /* discrete reading mask */ } discrete; struct { #if WORDS_BIGENDIAN @@ -232,44 +232,52 @@ struct sdr_record_mask { uint16_t status_unr:1; uint16_t reserved_2:1; #endif - struct { -#if WORDS_BIGENDIAN /* settable threshold mask */ - uint8_t reserved:2; - uint8_t unr:1; - uint8_t ucr:1; - uint8_t unc:1; - uint8_t lnr:1; - uint8_t lcr:1; - uint8_t lnc:1; + union { + struct { +#if WORDS_BIGENDIAN /* settable threshold mask */ + uint16_t reserved:2; + uint16_t unr:1; + uint16_t ucr:1; + uint16_t unc:1; + uint16_t lnr:1; + uint16_t lcr:1; + uint16_t lnc:1; + /* padding lower 8 bits */ + uint16_t readable:8; #else - uint8_t lnc:1; - uint8_t lcr:1; - uint8_t lnr:1; - uint8_t unc:1; - uint8_t ucr:1; - uint8_t unr:1; - uint8_t reserved:2; + uint16_t readable:8; + uint16_t lnc:1; + uint16_t lcr:1; + uint16_t lnr:1; + uint16_t unc:1; + uint16_t ucr:1; + uint16_t unr:1; + uint16_t reserved:2; #endif - } set; - struct { -#if WORDS_BIGENDIAN /* readable threshold mask */ - uint8_t reserved:2; - uint8_t unr:1; - uint8_t ucr:1; - uint8_t unc:1; - uint8_t lnr:1; - uint8_t lcr:1; - uint8_t lnc:1; + } set; + struct { +#if WORDS_BIGENDIAN /* readable threshold mask */ + /* padding upper 8 bits */ + uint16_t settable:8; + uint16_t reserved:2; + uint16_t unr:1; + uint16_t ucr:1; + uint16_t unc:1; + uint16_t lnr:1; + uint16_t lcr:1; + uint16_t lnc:1; #else - uint8_t lnc:1; - uint8_t lcr:1; - uint8_t lnr:1; - uint8_t unc:1; - uint8_t ucr:1; - uint8_t unr:1; - uint8_t reserved:2; + uint16_t lnc:1; + uint16_t lcr:1; + uint16_t lnr:1; + uint16_t unc:1; + uint16_t ucr:1; + uint16_t unr:1; + uint16_t reserved:2; + uint16_t settable:8; #endif - } read; + } read; + }; } threshold; } type; } __attribute__ ((packed));