Stefan Reinauer (stefan.reinauer@coreboot.org) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/14616
-gerrit
commit f21a411d795af8e24873aa65861fe817ae1da417 Author: Stefan Reinauer stefan.reinauer@coreboot.org Date: Wed May 4 16:16:47 2016 -0700
rtc: Do checksum check for all bytes
Due to missing braces (that went undetected because of the indentation), I584189d9fcf7c9b831d9c020ee7ed59bb5ae08e8 only takes the last changed byte into regard when determining whether the checksum needs to be updated.
This bug went undetected for 5 years.
Change-Id: I47cedc801a60959386dfdcda3a13b8e3162a7ecb Signed-off-by: Stefan Reinauer stefan.reinauer@coreboot.org --- src/drivers/pc80/rtc/mc146818rtc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/drivers/pc80/rtc/mc146818rtc.c b/src/drivers/pc80/rtc/mc146818rtc.c index 35dad32..5fb9cf6 100644 --- a/src/drivers/pc80/rtc/mc146818rtc.c +++ b/src/drivers/pc80/rtc/mc146818rtc.c @@ -198,7 +198,7 @@ static enum cb_err get_cmos_value(unsigned long bit, unsigned long length, uchar >>= byte_bit; /* shift the bits to byte align */ /* clear unspecified bits */ ret[0] = uchar & ((1 << length) - 1); - } else { /* more that one byte so transfer the whole bytes */ + } else { /* more than one byte so transfer the whole bytes */ for (i = 0; length; i++, length -= 8, byte++) { /* load the byte */ ret[i] = cmos_read(byte); @@ -284,11 +284,12 @@ static enum cb_err set_cmos_value(unsigned long bit, unsigned long length, if (byte_bit || length % 8) return CB_ERR_ARG;
- for (i = 0; length; i++, length -= 8, byte++) + for (i = 0; length; i++, length -= 8, byte++) { cmos_write(ret[i], byte); if (byte >= LB_CKS_RANGE_START && byte <= LB_CKS_RANGE_END) chksum_update_needed = 1; + } }
if (chksum_update_needed) {