software/microwatt: Fix copying data to RAM and clearing BSS
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Sun, 21 Jun 2020 09:35:04 +0000 (19:35 +1000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Sun, 21 Jun 2020 09:35:04 +0000 (19:35 +1000)
This also makes us use the "small" memory model to avoid having to
use more complex constructs and adds the TOC to the linker script

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
litex/soc/cores/cpu/microwatt/core.py
litex/soc/cores/cpu/microwatt/crt0.S
litex/soc/software/bios/linker.ld

index 45da6e69d635c75ac8d6fed003a998d50534b539..ee6f8a66e73845370fa4fb53e8dd6b68d6cff79f 100644 (file)
@@ -41,6 +41,7 @@ class Microwatt(CPU):
         flags += "-mlittle-endian "
         flags += "-mstrict-align "
         flags += "-fno-stack-protector "
+        flags += "-mcmodel=small "
         flags += "-D__microwatt__ "
         return flags
 
index e03ac0bb4be6e07239efb0cbb9c7724c3badf3c2..0fc8868ef0c2269e4f4bcd978a61243c7b521d62 100644 (file)
 _start:
        FIXUP_ENDIAN
 
+       /* Grab our own address */
+       bcl     20,31,$+4
+0:     mflr    %r12
+
+       /* Get our TOC */
+       addis   %r2,%r12,(.TOC.-0b)@h
+       addi    %r2,%r2,(.TOC.-0b)@l
+
+       /* Copy data from ROM to SRAM */
+       ld      %r3,_fdata@got(%r2)
+       ld      %r4,_edata@got(%r2)
+       ld      %r5,_fdata_rom@got(%r2)
+       subf    %r6,%r3,%r4
+       srdi.   %r6,%r6,3
+       beq     1f
+       li      %r10,0
+       mtctr   %r6
+0:     ldx     %r0,%r10,%r5
+       stdx    %r0,%r10,%r3
+       addi    %r10,%r10,8
+       bdnz    0b
+1:
+       /* Clear BSS */
+       ld      %r3,_fbss@got(%r2)
+       ld      %r4,_ebss@got(%r2)
+       subf    %r6,%r3,%r4
+       srdi.   %r6,%r6,3
+       beq     1f
+       li      %r0,0
+       subi    %r3,%r3,8
+       mtctr   %r6
+0:     stdu    %r0,8(%r3)
+       bdnz    0b
+1:
        /* setup stack */
-       LOAD_IMM64(%r1, _fstack - 0x100)
-       LOAD_IMM64(%r12, main)
-       mtctr   %r12,
-       bctrl
-       b .
+       ld      %r1,_fstack@got(%r2)
+       bl      main
+       b       .
 
 #define EXCEPTION(nr)          \
        .=  nr;      \
index 070212538958d9ace8e8ff0c9c6738ebd8ac8491..6ebd50cdd709fc0fd6b529cdc384dc10811ec56a 100644 (file)
@@ -25,6 +25,7 @@ SECTIONS
                *(.rodata .rodata.* .gnu.linkonce.r.*)
                *(.rodata1)
                *(.got .got.*)
+               *(.toc .toc.*)
 
                /* Make sure the file is aligned on disk as well
                   as in memory; CRC calculation requires that. */