summaryrefslogtreecommitdiff
path: root/newlib/libc/sys/z8ksim/crt0.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys/z8ksim/crt0.c')
-rw-r--r--newlib/libc/sys/z8ksim/crt0.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/newlib/libc/sys/z8ksim/crt0.c b/newlib/libc/sys/z8ksim/crt0.c
new file mode 100644
index 00000000000..f9aad6d95a3
--- /dev/null
+++ b/newlib/libc/sys/z8ksim/crt0.c
@@ -0,0 +1,58 @@
+extern char _start_bss;
+extern char _end_bss;
+extern int main(int argc, char **argv, char **environ);
+void __main();
+
+static void
+enter()
+{
+#if defined(__Z8002__)
+ __main();
+#endif
+ exit(main(0,0,0));
+}
+start()
+{
+ char *p;
+#if defined(__Z8002__)
+ asm("ld r15,#__stack_top");
+ asm("ld r10,r15");
+#endif
+#if defined(__Z8001__)
+ asm("ldl rr14,#__stack_top");
+ asm("ldl rr10,rr14");
+#endif
+
+
+ /* zero bss */
+ p = &_start_bss;
+ while (p < & _end_bss)
+ {
+ *p++ = 0;
+ }
+ enter();
+}
+
+#if defined(__Z8002__)
+void __do_global_ctors ()
+{
+ typedef void (*pfunc)();
+ extern pfunc __ctors[];
+ extern pfunc __ctors_end[];
+ pfunc *p;
+ for (p = __ctors_end; p > __ctors; )
+ {
+ (*--p)();
+ }
+}
+
+void __main()
+{
+ static int initialized;
+ if (! initialized)
+ {
+ initialized = 1;
+ __do_global_ctors ();
+ }
+}
+#endif