From 8db098dd8f2b508a277c97352fee519aab0928ba Mon Sep 17 00:00:00 2001 From: whitequark Date: Wed, 29 Jul 2015 12:30:57 +0300 Subject: [PATCH] Make sure the BIOS file ends on an aligned boundary. If it does not, the address to which mkmscimg.py writes the CRC and the address from which it is read could differ. --- software/bios/linker.ld | 17 +++++++---------- software/bios/main.c | 10 +++++----- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/software/bios/linker.ld b/software/bios/linker.ld index 74e83e3a6..13b4bcaec 100644 --- a/software/bios/linker.ld +++ b/software/bios/linker.ld @@ -18,18 +18,12 @@ SECTIONS _frodata = .; *(.rodata .rodata.* .gnu.linkonce.r.*) *(.rodata1) - _erodata = .; - } > rom - /* We shouldn't have a .data section, but the GNU crapchain whines if we don't */ - .data : - { + /* Make sure the file is aligned on disk as well + as in memory; CRC calculation requires that. */ + FILL(0); . = ALIGN(4); - _fdata = .; - *(.data .data.* .gnu.linkonce.d.*) - *(.data1) - *(.sdata .sdata.* .gnu.linkonce.s.*) - _edata = .; + _erodata = .; } > rom .bss : @@ -51,6 +45,9 @@ SECTIONS { *(.eh_frame) *(.comment) + *(.data .data.* .gnu.linkonce.d.*) + *(.data1) + *(.sdata .sdata.* .gnu.linkonce.s.*) } } diff --git a/software/bios/main.c b/software/bios/main.c index 2a9aaa986..389314144 100644 --- a/software/bios/main.c +++ b/software/bios/main.c @@ -409,7 +409,7 @@ static void do_command(char *c) printf("Command not found\n"); } -extern unsigned int _ftext, _edata; +extern unsigned int _ftext, _erodata; static void crcbios(void) { @@ -419,14 +419,14 @@ static void crcbios(void) unsigned int actual_crc; /* - * _edata is located right after the end of the flat + * _erodata is located right after the end of the flat * binary image. The CRC tool writes the 32-bit CRC here. - * We also use the address of _edata to know the length + * We also use the address of _erodata to know the length * of our code. */ offset_bios = (unsigned int)&_ftext; - expected_crc = _edata; - length = (unsigned int)&_edata - offset_bios; + expected_crc = _erodata; + length = (unsigned int)&_erodata - offset_bios; actual_crc = crc32((unsigned char *)offset_bios, length); if(expected_crc == actual_crc) printf("BIOS CRC passed (%08x)\n", actual_crc);