summaryrefslogtreecommitdiffstats
path: root/newlib/libc/sys/sh/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys/sh/crt0.S')
-rw-r--r--newlib/libc/sys/sh/crt0.S67
1 files changed, 67 insertions, 0 deletions
diff --git a/newlib/libc/sys/sh/crt0.S b/newlib/libc/sys/sh/crt0.S
index 88c9fac0d..6eccf3a4b 100644
--- a/newlib/libc/sys/sh/crt0.S
+++ b/newlib/libc/sys/sh/crt0.S
@@ -1,3 +1,69 @@
+
+#ifdef __SH5__
+ .section .data,"aw"
+ .global ___data
+___data:
+
+ .section .rodata,"a"
+ .global ___rodata
+___rodata:
+
+#if __SH5__ == 64
+ .section .text,"ax"
+#define LOAD_ADDR(sym, reg) \
+ movi (sym >> 48) & 65535, reg; \
+ shori (sym >> 32) & 65535, reg; \
+ shori (sym >> 16) & 65535, reg; \
+ shori sym & 65535, reg
+#else
+ .mode SHmedia
+ .section .text..SHmedia32,"ax"
+#define LOAD_ADDR(sym, reg) \
+ movi (sym >> 16) & 65535, reg; \
+ shori sym & 65535, reg
+#endif
+ .global start
+start:
+ LOAD_ADDR (_stack, r15)
+
+ pt/l zero_bss_loop, tr0
+ pt/l _atexit, tr1
+ pt/l _init, tr5
+ pt/l _main, tr6
+ pt/l _exit, tr7
+
+ ! zero out bss
+ LOAD_ADDR (_edata, r0)
+ LOAD_ADDR (_end, r1)
+zero_bss_loop:
+ stx.q r0, r63, r63
+ addi r0, 8, r0
+ bgt/l r1, r0, tr0
+
+ LOAD_ADDR (___data, r26)
+ LOAD_ADDR (___rodata, r27)
+
+#if ! __SH4_NOFPU__
+ getcon cr0, r0
+ movi 1, r1
+ shlli r1, 15, r1
+ or r1, r0, r0
+ putcon r0, cr0
+#endif
+
+ ! arrange for exit to call fini
+ LOAD_ADDR (_fini, r2)
+ blink tr1, r18
+
+ ! call init
+ blink tr5, r18
+
+ ! call the mainline
+ blink tr6, r18
+
+ ! call exit
+ blink tr7, r18
+#else
.section .text
.global start
start:
@@ -46,6 +112,7 @@ main_k:
.long _main
exit_k:
.long _exit
+#endif
#ifdef __ELF__
.section .stack,"aw"