6b8bfdafd0bd59be217322516166f949c2adcb7c
[gnuk/gnuk.git] / regnual / sys.c
1 #include "types.h"
2
3 static void fatal (void)
4 {
5   for (;;);
6 }
7
8 static void none (void)
9 {
10 }
11
12 /*
13  * Note: the address of this routine 'entry' will be in the vectors as
14  * RESET, but this will be called from application.  It's not RESET
15  * state, then.
16  *
17  * This routine doesn't change PSP and MSP.  Application should
18  * prepare those stack pointers.
19  */
20 static __attribute__ ((naked,section(".text.entry")))
21 void entry (void)
22 {
23   asm volatile ("mov    r0, pc\n\t"
24                 "bic    r0, r0, #255\n\t" /* R0 := vector_table address    */
25                 "mov    r1, #0x90\n\t"    /* R1 := numbers of entries * 4  */
26                 "ldr    r3, .L01\n"       /* R3 := -0x20001400 fixed addr  */
27         "0:\n\t"
28                 "ldr    r2, [r0, r1]\n\t"
29                 "add    r2, r0\n\t" /* Relocate: R0 - 0x20001400 */
30                 "add    r2, r3\n\t"
31                 "str    r2, [r0, r1]\n\t"
32                 "subs   r1, r1, #4\n\t"
33                 "bne    0b\n\t"
34                 /* Relocation done. */
35                 "add    r0, r3\n\t"
36                 "ldr    r3, .L00\n"
37         ".LPIC00:\n\t"
38                 "add    r3, pc\n\t" /* R3 := @_GLOBAL_OFFSET_TABLE_ */
39                 /* Compute the address of BSS.  */
40                 "ldr    r4, .L00+4\n\t"
41                 "ldr    r1, [r3, r4]\n\t"
42                 "add    r1, r0\n\t" /* relocate bss_start */
43                 "ldr    r4, .L00+8\n\t"
44                 "ldr    r2, [r3, r4]\n"
45                 "add    r1, r0\n\t" /* relocate bss_end */
46                 /* Clear BSS.  */
47                 "mov    r0, #0\n\t"
48         "0:\n\t"
49                 "str    r0, [r1], #4\n\t"
50                 "cmp    r2, r1\n\t"
51                 "bhi    0b\n\t"
52                 "cpsie  i\n\t"  /* Enable interrupts */
53                 "mov    r0, #0\n\t"
54                 "mov    r1, r0\n\t"
55                 "bl     main\n"
56         "1:\n\t"
57                 "b      1b\n\t"
58                 ".align 2\n"
59         ".L01:\n\t"
60                 ".word  -0x20001400\n"
61         ".L00:\n\t"
62                 ".word  _GLOBAL_OFFSET_TABLE_-(.LPIC00+4)\n\t"
63                 ".word  _bss_start(GOT)\n\t"
64                 ".word  _bss_end(GOT)"
65                 : /* no output */ : /* no input */ : "memory");
66 }
67
68 typedef void (*handler)(void);
69 extern uint8_t __ram_end__;
70 extern void usb_interrupt_handler (void);
71
72 handler vector_table[] __attribute__ ((section(".vectors"))) = {
73   (handler)&__ram_end__,
74   entry,
75   fatal,                /* nmi */
76   fatal,                /* hard fault */
77   /* 10 */
78   fatal,                /* mem manage */
79   fatal,                /* bus fault */
80   fatal,                /* usage fault */
81   none,
82   /* 20 */
83   none, none, none, none,  none, none, none, none,
84   /* 40 */
85   none, none, none, none,  none, none, none, none,
86   /* 60 */
87   none, none, none, none,  none, none, none, none,
88   /* 80 */
89   none, none, none, none,
90   /* 90 */
91   usb_interrupt_handler,
92 };