summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i960/i960sim/start/start.c
blob: 2b7a83e64cd2f2a311a5bfacf1d5be0dc52e5690 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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);
}