mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@138 b871894f-2f95-9b40-918c-086798483c85
265 lines
7.2 KiB
C
265 lines
7.2 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: CtrBrom - library - init
|
||
File: crt0_excpHandler.c
|
||
|
||
Copyright 2008 Nintendo. All rights reserved.
|
||
|
||
These coded instructions, statements, and computer programs contain
|
||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||
Company Ltd., and are protected by Federal copyright law. They may
|
||
not be disclosed to third parties or copied or duplicated in any form,
|
||
in whole or in part, without the prior written consent of Nintendo.
|
||
|
||
$Date:: $
|
||
$Rev$
|
||
$Author$
|
||
*---------------------------------------------------------------------------*/
|
||
#include <brom/code32.h>
|
||
#include <brom/os.h>
|
||
#include <brom/swi.h>
|
||
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: stupInitExceptions
|
||
|
||
Description: Initialize Exceptions
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void stupInitExceptions( void )
|
||
{
|
||
adr r2, i_stupExcpVennerCode
|
||
ldr r3, =HW_EXCP_VENEER_BUF
|
||
add r12, r3, #HW_EXCP_VENEER_BUF_SIZE
|
||
LSYM(0)
|
||
ldr r0, [r2], #4
|
||
ldm r0, {r0-r1}
|
||
stm r3!,{r0-r1}
|
||
cmp r3, r12
|
||
blt BSYM(0)
|
||
bx lr
|
||
|
||
i_stupExcpVennerCode
|
||
DCD i_stupExcpTerminateCode
|
||
DCD i_stupExcpTerminateCode
|
||
DCD i_stupSwiVeneerCode
|
||
DCD i_stupExcpTerminateCode
|
||
DCD i_stupExcpTerminateCode
|
||
DCD i_stupExcpTerminateCode
|
||
|
||
LTORG
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupExcpTerminateCode
|
||
|
||
Description: exception veneer code
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupExcpTerminateCode( void )
|
||
{
|
||
ldr pc, =i_stupExcpTerminateCode
|
||
LTORG
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupSwiVeneerCode
|
||
|
||
Description: SWI veneer code
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupSwiVeneerCode( void )
|
||
{
|
||
ldr pc, =i_stupSwiHandler
|
||
LTORG
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupDbgHandler
|
||
|
||
Description: Debug (FIQ, etc) handler
|
||
|
||
Arguments: None
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupDbgHandler( void )
|
||
{
|
||
mrs sp, cpsr // IRQ/FIQ<49>s<EFBFBD><73><EFBFBD><EFBFBD>
|
||
orr sp, sp, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE
|
||
msr cpsr_cxsf, sp
|
||
|
||
dbg_m
|
||
b dbg_m
|
||
|
||
LTORG
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupIrqVeneer
|
||
|
||
Description: IRQ veneer
|
||
|
||
Arguments: None
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupIrqVeneer( void )
|
||
{
|
||
ldr pc, =HW_INTR_VENEER_BUF
|
||
|
||
LTORG
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupFiqVeneer
|
||
|
||
Description: FIQ veneer
|
||
|
||
Arguments: None
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupFiqVeneer( void )
|
||
{
|
||
ldr pc, =HW_FIQ_VENEER_BUF
|
||
|
||
LTORG
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupPrefetchAbortVeneer
|
||
|
||
Description: Prefetch Abort veneer
|
||
|
||
Arguments: None
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupPrefetchAbortVeneer( void )
|
||
{
|
||
ldr pc, =HW_IABT_VENEER_BUF
|
||
|
||
LTORG
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupDataAbortVeneer
|
||
|
||
Description: Data Abort veneer
|
||
|
||
Arguments: None
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupDataAbortVeneer( void )
|
||
{
|
||
ldr pc, =HW_DABT_VENEER_BUF
|
||
|
||
LTORG
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupUndefInstVeneer
|
||
|
||
Description: Undefine Instruction veneer
|
||
|
||
Arguments: None
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupUndefInstVeneer( void )
|
||
{
|
||
ldr pc, =HW_UDEF_VENEER_BUF
|
||
|
||
LTORG
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupSwiVeneer
|
||
|
||
Description: SWI veneer
|
||
|
||
Arguments: None
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupSwiVeneer( void )
|
||
{
|
||
ldr pc, =HW_SWI_VENEER_BUF
|
||
|
||
LTORG
|
||
}
|
||
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: i_stupSwiHandler
|
||
|
||
Description: SWI handler
|
||
|
||
Arguments: None
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
ASM void i_stupSwiSemihosting( void )
|
||
{
|
||
ldmfd sp!, {r11, r12, lr}
|
||
semi_vector
|
||
movs pc, lr
|
||
}
|
||
|
||
ASM void i_stupSwiHandler( void )
|
||
{
|
||
INASM_EXTERN( _start )
|
||
|
||
stmfd sp!, {r11, r12, lr} // SVC<56><43><EFBFBD>[<5B>h <20><><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E>ޔ<EFBFBD>
|
||
ldrh r12, [lr, #-2] // <20>V<EFBFBD>X<EFBFBD>e<EFBFBD><65><EFBFBD>R<EFBFBD>[<5B><>No<4E>擾<EFBFBD>i<EFBFBD>n<EFBFBD>[<5B>t<EFBFBD><74><EFBFBD>[<5B>h<EFBFBD>A<EFBFBD>N<EFBFBD>Z<EFBFBD>X<EFBFBD>Ή<EFBFBD><CE89>j
|
||
mov r12, r12, lsl #1
|
||
and r12, r12, #SVC_ID_PREMASK<<SVC_ID_SHIFT
|
||
|
||
cmp r12, #(SVC_ID_SEMIHOST_ARM & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_ARM = 0x12
|
||
cmpne r12, #(SVC_ID_SEMIHOST_THUMB & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_THUMB = 0xab
|
||
beq i_stupSwiSemihosting
|
||
|
||
adr r11, SWI_Table // <20>V<EFBFBD>X<EFBFBD>e<EFBFBD><65><EFBFBD>R<EFBFBD>[<5B><><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>X <20>擾
|
||
ldrh r12, [r11, r12]
|
||
|
||
ldr r11, =HW_BROM
|
||
orr r12, r12, r11
|
||
|
||
mrs r11, spsr // SVC<56><43><EFBFBD>[<5B>h SPSR<53>ޔ<EFBFBD><DE94>i<EFBFBD><69><EFBFBD>v4<76><34><EFBFBD>[<5B>h<EFBFBD>j
|
||
stmfd sp!, {r11}
|
||
|
||
and r11, r11, #HW_PSR_IRQ_DISABLE // IRQ<52><51><EFBFBD><EFBFBD><C28F><EFBFBD> <20>R<EFBFBD>s<EFBFBD>[
|
||
orr r11, r11, #HW_PSR_SYS_MODE // <20>V<EFBFBD>X<EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD>[<5B>h<EFBFBD>芷<D882><E88AB7> & FIQ<49><51><EFBFBD><EFBFBD>
|
||
msr cpsr_cxsf,r11
|
||
|
||
stmfd sp!, {r2, lr} // <20>V<EFBFBD>X<EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD>[<5B>h <20><><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E>ޔ<EFBFBD><DE94>i2<69><32><EFBFBD>[<5B>h<EFBFBD>j
|
||
blx r12
|
||
|
||
swi_return
|
||
ldmfd sp!, {r2, lr} // <20>V<EFBFBD>X<EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD>[<5B>h ڼ<DABC><DEBD><EFBFBD><EFBFBD>A
|
||
mov r12, #0xc0 | HW_PSR_SVC_MODE // SVC<56><43><EFBFBD>[<5B>h<EFBFBD>芷<D882><E88AB7>
|
||
msr cpsr_cxsf, r12 // & IRQ/FIQ<49>s<EFBFBD><73><EFBFBD><EFBFBD>
|
||
|
||
ldmfd sp!, {r11} // SVC<56><43><EFBFBD>[<5B>h <20><><EFBFBD>W<EFBFBD>X<EFBFBD>^<5E><><EFBFBD>A
|
||
msr spsr_cxsf, r11
|
||
|
||
semi_return
|
||
ldmfd sp!, {r11, r12, lr}
|
||
movs pc, lr
|
||
|
||
LTORG
|
||
|
||
#include <../build/libraries/swi/common/swi_table.c>
|
||
}
|
||
|