summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i960/i960sim/start/start.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/i960/i960sim/start/start.c')
-rw-r--r--c/src/lib/libbsp/i960/i960sim/start/start.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i960/i960sim/start/start.c b/c/src/lib/libbsp/i960/i960sim/start/start.c
new file mode 100644
index 0000000000..590e3eb8ed
--- /dev/null
+++ b/c/src/lib/libbsp/i960/i960sim/start/start.c
@@ -0,0 +1,39 @@
+char *__env[1] = {0};
+char **environ = __env;
+
+#define ENABLE_TRACE_MASK 1
+#define STACK_ALIGN 64
+
+__inline static void
+init_Cregs (void)
+{
+ /* set register values gcc like */
+ register unsigned int mask0=0x3b001000;
+ register unsigned int mask1=0x00009107;
+ __asm__ volatile ("mov %0,g14"
+ : /* no output */
+ : "I" (0)); /* gnu structure pointer */
+ __asm__ volatile ("modac %1,%0,%0"
+ : /* no output */
+ : "d" (mask0),
+ "d" (mask1)); /* fpu control kb */
+}
+
+void _start(void)
+{
+ extern int stack_init;
+ register void *ptr = &stack_init;
+
+ /* enable tracing */
+ register int mask = ENABLE_TRACE_MASK;
+ __asm__ volatile ("modpc %0,%0,%0" : : "d" (mask));
+
+ /* SP must be 64 bytes larger than FP at start. */
+ __asm__ volatile ("mov %0,sp" : : "d" (ptr + STACK_ALIGN));
+ __asm__ volatile ("mov %0,fp" : : "d" (ptr));
+
+
+ init_Cregs();
+ boot_card();
+ _sys_exit(0);
+}