rockbox/firmware/target/mips/exception-mips.S

182 lines
4.1 KiB
ArmAsm
Raw Normal View History

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2022 Aidan MacDonald
*
* 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "mips.h"
.text
.set push
.set mips32
.section .vectors.1, "ax", %progbits
la k1, tlb_refill_handler
j _exception_enter
.section .vectors.2, "ax", %progbits
la k1, cache_error_handler
j _exception_enter
.section .vectors.3, "ax", %progbits
li k1, M_CauseExcCode
mfc0 k0, C0_CAUSE
and k0, k1
beq zero, k0, 1f
la k1, exception_handler
j _exception_enter
1:
la k1, intr_handler
j _exception_enter
.section .vectors.4, "ax", %progbits
/* same as above */
li k1, M_CauseExcCode
mfc0 k0, C0_CAUSE
and k0, k1
beq zero, k0, 1f
nop
la k1, exception_handler
j _exception_enter
1:
la k1, intr_handler
j _exception_enter
.set push
.set noat
.set noreorder
.section .vectors, "ax", %progbits
_exception_enter:
la k0, _irqstackend
addiu k0, -0x84
sw $1, 0x00(k0)
sw $2, 0x04(k0)
sw $3, 0x08(k0)
sw $4, 0x0c(k0)
sw $5, 0x10(k0)
sw $6, 0x14(k0)
sw $7, 0x18(k0)
sw $8, 0x1c(k0)
sw $9, 0x20(k0)
sw $10, 0x24(k0)
sw $11, 0x28(k0)
sw $12, 0x2c(k0)
sw $13, 0x30(k0)
sw $14, 0x34(k0)
sw $15, 0x38(k0)
sw $16, 0x3c(k0)
sw $17, 0x40(k0)
sw $18, 0x44(k0)
sw $19, 0x48(k0)
sw $20, 0x4c(k0)
sw $21, 0x50(k0)
sw $22, 0x54(k0)
sw $23, 0x58(k0)
sw $24, 0x5c(k0)
sw $25, 0x60(k0)
sw $28, 0x64(k0)
sw $29, 0x68(k0)
sw $30, 0x6c(k0)
sw $31, 0x70(k0)
mflo t0
ssnop
sw t0, 0x74(k0)
mfhi t0
ssnop
sw t0, 0x78(k0)
mfc0 t0, C0_STATUS
ssnop
ssnop
ssnop
sw t0, 0x7c(k0)
mfc0 a1, C0_EPC
ssnop
ssnop
ssnop
sw a1, 0x80(k0)
move sp, k0
jalr k1
move a0, sp
_exception_return:
/* restore all GPRs except sp */
lw $1, 0x00(sp)
lw $2, 0x04(sp)
lw $3, 0x08(sp)
lw $4, 0x0c(sp)
lw $5, 0x10(sp)
lw $6, 0x14(sp)
lw $7, 0x18(sp)
lw $8, 0x1c(sp)
lw $9, 0x20(sp)
lw $10, 0x24(sp)
lw $11, 0x28(sp)
lw $12, 0x2c(sp)
lw $13, 0x30(sp)
lw $14, 0x34(sp)
lw $15, 0x38(sp)
lw $16, 0x3c(sp)
lw $17, 0x40(sp)
lw $18, 0x44(sp)
lw $19, 0x48(sp)
lw $20, 0x4c(sp)
lw $21, 0x50(sp)
lw $22, 0x54(sp)
lw $23, 0x58(sp)
lw $24, 0x5c(sp)
lw $25, 0x60(sp)
lw $28, 0x64(sp)
lw $30, 0x6c(sp)
lw $31, 0x70(sp)
lw k0, 0x74(sp)
mtlo k0
ssnop
lw k0, 0x78(sp)
mthi k0
ssnop
lw k0, 0x7c(sp)
mtc0 k0, C0_STATUS
ssnop
ssnop
ssnop
lw k0, 0x80(sp)
mtc0 k0, C0_EPC
ssnop
ssnop
ssnop
/* restore stack pointer last */
lw sp, 0x68(sp)
eret
ssnop
.set pop
.set pop