ctr_firmware/trunk/bootrom/build/libraries/init/common/crt0_excp.c
nakasima 76da849d53 システム領域クリアの修正。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@138 b871894f-2f95-9b40-918c-086798483c85
2008-12-24 10:11:40 +00:00

265 lines
7.2 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
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>
}