rtc: Do checksum check for all bytes
Due to missing braces (that went undetected because of the indentation), I584189d9fcf7c9b831d9c020ee7ed59bb5ae08e8 CMOS: add set_option() 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> Reviewed-on: https://review.coreboot.org/14616 Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
		
				
					committed by
					
						
						Martin Roth
					
				
			
			
				
	
			
			
			
						parent
						
							d5a6eb44ca
						
					
				
				
					commit
					24850ccf9b
				
			@@ -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 */
 | 
							uchar >>= byte_bit;	/* shift the bits to byte align */
 | 
				
			||||||
		/* clear unspecified bits */
 | 
							/* clear unspecified bits */
 | 
				
			||||||
		ret[0] = uchar & ((1 << length) - 1);
 | 
							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++) {
 | 
							for (i = 0; length; i++, length -= 8, byte++) {
 | 
				
			||||||
			/* load the byte */
 | 
								/* load the byte */
 | 
				
			||||||
			ret[i] = cmos_read(byte);
 | 
								ret[i] = cmos_read(byte);
 | 
				
			||||||
@@ -284,12 +284,13 @@ static enum cb_err set_cmos_value(unsigned long bit, unsigned long length,
 | 
				
			|||||||
		if (byte_bit || length % 8)
 | 
							if (byte_bit || length % 8)
 | 
				
			||||||
			return CB_ERR_ARG;
 | 
								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);
 | 
								cmos_write(ret[i], byte);
 | 
				
			||||||
			if (byte >= LB_CKS_RANGE_START &&
 | 
								if (byte >= LB_CKS_RANGE_START &&
 | 
				
			||||||
			    byte <= LB_CKS_RANGE_END)
 | 
								    byte <= LB_CKS_RANGE_END)
 | 
				
			||||||
				chksum_update_needed = 1;
 | 
									chksum_update_needed = 1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (chksum_update_needed) {
 | 
						if (chksum_update_needed) {
 | 
				
			||||||
		cmos_set_checksum(LB_CKS_RANGE_START, LB_CKS_RANGE_END,
 | 
							cmos_set_checksum(LB_CKS_RANGE_START, LB_CKS_RANGE_END,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user