101 lines
1.6 KiB
ArmAsm
101 lines
1.6 KiB
ArmAsm
#include "mem.h"
|
|
#include "io.h"
|
|
|
|
TEXT vectors(SB), $-4
|
|
MOVW $_start-KZERO(SB), R15
|
|
MOVW $_vexc(SB), R15
|
|
MOVW $_vsvc(SB), R15
|
|
MOVW $_viabt(SB), R15
|
|
MOVW $_vexc(SB), R15
|
|
MOVW $vectors(SB), R15
|
|
MOVW $_vexc(SB), R15
|
|
MOVW $_vexc(SB), R15
|
|
|
|
TEXT _viabt(SB), $-4
|
|
CPS(CPSID)
|
|
CLREX
|
|
DSB
|
|
MOVW R14, 8(R13)
|
|
MOVW SPSR, R14
|
|
MOVW R14, 4(R13)
|
|
MOVW CPSR, R14
|
|
AND $0x1e, R14
|
|
B _exc
|
|
|
|
|
|
TEXT _vexc(SB), $-4
|
|
CPS(CPSID)
|
|
CLREX
|
|
DSB
|
|
MOVW R14, 8(R13)
|
|
MOVW SPSR, R14
|
|
MOVW R14, 4(R13)
|
|
MOVW CPSR, R14
|
|
AND $0x1f, R14
|
|
_exc:
|
|
MOVW R14, 0(R13)
|
|
CPS(CPSMODE | PsrMsvc)
|
|
|
|
SUB $(18*4), R13
|
|
MOVM.IA [R0-R14], (R13)
|
|
|
|
/* get Mach* from TPIDRPRW */
|
|
MRC 15, 0, R(Rmach), C(13), C(0), 4
|
|
MOVW 8(R(Rmach)), R(Rup)
|
|
MOVW $setR12(SB), R12
|
|
|
|
ADD $12, R(Rmach), R0
|
|
MOVM.IA (R0), [R1-R3]
|
|
ADD $(15*4), R13, R0
|
|
MOVM.IA [R1-R3], (R0)
|
|
|
|
AND.S $0xf, R2
|
|
ADD.NE $(18*4), R13, R0
|
|
MOVW.NE R0, (13*4)(R13)
|
|
ADD.EQ $(13*4), R13, R0
|
|
MOVM.IA.S.EQ [R13-R14], (R0)
|
|
|
|
MOVW R13, R0
|
|
SUB $8, R13
|
|
BL trap(SB)
|
|
ADD $8, R13
|
|
|
|
MOVW (16*4)(R13), R0
|
|
MOVW R0, SPSR
|
|
AND.S $0xf, R0
|
|
BEQ _uret
|
|
MOVW R(Rmach), (Rmach*4)(R13)
|
|
MOVM.IA (R13), [R0-R14]
|
|
DSB
|
|
MOVM.DB.S (R13), [R15]
|
|
|
|
TEXT _vsvc(SB), $-4
|
|
CLREX
|
|
DSB
|
|
MOVW.W R14, -4(R13)
|
|
MOVW SPSR, R14
|
|
MOVW.W R14, -4(R13)
|
|
MOVW $PsrMsvc, R14
|
|
MOVW.W R14, -4(R13)
|
|
MOVM.DB.S [R0-R14], (R13)
|
|
SUB $(15*4), R13
|
|
|
|
/* get Mach* from TPIDRPRW */
|
|
MRC 15, 0, R(Rmach), C(13), C(0), 4
|
|
MOVW 8(R(Rmach)), R(Rup)
|
|
MOVW $setR12(SB), R12
|
|
|
|
MOVW R13, R0
|
|
SUB $8, R13
|
|
BL syscall(SB)
|
|
ADD $8, R13
|
|
|
|
MOVW (16*4)(R13), R0
|
|
MOVW R0, SPSR
|
|
_uret:
|
|
MOVM.IA.S (R13), [R0-R14]
|
|
ADD $(17*4), R13
|
|
DSB
|
|
ISB
|
|
MOVM.IA.S.W (R13), [R15]
|