diff options
Diffstat (limited to 'libgloss/i960/crt0.c')
-rw-r--r-- | libgloss/i960/crt0.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/libgloss/i960/crt0.c b/libgloss/i960/crt0.c new file mode 100644 index 000000000..45d7891f7 --- /dev/null +++ b/libgloss/i960/crt0.c @@ -0,0 +1,66 @@ +extern int main(int argc, char **argv, char **envp); +extern int brk (void *value); + +extern char bss_start; +extern char end; + +char *__env[1] = {0}; +char **environ = __env; + +#define ENABLE_TRACE_MASK 1 + +__inline static void +enable_tracing (void) +{ + register int mask = ENABLE_TRACE_MASK; + __asm__ volatile ("modpc %0,%0,%0" + : + : "d" (mask)); +} + +#define STACK_ALIGN 64 + +__inline static void +set_stack (void* ptr) +{ + ptr = (void *)(((int)ptr + STACK_ALIGN - 1) & ~(STACK_ALIGN - 1)); + /* 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)); +} + +__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) +{ + char *p; + + enable_tracing (); + set_stack (&end); + init_Cregs (); + /* The stack grows upwards, so this makes the heap start after a 256K + stack area. PlumHall known to fail with less than 73K of stack. */ + brk (&end+0x40000); + /* clear bss */ + memset (&bss_start, 0, &end - &bss_start); + main(0, 0, 0); + exit(0); +} |