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); }