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