forked from Firmware/Firmwares
289 lines
4.7 KiB
ArmAsm
289 lines
4.7 KiB
ArmAsm
// See LICENSE for license details
|
|
|
|
#ifndef VENTRY_S
|
|
#define VENTRY_S
|
|
|
|
#include "encoding.h"
|
|
#include "sifive/bits.h"
|
|
|
|
#only save caller registers
|
|
.macro TRAP_ENTRY
|
|
addi sp, sp, -16*REGBYTES
|
|
|
|
STORE x1, 0*REGBYTES(sp)
|
|
STORE x5, 1*REGBYTES(sp)
|
|
STORE x6, 2*REGBYTES(sp)
|
|
STORE x7, 3*REGBYTES(sp)
|
|
STORE x10, 4*REGBYTES(sp)
|
|
STORE x11, 5*REGBYTES(sp)
|
|
STORE x12, 6*REGBYTES(sp)
|
|
STORE x13, 7*REGBYTES(sp)
|
|
STORE x14, 8*REGBYTES(sp)
|
|
STORE x15, 9*REGBYTES(sp)
|
|
STORE x16, 10*REGBYTES(sp)
|
|
STORE x17, 11*REGBYTES(sp)
|
|
STORE x28, 12*REGBYTES(sp)
|
|
STORE x29, 13*REGBYTES(sp)
|
|
STORE x30, 14*REGBYTES(sp)
|
|
STORE x31, 15*REGBYTES(sp)
|
|
.endm
|
|
|
|
#restore caller registers
|
|
.macro TRAP_EXIT
|
|
# Remain in M-mode after mret
|
|
li t0, MSTATUS_MPP
|
|
csrs mstatus, t0
|
|
|
|
LOAD x1, 0*REGBYTES(sp)
|
|
LOAD x5, 1*REGBYTES(sp)
|
|
LOAD x6, 2*REGBYTES(sp)
|
|
LOAD x7, 3*REGBYTES(sp)
|
|
LOAD x10, 4*REGBYTES(sp)
|
|
LOAD x11, 5*REGBYTES(sp)
|
|
LOAD x12, 6*REGBYTES(sp)
|
|
LOAD x13, 7*REGBYTES(sp)
|
|
LOAD x14, 8*REGBYTES(sp)
|
|
LOAD x15, 9*REGBYTES(sp)
|
|
LOAD x16, 10*REGBYTES(sp)
|
|
LOAD x17, 11*REGBYTES(sp)
|
|
LOAD x28, 12*REGBYTES(sp)
|
|
LOAD x29, 13*REGBYTES(sp)
|
|
LOAD x30, 14*REGBYTES(sp)
|
|
LOAD x31, 15*REGBYTES(sp)
|
|
|
|
addi sp, sp, 16*REGBYTES
|
|
mret
|
|
.endm
|
|
|
|
|
|
|
|
#Vector table for E31/E51
|
|
|
|
.section .text.entry
|
|
.align 8
|
|
.global vtrap_entry
|
|
vtrap_entry:
|
|
j sync_trap
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j vmsi_Handler
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j vmti_Handler
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j vmei_Handler
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j reserved
|
|
.align 2
|
|
j vlip_Handler0
|
|
.align 2
|
|
j vlip_Handler1
|
|
.align 2
|
|
j vlip_Handler2
|
|
.align 2
|
|
j vlip_Handler3
|
|
.align 2
|
|
j vlip_Handler4
|
|
.align 2
|
|
j vlip_Handler5
|
|
.align 2
|
|
j vlip_Handler6
|
|
.align 2
|
|
j vlip_Handler7
|
|
.align 2
|
|
j vlip_Handler8
|
|
.align 2
|
|
j vlip_Handler9
|
|
.align 2
|
|
j vlip_Handler10
|
|
.align 2
|
|
j vlip_Handler11
|
|
.align 2
|
|
j vlip_Handler12
|
|
.align 2
|
|
j vlip_Handler13
|
|
.align 2
|
|
j vlip_Handler14
|
|
.align 2
|
|
j vlip_Handler15
|
|
|
|
#synchronous trap
|
|
sync_trap:
|
|
TRAP_ENTRY
|
|
jal handle_sync_trap
|
|
TRAP_EXIT
|
|
|
|
#Machine Software Interrupt
|
|
vmsi_Handler:
|
|
TRAP_ENTRY
|
|
jal reserved
|
|
TRAP_EXIT
|
|
|
|
#Machine Timer Interrupt
|
|
vmti_Handler:
|
|
TRAP_ENTRY
|
|
jal handle_m_time_interrupt
|
|
TRAP_EXIT
|
|
|
|
#Machine External Interrupt
|
|
vmei_Handler:
|
|
TRAP_ENTRY
|
|
jal handle_m_external_interrupt
|
|
TRAP_EXIT
|
|
|
|
#LIP0
|
|
vlip_Handler0:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt0
|
|
TRAP_EXIT
|
|
|
|
#LIP1
|
|
vlip_Handler1:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt1
|
|
TRAP_EXIT
|
|
|
|
#LIP2
|
|
vlip_Handler2:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt2
|
|
TRAP_EXIT
|
|
|
|
#LIP3
|
|
vlip_Handler3:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt3
|
|
TRAP_EXIT
|
|
|
|
#LIP4
|
|
vlip_Handler4:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt4
|
|
TRAP_EXIT
|
|
|
|
#LIP5
|
|
vlip_Handler5:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt5
|
|
TRAP_EXIT
|
|
|
|
#LIP6
|
|
vlip_Handler6:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt6
|
|
TRAP_EXIT
|
|
|
|
#LIP7
|
|
vlip_Handler7:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt7
|
|
TRAP_EXIT
|
|
|
|
#LIP8
|
|
vlip_Handler8:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt8
|
|
TRAP_EXIT
|
|
|
|
#LIP9
|
|
vlip_Handler9:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt9
|
|
TRAP_EXIT
|
|
|
|
#LIP10
|
|
vlip_Handler10:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt10
|
|
TRAP_EXIT
|
|
|
|
#LIP11
|
|
vlip_Handler11:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt11
|
|
TRAP_EXIT
|
|
|
|
#LIP12
|
|
vlip_Handler12:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt12
|
|
TRAP_EXIT
|
|
|
|
#LIP13
|
|
vlip_Handler13:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt13
|
|
TRAP_EXIT
|
|
|
|
#LIP14
|
|
vlip_Handler14:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt14
|
|
TRAP_EXIT
|
|
|
|
#LIP15
|
|
vlip_Handler15:
|
|
TRAP_ENTRY
|
|
jal handle_local_interrupt15
|
|
TRAP_EXIT
|
|
|
|
#unimplemented ISRs trap here
|
|
.weak reserved
|
|
reserved:
|
|
.weak handle_local_interrupt0
|
|
handle_local_interrupt0:
|
|
.weak handle_local_interrupt1
|
|
handle_local_interrupt1:
|
|
.weak handle_local_interrupt2
|
|
handle_local_interrupt2:
|
|
.weak handle_local_interrupt3
|
|
handle_local_interrupt3:
|
|
.weak handle_local_interrupt4
|
|
handle_local_interrupt4:
|
|
.weak handle_local_interrupt5
|
|
handle_local_interrupt5:
|
|
.weak handle_local_interrupt6
|
|
handle_local_interrupt6:
|
|
.weak handle_local_interrupt7
|
|
handle_local_interrupt7:
|
|
.weak handle_local_interrupt8
|
|
handle_local_interrupt8:
|
|
.weak handle_local_interrupt9
|
|
handle_local_interrupt9:
|
|
.weak handle_local_interrupt10
|
|
handle_local_interrupt10:
|
|
.weak handle_local_interrupt11
|
|
handle_local_interrupt11:
|
|
.weak handle_local_interrupt12
|
|
handle_local_interrupt12:
|
|
.weak handle_local_interrupt13
|
|
handle_local_interrupt13:
|
|
.weak handle_local_interrupt14
|
|
handle_local_interrupt14:
|
|
.weak handle_local_interrupt15
|
|
handle_local_interrupt15:
|
|
1:
|
|
j 1b
|
|
|
|
#endif
|