mirror of
https://github.com/PiMaker/rvc.git
synced 2024-11-10 06:00:07 +00:00
137 lines
3.2 KiB
ArmAsm
137 lines
3.2 KiB
ArmAsm
#define SLL32 sll
|
|
#define STORE sw
|
|
#define LOAD lw
|
|
#define LWU lw
|
|
#define LOG_REGBYTES 2
|
|
#define REGBYTES (1 << LOG_REGBYTES)
|
|
|
|
.section .entry, "ax", %progbits
|
|
.align 4
|
|
.globl _start
|
|
_start:
|
|
csrw mie, zero
|
|
csrw mip, zero
|
|
lla a3, _start_hang
|
|
csrw mtvec, a3
|
|
lla a3, _s_trap_entry
|
|
csrw stvec, a3
|
|
|
|
# enable supervisor software interrupt
|
|
li a3, 0x2
|
|
csrw sie, a3
|
|
csrw mie, a3
|
|
csrw mideleg, a3
|
|
li a3, 0x00b
|
|
csrs mstatus, a3
|
|
|
|
lla sp, _estack
|
|
lla a3, main
|
|
csrw mepc, a3
|
|
li a3, 0x800
|
|
csrs mstatus, a3
|
|
mret
|
|
j _start_hang
|
|
|
|
.section .entry, "ax", %progbits
|
|
.align 4
|
|
.globl _start_hang
|
|
_start_hang:
|
|
j _start_hang
|
|
|
|
.section .entry, "ax", %progbits
|
|
.align 4
|
|
.globl _trap_entry
|
|
_s_trap_entry:
|
|
|
|
addi sp,sp,-320
|
|
|
|
# save gprs
|
|
STORE x1,1*REGBYTES(x2)
|
|
STORE x3,3*REGBYTES(x2)
|
|
STORE x4,4*REGBYTES(x2)
|
|
STORE x5,5*REGBYTES(x2)
|
|
STORE x6,6*REGBYTES(x2)
|
|
STORE x7,7*REGBYTES(x2)
|
|
STORE x8,8*REGBYTES(x2)
|
|
STORE x9,9*REGBYTES(x2)
|
|
STORE x10,10*REGBYTES(x2)
|
|
STORE x11,11*REGBYTES(x2)
|
|
STORE x12,12*REGBYTES(x2)
|
|
STORE x13,13*REGBYTES(x2)
|
|
STORE x14,14*REGBYTES(x2)
|
|
STORE x15,15*REGBYTES(x2)
|
|
STORE x16,16*REGBYTES(x2)
|
|
STORE x17,17*REGBYTES(x2)
|
|
STORE x18,18*REGBYTES(x2)
|
|
STORE x19,19*REGBYTES(x2)
|
|
STORE x20,20*REGBYTES(x2)
|
|
STORE x21,21*REGBYTES(x2)
|
|
STORE x22,22*REGBYTES(x2)
|
|
STORE x23,23*REGBYTES(x2)
|
|
STORE x24,24*REGBYTES(x2)
|
|
STORE x25,25*REGBYTES(x2)
|
|
STORE x26,26*REGBYTES(x2)
|
|
STORE x27,27*REGBYTES(x2)
|
|
STORE x28,28*REGBYTES(x2)
|
|
STORE x29,29*REGBYTES(x2)
|
|
STORE x30,30*REGBYTES(x2)
|
|
STORE x31,31*REGBYTES(x2)
|
|
|
|
# get sr, epc, badvaddr, cause
|
|
csrr s0, sstatus
|
|
csrr t1, sepc
|
|
csrr t2, stval
|
|
csrr t3, scause
|
|
STORE t0, 2*REGBYTES(x2)
|
|
STORE s0, 32*REGBYTES(x2)
|
|
STORE t1, 33*REGBYTES(x2)
|
|
STORE t2, 34*REGBYTES(x2)
|
|
STORE t3, 35*REGBYTES(x2)
|
|
|
|
mv a0, sp
|
|
jal handle_trap
|
|
|
|
mv a0, sp
|
|
addi sp, sp, 320
|
|
|
|
LOAD t0, 32*REGBYTES(a0)
|
|
LOAD t1, 33*REGBYTES(a0)
|
|
csrw sstatus, t0
|
|
csrw sepc, t1
|
|
|
|
# restore x registers
|
|
LOAD x1,1*REGBYTES(a0)
|
|
LOAD x3,3*REGBYTES(a0)
|
|
LOAD x4,4*REGBYTES(a0)
|
|
LOAD x5,5*REGBYTES(a0)
|
|
LOAD x6,6*REGBYTES(a0)
|
|
LOAD x7,7*REGBYTES(a0)
|
|
LOAD x8,8*REGBYTES(a0)
|
|
LOAD x9,9*REGBYTES(a0)
|
|
LOAD x11,11*REGBYTES(a0)
|
|
LOAD x12,12*REGBYTES(a0)
|
|
LOAD x13,13*REGBYTES(a0)
|
|
LOAD x14,14*REGBYTES(a0)
|
|
LOAD x15,15*REGBYTES(a0)
|
|
LOAD x16,16*REGBYTES(a0)
|
|
LOAD x17,17*REGBYTES(a0)
|
|
LOAD x18,18*REGBYTES(a0)
|
|
LOAD x19,19*REGBYTES(a0)
|
|
LOAD x20,20*REGBYTES(a0)
|
|
LOAD x21,21*REGBYTES(a0)
|
|
LOAD x22,22*REGBYTES(a0)
|
|
LOAD x23,23*REGBYTES(a0)
|
|
LOAD x24,24*REGBYTES(a0)
|
|
LOAD x25,25*REGBYTES(a0)
|
|
LOAD x26,26*REGBYTES(a0)
|
|
LOAD x27,27*REGBYTES(a0)
|
|
LOAD x28,28*REGBYTES(a0)
|
|
LOAD x29,29*REGBYTES(a0)
|
|
LOAD x30,30*REGBYTES(a0)
|
|
LOAD x31,31*REGBYTES(a0)
|
|
# restore a0 last
|
|
LOAD x10,10*REGBYTES(a0)
|
|
|
|
# gtfo
|
|
sret
|