Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/i960/crt0.c')
-rw-r--r--libgloss/i960/crt0.c66
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);
+}