mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
general: Make byteswapping arch-independent
ipmiXXtoh() and htoipmiXX() functions were broken and only worked properly for big-endian hosts. This commit makes them endianness-independent. Signed-off-by: Alexander Amelkin <alexander@amelkin.msk.ru>
This commit is contained in:
parent
b3d258b234
commit
249e092967
@ -118,16 +118,31 @@ static inline uint16_t ipmi16toh(void *ipmi16)
|
|||||||
uint8_t *ipmi = (uint8_t *)ipmi16;
|
uint8_t *ipmi = (uint8_t *)ipmi16;
|
||||||
uint16_t h;
|
uint16_t h;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ipmi16 address may be word-wise misaligned, so don't
|
||||||
|
* use type-pun and instead explicity shift corresponding bytes
|
||||||
|
* to where they belong.
|
||||||
|
*/
|
||||||
|
#if WORDS_BIGENDIAN
|
||||||
|
h = ipmi[0] << 8; /* MSB */
|
||||||
|
h |= ipmi[1]; /* LSB */
|
||||||
|
#else
|
||||||
h = ipmi[1] << 8; /* MSB */
|
h = ipmi[1] << 8; /* MSB */
|
||||||
h |= ipmi[0]; /* LSB */
|
h |= ipmi[0]; /* LSB */
|
||||||
|
#endif
|
||||||
|
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void htoipmi16(uint16_t h, uint8_t *ipmi)
|
static inline void htoipmi16(uint16_t h, uint8_t *ipmi)
|
||||||
{
|
{
|
||||||
|
#if WORDS_BIGENDIAN
|
||||||
ipmi[0] = h & 0xFF; /* LSB */
|
ipmi[0] = h & 0xFF; /* LSB */
|
||||||
ipmi[1] = h >> 8; /* MSB */
|
ipmi[1] = h >> 8; /* MSB */
|
||||||
|
#else
|
||||||
|
ipmi[1] = h & 0xFF; /* LSB */
|
||||||
|
ipmi[0] = h >> 8; /* MSB */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t ipmi24toh(void *ipmi24)
|
static inline uint32_t ipmi24toh(void *ipmi24)
|
||||||
@ -135,26 +150,58 @@ static inline uint32_t ipmi24toh(void *ipmi24)
|
|||||||
uint8_t *ipmi = (uint8_t *)ipmi24;
|
uint8_t *ipmi = (uint8_t *)ipmi24;
|
||||||
uint32_t h = 0;
|
uint32_t h = 0;
|
||||||
|
|
||||||
h = ipmi[2] << 16;
|
#if WORDS_BIGENDIAN
|
||||||
|
h = ipmi[0] << 16; /* LSB */
|
||||||
h |= ipmi[1] << 8;
|
h |= ipmi[1] << 8;
|
||||||
h |= ipmi[0];
|
h |= ipmi[2]; /* MSB */
|
||||||
|
#else
|
||||||
|
h = ipmi[2] << 16; /* LSB */
|
||||||
|
h |= ipmi[1] << 8;
|
||||||
|
h |= ipmi[0]; /* MSB */
|
||||||
|
#endif
|
||||||
|
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t ipmi32toh(void *ipmi32)
|
static inline uint32_t ipmi32toh(void *ipmi32)
|
||||||
{
|
{
|
||||||
uint8_t *ipmi = (uint8_t *)ipmi32;
|
uint8_t *ipmi = ipmi32;
|
||||||
uint32_t h;
|
uint32_t h;
|
||||||
|
|
||||||
h = ipmi[3] << 24;
|
/*
|
||||||
|
* ipmi32 address may be dword-wise misaligned, so don't
|
||||||
|
* use type-pun and instead explicity shift corresponding bytes
|
||||||
|
* to where they belong.
|
||||||
|
*/
|
||||||
|
#if WORDS_BIGENDIAN
|
||||||
|
h = ipmi[0] << 24; /* LSB */
|
||||||
|
h |= ipmi[1] << 16;
|
||||||
|
h |= ipmi[2] << 8;
|
||||||
|
h |= ipmi[3]; /* MSB */
|
||||||
|
#else
|
||||||
|
h = ipmi[3] << 24; /* LSB */
|
||||||
h |= ipmi[2] << 16;
|
h |= ipmi[2] << 16;
|
||||||
h |= ipmi[1] << 8;
|
h |= ipmi[1] << 8;
|
||||||
h |= ipmi[0];
|
h |= ipmi[0]; /* MSB */
|
||||||
|
#endif
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void htoipmi32(uint32_t h, uint8_t *ipmi)
|
||||||
|
{
|
||||||
|
#if WORDS_BIGENDIAN
|
||||||
|
ipmi[0] = h & 0xFF; /* LSB */
|
||||||
|
ipmi[1] = (h >> 8) & 0xFF;
|
||||||
|
ipmi[2] = (h >> 16) & 0xFF;
|
||||||
|
ipmi[3] = (h >> 24) & 0xFF; /* MSB */
|
||||||
|
#else
|
||||||
|
ipmi[3] = h & 0xFF; /* LSB */
|
||||||
|
ipmi[2] = (h >> 8) & 0xFF;
|
||||||
|
ipmi[1] = (h >> 16) & 0xFF;
|
||||||
|
ipmi[0] = (h >> 24) & 0xFF; /* MSB */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#define ipmi_open_file_read(file) ipmi_open_file(file, 0)
|
#define ipmi_open_file_read(file) ipmi_open_file(file, 0)
|
||||||
#define ipmi_open_file_write(file) ipmi_open_file(file, 1)
|
#define ipmi_open_file_write(file) ipmi_open_file(file, 1)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user