Firmwares/hello-world/bsp/env/ventry.S
2018-09-26 08:07:48 +02:00

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