From: whitequark Date: Wed, 29 Jul 2015 09:30:57 +0000 (+0300) Subject: Make sure the BIOS file ends on an aligned boundary. X-Git-Tag: 24jan2021_ls180~2173 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8db098dd8f2b508a277c97352fee519aab0928ba;p=litex.git 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. --- diff --git a/software/bios/linker.ld b/software/bios/linker.ld index 74e83e3a..13b4bcae 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 2a9aaa98..38931414 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);