The calculation uses 'char' to store a signed value. But on some platforms 'char' is unsigned, and the calculation yields bogus results.
Fixed by the diff below. ok? Index: dev/ipmi.c =================================================================== RCS file: /cvs/src/sys/dev/ipmi.c,v retrieving revision 1.107 diff -u -p -r1.107 ipmi.c --- dev/ipmi.c 31 Dec 2019 10:05:32 -0000 1.107 +++ dev/ipmi.c 11 Jan 2020 18:30:24 -0000 @@ -1171,8 +1171,8 @@ signextend(unsigned long val, int bits) long ipmi_convert(u_int8_t v, struct sdrtype1 *s1, long adj) { - short M, B; - char K1, K2; + int16_t M, B; + int8_t K1, K2; long val; /* Calculate linear reading variables */