software/microwatt: Fix copying data to RAM and clearing BSS

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>
This commit is contained in:
Benjamin Herrenschmidt 2020-06-21 19:35:04 +10:00
parent 13e0852af4
commit 28ea4b3f4c
3 changed files with 39 additions and 5 deletions

View File

@ -41,6 +41,7 @@ class Microwatt(CPU):
flags += "-mlittle-endian " flags += "-mlittle-endian "
flags += "-mstrict-align " flags += "-mstrict-align "
flags += "-fno-stack-protector " flags += "-fno-stack-protector "
flags += "-mcmodel=small "
flags += "-D__microwatt__ " flags += "-D__microwatt__ "
return flags return flags

View File

@ -41,11 +41,43 @@
_start: _start:
FIXUP_ENDIAN 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 */ /* setup stack */
LOAD_IMM64(%r1, _fstack - 0x100) ld %r1,_fstack@got(%r2)
LOAD_IMM64(%r12, main) bl main
mtctr %r12,
bctrl
b . b .
#define EXCEPTION(nr) \ #define EXCEPTION(nr) \

View File

@ -25,6 +25,7 @@ SECTIONS
*(.rodata .rodata.* .gnu.linkonce.r.*) *(.rodata .rodata.* .gnu.linkonce.r.*)
*(.rodata1) *(.rodata1)
*(.got .got.*) *(.got .got.*)
*(.toc .toc.*)
/* Make sure the file is aligned on disk as well /* Make sure the file is aligned on disk as well
as in memory; CRC calculation requires that. */ as in memory; CRC calculation requires that. */