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>
flags += "-mlittle-endian "
flags += "-mstrict-align "
flags += "-fno-stack-protector "
+ flags += "-mcmodel=small "
flags += "-D__microwatt__ "
return flags
_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; \
*(.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. */