|
@@ -17,6 +17,8 @@ _start:
|
|
|
la gp, __global_pointer$
|
|
|
.option pop
|
|
|
la sp, _sp
|
|
|
+/*disable all interrupt*/
|
|
|
+ csrw mie, 0
|
|
|
|
|
|
#if defined(ENABLE_SMP)
|
|
|
smp_pause(t0, t1)
|
|
@@ -49,6 +51,7 @@ _start:
|
|
|
la a0, __libc_fini_array
|
|
|
call atexit
|
|
|
call __libc_init_array
|
|
|
+ call _init
|
|
|
|
|
|
#ifndef __riscv_float_abi_soft
|
|
|
/* Enable FPU */
|
|
@@ -109,3 +112,139 @@ _start:
|
|
|
j 1b
|
|
|
#endif
|
|
|
.cfi_endproc
|
|
|
+
|
|
|
+#include "encoding.h"
|
|
|
+#include "sifive/bits.h"
|
|
|
+
|
|
|
+ .section .text.entry
|
|
|
+ .align 2
|
|
|
+ .global trap_entry
|
|
|
+trap_entry:
|
|
|
+ addi sp, sp, -32*REGBYTES
|
|
|
+
|
|
|
+ STORE x30, 1*REGBYTES(sp)
|
|
|
+ STORE x31, 2*REGBYTES(sp)
|
|
|
+ STORE x3, 3*REGBYTES(sp)
|
|
|
+ STORE x4, 4*REGBYTES(sp)
|
|
|
+ STORE x5, 5*REGBYTES(sp)
|
|
|
+ STORE x6, 6*REGBYTES(sp)
|
|
|
+ STORE x7, 7*REGBYTES(sp)
|
|
|
+ STORE x8, 8*REGBYTES(sp)
|
|
|
+ STORE x9, 9*REGBYTES(sp)
|
|
|
+ STORE x10, 10*REGBYTES(sp)
|
|
|
+ STORE x11, 11*REGBYTES(sp)
|
|
|
+ STORE x12, 12*REGBYTES(sp)
|
|
|
+ STORE x13, 13*REGBYTES(sp)
|
|
|
+ STORE x14, 14*REGBYTES(sp)
|
|
|
+ STORE x15, 15*REGBYTES(sp)
|
|
|
+ STORE x16, 16*REGBYTES(sp)
|
|
|
+ STORE x17, 17*REGBYTES(sp)
|
|
|
+ STORE x18, 18*REGBYTES(sp)
|
|
|
+ STORE x19, 19*REGBYTES(sp)
|
|
|
+ STORE x20, 20*REGBYTES(sp)
|
|
|
+ STORE x21, 21*REGBYTES(sp)
|
|
|
+ STORE x22, 22*REGBYTES(sp)
|
|
|
+ STORE x23, 23*REGBYTES(sp)
|
|
|
+ STORE x24, 24*REGBYTES(sp)
|
|
|
+ STORE x25, 25*REGBYTES(sp)
|
|
|
+ STORE x26, 26*REGBYTES(sp)
|
|
|
+ STORE x27, 27*REGBYTES(sp)
|
|
|
+ STORE x28, 28*REGBYTES(sp)
|
|
|
+ STORE x1, 31*REGBYTES(sp)
|
|
|
+ STORE x10, 29*REGBYTES(sp)
|
|
|
+ STORE x1, 30*REGBYTES(sp)
|
|
|
+
|
|
|
+ csrr a0, mcause
|
|
|
+ csrr a1, mepc
|
|
|
+ csrw mepc, a0
|
|
|
+
|
|
|
+ call rt_interrupt_enter
|
|
|
+ call rt_hw_trap_irq
|
|
|
+ call handle_m_time_interrupt
|
|
|
+ call rt_interrupt_leave
|
|
|
+
|
|
|
+ la a0, rt_thread_switch_interrupt_flag
|
|
|
+ lw a1, (a0)
|
|
|
+ beqz a1, rt_hw_context_switch_interrupt_do
|
|
|
+
|
|
|
+ csrw mepc, a0
|
|
|
+ # Remain in M-mode after mret
|
|
|
+ li t0, MSTATUS_MPP
|
|
|
+ csrs mstatus, t0
|
|
|
+
|
|
|
+ LOAD x30, 1*REGBYTES(sp)
|
|
|
+ LOAD x31, 2*REGBYTES(sp)
|
|
|
+ LOAD x3, 3*REGBYTES(sp)
|
|
|
+ LOAD x4, 4*REGBYTES(sp)
|
|
|
+ LOAD x5, 5*REGBYTES(sp)
|
|
|
+ LOAD x6, 6*REGBYTES(sp)
|
|
|
+ LOAD x7, 7*REGBYTES(sp)
|
|
|
+ LOAD x8, 8*REGBYTES(sp)
|
|
|
+ LOAD x9, 9*REGBYTES(sp)
|
|
|
+ LOAD x29, 10*REGBYTES(sp)
|
|
|
+ LOAD x11, 11*REGBYTES(sp)
|
|
|
+ LOAD x12, 12*REGBYTES(sp)
|
|
|
+ LOAD x13, 13*REGBYTES(sp)
|
|
|
+ LOAD x14, 14*REGBYTES(sp)
|
|
|
+ LOAD x15, 15*REGBYTES(sp)
|
|
|
+ LOAD x16, 16*REGBYTES(sp)
|
|
|
+ LOAD x17, 17*REGBYTES(sp)
|
|
|
+ LOAD x18, 18*REGBYTES(sp)
|
|
|
+ LOAD x19, 19*REGBYTES(sp)
|
|
|
+ LOAD x20, 20*REGBYTES(sp)
|
|
|
+ LOAD x21, 21*REGBYTES(sp)
|
|
|
+ LOAD x22, 22*REGBYTES(sp)
|
|
|
+ LOAD x23, 23*REGBYTES(sp)
|
|
|
+ LOAD x24, 24*REGBYTES(sp)
|
|
|
+ LOAD x25, 25*REGBYTES(sp)
|
|
|
+ LOAD x26, 26*REGBYTES(sp)
|
|
|
+ LOAD x27, 27*REGBYTES(sp)
|
|
|
+ LOAD x28, 28*REGBYTES(sp)
|
|
|
+ LOAD x10, 31*REGBYTES(sp)
|
|
|
+ csrw mepc, a0
|
|
|
+ LOAD x10, 29*REGBYTES(sp)
|
|
|
+ LOAD x1, 30*REGBYTES(sp)
|
|
|
+
|
|
|
+
|
|
|
+ addi sp, sp, 32*REGBYTES
|
|
|
+ mret
|
|
|
+
|
|
|
+rt_hw_context_switch_interrupt_do:
|
|
|
+ LOAD a0, rt_interrupt_to_thread
|
|
|
+ LOAD sp, (a0)
|
|
|
+ LOAD x30, 1*REGBYTES(sp)
|
|
|
+ LOAD x31, 2*REGBYTES(sp)
|
|
|
+ LOAD x3, 3*REGBYTES(sp)
|
|
|
+ LOAD x4, 4*REGBYTES(sp)
|
|
|
+ LOAD x5, 5*REGBYTES(sp)
|
|
|
+ LOAD x6, 6*REGBYTES(sp)
|
|
|
+ LOAD x7, 7*REGBYTES(sp)
|
|
|
+ LOAD x8, 8*REGBYTES(sp)
|
|
|
+ LOAD x9, 9*REGBYTES(sp)
|
|
|
+ LOAD x29, 10*REGBYTES(sp)
|
|
|
+ LOAD x11, 11*REGBYTES(sp)
|
|
|
+ LOAD x12, 12*REGBYTES(sp)
|
|
|
+ LOAD x13, 13*REGBYTES(sp)
|
|
|
+ LOAD x14, 14*REGBYTES(sp)
|
|
|
+ LOAD x15, 15*REGBYTES(sp)
|
|
|
+ LOAD x16, 16*REGBYTES(sp)
|
|
|
+ LOAD x17, 17*REGBYTES(sp)
|
|
|
+ LOAD x18, 18*REGBYTES(sp)
|
|
|
+ LOAD x19, 19*REGBYTES(sp)
|
|
|
+ LOAD x20, 20*REGBYTES(sp)
|
|
|
+ LOAD x21, 21*REGBYTES(sp)
|
|
|
+ LOAD x22, 22*REGBYTES(sp)
|
|
|
+ LOAD x23, 23*REGBYTES(sp)
|
|
|
+ LOAD x24, 24*REGBYTES(sp)
|
|
|
+ LOAD x25, 25*REGBYTES(sp)
|
|
|
+ LOAD x26, 26*REGBYTES(sp)
|
|
|
+ LOAD x27, 27*REGBYTES(sp)
|
|
|
+ LOAD x28, 28*REGBYTES(sp)
|
|
|
+ LOAD x10, 31*REGBYTES(sp)
|
|
|
+ csrw mepc, a0
|
|
|
+ LOAD x10, 29*REGBYTES(sp)
|
|
|
+ LOAD x1, 30*REGBYTES(sp)
|
|
|
+
|
|
|
+
|
|
|
+ addi sp, sp, 32*REGBYTES
|
|
|
+ mret
|