diff --git a/core/init.c b/core/init.c index 62d9c709fac9..c2d7324622db 100644 --- a/core/init.c +++ b/core/init.c @@ -927,8 +927,12 @@ static void checksum_romem(void) if (chip_quirk(QUIRK_SLOW_SIM)) return; - csum = mem_csum(_start, _romem_end); + csum = mem_csum(_start, _head_end); romem_csum ^= csum; + + csum = mem_csum(_stext, _romem_end); + romem_csum ^= csum; + csum = mem_csum(__builtin_kernel_start, __builtin_kernel_end); romem_csum ^= csum; } diff --git a/include/skiboot.h b/include/skiboot.h index 686ba9dc8411..10b43e8c37f8 100644 --- a/include/skiboot.h +++ b/include/skiboot.h @@ -37,6 +37,7 @@ extern struct mem_region *mem_region_next(struct mem_region *region); /* Misc linker script symbols */ extern char _start[]; +extern char _head_end[]; extern char _stext[]; extern char _etext[]; extern char __sym_map_end[]; diff --git a/skiboot.lds.S b/skiboot.lds.S index 8890d69aa804..32139b2c5b7f 100644 --- a/skiboot.lds.S +++ b/skiboot.lds.S @@ -69,6 +69,13 @@ SECTIONS KEEP(*(.spirah.data)) } + _head_end = .; + + /* + * The following sections are read-write at runtime. We need + * to skip over them when checksumming the skiboot images + * before a fast-reboot. + */ . = PROC_DUMP_AREA_OFF; .procdump : { KEEP(*(.procdump.data)) @@ -94,6 +101,8 @@ SECTIONS KEEP(*(.cpuctrl.data)) } + /* ...and back to RO */ + . = ALIGN(0x10); _stext = .; .text : {