mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
MMUライブラリ追加。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@181 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
parent
3092e655b1
commit
c087e62b84
@ -44,6 +44,8 @@ SRCS = \
|
|||||||
os_message.c \
|
os_message.c \
|
||||||
os_cache.c \
|
os_cache.c \
|
||||||
os_printf.c \
|
os_printf.c \
|
||||||
|
os_boot.c \
|
||||||
|
os_mmu.c \
|
||||||
|
|
||||||
TARGET_LIB = libos$(BROM_LIBSUFFIX).a
|
TARGET_LIB = libos$(BROM_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|||||||
445
trunk/bootrom/build/libraries/os/ARM11/os_mmu.c
Normal file
445
trunk/bootrom/build/libraries/os/ARM11/os_mmu.c
Normal file
@ -0,0 +1,445 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - OS
|
||||||
|
File: os_mmu.c
|
||||||
|
|
||||||
|
Copyright 2009 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/os.h>
|
||||||
|
#include <brom/code32.h>
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// VA TO PA
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osGetPhysicalAddr
|
||||||
|
|
||||||
|
Description: Get physical address
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Physical address
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void* osGetPhysicalAddr( void* vaddr )
|
||||||
|
{
|
||||||
|
PRESERVE8
|
||||||
|
|
||||||
|
ldr r3, =HW_C7_VA_SRC_MASK
|
||||||
|
and r2, r0, r3
|
||||||
|
bic r1, r0, r3
|
||||||
|
mcr p15, 0, r2, c7, c8, 1
|
||||||
|
|
||||||
|
mrc p15, 0, r0, c7, c4, 0
|
||||||
|
tst r0, #HW_C7_PA_ABORT
|
||||||
|
LSYM(1) bne BSYM(1) // Error
|
||||||
|
|
||||||
|
ldr r3, =HW_C7_PA_DEST_MASK
|
||||||
|
and r0, r0, r3
|
||||||
|
orr r0, r0, r1
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osGetMemRegionType
|
||||||
|
|
||||||
|
Description: Get memory region type
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Region type
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm u8 osGetMemRegionType( void* vaddr )
|
||||||
|
{
|
||||||
|
ldr r3, =HW_C7_VA_SRC_MASK
|
||||||
|
and r2, r0, r3
|
||||||
|
mcr p15, 0, r2, c7, c8, 1
|
||||||
|
|
||||||
|
mrc p15, 0, r0, c7, c4, 0
|
||||||
|
tst r0, #HW_C7_PA_ABORT
|
||||||
|
LSYM(1) bne BSYM(1) // Error
|
||||||
|
|
||||||
|
and r0, r0, #HW_C7_PA_RGT_MASK
|
||||||
|
mov r0, r0, lsr #HW_C7_PA_RGT_TYPE_SFT
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osGetMemRegionCacheAttr
|
||||||
|
|
||||||
|
Description: Get memory region cache attribute
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Region cache attribute
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm u8 osGetMemRegionCacheAttr( void* vaddr )
|
||||||
|
{
|
||||||
|
ldr r3, =HW_C7_VA_SRC_MASK
|
||||||
|
and r2, r0, r3
|
||||||
|
mcr p15, 0, r2, c7, c8, 1
|
||||||
|
|
||||||
|
mrc p15, 0, r0, c7, c4, 0
|
||||||
|
tst r0, #HW_C7_PA_ABORT
|
||||||
|
LSYM(1) bne BSYM(1) // Error
|
||||||
|
|
||||||
|
and r0, r0, #HW_C7_PA_L1C_CA_MASK
|
||||||
|
mov r0, r0, lsr #HW_C7_PA_L1C_CA_SFT
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osIsMemRegionShareable
|
||||||
|
|
||||||
|
Description: Whether memory region is shareable or not
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Whether region is shareable or not
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm BOOL osIsMemRegionShareable( void* vaddr )
|
||||||
|
{
|
||||||
|
ldr r3, =HW_C7_VA_SRC_MASK
|
||||||
|
and r2, r0, r3
|
||||||
|
mcr p15, 0, r2, c7, c8, 1
|
||||||
|
|
||||||
|
mrc p15, 0, r0, c7, c4, 0
|
||||||
|
tst r0, #HW_C7_PA_ABORT
|
||||||
|
LSYM(1) bne BSYM(1) // Error
|
||||||
|
|
||||||
|
and r0, r0, #HW_C7_PA_SHAREABLE
|
||||||
|
mov r0, r0, lsr #HW_C7_PA_SHAREABLE_SFT
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osIsMemRegionAbort
|
||||||
|
|
||||||
|
Description: Whether memory region is abort or not
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Whether region is shareable or not
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm BOOL osIsMemRegionAbort( void* vaddr )
|
||||||
|
{
|
||||||
|
ldr r3, =HW_C7_VA_SRC_MASK
|
||||||
|
and r2, r0, r3
|
||||||
|
mcr p15, 0, r2, c7, c8, 1
|
||||||
|
|
||||||
|
mrc p15, 0, r0, c7, c4, 0
|
||||||
|
and r0, r0, #HW_C7_PA_ABORT
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// INVALIDATE ALL TLB
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateTLBAll
|
||||||
|
|
||||||
|
Description: Invalidate all main/instruction/data TLBs
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateTLBAll( void )
|
||||||
|
{
|
||||||
|
mov r0, #0
|
||||||
|
mcr p15, 0, r0, c8, c7, 0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateITLBAll
|
||||||
|
|
||||||
|
Description: Invalidate all instruction TLB
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateITLBAll( void )
|
||||||
|
{
|
||||||
|
mov r0, #0
|
||||||
|
mcr p15, 0, r0, c8, c5, 0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateDTLBAll
|
||||||
|
|
||||||
|
Description: Invalidate all data TLB
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateDTLBAll( void )
|
||||||
|
{
|
||||||
|
mov r0, #0
|
||||||
|
mcr p15, 0, r0, c8, c6, 0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// INVALIDATE RANGE OF TLB
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateTLBRange
|
||||||
|
|
||||||
|
Description: Invalidate main/instruction/data TLBs in specified range
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateTLBRange( void* startAddr, u32 nBytes )
|
||||||
|
{
|
||||||
|
add r1, r1, r0
|
||||||
|
ldr r3, =HW_MMU6_T2_SP_BASE_MASK
|
||||||
|
and r0, r0, r3
|
||||||
|
LSYM(1)
|
||||||
|
mcr p15, 0, r0, c8, c7, 3
|
||||||
|
add r0, r0, #HW_MMU6_T2_SP_SIZE
|
||||||
|
cmp r0, r1
|
||||||
|
blt BSYM(1)
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateITLBRange
|
||||||
|
|
||||||
|
Description: Invalidate instruction TLB in specified range
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateITLBRange( void* startAddr, u32 nBytes )
|
||||||
|
{
|
||||||
|
add r1, r1, r0
|
||||||
|
ldr r3, =HW_MMU6_T2_SP_BASE_MASK
|
||||||
|
and r0, r0, r3
|
||||||
|
LSYM(1)
|
||||||
|
mcr p15, 0, r0, c8, c5, 3
|
||||||
|
add r0, r0, #HW_MMU6_T2_SP_SIZE
|
||||||
|
cmp r0, r1
|
||||||
|
blt BSYM(1)
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateDTLBRange
|
||||||
|
|
||||||
|
Description: Invalidate TLBs in specified range
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateDTLBRange( void* startAddr, u32 nBytes )
|
||||||
|
{
|
||||||
|
add r1, r1, r0
|
||||||
|
ldr r3, =HW_MMU6_T2_SP_BASE_MASK
|
||||||
|
and r0, r0, r3
|
||||||
|
LSYM(1)
|
||||||
|
mcr p15, 0, r0, c8, c6, 3
|
||||||
|
add r0, r0, #HW_MMU6_T2_SP_SIZE
|
||||||
|
cmp r0, r1
|
||||||
|
blt BSYM(1)
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// INVALIDATE ALL TLB With ASID
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateTLBAllWithASID
|
||||||
|
|
||||||
|
Description: Invalidate all main/instruction/data TLBs with ASID
|
||||||
|
|
||||||
|
Arguments: Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateTLBAllWithASID( u32 asID )
|
||||||
|
{
|
||||||
|
and r0, r0, #HW_C8_TLB_ASID_MASK
|
||||||
|
|
||||||
|
mcr p15, 0, r0, c8, c7, 2
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateITLBAllWithASID
|
||||||
|
|
||||||
|
Description: Invalidate all instruction TLB with ASID
|
||||||
|
|
||||||
|
Arguments: Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateITLBAllWithASID( u32 asID )
|
||||||
|
{
|
||||||
|
and r0, r0, #HW_C8_TLB_ASID_MASK
|
||||||
|
|
||||||
|
mcr p15, 0, r0, c8, c5, 2
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateDTLBAllWithASID
|
||||||
|
|
||||||
|
Description: Invalidate all data TLB with ASID
|
||||||
|
|
||||||
|
Arguments: Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateDTLBAllWithASID( u32 asID )
|
||||||
|
{
|
||||||
|
and r0, r0, #HW_C8_TLB_ASID_MASK
|
||||||
|
|
||||||
|
mcr p15, 0, r0, c8, c6, 2
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// INVALIDATE RANGE OF TLB WITH ASID
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateTLBRangeWithASID
|
||||||
|
|
||||||
|
Description: Invalidate TLBs in specified rang with ASIDe
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
asID Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateTLBRangeWithASID( void* startAddr, u32 nBytes, u32 asID )
|
||||||
|
{
|
||||||
|
add r1, r1, r0
|
||||||
|
ldr r3, =HW_MMU6_T2_SP_BASE_MASK
|
||||||
|
and r0, r0, r3
|
||||||
|
and r2, r2, #HW_C8_TLB_ASID_MASK
|
||||||
|
orr r0, r0, r2
|
||||||
|
LSYM(1)
|
||||||
|
mcr p15, 0, r0, c8, c5, 1
|
||||||
|
mcr p15, 0, r0, c8, c6, 1
|
||||||
|
mcr p15, 0, r0, c8, c7, 1
|
||||||
|
add r0, r0, #HW_MMU6_T2_SP_SIZE
|
||||||
|
cmp r0, r1
|
||||||
|
blt BSYM(1)
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateITLBRangeWithASID
|
||||||
|
|
||||||
|
Description: Invalidate instruction TLB in specified range with ASID
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
asID Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateITLBRangeWithASID( void* startAddr, u32 nBytes, u32 asID )
|
||||||
|
{
|
||||||
|
add r1, r1, r0
|
||||||
|
ldr r3, =HW_MMU6_T2_SP_BASE_MASK
|
||||||
|
and r0, r0, r3
|
||||||
|
and r2, r2, #HW_C8_TLB_ASID_MASK
|
||||||
|
orr r0, r0, r2
|
||||||
|
LSYM(1)
|
||||||
|
mcr p15, 0, r0, c8, c5, 1
|
||||||
|
add r0, r0, #HW_MMU6_T2_SP_SIZE
|
||||||
|
cmp r0, r1
|
||||||
|
blt BSYM(1)
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateDTLBRangeWithASID
|
||||||
|
|
||||||
|
Description: Invalidate TLBs in specified range with ASID
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
asID Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateDTLBRangeWithASID( void* startAddr, u32 nBytes, u32 asID )
|
||||||
|
{
|
||||||
|
add r1, r1, r0
|
||||||
|
ldr r3, =HW_MMU6_T2_SP_BASE_MASK
|
||||||
|
and r0, r0, r3
|
||||||
|
and r2, r2, #HW_C8_TLB_ASID_MASK
|
||||||
|
orr r0, r0, r2
|
||||||
|
LSYM(1)
|
||||||
|
mcr p15, 0, r0, c8, c6, 1
|
||||||
|
add r0, r0, #HW_MMU6_T2_SP_SIZE
|
||||||
|
cmp r0, r1
|
||||||
|
blt BSYM(1)
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// LOCKDOWN TLB
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osStartTLBLockDown
|
||||||
|
|
||||||
|
Description: Start TLB Lockdown
|
||||||
|
|
||||||
|
Arguments: TLB ID (0-7)
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osStartTLBLockDown( u32 tlbID )
|
||||||
|
{
|
||||||
|
mov r0, r0, lsl #HW_C10_TLBL_VICTIM_SFT
|
||||||
|
and r0, r0, #HW_C10_TLBL_VICTIM_MASK
|
||||||
|
and r0, r0, #HW_C10_TLBL_PRESERVE
|
||||||
|
|
||||||
|
mcr p15, 0, r0, c10, c0, 0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osEndTLBLockDown
|
||||||
|
|
||||||
|
Description: End TLB Lockdown
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osEndTLBLockDown( void )
|
||||||
|
{
|
||||||
|
mov r0, #0
|
||||||
|
mcr p15, 0, r0, c10, c0, 0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
@ -47,6 +47,8 @@ SRCS = \
|
|||||||
os_message.c \
|
os_message.c \
|
||||||
os_cache.c \
|
os_cache.c \
|
||||||
os_printf.c \
|
os_printf.c \
|
||||||
|
os_boot.c \
|
||||||
|
os_protectionUnit.c \
|
||||||
|
|
||||||
TARGET_LIB = libos_sp$(BROM_LIBSUFFIX).a
|
TARGET_LIB = libos_sp$(BROM_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|||||||
90
trunk/bootrom/build/libraries/os/ARM9/os_protectionUnit.c
Normal file
90
trunk/bootrom/build/libraries/os/ARM9/os_protectionUnit.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - OS
|
||||||
|
File: os_protectionUnit.c
|
||||||
|
|
||||||
|
Copyright 2009 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/os.h>
|
||||||
|
#include <brom/code32.h>
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// protection unit
|
||||||
|
//======================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osEnableProtectionUnit
|
||||||
|
|
||||||
|
Description: enable protection unit
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osEnableProtectionUnit( void )
|
||||||
|
{
|
||||||
|
mrc p15, 0, r0, c1, c0, 0
|
||||||
|
orr r0, r0, #HW_C1_PROTECT_UNIT_ENABLE
|
||||||
|
mcr p15, 0, r0, c1, c0, 0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osDisableProtectionUnit
|
||||||
|
|
||||||
|
Description: disable protection unit
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osDisableProtectionUnit( void )
|
||||||
|
{
|
||||||
|
mrc p15, 0, r0, c1, c0, 0
|
||||||
|
bic r0, r0, #HW_C1_PROTECT_UNIT_ENABLE
|
||||||
|
mcr p15, 0, r0, c1, c0, 0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osFinalizeProtectionUnit
|
||||||
|
|
||||||
|
Description: finalize protection unit
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void i_osFinalizeProtectionUnit( void )
|
||||||
|
{
|
||||||
|
// プロテクションユニット&キャッシュ無効。ITCM & DTCMは有効
|
||||||
|
ldr r0, = HW_C1_ITCM_ENABLE | HW_C1_DTCM_ENABLE | HW_C1_EXCEPT_VEC_UPPER | HW_C1_SB1_BITSET
|
||||||
|
mcr p15, 0, r0, c1, c0, 0
|
||||||
|
|
||||||
|
// ITCMの割り当てを解除
|
||||||
|
// mov r0, #0
|
||||||
|
// mcr p15, 0, r0, c6, c5, 0
|
||||||
|
|
||||||
|
// DTCMの割り当てを解除
|
||||||
|
// mov r0,#0
|
||||||
|
// mcr p15, 0, r0, c9, c1, 0
|
||||||
|
|
||||||
|
// キャッシュ無効化
|
||||||
|
mov r0, #0
|
||||||
|
mcr p15, 0, r0, c7, c5, 0 // 命令キャッシュ
|
||||||
|
mcr p15, 0, r0, c7, c6, 0 // データキャッシュ
|
||||||
|
|
||||||
|
// ライトバッファ エンプティ待ち
|
||||||
|
mcr p15, 0, r0, c7, c10, 4
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
104
trunk/bootrom/build/libraries/os/common/os_boot.c
Normal file
104
trunk/bootrom/build/libraries/os/common/os_boot.c
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - OS
|
||||||
|
File: os_boot.c
|
||||||
|
|
||||||
|
Copyright 2009 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/os.h>
|
||||||
|
#include <brom/mi.h>
|
||||||
|
|
||||||
|
void i_osBootCore( OSEntryPoint p );
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osFinalize
|
||||||
|
|
||||||
|
Description: finalize
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void i_osFinalize(void)
|
||||||
|
{
|
||||||
|
(void)osDisableInterrupts();
|
||||||
|
osDisableDCache();
|
||||||
|
osFlushDCacheAll();
|
||||||
|
osWaitWriteBufferEmpty();
|
||||||
|
osDisableICache();
|
||||||
|
osInvalidateICacheAll();
|
||||||
|
#ifdef SDK_ARM11
|
||||||
|
osInvalidateInstPrefetchBuffer();
|
||||||
|
osInvalidateBCacheAll();
|
||||||
|
#else // SDK_ARM9
|
||||||
|
reg_OS_IE = 0;
|
||||||
|
reg_OS_IF = 0xffffffff;
|
||||||
|
i_osFinalizeProtectionUnit();
|
||||||
|
#endif // SDK_ARM9
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osClearWorkArea
|
||||||
|
|
||||||
|
Description: clear work area
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void i_osClearWorkArea( void )
|
||||||
|
{
|
||||||
|
INASM_EXTERN( |Image$$RW$$Base| )
|
||||||
|
INASM_EXTERN( |Image$$ZI$$ZI$$Limit| )
|
||||||
|
|
||||||
|
CODE32
|
||||||
|
|
||||||
|
mov r11, lr
|
||||||
|
|
||||||
|
// clear stack with r4-r9
|
||||||
|
mov r0, #0
|
||||||
|
ldr r1, =|Image$$RW$$Base|
|
||||||
|
ldr r2, =|Image$$ZI$$ZI$$Limit|
|
||||||
|
sub r2, r2, r1
|
||||||
|
bl i_miCpuClearFast
|
||||||
|
|
||||||
|
bx r11
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// internal
|
||||||
|
|
||||||
|
asm void i_osBootCore( OSEntryPoint p )
|
||||||
|
{
|
||||||
|
INASM_EXTERN( i_miCpuClearFast )
|
||||||
|
|
||||||
|
CODE32
|
||||||
|
|
||||||
|
mov r11, r0
|
||||||
|
|
||||||
|
// clear stack with r4-r9
|
||||||
|
mov r0, #0
|
||||||
|
ldr r1, =HW_BROM_STACK
|
||||||
|
ldr r2, =HW_BROM_STACK_SIZE
|
||||||
|
bl i_miCpuClearFast
|
||||||
|
|
||||||
|
mov lr, r11
|
||||||
|
|
||||||
|
// clear registers
|
||||||
|
ldr sp, =HW_BROM_STACK
|
||||||
|
ldmia sp, {r0-r12,sp}
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -15,7 +15,6 @@
|
|||||||
$Author$
|
$Author$
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#include <brom/os.h>
|
#include <brom/os.h>
|
||||||
|
|
||||||
#include <brom/code32.h>
|
#include <brom/code32.h>
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@ -30,8 +29,7 @@
|
|||||||
|
|
||||||
Returns: previous state
|
Returns: previous state
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm BOOL osEnableDCache( void )
|
||||||
ASM BOOL osEnableDCache( void )
|
|
||||||
{
|
{
|
||||||
PRESERVE8
|
PRESERVE8
|
||||||
|
|
||||||
@ -52,8 +50,7 @@ ASM BOOL osEnableDCache( void )
|
|||||||
|
|
||||||
Returns: previous stats
|
Returns: previous stats
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm BOOL osDisableDCache( void )
|
||||||
ASM BOOL osDisableDCache( void )
|
|
||||||
{
|
{
|
||||||
mrc p15, 0, r1, c1, c0, 0
|
mrc p15, 0, r1, c1, c0, 0
|
||||||
and r0, r1, #HW_C1_DC_ENABLE
|
and r0, r1, #HW_C1_DC_ENABLE
|
||||||
@ -72,8 +69,7 @@ ASM BOOL osDisableDCache( void )
|
|||||||
|
|
||||||
Returns: previous state
|
Returns: previous state
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm BOOL osRestoreDCache( BOOL enable )
|
||||||
ASM BOOL osRestoreDCache( BOOL enable )
|
|
||||||
{
|
{
|
||||||
//---- 引数処理
|
//---- 引数処理
|
||||||
cmp r0, #0
|
cmp r0, #0
|
||||||
@ -101,8 +97,7 @@ ASM BOOL osRestoreDCache( BOOL enable )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateDCacheAll( void )
|
||||||
ASM void osInvalidateDCacheAll( void )
|
|
||||||
{
|
{
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
mcr p15, 0, r0, c7, c6, 0
|
mcr p15, 0, r0, c7, c6, 0
|
||||||
@ -119,8 +114,7 @@ ASM void osInvalidateDCacheAll( void )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osStoreDCacheAll( void )
|
||||||
ASM void osStoreDCacheAll( void )
|
|
||||||
{
|
{
|
||||||
mov r1, #0
|
mov r1, #0
|
||||||
LSYM(1)
|
LSYM(1)
|
||||||
@ -149,8 +143,7 @@ LSYM(2)
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osFlushDCacheAll( void )
|
||||||
ASM void osFlushDCacheAll( void )
|
|
||||||
{
|
{
|
||||||
mov r12, #0
|
mov r12, #0
|
||||||
mov r1, #0 // r1: セットNoカウンタ(0 ~ 3)
|
mov r1, #0 // r1: セットNoカウンタ(0 ~ 3)
|
||||||
@ -186,8 +179,7 @@ LSYM(2)
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateDCacheRange( void* startAddr, u32 nBytes )
|
||||||
ASM void osInvalidateDCacheRange( void* startAddr, u32 nBytes )
|
|
||||||
{
|
{
|
||||||
add r1, r1, r0
|
add r1, r1, r0
|
||||||
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
||||||
@ -211,8 +203,7 @@ LSYM(1)
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osStoreDCacheRange( void* startAddr, u32 nBytes )
|
||||||
ASM void osStoreDCacheRange( void* startAddr, u32 nBytes )
|
|
||||||
{
|
{
|
||||||
add r1, r1, r0
|
add r1, r1, r0
|
||||||
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
||||||
@ -236,8 +227,7 @@ LSYM(1)
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osFlushDCacheRange( void* startAddr, u32 nBytes )
|
||||||
ASM void osFlushDCacheRange( void* startAddr, u32 nBytes )
|
|
||||||
{
|
{
|
||||||
mov r12, #0
|
mov r12, #0
|
||||||
add r1, r1, r0
|
add r1, r1, r0
|
||||||
@ -262,7 +252,6 @@ LSYM(1)
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void osInvalidateDCacheRangeOrAll( void* startAddr, u32 nBytes )
|
void osInvalidateDCacheRangeOrAll( void* startAddr, u32 nBytes )
|
||||||
{
|
{
|
||||||
if ( nBytes < HW_DC_SIZE )
|
if ( nBytes < HW_DC_SIZE )
|
||||||
@ -286,7 +275,6 @@ void osInvalidateDCacheRangeOrAll( void* startAddr, u32 nBytes )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void osStoreDCacheRangeOrAll( void* startAddr, u32 nBytes )
|
void osStoreDCacheRangeOrAll( void* startAddr, u32 nBytes )
|
||||||
{
|
{
|
||||||
if ( nBytes < HW_DC_SIZE )
|
if ( nBytes < HW_DC_SIZE )
|
||||||
@ -310,7 +298,6 @@ void osStoreDCacheRangeOrAll( void* startAddr, u32 nBytes )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void osFlushDCacheRangeOrAll( void* startAddr, u32 nBytes )
|
void osFlushDCacheRangeOrAll( void* startAddr, u32 nBytes )
|
||||||
{
|
{
|
||||||
if ( nBytes < HW_DC_SIZE )
|
if ( nBytes < HW_DC_SIZE )
|
||||||
@ -336,8 +323,7 @@ void osFlushDCacheRangeOrAll( void* startAddr, u32 nBytes )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osLockdownDCacheRange( void* startAddr, u32 nBytes )
|
||||||
ASM void osLockdownDCacheRange( void* startAddr, u32 nBytes )
|
|
||||||
{
|
{
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
INASM_EXTERN( osDisableInterrupts )
|
INASM_EXTERN( osDisableInterrupts )
|
||||||
@ -391,8 +377,7 @@ LSYM(1)
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osUnlockdownDCacheAll( void )
|
||||||
ASM void osUnlockdownDCacheAll( void )
|
|
||||||
{
|
{
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
mov r3, #0
|
mov r3, #0
|
||||||
@ -411,8 +396,7 @@ ASM void osUnlockdownDCacheAll( void )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osUnlockdownDCache( u32 num )
|
||||||
ASM void osUnlockdownDCache( u32 num )
|
|
||||||
{
|
{
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
mrc p15, 0, r3, c9, c0, 0
|
mrc p15, 0, r3, c9, c0, 0
|
||||||
@ -435,8 +419,7 @@ ASM void osUnlockdownDCache( u32 num )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osWaitWriteBufferEmpty( void )
|
||||||
ASM void osWaitWriteBufferEmpty( void )
|
|
||||||
{
|
{
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
mcr p15, 0, r0, c7, c10, 4
|
mcr p15, 0, r0, c7, c10, 4
|
||||||
@ -454,8 +437,7 @@ ASM void osWaitWriteBufferEmpty( void )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osTouchDCacheRange( void* startAddr, u32 nBytes )
|
||||||
ASM void osTouchDCacheRange( void* startAddr, u32 nBytes )
|
|
||||||
{
|
{
|
||||||
add r1, r1, r0
|
add r1, r1, r0
|
||||||
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
||||||
@ -483,8 +465,7 @@ LSYM(1)
|
|||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osKeepDataAccessOrder( void )
|
||||||
ASM void osKeepDataAccessOrder( void )
|
|
||||||
{
|
{
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
mcr p15, 0, r0, c7, c10, 5
|
mcr p15, 0, r0, c7, c10, 5
|
||||||
@ -506,8 +487,7 @@ ASM void osKeepDataAccessOrder( void )
|
|||||||
|
|
||||||
Returns: previous state
|
Returns: previous state
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm BOOL osEnableICache( void )
|
||||||
ASM BOOL osEnableICache( void )
|
|
||||||
{
|
{
|
||||||
mrc p15, 0, r1, c1, c0, 0
|
mrc p15, 0, r1, c1, c0, 0
|
||||||
and r0, r1, #HW_C1_IC_ENABLE
|
and r0, r1, #HW_C1_IC_ENABLE
|
||||||
@ -526,8 +506,7 @@ ASM BOOL osEnableICache( void )
|
|||||||
|
|
||||||
Returns: previous stats
|
Returns: previous stats
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm BOOL osDisableICache( void )
|
||||||
ASM BOOL osDisableICache( void )
|
|
||||||
{
|
{
|
||||||
mrc p15, 0, r1, c1, c0, 0
|
mrc p15, 0, r1, c1, c0, 0
|
||||||
and r0, r1, #HW_C1_IC_ENABLE
|
and r0, r1, #HW_C1_IC_ENABLE
|
||||||
@ -546,8 +525,7 @@ ASM BOOL osDisableICache( void )
|
|||||||
|
|
||||||
Returns: previous stats
|
Returns: previous stats
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm BOOL osRestoreICache( BOOL enable )
|
||||||
ASM BOOL osRestoreICache( BOOL enable )
|
|
||||||
{
|
{
|
||||||
//---- 引数処理
|
//---- 引数処理
|
||||||
cmp r0, #0
|
cmp r0, #0
|
||||||
@ -575,8 +553,7 @@ ASM BOOL osRestoreICache( BOOL enable )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateICacheAll( void )
|
||||||
ASM void osInvalidateICacheAll( void )
|
|
||||||
{
|
{
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
mcr p15, 0, r0, c7, c5, 0
|
mcr p15, 0, r0, c7, c5, 0
|
||||||
@ -593,8 +570,7 @@ ASM void osInvalidateICacheAll( void )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateICacheRange( void* startAddr, u32 nBytes )
|
||||||
ASM void osInvalidateICacheRange( void* startAddr, u32 nBytes )
|
|
||||||
{
|
{
|
||||||
add r1, r1, r0
|
add r1, r1, r0
|
||||||
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
||||||
@ -617,7 +593,6 @@ LSYM(1)
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void osInvalidateICacheRangeOrAll( void* startAddr, u32 nBytes )
|
void osInvalidateICacheRangeOrAll( void* startAddr, u32 nBytes )
|
||||||
{
|
{
|
||||||
if ( nBytes < HW_DC_SIZE )
|
if ( nBytes < HW_DC_SIZE )
|
||||||
@ -642,8 +617,7 @@ void osInvalidateICacheRangeOrAll( void* startAddr, u32 nBytes )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osLockdownICacheRange( void* startAddr, u32 nBytes )
|
||||||
ASM void osLockdownICacheRange( void* startAddr, u32 nBytes )
|
|
||||||
{
|
{
|
||||||
INASM_EXTERN( osDisableInterrupts )
|
INASM_EXTERN( osDisableInterrupts )
|
||||||
INASM_EXTERN( osRestoreInterrupts )
|
INASM_EXTERN( osRestoreInterrupts )
|
||||||
@ -693,8 +667,7 @@ LSYM(1)
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osUnlockdownICacheAll( void )
|
||||||
ASM void osUnlockdownICacheAll( void )
|
|
||||||
{
|
{
|
||||||
mov r3, #0
|
mov r3, #0
|
||||||
mcr p15, 0, r3, c9, c0, 1
|
mcr p15, 0, r3, c9, c0, 1
|
||||||
@ -710,8 +683,7 @@ ASM void osUnlockdownICacheAll( void )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osUnlockdownICache( u32 num )
|
||||||
ASM void osUnlockdownICache( u32 num )
|
|
||||||
{
|
{
|
||||||
mrc p15, 0, r3, c9, c0, 1
|
mrc p15, 0, r3, c9, c0, 1
|
||||||
and r3, r3, #HW_C9_LOCKDOWN_WAY_NO_MASK
|
and r3, r3, #HW_C9_LOCKDOWN_WAY_NO_MASK
|
||||||
@ -733,8 +705,7 @@ ASM void osUnlockdownICache( u32 num )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osPrefetchICacheRange( void* startAddr, u32 nBytes )
|
||||||
ASM void osPrefetchICacheRange( void* startAddr, u32 nBytes )
|
|
||||||
{
|
{
|
||||||
add r1, r1, r0
|
add r1, r1, r0
|
||||||
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
bic r0, r0, #HW_CACHE_LINE_SIZE - 1
|
||||||
@ -756,8 +727,7 @@ LSYM(1)
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateInstPrefetchBuffer( void )
|
||||||
ASM void osInvalidateInstPrefetchBuffer( void )
|
|
||||||
{
|
{
|
||||||
mov r3, #0
|
mov r3, #0
|
||||||
mcr p15, 0, r3, c7, c5, 4
|
mcr p15, 0, r3, c7, c5, 4
|
||||||
@ -773,7 +743,6 @@ ASM void osInvalidateInstPrefetchBuffer( void )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void osDoInstMemoryBarrierAll( void )
|
void osDoInstMemoryBarrierAll( void )
|
||||||
{
|
{
|
||||||
osStoreDCacheAll();
|
osStoreDCacheAll();
|
||||||
@ -793,7 +762,6 @@ void osDoInstMemoryBarrierAll( void )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void osDoInstMemoryBarrierRange( void* startAddr, u32 nBytes )
|
void osDoInstMemoryBarrierRange( void* startAddr, u32 nBytes )
|
||||||
{
|
{
|
||||||
osStoreDCacheRange( startAddr, nBytes );
|
osStoreDCacheRange( startAddr, nBytes );
|
||||||
@ -815,8 +783,7 @@ void osDoInstMemoryBarrierRange( void* startAddr, u32 nBytes )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateBCacheAll( void )
|
||||||
ASM void osInvalidateBCacheAll( void )
|
|
||||||
{
|
{
|
||||||
mov r3, #0
|
mov r3, #0
|
||||||
mcr p15, 0, r3, c7, c5, 6
|
mcr p15, 0, r3, c7, c5, 6
|
||||||
@ -833,8 +800,7 @@ ASM void osInvalidateBCacheAll( void )
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
asm void osInvalidateBCacheRange( void* startAddr, u32 nBytes )
|
||||||
ASM void osInvalidateBCacheRange( void* startAddr, u32 nBytes )
|
|
||||||
{
|
{
|
||||||
add r1, r1, r0
|
add r1, r1, r0
|
||||||
bic r0, r0, #1
|
bic r0, r0, #1
|
||||||
|
|||||||
@ -42,10 +42,15 @@ extern "C" {
|
|||||||
#include <brom/os/common/cache.h>
|
#include <brom/os/common/cache.h>
|
||||||
#include <brom/os/common/printf.h>
|
#include <brom/os/common/printf.h>
|
||||||
#include <brom/os/common/spinLock.h>
|
#include <brom/os/common/spinLock.h>
|
||||||
|
#include <brom/os/common/boot.h>
|
||||||
|
|
||||||
|
#ifdef SDK_ARM9
|
||||||
|
#include <brom/os/ARM9/protectionUnit.h>
|
||||||
|
#endif // SDK_ARM9
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
#include <brom/os/common/systemWork.h>
|
#include <brom/os/common/systemWork.h>
|
||||||
#include <brom/os/common/systemCall.h>
|
#include <brom/os/common/systemCall.h>
|
||||||
#include <brom/os/common/boot.h>
|
|
||||||
|
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
#include <brom/os/ARM9/protectionUnit.h>
|
#include <brom/os/ARM9/protectionUnit.h>
|
||||||
|
|||||||
268
trunk/bootrom/include/brom/os/ARM11/mmu.h
Normal file
268
trunk/bootrom/include/brom/os/ARM11/mmu.h
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - OS - include
|
||||||
|
File: mmu.h
|
||||||
|
|
||||||
|
Copyright 2009 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$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef BROM_OS_MMU_H_
|
||||||
|
#define BROM_OS_MMU_H_
|
||||||
|
|
||||||
|
#include <ctr/types.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// VA TO PA
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osGetPhysicalAddr
|
||||||
|
|
||||||
|
Description: Get physical address
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Physical address
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void* osGetPhysicalAddr( void* vaddr );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osGetMemRegionType
|
||||||
|
|
||||||
|
Description: Get memory region type
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Region type
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
u8 osGetMemRegionType( void* vaddr );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osGetMemRegionCacheAttr
|
||||||
|
|
||||||
|
Description: Get memory region cache attribute
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Region cache attribute
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
u8 osGetMemRegionCacheAttr( void* vaddr );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osIsMemRegionShareable
|
||||||
|
|
||||||
|
Description: Whether memory region is shareable or not
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Whether region is shareable or not
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osIsMemRegionShareable( void* vaddr );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osIsMemRegionAbort
|
||||||
|
|
||||||
|
Description: Whether memory region is abort or not
|
||||||
|
|
||||||
|
Arguments: Virtual address
|
||||||
|
|
||||||
|
Returns: Whether region is shareable or not
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osIsMemRegionAbort( void* vaddr );
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// INVALIDATE ALL TLB
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateTLBAll
|
||||||
|
|
||||||
|
Description: Invalidate all main/instruction/data TLBs
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateTLBAll( void );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateITLBAll
|
||||||
|
|
||||||
|
Description: Invalidate all instruction TLB
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateITLBAll( void );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateDTLBAll
|
||||||
|
|
||||||
|
Description: Invalidate all data TLB
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateDTLBAll( void );
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// INVALIDATE RANGE OF TLB
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateTLBRange
|
||||||
|
|
||||||
|
Description: Invalidate main/instruction/data TLBs in specified range
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateTLBRange( void* startAddr, u32 nBytes );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateITLBRange
|
||||||
|
|
||||||
|
Description: Invalidate instruction TLB in specified range
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateITLBRange( void* startAddr, u32 nBytes );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateDTLBRange
|
||||||
|
|
||||||
|
Description: Invalidate TLBs in specified range
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateDTLBRange( void* startAddr, u32 nBytes );
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// INVALIDATE ALL TLB With ASID
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateTLBAllWithASID
|
||||||
|
|
||||||
|
Description: Invalidate all main/instruction/data TLBs with ASID
|
||||||
|
|
||||||
|
Arguments: Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateTLBAllWithASID( u32 asID );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateITLBAllWithASID
|
||||||
|
|
||||||
|
Description: Invalidate all instruction TLB with ASID
|
||||||
|
|
||||||
|
Arguments: Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateITLBAllWithASID( u32 asID );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateDTLBAllWithASID
|
||||||
|
|
||||||
|
Description: Invalidate all data TLB with ASID
|
||||||
|
|
||||||
|
Arguments: Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateDTLBAllWithASID( u32 asID );
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// INVALIDATE RANGE OF TLB WITH ASID
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateTLBRangeWithASID
|
||||||
|
|
||||||
|
Description: Invalidate TLBs in specified rang with ASIDe
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
asID Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateTLBRangeWithASID( void* startAddr, u32 nBytes, u32 asID );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateITLBRangeWithASID
|
||||||
|
|
||||||
|
Description: Invalidate instruction TLB in specified range with ASID
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
asID Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateITLBRangeWithASID( void* startAddr, u32 nBytes, u32 asID );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInvalidateDTLBRangeWithASID
|
||||||
|
|
||||||
|
Description: Invalidate TLBs in specified range with ASID
|
||||||
|
|
||||||
|
Arguments: startAddr start address
|
||||||
|
nBytes size (in byte)
|
||||||
|
asID Application Space ID
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInvalidateDTLBRangeWithASID( void* startAddr, u32 nBytes, u32 asID );
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// LOCKDOWN TLB
|
||||||
|
//===========================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osStartTLBLockDown
|
||||||
|
|
||||||
|
Description: Start TLB Lockdown
|
||||||
|
|
||||||
|
Arguments: TLB ID (0-7)
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osStartTLBLockDown( u32 tlbID );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osEndTLBLockDown
|
||||||
|
|
||||||
|
Description: End TLB Lockdown
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osEndTLBLockDown( void );
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // BROM_OS_MMU_H_
|
||||||
68
trunk/bootrom/include/brom/os/ARM9/protectionUnit.h
Normal file
68
trunk/bootrom/include/brom/os/ARM9/protectionUnit.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - OS - include
|
||||||
|
File: protectionUnit.h
|
||||||
|
|
||||||
|
Copyright 2009 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$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef BROM_OS_PROTECTIONUNIT_H_
|
||||||
|
#define BROM_OS_PROTECTIONUNIT_H_
|
||||||
|
|
||||||
|
#include <brom/misc.h>
|
||||||
|
#include <brom/types.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// protection unit
|
||||||
|
//======================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osEnableProtectionUnit
|
||||||
|
|
||||||
|
Description: enable protection unit
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osEnableProtectionUnit(void);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osDisableProtectionUnit
|
||||||
|
|
||||||
|
Description: disable protection unit
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osDisableProtectionUnit(void);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osFinalizeProtectionUnit
|
||||||
|
|
||||||
|
Description: finalize protection unit
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void i_osFinalizeProtectionUnit( void );
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* BROM_OS_PROTECTIONUNIT_H_ */
|
||||||
|
#endif
|
||||||
55
trunk/bootrom/include/brom/os/common/boot.h
Normal file
55
trunk/bootrom/include/brom/os/common/boot.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - OS - include
|
||||||
|
File: boot.h
|
||||||
|
|
||||||
|
Copyright 2009 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$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef BROM_OS_BOOT_H_
|
||||||
|
#define BROM_OS_BOOT_H_
|
||||||
|
|
||||||
|
#include <brom/misc.h>
|
||||||
|
#include <brom/types.h>
|
||||||
|
#include <brom/memorymap.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osFinalize
|
||||||
|
|
||||||
|
Description: finalize
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void i_osFinalize(void);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osClearWorkArea
|
||||||
|
|
||||||
|
Description: clear work area
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void i_osClearWorkArea( void );
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* BROM_OS_BOOT_H_ */
|
||||||
|
#endif
|
||||||
@ -330,7 +330,6 @@ static inline void osCleanAndInvalidateDCacheRange( void *startAddr, u32 nBytes
|
|||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static inline void osPreloadDCacheRange( void *startAddr, u32 nBytes )
|
static inline void osPreloadDCacheRange( void *startAddr, u32 nBytes )
|
||||||
{
|
{
|
||||||
osTouchDCacheRange( startAddr, nBytes );
|
osTouchDCacheRange( startAddr, nBytes );
|
||||||
@ -345,7 +344,6 @@ static inline void osPreloadDCacheRange( void *startAddr, u32 nBytes )
|
|||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static inline void osDoDataMemoryBarrier( void )
|
static inline void osDoDataMemoryBarrier( void )
|
||||||
{
|
{
|
||||||
osKeepDataAccessOrder();
|
osKeepDataAccessOrder();
|
||||||
|
|||||||
@ -33,6 +33,10 @@ extern "C" {
|
|||||||
|
|
||||||
typedef u32 OSCpuCycle;
|
typedef u32 OSCpuCycle;
|
||||||
|
|
||||||
|
//---- entry point type
|
||||||
|
typedef void (*OSEntryPoint) (void);
|
||||||
|
|
||||||
|
|
||||||
#define OS_CPU_CLOCK HW_CPU_CLOCK
|
#define OS_CPU_CLOCK HW_CPU_CLOCK
|
||||||
|
|
||||||
//---- sec to cpu cycle
|
//---- sec to cpu cycle
|
||||||
@ -186,7 +190,6 @@ void osHalt(void);
|
|||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void osHaltUntilEvent( void );
|
void osHaltUntilEvent( void );
|
||||||
|
|
||||||
#endif // SDK_ARM11
|
#endif // SDK_ARM11
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user