summaryrefslogtreecommitdiffstats
path: root/newlib/libc/sys
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys')
-rw-r--r--newlib/libc/sys/sh/crt0.S67
-rw-r--r--newlib/libc/sys/sh/trap.S28
2 files changed, 95 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"
diff --git a/newlib/libc/sys/sh/trap.S b/newlib/libc/sys/sh/trap.S
index 4512293e3..0eb6e5dfe 100644
--- a/newlib/libc/sys/sh/trap.S
+++ b/newlib/libc/sys/sh/trap.S
@@ -1,3 +1,30 @@
+#if __SH5__
+ .mode SHmedia
+#if __SH5__ == 32 && __SHMEDIA__
+ .section .text..SHmedia32, "ax"
+#else
+ .text
+#endif
+ .global ___trap34
+___trap34:
+ movi 34, r0
+ trapa r0
+ pt/l ret, tr1
+ ptabs/l r18, tr0
+ beqi r1, 0, tr1
+#if __SH5__ == 64
+ movi ((_errno >> 48) & 65535), r0
+ shori ((_errno >> 32) & 65535), r0
+ shori ((_errno >> 16) & 65535), r0
+#else
+ movi ((_errno >> 16) & 65535), r0
+#endif
+ shori (_errno & 65535), r0
+ stx.l r0, r63, r1
+ret:
+ blink tr0, r63
+
+#else
.text
.global ___trap34
___trap34:
@@ -13,3 +40,4 @@ ret:
.align 2
perrno:
.long _errno
+#endif /* ! __SH5__ */