diff options
author | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
---|---|---|
committer | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
commit | 03261851a10dd2d6900a0a00a7515a0a46fb5d76 (patch) | |
tree | 7c22ac6cbbc99fd5cd1b5426853be8d4fd7bfcf1 /libgloss/i960/crt0.c | |
parent | fae4c299f14fc23e2829c8656992eba21f79242a (diff) | |
download | cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.gz cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.bz2 cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.zip |
20000317 sourceware import
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); +} |