diff options
Diffstat (limited to 'c/src/lib/libbsp/i960/i960sim/start/start.c')
-rw-r--r-- | c/src/lib/libbsp/i960/i960sim/start/start.c | 39 |
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); +} |