Make sure the BIOS file ends on an aligned boundary.
authorwhitequark <whitequark@whitequark.org>
Wed, 29 Jul 2015 09:30:57 +0000 (12:30 +0300)
committerwhitequark <whitequark@whitequark.org>
Wed, 29 Jul 2015 09:30:57 +0000 (12:30 +0300)
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
software/bios/main.c

index 74e83e3a653a4c640be750d7965ad84c75daed74..13b4bcaecb4c0f49c5522badbbb5a6c5baeffa0d 100644 (file)
@@ -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.*)
        }
 }
 
index 2a9aaa98655d091a625573cf92daab77340e54f2..3893141444ee476adb53c66d4262342f0bf1880a 100644 (file)
@@ -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);