/*
* This file is part of GodMode9
* Copyright (C) 2017-2019 Wolfvak
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/*
* This is almost the same as the ARM9 exception handler,
* but with a few extra register dumps (DFSR, IFSR and FAR)
*/
#include
.arm
.align 3
.macro TRAP_ENTRY xrq
msr cpsr_f, #(\xrq << 29)
b xrqMain
.endm
xrqVectorTable:
ldr pc, =xrqReset
ldr pc, =xrqUndefined
ldr pc, =xrqSVC
ldr pc, =xrqPrefetchAbort
ldr pc, =xrqDataAbort
b . @ ignore the reserved exception
ldr pc, =xrqIRQ
ldr pc, =xrqFIQ
.pool
xrqVectorTableEnd:
xrqReset:
TRAP_ENTRY 0
xrqUndefined:
TRAP_ENTRY 1
xrqSVC:
TRAP_ENTRY 2
xrqPrefetchAbort:
TRAP_ENTRY 3
xrqDataAbort:
TRAP_ENTRY 4
xrqFIQ:
TRAP_ENTRY 7
xrqMain:
clrex
cpsid aif
ldr sp, =(xrqStackTop - 32*4)
stmia sp, {r0-r7}
mrs r1, cpsr
lsr r0, r1, #29
mrs r2, spsr
str lr, [sp, #15*4]
str r2, [sp, #16*4]
ands r2, r2, #SR_PMODE_MASK
orreq r2, r2, #SR_SYS_MODE
orr r2, r2, #(0x10 | SR_NOINT)
add r3, sp, #8*4
msr cpsr_c, r2
stmia r3!, {r8-r14}
msr cpsr_c, r1
mrc p15, 0, r4, c5, c0, 0 @ data fault status register
mrc p15, 0, r5, c5, c0, 1 @ instruction fault status register
mrc p15, 0, r6, c6, c0, 0 @ data fault address
add r3, r3, #2*4 @ skip saved PC and CPSR
stmia r3!, {r4, r5, r6}
mov r1, sp
bl do_exception
xrqIRQ:
clrex
sub lr, lr, #4 @ Fix return address
srsfd sp!, #SR_SVC_MODE @ Store IRQ mode LR and SPSR on the SVC stack
cps #SR_SVC_MODE @ Switch to SVC mode
push {r0-r4, r12, lr} @ Preserve registers
and r4, sp, #7 @ Fix SP to be 8byte aligned
sub sp, sp, r4
bl gicTopHandler
add sp, sp, r4
pop {r0-r4, r12, lr}
rfeia sp! @ Return from exception
@ u32 xrqInstallVectorTable(void)
.global xrqInstallVectorTable
.type xrqInstallVectorTable, %function
xrqInstallVectorTable:
ldr r0, =xrqPage
ldr r1, =xrqVectorTable
mov r2, #(xrqVectorTableEnd - xrqVectorTable)
b memcpy
.section .bss.xrqPage
.align 12
.global xrqPage
xrqPage:
.space 8192 @ reserve two 4K aligned pages for vectors and abort stack
.global xrqStackTop
xrqStackTop: