]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/entry.S
Add starting point for IGLOO2 RISV-V demo project.
[freertos] / FreeRTOS / Demo / RISC-V_IGLOO2_Creative_SoftConsole / riscv_hal / entry.S
1 /*******************************************************************************\r
2  * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
3  *\r
4  * @file entry.S\r
5  * @author Microsemi SoC Products Group\r
6  * @brief Mi-V soft processor vectors, trap handling and startup code.\r
7  *\r
8  * SVN $Revision: 9947 $\r
9  * SVN $Date: 2018-04-30 20:28:49 +0530 (Mon, 30 Apr 2018) $\r
10  */\r
11 #ifndef ENTRY_S\r
12 #define ENTRY_S\r
13 \r
14 #include "encoding.h"\r
15 \r
16 #if __riscv_xlen == 64\r
17 # define LREG ld\r
18 # define SREG sd\r
19 # define REGBYTES 8\r
20 #else\r
21 # define LREG lw\r
22 # define SREG sw\r
23 # define REGBYTES 4\r
24 #endif\r
25 \r
26   .section      .text.entry\r
27   .globl _start\r
28 \r
29 _start:\r
30   j handle_reset\r
31 \r
32 nmi_vector:\r
33   j nmi_vector\r
34 \r
35 trap_vector:\r
36   j trap_entry\r
37 \r
38 handle_reset:\r
39   la t0, trap_entry\r
40   csrw mtvec, t0\r
41   csrwi mstatus, 0\r
42   csrwi mie, 0\r
43 \r
44 /*Floating point support configuration*/\r
45 \r
46 #ifdef __riscv_flen\r
47   csrr t0, mstatus\r
48   lui t1, 0xffffa\r
49   addi t1, t1, -1\r
50   and t0, t0, t1\r
51   lui t1, 0x4\r
52   or t1, t0, t1\r
53   csrw mstatus, t1\r
54 \r
55   lui t0, 0x0\r
56   fscsr t0\r
57 #endif\r
58 .option push\r
59 \r
60 # Ensure the instruction is not optimized, since gp is not yet set\r
61 \r
62 .option norelax\r
63   # initialize global pointer\r
64   la gp, __global_pointer$\r
65 \r
66 .option pop\r
67 \r
68   # initialize stack pointer\r
69   la sp, __stack_top\r
70 \r
71   # perform the rest of initialization in C\r
72   j _init\r
73 \r
74 \r
75 trap_entry:\r
76   addi sp, sp, -32*REGBYTES\r
77 \r
78   SREG x1, 0 * REGBYTES(sp)\r
79   SREG x2, 1 * REGBYTES(sp)\r
80   SREG x3, 2 * REGBYTES(sp)\r
81   SREG x4, 3 * REGBYTES(sp)\r
82   SREG x5, 4 * REGBYTES(sp)\r
83   SREG x6, 5 * REGBYTES(sp)\r
84   SREG x7, 6 * REGBYTES(sp)\r
85   SREG x8, 7 * REGBYTES(sp)\r
86   SREG x9, 8 * REGBYTES(sp)\r
87   SREG x10, 9 * REGBYTES(sp)\r
88   SREG x11, 10 * REGBYTES(sp)\r
89   SREG x12, 11 * REGBYTES(sp)\r
90   SREG x13, 12 * REGBYTES(sp)\r
91   SREG x14, 13 * REGBYTES(sp)\r
92   SREG x15, 14 * REGBYTES(sp)\r
93   SREG x16, 15 * REGBYTES(sp)\r
94   SREG x17, 16 * REGBYTES(sp)\r
95   SREG x18, 17 * REGBYTES(sp)\r
96   SREG x19, 18 * REGBYTES(sp)\r
97   SREG x20, 19 * REGBYTES(sp)\r
98   SREG x21, 20 * REGBYTES(sp)\r
99   SREG x22, 21 * REGBYTES(sp)\r
100   SREG x23, 22 * REGBYTES(sp)\r
101   SREG x24, 23 * REGBYTES(sp)\r
102   SREG x25, 24 * REGBYTES(sp)\r
103   SREG x26, 25 * REGBYTES(sp)\r
104   SREG x27, 26 * REGBYTES(sp)\r
105   SREG x28, 27 * REGBYTES(sp)\r
106   SREG x29, 28 * REGBYTES(sp)\r
107   SREG x30, 29 * REGBYTES(sp)\r
108   SREG x31, 30 * REGBYTES(sp)\r
109 \r
110 \r
111   csrr t0, mepc\r
112   SREG t0, 31 * REGBYTES(sp)\r
113 \r
114   csrr a0, mcause\r
115   csrr a1, mepc\r
116   mv a2, sp\r
117   jal handle_trap\r
118   csrw mepc, a0\r
119 \r
120   # Remain in M-mode after mret\r
121   li t0, MSTATUS_MPP\r
122   csrs mstatus, t0\r
123 \r
124   LREG x1, 0 * REGBYTES(sp)\r
125   LREG x2, 1 * REGBYTES(sp)\r
126   LREG x3, 2 * REGBYTES(sp)\r
127   LREG x4, 3 * REGBYTES(sp)\r
128   LREG x5, 4 * REGBYTES(sp)\r
129   LREG x6, 5 * REGBYTES(sp)\r
130   LREG x7, 6 * REGBYTES(sp)\r
131   LREG x8, 7 * REGBYTES(sp)\r
132   LREG x9, 8 * REGBYTES(sp)\r
133   LREG x10, 9 * REGBYTES(sp)\r
134   LREG x11, 10 * REGBYTES(sp)\r
135   LREG x12, 11 * REGBYTES(sp)\r
136   LREG x13, 12 * REGBYTES(sp)\r
137   LREG x14, 13 * REGBYTES(sp)\r
138   LREG x15, 14 * REGBYTES(sp)\r
139   LREG x16, 15 * REGBYTES(sp)\r
140   LREG x17, 16 * REGBYTES(sp)\r
141   LREG x18, 17 * REGBYTES(sp)\r
142   LREG x19, 18 * REGBYTES(sp)\r
143   LREG x20, 19 * REGBYTES(sp)\r
144   LREG x21, 20 * REGBYTES(sp)\r
145   LREG x22, 21 * REGBYTES(sp)\r
146   LREG x23, 22 * REGBYTES(sp)\r
147   LREG x24, 23 * REGBYTES(sp)\r
148   LREG x25, 24 * REGBYTES(sp)\r
149   LREG x26, 25 * REGBYTES(sp)\r
150   LREG x27, 26 * REGBYTES(sp)\r
151   LREG x28, 27 * REGBYTES(sp)\r
152   LREG x29, 28 * REGBYTES(sp)\r
153   LREG x30, 29 * REGBYTES(sp)\r
154   LREG x31, 30 * REGBYTES(sp)\r
155 \r
156   addi sp, sp, 32*REGBYTES\r
157   mret\r
158 \r
159 #endif\r
160 \r