380 lines
11 KiB
ArmAsm
380 lines
11 KiB
ArmAsm
|
// See LICENSE for license details
|
||
|
|
||
|
#ifndef KL3_ENTRY_S
|
||
|
#define KL3_ENTRY_S
|
||
|
|
||
|
#include "encoding.h"
|
||
|
#include "bits.h"
|
||
|
|
||
|
.section .iram
|
||
|
|
||
|
#define MSTATUS_PRV1 0x1800
|
||
|
|
||
|
/* When trap is an interrupt, this function is called */
|
||
|
interrupt:
|
||
|
.global pxCurrentTCB
|
||
|
/* make room in stack */
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
addi sp, sp, -REGBYTES * 64
|
||
|
#else
|
||
|
addi sp, sp, -REGBYTES * 32
|
||
|
#endif
|
||
|
/* Save Context */
|
||
|
STORE x1, 0x0(sp)
|
||
|
STORE x2, 1 * REGBYTES(sp)
|
||
|
STORE x3, 2 * REGBYTES(sp)
|
||
|
STORE x4, 3 * REGBYTES(sp)
|
||
|
STORE x6, 5 * REGBYTES(sp)
|
||
|
STORE x7, 6 * REGBYTES(sp)
|
||
|
STORE x8, 30 * REGBYTES(sp)
|
||
|
STORE x9, 8 * REGBYTES(sp)
|
||
|
STORE x10, 9 * REGBYTES(sp)
|
||
|
STORE x11, 10 * REGBYTES(sp)
|
||
|
STORE x12, 11 * REGBYTES(sp)
|
||
|
STORE x13, 12 * REGBYTES(sp)
|
||
|
STORE x14, 13 * REGBYTES(sp)
|
||
|
STORE x15, 14 * REGBYTES(sp)
|
||
|
STORE x16, 15 * REGBYTES(sp)
|
||
|
STORE x17, 16 * REGBYTES(sp)
|
||
|
STORE x18, 17 * REGBYTES(sp)
|
||
|
STORE x19, 18 * REGBYTES(sp)
|
||
|
STORE x20, 19 * REGBYTES(sp)
|
||
|
STORE x21, 20 * REGBYTES(sp)
|
||
|
STORE x22, 21 * REGBYTES(sp)
|
||
|
STORE x23, 22 * REGBYTES(sp)
|
||
|
STORE x24, 23 * REGBYTES(sp)
|
||
|
STORE x25, 24 * REGBYTES(sp)
|
||
|
STORE x26, 25 * REGBYTES(sp)
|
||
|
STORE x27, 26 * REGBYTES(sp)
|
||
|
STORE x28, 27 * REGBYTES(sp)
|
||
|
STORE x29, 28 * REGBYTES(sp)
|
||
|
STORE x30, 29 * REGBYTES(sp)
|
||
|
STORE x31, 7 * REGBYTES(sp)
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
fsw f0, 31 * REGBYTES(sp)
|
||
|
fsw f1, 32 * REGBYTES(sp)
|
||
|
fsw f2, 33 * REGBYTES(sp)
|
||
|
fsw f3, 34 * REGBYTES(sp)
|
||
|
fsw f4, 35 * REGBYTES(sp)
|
||
|
fsw f5, 36 * REGBYTES(sp)
|
||
|
fsw f6, 37 * REGBYTES(sp)
|
||
|
fsw f7, 38 * REGBYTES(sp)
|
||
|
fsw f8, 39 * REGBYTES(sp)
|
||
|
fsw f9, 40 * REGBYTES(sp)
|
||
|
fsw f10, 41 * REGBYTES(sp)
|
||
|
fsw f11, 42 * REGBYTES(sp)
|
||
|
fsw f12, 43 * REGBYTES(sp)
|
||
|
fsw f13, 44 * REGBYTES(sp)
|
||
|
fsw f14, 45 * REGBYTES(sp)
|
||
|
fsw f15, 46 * REGBYTES(sp)
|
||
|
fsw f16, 47 * REGBYTES(sp)
|
||
|
fsw f17, 48 * REGBYTES(sp)
|
||
|
fsw f18, 49 * REGBYTES(sp)
|
||
|
fsw f19, 50 * REGBYTES(sp)
|
||
|
fsw f20, 51 * REGBYTES(sp)
|
||
|
fsw f21, 52 * REGBYTES(sp)
|
||
|
fsw f22, 53 * REGBYTES(sp)
|
||
|
fsw f23, 54 * REGBYTES(sp)
|
||
|
fsw f24, 55 * REGBYTES(sp)
|
||
|
fsw f25, 56 * REGBYTES(sp)
|
||
|
fsw f26, 57 * REGBYTES(sp)
|
||
|
fsw f27, 58 * REGBYTES(sp)
|
||
|
fsw f28, 59 * REGBYTES(sp)
|
||
|
fsw f29, 60 * REGBYTES(sp)
|
||
|
fsw f30, 61 * REGBYTES(sp)
|
||
|
fsw f31, 62 * REGBYTES(sp)
|
||
|
#endif
|
||
|
csrr x5, mscratch
|
||
|
STORE x5, 4 * REGBYTES(sp)
|
||
|
/* Store current stackpointer in task control block (TCB) */
|
||
|
LOAD t0, pxCurrentTCB //pointer
|
||
|
|
||
|
#if RISCV_SMP_ENABLE
|
||
|
csrr t1, mhartid
|
||
|
li t2, 1
|
||
|
beq t1, t2, 3f
|
||
|
LOAD t0, pxCurrentTCB+4
|
||
|
3:
|
||
|
#endif
|
||
|
|
||
|
STORE sp, 0x0(t0)
|
||
|
/* Saves current error program counter (EPC) as task program counter */
|
||
|
csrr t0, mepc
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
STORE t0, 63 * REGBYTES(sp)
|
||
|
#else
|
||
|
STORE t0, 31 * REGBYTES(sp)
|
||
|
#endif
|
||
|
/* Interrupt handling*/
|
||
|
csrr a0, mcause
|
||
|
csrr a1, mepc
|
||
|
mv a2, sp
|
||
|
call handle_interrupt
|
||
|
NOP
|
||
|
/* Load stack pointer from the current TCB */
|
||
|
LOAD sp, pxCurrentTCB
|
||
|
|
||
|
#if RISCV_SMP_ENABLE
|
||
|
csrr t1, mhartid
|
||
|
li t0, 1
|
||
|
beq t1, t0, 3f
|
||
|
LOAD sp, pxCurrentTCB+4
|
||
|
3:
|
||
|
#endif
|
||
|
LOAD sp, 0x0(sp)
|
||
|
/* Load task program counter */
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
LOAD t0, 63 * REGBYTES(sp)
|
||
|
#else
|
||
|
LOAD t0, 31 * REGBYTES(sp)
|
||
|
#endif
|
||
|
csrw mepc, t0
|
||
|
/* Run in machine mode */
|
||
|
li t0, MSTATUS_PRV1
|
||
|
csrs mstatus, t0
|
||
|
/* Restore registers, Skip global pointer because that does not change */
|
||
|
LOAD x1, 0x0(sp)
|
||
|
LOAD x4, 3 * REGBYTES(sp)
|
||
|
LOAD x5, 4 * REGBYTES(sp)
|
||
|
LOAD x6, 5 * REGBYTES(sp)
|
||
|
LOAD x7, 6 * REGBYTES(sp)
|
||
|
LOAD x8, 30 * REGBYTES(sp)
|
||
|
LOAD x9, 8 * REGBYTES(sp)
|
||
|
LOAD x10, 9 * REGBYTES(sp)
|
||
|
LOAD x11, 10 * REGBYTES(sp)
|
||
|
LOAD x12, 11 * REGBYTES(sp)
|
||
|
LOAD x13, 12 * REGBYTES(sp)
|
||
|
LOAD x14, 13 * REGBYTES(sp)
|
||
|
LOAD x15, 14 * REGBYTES(sp)
|
||
|
LOAD x16, 15 * REGBYTES(sp)
|
||
|
LOAD x17, 16 * REGBYTES(sp)
|
||
|
LOAD x18, 17 * REGBYTES(sp)
|
||
|
LOAD x19, 18 * REGBYTES(sp)
|
||
|
LOAD x20, 19 * REGBYTES(sp)
|
||
|
LOAD x21, 20 * REGBYTES(sp)
|
||
|
LOAD x22, 21 * REGBYTES(sp)
|
||
|
LOAD x23, 22 * REGBYTES(sp)
|
||
|
LOAD x24, 23 * REGBYTES(sp)
|
||
|
LOAD x25, 24 * REGBYTES(sp)
|
||
|
LOAD x26, 25 * REGBYTES(sp)
|
||
|
LOAD x27, 26 * REGBYTES(sp)
|
||
|
LOAD x28, 27 * REGBYTES(sp)
|
||
|
LOAD x29, 28 * REGBYTES(sp)
|
||
|
LOAD x30, 29 * REGBYTES(sp)
|
||
|
LOAD x31, 7 * REGBYTES(sp)
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
flw f0, 31 * REGBYTES(sp)
|
||
|
flw f1, 32 * REGBYTES(sp)
|
||
|
flw f2, 33 * REGBYTES(sp)
|
||
|
flw f3, 34 * REGBYTES(sp)
|
||
|
flw f4, 35 * REGBYTES(sp)
|
||
|
flw f5, 36 * REGBYTES(sp)
|
||
|
flw f6, 37 * REGBYTES(sp)
|
||
|
flw f7, 38 * REGBYTES(sp)
|
||
|
flw f8, 39 * REGBYTES(sp)
|
||
|
flw f9, 40 * REGBYTES(sp)
|
||
|
flw f10, 41 * REGBYTES(sp)
|
||
|
flw f11, 42 * REGBYTES(sp)
|
||
|
flw f12, 43 * REGBYTES(sp)
|
||
|
flw f13, 44 * REGBYTES(sp)
|
||
|
flw f14, 45 * REGBYTES(sp)
|
||
|
flw f15, 46 * REGBYTES(sp)
|
||
|
flw f16, 47 * REGBYTES(sp)
|
||
|
flw f17, 48 * REGBYTES(sp)
|
||
|
flw f18, 49 * REGBYTES(sp)
|
||
|
flw f19, 50 * REGBYTES(sp)
|
||
|
flw f20, 51 * REGBYTES(sp)
|
||
|
flw f21, 52 * REGBYTES(sp)
|
||
|
flw f22, 53 * REGBYTES(sp)
|
||
|
flw f23, 54 * REGBYTES(sp)
|
||
|
flw f24, 55 * REGBYTES(sp)
|
||
|
flw f25, 56 * REGBYTES(sp)
|
||
|
flw f26, 57 * REGBYTES(sp)
|
||
|
flw f27, 58 * REGBYTES(sp)
|
||
|
flw f28, 59 * REGBYTES(sp)
|
||
|
flw f29, 60 * REGBYTES(sp)
|
||
|
flw f30, 61 * REGBYTES(sp)
|
||
|
flw f31, 62 * REGBYTES(sp)
|
||
|
#endif
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
addi sp, sp, REGBYTES * 64
|
||
|
#else
|
||
|
addi sp, sp, REGBYTES * 32
|
||
|
#endif
|
||
|
mret
|
||
|
|
||
|
.section .iram.entry
|
||
|
.align 4
|
||
|
.global kl3_trap_entry
|
||
|
|
||
|
kl3_trap_entry:
|
||
|
/* Interrupt trap */
|
||
|
csrw mscratch, t0
|
||
|
csrr t0, mcause
|
||
|
blt t0, x0, interrupt
|
||
|
|
||
|
/* System call and other traps */
|
||
|
csrrw t0, mscratch, sp
|
||
|
la sp, _trap_sp
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
addi sp, sp, -REGBYTES*64
|
||
|
#else
|
||
|
addi sp, sp, -REGBYTES*32
|
||
|
#endif
|
||
|
STORE x1, 0*REGBYTES(sp)
|
||
|
STORE x2, 1*REGBYTES(sp)
|
||
|
STORE x3, 2*REGBYTES(sp)
|
||
|
STORE x4, 3*REGBYTES(sp)
|
||
|
STORE x5, 4*REGBYTES(sp)
|
||
|
STORE x6, 5*REGBYTES(sp)
|
||
|
STORE x7, 6*REGBYTES(sp)
|
||
|
STORE x8, 30*REGBYTES(sp)
|
||
|
STORE x9, 8*REGBYTES(sp)
|
||
|
STORE x10, 9*REGBYTES(sp)
|
||
|
STORE x11, 10*REGBYTES(sp)
|
||
|
STORE x12, 11*REGBYTES(sp)
|
||
|
STORE x13, 12*REGBYTES(sp)
|
||
|
STORE x14, 13*REGBYTES(sp)
|
||
|
STORE x15, 14*REGBYTES(sp)
|
||
|
STORE x16, 15*REGBYTES(sp)
|
||
|
STORE x17, 16*REGBYTES(sp)
|
||
|
STORE x18, 17*REGBYTES(sp)
|
||
|
STORE x19, 18*REGBYTES(sp)
|
||
|
STORE x20, 19*REGBYTES(sp)
|
||
|
STORE x21, 20*REGBYTES(sp)
|
||
|
STORE x22, 21*REGBYTES(sp)
|
||
|
STORE x23, 22*REGBYTES(sp)
|
||
|
STORE x24, 23*REGBYTES(sp)
|
||
|
STORE x25, 24*REGBYTES(sp)
|
||
|
STORE x26, 25*REGBYTES(sp)
|
||
|
STORE x27, 26*REGBYTES(sp)
|
||
|
STORE x28, 27*REGBYTES(sp)
|
||
|
STORE x29, 28*REGBYTES(sp)
|
||
|
STORE x30, 29*REGBYTES(sp)
|
||
|
STORE x31, 7*REGBYTES(sp)
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
fsw f0, 31 * REGBYTES(sp)
|
||
|
fsw f1, 32 * REGBYTES(sp)
|
||
|
fsw f2, 33 * REGBYTES(sp)
|
||
|
fsw f3, 34 * REGBYTES(sp)
|
||
|
fsw f4, 35 * REGBYTES(sp)
|
||
|
fsw f5, 36 * REGBYTES(sp)
|
||
|
fsw f6, 37 * REGBYTES(sp)
|
||
|
fsw f7, 38 * REGBYTES(sp)
|
||
|
fsw f8, 39 * REGBYTES(sp)
|
||
|
fsw f9, 40 * REGBYTES(sp)
|
||
|
fsw f10, 41 * REGBYTES(sp)
|
||
|
fsw f11, 42 * REGBYTES(sp)
|
||
|
fsw f12, 43 * REGBYTES(sp)
|
||
|
fsw f13, 44 * REGBYTES(sp)
|
||
|
fsw f14, 45 * REGBYTES(sp)
|
||
|
fsw f15, 46 * REGBYTES(sp)
|
||
|
fsw f16, 47 * REGBYTES(sp)
|
||
|
fsw f17, 48 * REGBYTES(sp)
|
||
|
fsw f18, 49 * REGBYTES(sp)
|
||
|
fsw f19, 50 * REGBYTES(sp)
|
||
|
fsw f20, 51 * REGBYTES(sp)
|
||
|
fsw f21, 52 * REGBYTES(sp)
|
||
|
fsw f22, 53 * REGBYTES(sp)
|
||
|
fsw f23, 54 * REGBYTES(sp)
|
||
|
fsw f24, 55 * REGBYTES(sp)
|
||
|
fsw f25, 56 * REGBYTES(sp)
|
||
|
fsw f26, 57 * REGBYTES(sp)
|
||
|
fsw f27, 58 * REGBYTES(sp)
|
||
|
fsw f28, 59 * REGBYTES(sp)
|
||
|
fsw f29, 60 * REGBYTES(sp)
|
||
|
fsw f30, 61 * REGBYTES(sp)
|
||
|
fsw f31, 62 * REGBYTES(sp)
|
||
|
#endif
|
||
|
csrr a0, mcause
|
||
|
csrr a1, mepc
|
||
|
mv a2, sp
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
STORE a1, 63*REGBYTES(sp)
|
||
|
#else
|
||
|
STORE a1, 31*REGBYTES(sp)
|
||
|
#endif
|
||
|
call kl3_handle_trap
|
||
|
csrw mepc, a0
|
||
|
# Remain in M-mode after mret
|
||
|
li t0, MSTATUS_MPP
|
||
|
csrs mstatus, t0
|
||
|
LOAD x1, 0*REGBYTES(sp)
|
||
|
LOAD x2, 1*REGBYTES(sp)
|
||
|
LOAD x3, 2*REGBYTES(sp)
|
||
|
LOAD x4, 3*REGBYTES(sp)
|
||
|
LOAD x5, 4*REGBYTES(sp)
|
||
|
LOAD x6, 5*REGBYTES(sp)
|
||
|
LOAD x7, 6*REGBYTES(sp)
|
||
|
LOAD x8, 30*REGBYTES(sp)
|
||
|
LOAD x9, 8*REGBYTES(sp)
|
||
|
LOAD x10, 9*REGBYTES(sp)
|
||
|
LOAD x11, 10*REGBYTES(sp)
|
||
|
LOAD x12, 11*REGBYTES(sp)
|
||
|
LOAD x13, 12*REGBYTES(sp)
|
||
|
LOAD x14, 13*REGBYTES(sp)
|
||
|
LOAD x15, 14*REGBYTES(sp)
|
||
|
LOAD x16, 15*REGBYTES(sp)
|
||
|
LOAD x17, 16*REGBYTES(sp)
|
||
|
LOAD x18, 17*REGBYTES(sp)
|
||
|
LOAD x19, 18*REGBYTES(sp)
|
||
|
LOAD x20, 19*REGBYTES(sp)
|
||
|
LOAD x21, 20*REGBYTES(sp)
|
||
|
LOAD x22, 21*REGBYTES(sp)
|
||
|
LOAD x23, 22*REGBYTES(sp)
|
||
|
LOAD x24, 23*REGBYTES(sp)
|
||
|
LOAD x25, 24*REGBYTES(sp)
|
||
|
LOAD x26, 25*REGBYTES(sp)
|
||
|
LOAD x27, 26*REGBYTES(sp)
|
||
|
LOAD x28, 27*REGBYTES(sp)
|
||
|
LOAD x29, 28*REGBYTES(sp)
|
||
|
LOAD x30, 29*REGBYTES(sp)
|
||
|
LOAD x31, 7*REGBYTES(sp)
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
flw f0, 31 * REGBYTES(sp)
|
||
|
flw f1, 32 * REGBYTES(sp)
|
||
|
flw f2, 33 * REGBYTES(sp)
|
||
|
flw f3, 34 * REGBYTES(sp)
|
||
|
flw f4, 35 * REGBYTES(sp)
|
||
|
flw f5, 36 * REGBYTES(sp)
|
||
|
flw f6, 37 * REGBYTES(sp)
|
||
|
flw f7, 38 * REGBYTES(sp)
|
||
|
flw f8, 39 * REGBYTES(sp)
|
||
|
flw f9, 40 * REGBYTES(sp)
|
||
|
flw f10, 41 * REGBYTES(sp)
|
||
|
flw f11, 42 * REGBYTES(sp)
|
||
|
flw f12, 43 * REGBYTES(sp)
|
||
|
flw f13, 44 * REGBYTES(sp)
|
||
|
flw f14, 45 * REGBYTES(sp)
|
||
|
flw f15, 46 * REGBYTES(sp)
|
||
|
flw f16, 47 * REGBYTES(sp)
|
||
|
flw f17, 48 * REGBYTES(sp)
|
||
|
flw f18, 49 * REGBYTES(sp)
|
||
|
flw f19, 50 * REGBYTES(sp)
|
||
|
flw f20, 51 * REGBYTES(sp)
|
||
|
flw f21, 52 * REGBYTES(sp)
|
||
|
flw f22, 53 * REGBYTES(sp)
|
||
|
flw f23, 54 * REGBYTES(sp)
|
||
|
flw f24, 55 * REGBYTES(sp)
|
||
|
flw f25, 56 * REGBYTES(sp)
|
||
|
flw f26, 57 * REGBYTES(sp)
|
||
|
flw f27, 58 * REGBYTES(sp)
|
||
|
flw f28, 59 * REGBYTES(sp)
|
||
|
flw f29, 60 * REGBYTES(sp)
|
||
|
flw f30, 61 * REGBYTES(sp)
|
||
|
flw f31, 62 * REGBYTES(sp)
|
||
|
#endif
|
||
|
#ifndef __riscv_float_abi_soft
|
||
|
addi sp, sp, REGBYTES*64
|
||
|
#else
|
||
|
addi sp, sp, REGBYTES*32
|
||
|
#endif
|
||
|
csrr sp, mscratch
|
||
|
mret
|
||
|
|
||
|
.weak kl3_handle_trap
|
||
|
kl3_handle_trap:
|
||
|
1:
|
||
|
j 1b
|
||
|
#endif
|