スレッドライブラリ暫定版を追加。しかしデフォルトはディセーブルに。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@95 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
nakasima 2008-12-09 12:03:57 +00:00
parent 601d1952d8
commit 7404c14df9
30 changed files with 3777 additions and 188 deletions

View File

@ -18,5 +18,6 @@
void BromMain( void ) void BromMain( void )
{ {
osInitBROM();
} }

View File

@ -18,5 +18,6 @@
void BromSpMain( void ) void BromSpMain( void )
{ {
osInitBROM();
} }

View File

@ -18,5 +18,6 @@
void BromMain( void ) void BromMain( void )
{ {
osInitBROM();
} }

View File

@ -18,5 +18,6 @@
void BromSpMain( void ) void BromSpMain( void )
{ {
osInitBROM();
} }

View File

@ -240,7 +240,7 @@ LDEPENDS_RES += $(BROM_BUILDTOOLSDIR)/commondefs
ifeq ($(CODEGEN_PROC),ARM11) ifeq ($(CODEGEN_PROC),ARM11)
BROM_LIBS_BASE ?= \ BROM_LIBS_BASE ?= \
# libos \ libos \
ifdef BROM_PROFILE_TYPE ifdef BROM_PROFILE_TYPE
BROM_LIBS_BASE += libos.$(BROM_PROFILE_TYPE) BROM_LIBS_BASE += libos.$(BROM_PROFILE_TYPE)
@ -249,7 +249,7 @@ endif
else # ($(CODEGEN_PROC),ARM9) else # ($(CODEGEN_PROC),ARM9)
BROM_LIBS_BASE ?= \ BROM_LIBS_BASE ?= \
# libos_sp \ libos_sp \
ifdef BROM_PROFILE_TYPE ifdef BROM_PROFILE_TYPE
BROM_LIBS_BASE += libos_sp.$(BROM_PROFILE_TYPE) BROM_LIBS_BASE += libos_sp.$(BROM_PROFILE_TYPE)

View File

@ -22,6 +22,7 @@ include $(CTRBROM_ROOT)/build/buildtools/commondefs
SUBDIRS = \ SUBDIRS = \
init \ init \
os \
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------

View File

@ -28,14 +28,15 @@ BROM_CODEGEN_ALL ?= TRUE
SRCDIR = . ../common SRCDIR = . ../common
SRCS = \ SRCS = \
os_thread.c \
os_context.c \
os_init.c \
os_system.c \ os_system.c \
os_timer.c \ os_timer.c \
os_irqHandler.c \ os_irqHandler.c \
os_interrupt.c \ os_interrupt.c \
os_interrupt_common.c \ os_interrupt_common.c \
# os_init.c \
TARGET_LIB = libos$(BROM_LIBSUFFIX).a TARGET_LIB = libos$(BROM_LIBSUFFIX).a
include $(CTRBROM_ROOT)/build/buildtools/commondefs include $(CTRBROM_ROOT)/build/buildtools/commondefs

View File

@ -39,9 +39,10 @@ void osInitInterrupt( void )
(void)osDisableIrqAndFiq(); (void)osDisableIrqAndFiq();
osInitInterruptTable(); i_osInitInterruptTable();
*(u64*)HW_INTR_VENEER_BUF = *(u64*)i_osIrqVeneer; ((u32*)HW_INTR_VENEER_BUF)[0] = ((u32*)i_osIrqVeneer)[0];
((u32*)HW_INTR_VENEER_BUF)[1] = ((u32*)i_osIrqVeneer)[1];
{ {
u32 num = OS_INTR_ID_NUM; u32 num = OS_INTR_ID_NUM;

View File

@ -17,6 +17,8 @@
#include <brom/code32.h> #include <brom/code32.h>
#include <brom/os.h> #include <brom/os.h>
//#define BROM_ENABLE_THREAD
extern OSIntrFunction osIntrTable[OS_INTR_ID_NUM]; extern OSIntrFunction osIntrTable[OS_INTR_ID_NUM];
//---- thread queue for interrupt //---- thread queue for interrupt
@ -63,13 +65,17 @@ irq_return
ldr lr, =REG_CPUI_EOI_ADDR ldr lr, =REG_CPUI_EOI_ADDR
str r4, [lr] str r4, [lr]
#ifdef BROM_ENABLE_THREAD
bl osIrqHandler_ThreadSwitch bl osIrqHandler_ThreadSwitch
#endif // BROM_ENABLE_THREAD
my_undefined_interrupt_1 my_undefined_interrupt_1
ldmfd sp!, { lr } ldmfd sp!, { lr }
ldmfd sp!, { r0-r3,r12,pc } // return to interrupted address ldmfd sp!, { r0-r3,r12,pc } // return to interrupted address
} }
#ifdef BROM_ENABLE_THREAD
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_IRQHandler_ThreadSwitch Name: OS_IRQHandler_ThreadSwitch
@ -225,3 +231,4 @@ LSYM(13)
ldmfd sp!, { pc } // return to irq master handler ldmfd sp!, { pc } // return to irq master handler
} }
#endif // BROM_ENABLE_THREAD

View File

@ -31,6 +31,9 @@ BROM_PROC = ARM9
SRCDIR = . ../common SRCDIR = . ../common
SRCS = \ SRCS = \
os_thread.c \
os_context.c \
os_init.c \
os_system.c \ os_system.c \
os_timer.c \ os_timer.c \
os_tick.c \ os_tick.c \
@ -38,8 +41,6 @@ SRCS = \
os_interrupt.c \ os_interrupt.c \
os_interrupt_common.c \ os_interrupt_common.c \
# os_init.c \
TARGET_LIB = libos_sp$(BROM_LIBSUFFIX).a TARGET_LIB = libos_sp$(BROM_LIBSUFFIX).a

View File

@ -41,7 +41,8 @@ void osInitInterrupt( void )
i_osInitInterruptTable(); i_osInitInterruptTable();
*(u64*)HW_INTR_VENEER_BUF = *(u64*)i_osIrqVeneer; ((u32*)HW_INTR_VENEER_BUF)[0] = ((u32*)i_osIrqVeneer)[0];
((u32*)HW_INTR_VENEER_BUF)[1] = ((u32*)i_osIrqVeneer)[1];
reg_OS_IE = 0; reg_OS_IE = 0;
@ -387,7 +388,7 @@ void osWaitInterrupt( BOOL clear, OSIntrMask irqFlags )
while (!(osGetInterruptCheckFlag() & irqFlags)) while (!(osGetInterruptCheckFlag() & irqFlags))
{ {
i_osHalt(); osHalt();
(void)osEnableInterrupts(); (void)osEnableInterrupts();
(void)osDisableInterrupts(); (void)osDisableInterrupts();
} }

View File

@ -17,6 +17,7 @@
#include <brom/code32.h> #include <brom/code32.h>
#include <brom/os.h> #include <brom/os.h>
//#define BROM_ENABLE_THREAD
#ifdef SDK_ARM9 #ifdef SDK_ARM9
#include <brom/dtcm_begin.h> #include <brom/dtcm_begin.h>
@ -84,10 +85,20 @@ LSYM(1) clz r0, r1 // count zero of high bit
ldr r1, =osIntrTable ldr r1, =osIntrTable
ldr r0, [ r1, r0, LSL #2 ] ldr r0, [ r1, r0, LSL #2 ]
ldr lr, =osIrqHandler_ThreadSwitch adr lr, irq_return
bx r0 // set return address for thread rescheduling bx r0 // set return address for thread rescheduling
irq_return
#ifdef BROM_ENABLE_THREAD
bl osIrqHandler_ThreadSwitch
#endif // BROM_ENABLE_THREAD
ldmfd sp!, { lr }
ldmfd sp!, { r0-r3,r12,pc } // return to interrupted address
} }
#ifdef BROM_ENABLE_THREAD
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_IRQHandler_ThreadSwitch Name: OS_IRQHandler_ThreadSwitch
@ -244,6 +255,8 @@ LSYM(13)
ldmfd sp!, { pc } // return to irq master handler ldmfd sp!, { pc } // return to irq master handler
} }
#endif // BROM_ENABLE_THREAD
#ifdef SDK_ARM9 #ifdef SDK_ARM9
#include <brom/itcm_end.h> #include <brom/itcm_end.h>
#endif #endif

View File

@ -0,0 +1,240 @@
/*---------------------------------------------------------------------------*
Project: CtrBrom - libraries - OS
File: os_context.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/os.h>
#define osPrintf(...) ((void)0)
/*---------------------------------------------------------------------------*
Name: osInitContext
Description: Initialize context
Arguments: context context to be initialized
newpc program counter
newsp stack pointer
Returns: none
*---------------------------------------------------------------------------*/
#include <brom/code32.h>
asm void osInitContext(
register OSContext* context,
register u32 newpc,
register u32 newsp
)
{
#define context r0
#define newpc r1
#define newsp r2
// ---- 実行位置保存 (r0 = context)
add newpc, newpc, #4
str newpc, [ context, #OS_CONTEXT_PC_PLUS4 ]
// ---- スタック保存
#ifdef SDK_CONTEXT_HAS_SP_SVC
str newsp, [ context, #OS_CONTEXT_SP_SVC ]
sub newsp, newsp, #HW_BROM_SVC_STACK_SIZE
#endif
tst newsp, #4
subne newsp, newsp, #4 // for 8byte-alignment
str newsp, [ context, #OS_CONTEXT_SP ]
// ---- ステータス作成
ands r1, newpc, #1
movne r1, #HW_PSR_SYS_MODE|HW_PSR_THUMB_STATE
moveq r1, #HW_PSR_SYS_MODE|HW_PSR_ARM_STATE
str r1, [ context, #OS_CONTEXT_CPSR ]
// ---- 他のレジスタをクリア
mov r1, #0
str r1, [ context, #OS_CONTEXT_R0 ]
str r1, [ context, #OS_CONTEXT_R1 ]
str r1, [ context, #OS_CONTEXT_R2 ]
str r1, [ context, #OS_CONTEXT_R3 ]
str r1, [ context, #OS_CONTEXT_R4 ]
str r1, [ context, #OS_CONTEXT_R5 ]
str r1, [ context, #OS_CONTEXT_R6 ]
str r1, [ context, #OS_CONTEXT_R7 ]
str r1, [ context, #OS_CONTEXT_R8 ]
str r1, [ context, #OS_CONTEXT_R9 ]
str r1, [ context, #OS_CONTEXT_R10 ]
str r1, [ context, #OS_CONTEXT_R11 ]
str r1, [ context, #OS_CONTEXT_R12 ]
str r1, [ context, #OS_CONTEXT_LR ]
bx lr // start here and swicth arm/thumb mode
#undef context
#undef newpc
#undef newsp
}
#if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
#include <brom/itcm_begin.h>
#endif
/*---------------------------------------------------------------------------*
Name: osSaveContext
Description: Save current context into specified memory
Arguments: context pointer to the memory to be stored the current context
Returns: 0 saving a context (normal)
1 if context are reloaded via osLoadContext
*---------------------------------------------------------------------------*/
asm BOOL osSaveContext( register OSContext* context )
{
#if 0 // defined(SDK_ARM9)
stmfd sp!, { lr, r0 }
add r0, r0, #OS_CONTEXT_CP_CONTEXT
ldr r1, =CP_SaveContext
blx r1
ldmfd sp!, { lr, r0 }
#endif
add r1, r0, #OS_CONTEXT_CPSR
//---- Save CPSR
mrs r2, cpsr
str r2, [ r1 ], #OS_CONTEXT_R0-OS_CONTEXT_CPSR // r1 moved to context.r0
#ifdef SDK_CONTEXT_HAS_SP_SVC
//---- Save SP_svc
mov r0, #HW_PSR_SVC_MODE|HW_PSR_IRQ_DISABLE|HW_PSR_FIQ_DISABLE|HW_PSR_ARM_STATE
msr cpsr_c, r0
str sp, [ r1, #OS_CONTEXT_SP_SVC - OS_CONTEXT_R0 ]
msr cpsr_c, r2
#endif
//---- Save others
mov r0, #1 // return value via osLoadContext
stmia r1, {r0-r14} // save R0-R14
add r0, pc, #8 // set PC_plus4 to do ("bx lr" + 4)
str r0, [r1, #OS_CONTEXT_PC_PLUS4 - OS_CONTEXT_R0 ]
mov r0, #0 // regular return value
bx lr
}
#define OFFSETOF(x,y) (int)(&(((x*)0)->y))
/*---------------------------------------------------------------------------*
Name: osLoadContext
Description: Reload specified context as current context
Arguments: context pointer to the memory to switch to the context
Returns: None
*---------------------------------------------------------------------------*/
asm void osLoadContext( register OSContext* context )
{
#if OS_CONTEXT_CPSR != 0
#pragma message(has changed!!!)
add r0, r0, #OS_CONTEXT_CPSR
#endif
#if 0 // defined(SDK_ARM9)
// call CPi_RestoreContext
stmfd sp!, { lr, r0 }
add r0, r0, #OS_CONTEXT_CP_CONTEXT
ldr r1, =CPi_RestoreContext
blx r1
ldmfd sp!, { lr, r0 }
#endif
//---- モードを svc に
mrs r1, cpsr
bic r1, r1, #HW_PSR_CPU_MODE_MASK
orr r1, r1, #HW_PSR_SVC_MODE|HW_PSR_IRQ_DISABLE|HW_PSR_FIQ_DISABLE
msr cpsr_c, r1
//---- Load cpcr to spsr
ldr r1, [ r0 ], #OS_CONTEXT_R0-OS_CONTEXT_CPSR
msr spsr_fsxc, r1
#ifdef SDK_CONTEXT_HAS_SP_SVC
//---- Load SP_svc
ldr sp, [ r0, #OS_CONTEXT_SP_SVC - OS_CONTEXT_R0 ]
#endif
//---- Load r0-r14
ldr lr, [ r0, #OS_CONTEXT_PC_PLUS4 - OS_CONTEXT_R0 ]
ldmia r0, { r0 - r14 }^
nop
#if defined(SDK_ARM9)
#if 0 // don't need, because still spend more than 34 cycle for divider.
//---- CP_WaitDiv
stmfd sp!, { r0-r1 }
ldr r0, =REG_DIVCNT_ADDR
@00:
ldr r1, [r0]
and r1, r1, #REG_CP_DIVCNT_BUSY_MASK
bne @00
ldmfd sp!, { r0-r1 }
#endif
#endif
//---- Switch cpsr and Jump to (context->pc_plus4 - 4)
subs pc, lr, #4
}
#if defined(SDK_TCM_APPLY) && defined(SDK_ARM9)
#include <brom/itcm_end.h>
#endif
#include <brom/codereset.h>
/*---------------------------------------------------------------------------*
Name: osDumpContext
Description: Performs exception initialization.
- installs the first level exception handlers
- set up exception table and common exception handler
Arguments: installDBIntegrator if TRUE, copy OSDBIntegrator into
low memory.
Returns: None.
*---------------------------------------------------------------------------*/
void osDumpContext(OSContext *context)
{
#ifndef SDK_FINALROM
s32 i;
osPrintf("context=%08x\n", context);
if (context)
{
osPrintf("CPSR %08x\n", context->cpsr);
for (i = 0; i < 13; i++)
{
osPrintf("R%02d %08x\n", i, context->r[i]);
}
osPrintf("SP %08x\n", context->sp);
osPrintf("LR %08x\n", context->lr);
osPrintf("PC+4 %08x\n", context->pc_plus4);
#ifdef SDK_CONTEXT_HAS_SP_SVC
osPrintf("SPsvc %08x\n", context->sp_svc);
#endif
}
#else
(void)context; // avoiding to unused warning
#endif
}

View File

@ -17,7 +17,7 @@
#include <brom/os.h> #include <brom/os.h>
//#define BROM_DEBUG_ITCM //#define BROM_DEBUG_ITCM
#define FIRM_ENABLE_JTAG_AT_INIT //#define FIRM_ENABLE_JTAG_AT_INIT
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -41,7 +41,7 @@ void osInitBROM(void)
//---- Init Exception System //---- Init Exception System
// the exception vecter of ARM9 is in the noninitialized main memory. // the exception vecter of ARM9 is in the noninitialized main memory.
osInitException(); // osInitException();
#endif // SDK_ARM7 #endif // SDK_ARM7
@ -71,41 +71,9 @@ void osInit(void)
#endif // SDK_ARM7 #endif // SDK_ARM7
//---- Init Exception System //---- Init Exception System
osInitException(); // osInitException();
//---- Init Interrupt //---- Init Interrupt
osInitInterrupt(); osInitInterrupt();
} }
#ifdef SDK_ARM9
/*---------------------------------------------------------------------------*
Name: OSi_EnableCpuJTAG
Description: enable jtag of cpu
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void OSi_EnableCpuJTAG(void)
{
reg_CFG_CPU_JTAG = REG_CFG_CPU_JTAG_E_MASK | REG_CFG_CPU_JTAG_A7_MASK;
}
/*---------------------------------------------------------------------------*
Name: OSi_EnableDspJTAG
Description: enable jtag of dsp
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void OSi_EnableDspJTAG(void)
{
reg_CFG_DSP_JTAG = REG_CFG_DSP_JTAG_E_MASK;
}
#endif // SDK_ARM9

View File

@ -23,7 +23,7 @@
// PROCESSER MODE // PROCESSER MODE
//============================================================================ //============================================================================
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osGetProcMode Name: osGetProcMode
Description: Get processor mode from CPSR Description: Get processor mode from CPSR
@ -32,7 +32,7 @@
Returns: CPU processor mode (field 0x10-0x1f) Returns: CPU processor mode (field 0x10-0x1f)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <brom/code32.h> #include <brom/code32.h>
ASM OSProcMode i_osGetProcMode( void ) ASM OSProcMode osGetProcMode( void )
{ {
mrs r0, cpsr mrs r0, cpsr
and r0, r0, #HW_PSR_CPU_MODE_MASK and r0, r0, #HW_PSR_CPU_MODE_MASK
@ -68,7 +68,7 @@ LSYM(1)
// TERMINATE and HALT // TERMINATE and HALT
//============================================================================ //============================================================================
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osTerminate Name: osTerminate
Description: Halt CPU and loop Description: Halt CPU and loop
@ -76,17 +76,17 @@ LSYM(1)
Returns: -- (Never return) Returns: -- (Never return)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void i_osTerminate(void) void osTerminate(void)
{ {
while (1) while (1)
{ {
(void)osDisableInterrupts(); (void)osDisableInterrupts();
i_osHalt(); osHalt();
} }
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osHalt Name: osHalt
Description: Halt CPU Description: Halt CPU
@ -95,7 +95,7 @@ void i_osTerminate(void)
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <brom/code32.h> #include <brom/code32.h>
ASM void i_osHalt( void ) ASM void osHalt( void )
{ {
mov r0, #0 mov r0, #0
mcr p15, 0, r0, c7, c0, 4 mcr p15, 0, r0, c7, c0, 4
@ -104,7 +104,7 @@ ASM void i_osHalt( void )
#include <brom/codereset.h> #include <brom/codereset.h>
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osExit Name: osExit
Description: Display exit string and Terminate. Description: Display exit string and Terminate.
This is useful for 'loadrun' tool command. This is useful for 'loadrun' tool command.
@ -113,12 +113,12 @@ ASM void i_osHalt( void )
Returns: -- (Never return) Returns: -- (Never return)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void i_osExit(int status) void osExit(int status)
{ {
#ifdef SDK_FINALROM #ifdef SDK_FINALROM
#pragma unused( status ) #pragma unused( status )
#endif #endif
(void)osDisableInterrupts(); (void)osDisableInterrupts();
osTPrintf("\n" OS_EXIT_STRING, status); osTPrintf("\n" OS_EXIT_STRING, status);
i_osTerminate(); osTerminate();
} }

File diff suppressed because it is too large Load Diff

View File

@ -23,7 +23,8 @@
#include <ctr/arm_reg.h> #include <ctr/arm_reg.h>
#include <brom/init.h> #include <brom/init.h>
//#include <brom/os.h> #include <brom/os.h>
#include <brom/mi.h>
/* BROM_H_ */ /* BROM_H_ */
#endif #endif

View File

@ -0,0 +1,32 @@
/*---------------------------------------------------------------------------*
Project: CtrBrom - OS
File: mi.h
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$
*---------------------------------------------------------------------------*/
#ifndef BROM_MI_H_
#define BROM_MI_H_
#include <brom/mi/memory.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
} /* extern "C" */
#endif
/* BROM_MI_H_ */
#endif

View File

@ -0,0 +1,716 @@
/*---------------------------------------------------------------------------*
Project: CtrBrom - MI - include
File: memory.h
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$
*---------------------------------------------------------------------------*/
#ifndef BROM_MI_MEMORY_H_
#define BROM_MI_MEMORY_H_
#include <brom/misc.h>
#include <brom/types.h>
#ifdef __cplusplus
extern "C" {
#endif
//======================================================================
void MIi_CpuClear16(u16 data, void *destp, u32 size);
void MIi_CpuCopy16(const void *srcp, void *destp, u32 size);
void MIi_CpuSend16(const void *srcp, volatile void *destp, u32 size);
void MIi_CpuRecv16(volatile const void *srcp, void *destp, u32 size);
void MIi_CpuPipe16(volatile const void *srcp, volatile void *destp, u32 size);
void MIi_CpuMove16(const void *src, void *dest, u32 size);
void* MIi_CpuFind16(const void *src, u16 data, u32 size);
int MIi_CpuComp16(const void *mem1, const void *mem2, u32 size);
void MIi_CpuClear32(u32 data, void *destp, u32 size);
void MIi_CpuCopy32(const void *srcp, void *destp, u32 size);
void MIi_CpuSend32(const void *srcp, volatile void *destp, u32 size);
void MIi_CpuRecv32(volatile const void *srcp, void *destp, u32 size);
void MIi_CpuPipe32(volatile const void *srcp, volatile void *destp, u32 size);
void MIi_CpuMove32(const void *src, void *dest, u32 size);
void* MIi_CpuFind32(const void *src, u32 data, u32 size);
int MIi_CpuComp32(const void *mem1, const void *mem2, u32 size);
void MIi_CpuClearFast(u32 data, void *destp, u32 size);
void MIi_CpuCopyFast(const void *srcp, void *destp, u32 size);
void MIi_CpuSendFast(const void *srcp, volatile void *destp, u32 size);
void MIi_CpuRecvFast(volatile const void *srcp, void *destp, u32 size);
void MIi_CpuMoveFast(const void *src, void *dest, u32 size);
//================================================================================
// 32 bit version
//================================================================================
/*---------------------------------------------------------------------------*
Name: MI_CpuFill32
Description: fill memory with specified data. (32 bit version)
Arguments: dest : destination address to fill data, must be in 4 byte alignment
data : data to fill
size : size (byte), must be in 4 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuFill32(void *dest, u32 data, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuClear32(data, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuCopy32
Description: copy memory data (32 bit version)
Arguments: src : source address, must be in 4 byte alignment
dest : destination address, must be in 4 byte alignment
size : size (byte), must be in 4 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuCopy32(const void *src, void *dest, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuCopy32(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuClear32
Description: fill memory with 0 (32 bit version)
Arguments: dest : destination address, must be in 4 byte alignment
size : size (byte), must be in 4 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuClear32(void *dest, u32 size)
{
MI_CpuFill32(dest, 0, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuSend32
Description: write some data to fixed address (32 bit version)
Arguments: src : source address, must be in 4 byte alignment
dest : destination address, must be in 4 byte alignment
size : size (byte), must be in 4 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuSend32(const void *src, volatile void *dest, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuSend32(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuRecv32
Description: receive u32 data from fixed address
32bit version
Arguments: src : source address. not incremented
dest : data buffer to receive
size : size (byte)
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuRecv32(volatile const void *src, void *dest, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuRecv32(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuPipe32
Description: pipe data from fixed address to fixed address.
32bit version
Arguments: src : source address. not incremented
dest : destination address. not incremented
size : size (byte)
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuPipe32(volatile const void *src, volatile void *dest, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuPipe32(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuMove32
Description: move memory data (32 bit version)
Arguments: src : source address, must be in 4 byte alignment
dest : destination address, must be in 4 byte alignment
size : size (byte), must be in 4 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuMove32(const void *src, void *dest, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuMove32(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuFind32
Description: find memory data (32 bit version)
Arguments: src : source address, must be in 4 byte alignment
data : target data
size : size (byte), must be in 4 byte alignment
Returns: pointer to found data or NULL.
*---------------------------------------------------------------------------*/
static inline void* MI_CpuFind32(const void *src, u32 data, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
return MIi_CpuFind32(src, data, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuComp32
Description: compare memory data (32 bit version)
Arguments: mem1 : target address 1, must be in 4 byte alignment
mem2 : target address 2, must be in 4 byte alignment
size : size (byte), must be in 4 byte alignment
Returns: < 0 : mem1 smaller than mem2
= 0 : mem1 equals mem2
> 0 : mem1 larger than mem2
*---------------------------------------------------------------------------*/
static inline int MI_CpuComp32(const void *mem1, const void *mem2, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)mem1 & 3) == 0, "target address 1 must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)mem2 & 3) == 0, "target address 2 must be in 4-byte alignment");
return MIi_CpuComp32(mem1, mem2, size);
}
//================================================================================
// 16 bit version
//================================================================================
/*---------------------------------------------------------------------------*
Name: MI_CpuFill16
Description: fill memory with specified data. (16 bit version)
Arguments: dest : destination address to fill data, must be in 2 byte alignment
data : data to fill
size : size (byte), must be in 2 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuFill16(void *dest, u16 data, u32 size)
{
SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0");
SDK_ASSERTMSG(((u32)dest & 1) == 0, "source address must be in 2-byte alignment");
MIi_CpuClear16(data, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuCopy16
Description: copy memory data (16 bit version)
Arguments: src : source address, must be in 2 byte alignment
dest : destination address, must be in 2 byte alignment
size : size (byte), must be in 2 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuCopy16(const void *src, void *dest, u32 size)
{
SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0");
SDK_ASSERTMSG(((u32)src & 1) == 0, "source address must be in 2-byte alignment");
SDK_ASSERTMSG(((u32)dest & 1) == 0, "destination address must be in 2-byte alignment");
MIi_CpuCopy16(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuClear16
Description: fill memory with 0 (16 bit version)
Arguments: dest : destination address, must be in 2 byte alignment
size : size (byte), must be in 2 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuClear16(void *dest, u32 size)
{
MI_CpuFill16(dest, 0, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuSend16
Description: write some data to fixed address (16 bit version)
Arguments: src : source address, must be in 2 byte alignment
dest : destination address, must be in 4 byte alignment
size : size (byte), must be in 2 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuSend16(const void *src, volatile void *dest, u32 size)
{
SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0");
SDK_ASSERTMSG(((u32)src & 1) == 0, "source address must be in 2-byte alignment");
SDK_ASSERTMSG(((u32)dest & 1) == 0, "destination address must be in 2-byte alignment");
MIi_CpuSend16(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuRecv16
Description: receive u16 data from fixed address
16bit version
Arguments: src : source address. not incremented
dest : data buffer to receive
size : size (byte)
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuRecv16(volatile const void *src, void *dest, u32 size)
{
SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0");
SDK_ASSERTMSG(((u32)src & 1) == 0, "source address must be in 2-byte alignment");
SDK_ASSERTMSG(((u32)dest & 1) == 0, "destination address must be in 2-byte alignment");
MIi_CpuRecv16(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuRecv16
Description: pipe data from fixed address to fixed address.
16bit version
Arguments: src : source address. not incremented
dest : destination address. not incremented
size : size (byte)
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuPipe16(volatile const void *src, volatile void *dest, u32 size)
{
SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0");
SDK_ASSERTMSG(((u32)src & 1) == 0, "source address must be in 2-byte alignment");
SDK_ASSERTMSG(((u32)dest & 1) == 0, "destination address must be in 2-byte alignment");
MIi_CpuPipe16(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuMove16
Description: move memory data (16 bit version)
Arguments: src : source address, must be in 2 byte alignment
dest : destination address, must be in 2 byte alignment
size : size (byte), must be in 2 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuMove16(const void *src, void *dest, u32 size)
{
SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0");
SDK_ASSERTMSG(((u32)src & 1) == 0, "source address must be in 2-byte alignment");
SDK_ASSERTMSG(((u32)dest & 1) == 0, "destination address must be in 2-byte alignment");
MIi_CpuMove16(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuFind16
Description: find memory data (16 bit version)
Arguments: src : source address, must be in 2 byte alignment
data : target data
size : size (byte), must be in 2 byte alignment
Returns: pointer to found data or NULL.
*---------------------------------------------------------------------------*/
static inline void* MI_CpuFind16(const void *src, u16 data, u32 size)
{
SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0");
SDK_ASSERTMSG(((u32)src & 1) == 0, "source address must be in 2-byte alignment");
return MIi_CpuFind16(src, data, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuComp16
Description: compare memory data (16 bit version)
Arguments: mem1 : target address 1, must be in 2 byte alignment
mem2 : target address 2, must be in 2 byte alignment
size : size (byte), must be in 2 byte alignment
Returns: < 0 : mem1 smaller than mem2
= 0 : mem1 equals mem2
> 0 : mem1 larger than mem2
*---------------------------------------------------------------------------*/
static inline int MI_CpuComp16(const void *mem1, const void *mem2, u32 size)
{
SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0");
SDK_ASSERTMSG(((u32)mem1 & 1) == 0, "target address 1 must be in 2-byte alignment");
SDK_ASSERTMSG(((u32)mem2 & 1) == 0, "target address 2 must be in 2-byte alignment");
return MIi_CpuComp16(mem1, mem2, size);
}
//================================================================================
// 32 byte unit version
//================================================================================
/*---------------------------------------------------------------------------*
Name: MI_CpuFillFast
Description: fill memory with specified data quickly. (32 byte unit version)
Arguments: dest : destination address to fill data
data : data to fill
size : size (byte), must be in 4 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuFillFast(void *dest, u32 data, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "source address must be in 4-byte alignment");
MIi_CpuClearFast(data, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuCopyFast
Description: copy memory data quickly (32 byte unit version)
Arguments: src : source address, must be in 4 byte alignment
dest : destination address, must be in 4 byte alignment
size : size (byte), must be in 4 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuCopyFast(const void *src, void *dest, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuCopyFast(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuClearFast
Description: fill memory with 0 quickly (32 byte unit version)
Arguments: dest : destination address, must be in 4 byte alignment
size : size (byte), must be in 4-byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuClearFast(void *dest, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MI_CpuFillFast(dest, 0, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuSendFast
Description: move memory data (32 byte unit version)
Arguments: src : data stream to send
dest : destination address, not incremented
size : size (byte)
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuSendFast( register const void *src, register volatile void *dest, register u32 size )
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuSendFast(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuRecvFast
Description: move memory data (32 byte unit version)
Arguments: src : source address. not incremented
dest : data buffer to receive
size : size (byte)
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuRecvFast(volatile const void *src, register void *dest, register u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuRecvFast(src, dest, size);
}
/*---------------------------------------------------------------------------*
Name: MI_CpuMoveFast
Description: move memory data (32 byte unit version)
Arguments: src : source address, must be in 4 byte alignment
dest : destination address, must be in 4 byte alignment
size : size (byte), must be in 4 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuMoveFast(const void *src, void *dest, u32 size)
{
SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0");
SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment");
SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment");
MIi_CpuMoveFast(src, dest, size);
}
//================================================================================
// 8 bit version
//================================================================================
/*---------------------------------------------------------------------------*
Name: MI_CpuFill8
Description: fill memory with specified data. (8 bit version)
Arguments: dest : destination address to fill data, no limitation for alignment
data : data to fill
size : size (byte), no limitation for alignment
Returns: None
*---------------------------------------------------------------------------*/
void MI_CpuFill8(void *dest, u8 data, u32 size);
/*---------------------------------------------------------------------------*
Name: MI_CpuCopy8
Description: copy memory data (8 bit version)
Arguments: src : source address, no limitation for alignment
dest : destination address, no limitation for alignment
size : size (byte), no limitation for alignment
Returns: None
*---------------------------------------------------------------------------*/
void MI_CpuCopy8(const void *src, void *dest, u32 size);
/*---------------------------------------------------------------------------*
Name: MI_CpuFind8
Description: find memory data (8 bit version)
Arguments: src : source address, no limitation for alignment
data : target data
size : size (byte), no limitation for alignment
Returns: pointer to found data or NULL.
*---------------------------------------------------------------------------*/
void* MI_CpuFind8(const void *src, u8 data, u32 size);
/*---------------------------------------------------------------------------*
Name: MI_CpuComp8
Description: compare memory data (8 bit version)
Arguments: mem1 : target address 1, no limitation for alignment
mem2 : target address 2, no limitation for alignment
size : size (byte), no limitation for alignment
Returns: < 0 : mem1 smaller than mem2
= 0 : mem1 equals mem2
> 0 : mem1 larger than mem2
*---------------------------------------------------------------------------*/
int MI_CpuComp8(const void *mem1, const void *mem2, u32 size);
/*---------------------------------------------------------------------------*
Name: MI_CpuClear8
Description: fill memory with 0 (8 bit version)
Arguments: dest : destination address, no limitation for alignment
size : size (byte), no limitation for alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuClear8(void *dest, u32 size)
{
MI_CpuFill8(dest, 0, size);
}
//================================================================================
// 32 bit version
//================================================================================
/*---------------------------------------------------------------------------*
Name: MI_ReadWord
Description: read 32 bit data from specified address
Arguments: adrs : address to read
Returns: data which is read
*---------------------------------------------------------------------------*/
#ifndef SDK_ASM
#define MI_ReadWord( adrs ) (*(vu32 *)(adrs))
#endif
/*---------------------------------------------------------------------------*
Name: MI_WriteWord
Description: write 32 bit data to specified adress
Arguments: adrs : address to write
val : data to write
Returns: None
*---------------------------------------------------------------------------*/
#ifndef SDK_ASM
#define MI_WriteWord( adrs, val ) do { (*(vu32 *)(adrs)) = (u32)(val); } while(0)
#endif
//================================================================================
// mixed version
//================================================================================
/*---------------------------------------------------------------------------*
Name: MI_CpuFill
Description: fill memory with specified data. (mixed version)
Arguments: dest : destination address to fill data, no limitation for alignment
data : data to fill
size : size (byte), no limitation for alignment
Returns: None
*---------------------------------------------------------------------------*/
void MI_CpuFill(void *dest, u8 data, u32 size);
/*---------------------------------------------------------------------------*
Name: MI_CpuCopy
Description: copy memory data (mixed version)
Arguments: src : source address, no limitation for alignment
dest : destination address, no limitation for alignment
size : size (byte), no limitation for alignment
Returns: None
*---------------------------------------------------------------------------*/
void MI_CpuCopy(const void *srcp, void *destp, u32 size);
/*---------------------------------------------------------------------------*
Name: MI_CpuMove
Description: move memory data (mixed version)
Arguments: src : source address, must be in 4 byte alignment
dest : destination address, must be in 4 byte alignment
size : size (byte), must be in 4 byte alignment
Returns: None
*---------------------------------------------------------------------------*/
void MI_CpuMove(const void *srcp, void *destp, u32 size);
/*---------------------------------------------------------------------------*
Name: MI_CpuClear
Description: fill memory with 0 (mixed version)
Arguments: dest : destination address, no limitation for alignment
size : size (byte), no limitation for alignment
Returns: None
*---------------------------------------------------------------------------*/
static inline void MI_CpuClear(void *dest, u32 size)
{
MI_CpuFill(dest, 0, size);
}
//================================================================================
// the following functions are prepared for SDK private use.
// don't use in application thoughtlessly
//================================================================================
void MI_Copy16B(register const void *pSrc, register void *pDest);
void MI_Copy32B(register const void *pSrc, register void *pDest);
void MI_Copy36B(register const void *pSrc, register void *pDest);
void MI_Copy48B(register const void *pSrc, register void *pDest);
void MI_Copy64B(register const void *pSrc, register void *pDest);
void MI_Copy128B(register const void *pSrc, register void *pDest);
void MI_Zero32B(register void *pDest);
void MI_Zero36B(register void *pDest);
void MI_Zero48B(register void *pDest);
void MI_Zero64B(register void *pDest);
#ifdef __cplusplus
} /* extern "C" */
#endif
/* BROM_MI_MEMORY_H_ */
#endif

View File

@ -14,7 +14,6 @@
$Rev$ $Rev$
$Author$ $Author$
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifndef BROM_OS_H_ #ifndef BROM_OS_H_
#define BROM_OS_H_ #define BROM_OS_H_
@ -29,8 +28,12 @@ extern "C" {
#include <brom/init/crt0.h> #include <brom/init/crt0.h>
#include <brom/math.h> #include <brom/math.h>
#include <brom/mi.h>
#include <brom/os/common/system.h> #include <brom/os/common/system.h>
#include <brom/os/common/init.h> #include <brom/os/common/init.h>
#include <brom/os/common/tick.h>
#include <brom/os/common/alarm.h>
#include <brom/os/common/mutex.h>
#include <brom/os/common/thread.h> #include <brom/os/common/thread.h>
#ifdef SDK_ARM11 #ifdef SDK_ARM11
#include <brom/os/ARM11/interrupt.h> #include <brom/os/ARM11/interrupt.h>
@ -38,7 +41,6 @@ extern "C" {
#else // SDK_ARM9 #else // SDK_ARM9
#include <brom/os/ARM9/interrupt.h> #include <brom/os/ARM9/interrupt.h>
#include <brom/os/ARM9/timer.h> #include <brom/os/ARM9/timer.h>
#include <brom/os/ARM9/tick.h>
#endif // SDK_ARM9 #endif // SDK_ARM9
#if 0 #if 0
#include <brom/os/common/systemWork.h> #include <brom/os/common/systemWork.h>

View File

@ -0,0 +1,231 @@
/*---------------------------------------------------------------------------*
Project: CtrBrom - OS - include
File: alarm.h
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$
*---------------------------------------------------------------------------*/
#ifndef BROM_OS_ALARM_H_
#define BROM_OS_ALARM_H_
#include <brom/misc.h>
#include <brom/types.h>
#include <brom/os/common/thread.h>
#include <brom/os/common/tick.h>
#ifdef __cplusplus
extern "C" {
#endif
//--------------------------------------------------------------------------------
//---- Alarm Handler
typedef void (*OSAlarmHandler) (void *);
//---- struct of Alarm
//typedef struct OSiAlarm OSAlarm; // this is decleared in thread.h
struct OSiAlarm
{
OSAlarmHandler handler;
void *arg;
u32 tag;
OSTick fire;
OSAlarm *prev;
OSAlarm *next;
//---- for periodic alarm
OSTick period;
OSTick start;
};
//---- Alarm resource
typedef struct OSAlarmResource
{
int num;
}
OSAlarmResource;
//--------------------------------------------------------------------------------
/*---------------------------------------------------------------------------*
Name: osInitAlarm
Description: initalize alarm system
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
void osInitAlarm(void);
/*---------------------------------------------------------------------------*
Name: osEndAlarm
Description: end alarm system
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void osEndAlarm(void);
/*---------------------------------------------------------------------------*
Name: osIsAlarmAvailable
Description: check alarm system is available
Arguments: None
Returns: if available, TRUE.
*---------------------------------------------------------------------------*/
BOOL osIsAlarmAvailable(void);
/*---------------------------------------------------------------------------*
Name: osCreateAlarm
Description: Create alarm
Arguments: alarm pointer to alarm to be initialized
Returns: None.
*---------------------------------------------------------------------------*/
void osCreateAlarm(OSAlarm *alarm);
/*---------------------------------------------------------------------------*
Name: osSetAlarm
Description: Set alarm as a relative time
Arguments: alarm pointer to alarm to be set
tick ticks to count before firing
handler alarm handler to be called
arg argument of handler
Returns: None.
*---------------------------------------------------------------------------*/
void osSetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg);
/*---------------------------------------------------------------------------*
Name: osSetPeriodicAlarm
Description: set periodic alarm
Arguments: alarm pointer to alarm to be set
start origin of the period in absolute time
period ticks to count for each period
handler alarm handler to be called
arg argument of handler
Returns: None.
*---------------------------------------------------------------------------*/
void osSetPeriodicAlarm(OSAlarm *alarm, OSTick start, OSTick period, OSAlarmHandler handler,
void *arg);
/*---------------------------------------------------------------------------*
Name: osSetAlarmTag
Description: set tag which is used osCancelAlarms
Arguments: alarm alarm to be set tag
tag tagNo
Returns: None.
*---------------------------------------------------------------------------*/
void osSetAlarmTag(OSAlarm *alarm, u32 tag);
/*---------------------------------------------------------------------------*
Name: osCancelAlarm
Description: Cancel alarm
Arguments: alarm pointer to alarm to be canceled
Returns: None.
*---------------------------------------------------------------------------*/
void osCancelAlarm(OSAlarm *alarm);
/*---------------------------------------------------------------------------*
Name: osCancelAlarms
Description: cancel alarms which have specified tag
Arguments: tag tagNo. to be cancelled. not 0
Returns: None.
*---------------------------------------------------------------------------*/
void osCancelAlarms(u32 tag);
/*---------------------------------------------------------------------------*
Name: osCancelAllAlarms
Description: cancel all alarms
Arguments: None
Returns: None.
*---------------------------------------------------------------------------*/
void osCancelAllAlarms(void);
//================================================================================
// FOR DEBUG
//================================================================================
/*---------------------------------------------------------------------------*
Name: osGetNumberOfAlarm
Description: get number of alarm
Arguments: None
Returns: number of alarm
*---------------------------------------------------------------------------*/
int osGetNumberOfAlarm(void);
/*---------------------------------------------------------------------------*
Name: osGetAlarmResource
Description: store resources of alarm to specified pointer
Arguments: resource pointer to store alarm resources
Returns: TRUE ... success (always return this now)
FALSE ... fail
*---------------------------------------------------------------------------*/
BOOL osGetAlarmResource(OSAlarmResource *resource);
//================================================================================
// The following definitions or declarations are for internal use.
// Don't call these from use program.
struct OSiAlarmQueue
{
OSAlarm *head;
OSAlarm *tail;
};
struct OSiAlarmQueue *OSi_GetAlarmQueue(void);
#ifdef __cplusplus
} /* extern "C" */
#endif
/* BROM_OS_ALARM_H_ */
#endif

View File

@ -82,10 +82,10 @@ OSContext;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void OS_InitContext(OSContext *context, u32 newpc, u32 newsp); void osInitContext(OSContext *context, u32 newpc, u32 newsp);
BOOL OS_SaveContext(OSContext *context); BOOL osSaveContext(OSContext *context);
void OS_LoadContext(OSContext *context); void osLoadContext(OSContext *context);
void OS_DumpContext(OSContext *context); void osDumpContext(OSContext *context);
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */

View File

@ -17,13 +17,23 @@
#ifndef BROM_OS_INIT_H_ #ifndef BROM_OS_INIT_H_
#define BROM_OS_INIT_H_ #define BROM_OS_INIT_H_
#include <brom/misc.h>
#include <brom/types.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include <brom/misc.h> /*---------------------------------------------------------------------------*
#include <brom/types.h> Name: osInitBROM
Description: initialize sdk os for bootrom
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void osInitBROM(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: osInit Name: osInit

View File

@ -57,7 +57,7 @@ typedef void (*OSIntrFunction) (void);
//IRQ void osInterruptHandler( void ); //IRQ void osInterruptHandler( void );
void osInterruptHandler( void ); void osInterruptHandler( void );
void osInitInterruptTable( void ); void i_osInitInterruptTable( void );
OSIntrMode osEnableIrq( void ); OSIntrMode osEnableIrq( void );
OSIntrMode osDisableIrq( void ); OSIntrMode osDisableIrq( void );

View File

@ -0,0 +1,275 @@
/*---------------------------------------------------------------------------*
Project: CtrBrom - OS - include
File: mutex.h
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$
*---------------------------------------------------------------------------*/
#ifndef BROM_OS_MUTEX_H_
#define BROM_OS_MUTEX_H_
#include <brom/misc.h>
#include <brom/types.h>
#include <brom/os/common/thread.h>
#ifdef __cplusplus
extern "C" {
#endif
//----------------------------------------------------------------
//---- mutex type
#define OSi_MUTEX_TYPE_SHIFT 24
#define OSi_MUTEX_TYPE_MASK (0xff << OSi_MUTEX_TYPE_SHIFT)
#define OS_MUTEX_TYPE_NONE (0x00 << OSi_MUTEX_TYPE_SHIFT)
#define OS_MUTEX_TYPE_STD (0x10 << OSi_MUTEX_TYPE_SHIFT)
#define OS_MUTEX_TYPE_R (0x20 << OSi_MUTEX_TYPE_SHIFT)
#define OS_MUTEX_TYPE_W (0x30 << OSi_MUTEX_TYPE_SHIFT)
#define OSi_MUTEX_COUNT_MASK 0xffffff
#ifndef SDK_THREAD_INFINITY
typedef struct OSMutex OSMutex;
#endif
//#pragma warn_padding off
struct OSMutex
{
OSThreadQueue queue;
OSThread *thread; // current owner
s32 count; // lock count (notice: use upper 1byte as mutex type)
#ifndef SDK_THREAD_INFINITY
OSMutex *prev; // link for OSThread.queueMutex
OSMutex *next; // link for OSThread.queueMutex
#else
OSMutexLink link;
#endif
};
//#pragma warn_padding reset
static inline void OS_SetMutexCount( OSMutex* mutex, s32 count )
{
mutex->count = (s32)( (mutex->count & OSi_MUTEX_TYPE_MASK) | (count & OSi_MUTEX_COUNT_MASK) );
}
static inline s32 OS_GetMutexCount( OSMutex* mutex )
{
return (s32)( mutex->count & OSi_MUTEX_COUNT_MASK);
}
static inline void OS_IncreaseMutexCount( OSMutex* mutex )
{
u32 type = (u32)(mutex->count & OSi_MUTEX_TYPE_MASK);
mutex->count ++;
mutex->count = (s32)( type | (mutex->count & OSi_MUTEX_COUNT_MASK) );
}
static inline void OS_DecreaseMutexCount( OSMutex* mutex )
{
u32 type = (u32)(mutex->count & OSi_MUTEX_TYPE_MASK);
mutex->count --;
mutex->count = (s32)( type | (mutex->count & OSi_MUTEX_COUNT_MASK) );
}
static inline void OS_SetMutexType( OSMutex* mutex, u32 type )
{
mutex->count = (s32)( type | (mutex->count & OSi_MUTEX_COUNT_MASK) );
}
static inline u32 OS_GetMutexType( OSMutex* mutex )
{
return (u32)( mutex->count & OSi_MUTEX_TYPE_MASK );
}
/*---------------------------------------------------------------------------*
Name: OS_InitMutex
Description: initialize mutex
Arguments: mutex pointer to mutex structure
to be initialized
Returns: None
*---------------------------------------------------------------------------*/
void OS_InitMutex(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_LockMutex
Description: lock mutex
Arguments: mutex pointer to mutex structure
Returns: None
*---------------------------------------------------------------------------*/
void OS_LockMutex(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_UnlockMutex
Description: unlock mutex
Arguments: mutex pointer to mutex structure
Returns: None
*---------------------------------------------------------------------------*/
void OS_UnlockMutex(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_TryLockMutex
Description: try to lock mutex
Arguments: mutex pointer to mutex structure
Returns: True if lock
*---------------------------------------------------------------------------*/
BOOL OS_TryLockMutex(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OSi_UnlockAllMutex
Description: unlocks all the mutexes locked by the thread
Arguments: mutex pointer to mutex structure
Returns: None.
*---------------------------------------------------------------------------*/
void OSi_UnlockAllMutex(OSThread *thread);
/*---------------------------------------------------------------------------*
Name: OS_LockMutexR
Description: lock RW mutex as READ access
Arguments: mutex pointer to RW mutex structure
Returns: None
*---------------------------------------------------------------------------*/
void OS_LockMutexR(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_LockMutexW
Description: lock RW mutex as WRITE access
Arguments: mutex pointer to RW mutex structure
Returns: None
*---------------------------------------------------------------------------*/
void OS_LockMutexW(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_TryLockMutexR
Description: try to lock RW mutex as READ access
Arguments: mutex pointer to RW mutex structure
Returns: TRUE if locked
*---------------------------------------------------------------------------*/
BOOL OS_TryLockMutexR(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_TryLockMutexW
Description: try to lock RW mutex as WRITE access
Arguments: mutex pointer to RW mutex structure
Returns: TRUE if locked
*---------------------------------------------------------------------------*/
BOOL OS_TryLockMutexW(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_UnlockMutexR
Description: unlock mutex locked as READ access
Arguments: mutex pointer to mutex structure
Returns: None
*---------------------------------------------------------------------------*/
void OS_UnlockMutexR(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_UnlockMutexW
Description: unlock mutex locked as WRITE access
Arguments: mutex pointer to mutex structure
Returns: None
*---------------------------------------------------------------------------*/
void OS_UnlockMutexW(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_UnlockMutexRW
Description: unlock mutex locked as READ/WRITE access
Arguments: mutex pointer to mutex structure
Returns: None
*---------------------------------------------------------------------------*/
void OS_UnlockMutexRW(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_LockMutexFromRToW
Description: Promote mutexR lock to mutexW lock without unlock.
Wait till success.
Arguments: mutex pointer to mutex structure
Returns: None
*---------------------------------------------------------------------------*/
void OS_LockMutexFromRToW(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_TryLockMutexFromRToW
Description: Try to promote mutexR lock to mutexW lock without unlock.
Arguments: mutex pointer to mutex structure
Returns: TRUE if success
*---------------------------------------------------------------------------*/
BOOL OS_TryLockMutexFromRToW(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_LockMutexFromWToR
Description: Demote mutexW lock to mutexR lock without unlock.
Wait till success.
Arguments: mutex pointer to mutex structure
Returns: None
*---------------------------------------------------------------------------*/
void OS_LockMutexFromWToR(OSMutex *mutex);
/*---------------------------------------------------------------------------*
Name: OS_TryLockMutexFromWToR
Description: Try to demote mutexW lock to mutexR lock without unlock.
Arguments: mutex pointer to mutex structure
Returns: TRUE if success
*---------------------------------------------------------------------------*/
BOOL OS_TryLockMutexFromWToR(OSMutex *mutex);
#ifdef __cplusplus
} /* extern "C" */
#endif
/* BROM_OS_MUTEX_H_ */
#endif

View File

@ -22,10 +22,8 @@
#endif #endif
#include <ctr/arm_reg.h> #include <ctr/arm_reg.h>
#ifdef SDK_ARM11 #include <brom/os/common/tick.h>
#else // SDK_ARM9
#include <brom/os/ARM9/tick.h>
#endif //SDK_ARM9
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -126,7 +124,7 @@ static inline u32 i_osCpuCycleToNSec( OSCpuCycle cyc )
// PROCESSER MODE // PROCESSER MODE
//============================================================================ //============================================================================
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osGetProcMode Name: osGetProcMode
Description: Get processor mode from CPSR Description: Get processor mode from CPSR
@ -134,7 +132,7 @@ static inline u32 i_osCpuCycleToNSec( OSCpuCycle cyc )
Returns: CPU processor mode (field 0x10-0x1f) Returns: CPU processor mode (field 0x10-0x1f)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
OSProcMode i_osGetProcMode(void); OSProcMode osGetProcMode(void);
//============================================================================ //============================================================================
// WAIT // WAIT
@ -156,7 +154,7 @@ void i_osWaitCpuCycles( OSCpuCycle cycle );
// TERMINATE and HALT // TERMINATE and HALT
//============================================================================ //============================================================================
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osTerminate Name: osTerminate
Description: Halt CPU and loop Description: Halt CPU and loop
@ -164,10 +162,10 @@ void i_osWaitCpuCycles( OSCpuCycle cycle );
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
extern void i_osTerminate(void); extern void osTerminate(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osHalt Name: osHalt
Description: Halt CPU Description: Halt CPU
@ -175,10 +173,10 @@ extern void i_osTerminate(void);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
extern void i_osHalt(void); extern void osHalt(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: i_osExit Name: osExit
Description: Display exit string and Terminate. Description: Display exit string and Terminate.
This is useful for 'loadrun' tool command. This is useful for 'loadrun' tool command.
@ -187,7 +185,7 @@ extern void i_osHalt(void);
Returns: -- (Never return) Returns: -- (Never return)
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
extern void i_osExit(int status); extern void osExit(int status);
#endif /* SDK_ASM */ #endif /* SDK_ASM */

View File

@ -42,7 +42,7 @@ extern "C" {
#define OS_THREAD_MAX_NUM 16 // changed 8 to 16 (2004/5/26) #define OS_THREAD_MAX_NUM 16 // changed 8 to 16 (2004/5/26)
#endif #endif
//---- priority of thread that calls OS_InitThread() //---- priority of thread that calls osInitThread()
#define OS_THREAD_LAUNCHER_PRIORITY 16 #define OS_THREAD_LAUNCHER_PRIORITY 16
//---- range of thread priority //---- range of thread priority
@ -216,6 +216,13 @@ OSStackStatus;
//---------------- thread switch callback //---------------- thread switch callback
typedef void (*OSSwitchThreadCallback) (OSThread *from, OSThread *to); typedef void (*OSSwitchThreadCallback) (OSThread *from, OSThread *to);
//---------------- thread resource
typedef struct OSThreadResource
{
int num;
}
OSThreadResource;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
//---- private function ( don't use these OSi_* function ) //---- private function ( don't use these OSi_* function )
void OSi_CheckStack(const char *file, int line, const OSThread *thread); void OSi_CheckStack(const char *file, int line, const OSThread *thread);
@ -224,7 +231,7 @@ u32 OSi_GetCurrentStackPointer(void);
OSThread *OSi_GetIdleThread(void); OSThread *OSi_GetIdleThread(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_InitThread Name: osInitThread
Description: Initialize Thread System Description: Initialize Thread System
@ -232,10 +239,10 @@ OSThread *OSi_GetIdleThread(void);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_InitThread(void); void osInitThread(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_IsThreadAvailable Name: osIsThreadAvailable
Description: check if thread system is available Description: check if thread system is available
@ -243,10 +250,10 @@ void OS_InitThread(void);
Returns: TRUE if available, FALSE if not Returns: TRUE if available, FALSE if not
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL OS_IsThreadAvailable(void); BOOL osIsThreadAvailable(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_CreateThread Name: osCreateThread
Description: Create a new Thread Description: Create a new Thread
@ -259,12 +266,12 @@ BOOL OS_IsThreadAvailable(void);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_CreateThread(OSThread *thread, void osCreateThread(OSThread *thread,
void (*func) (void *), void *arg, void *stack, u32 stackSize, u32 prio); void (*func) (void *), void *arg, void *stack, u32 stackSize, u32 prio);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_ExitThread Name: osExitThread
Description: Exit thread Description: Exit thread
@ -272,11 +279,11 @@ void OS_CreateThread(OSThread *thread,
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_ExitThread(void); void osExitThread(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_DestroyThread Name: osDestroyThread
Description: destroy specified thread. Description: destroy specified thread.
@ -284,11 +291,11 @@ void OS_ExitThread(void);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_DestroyThread(OSThread *thread); void osDestroyThread(OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_KillThread Name: osKillThread
Description: switch PC to thread destructor to finalize thread Description: switch PC to thread destructor to finalize thread
@ -298,13 +305,13 @@ void OS_DestroyThread(OSThread *thread);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifdef SDK_THREAD_INFINITY #ifdef SDK_THREAD_INFINITY
void OS_KillThread(OSThread *thread, void *arg); void osKillThread(OSThread *thread, void *arg);
void OS_KillThreadWithPriority(OSThread *thread, void *arg, u32 prio); void osKillThreadWithPriority(OSThread *thread, void *arg, u32 prio);
#endif #endif
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_JoinThread Name: osJoinThread
Description: wait for specified thread to terminated Description: wait for specified thread to terminated
@ -312,11 +319,11 @@ void OS_KillThreadWithPriority(OSThread *thread, void *arg, u32 prio);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_JoinThread(OSThread *thread); void osJoinThread(OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_IsThreadTeminated Name: osIsThreadTeminated
Description: check thread status whether it's terminated Description: check thread status whether it's terminated
@ -324,11 +331,11 @@ void OS_JoinThread(OSThread *thread);
Returns: TRUE if the thread is terminated. FALSE if not Returns: TRUE if the thread is terminated. FALSE if not
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL OS_IsThreadTerminated(const OSThread *thread); BOOL osIsThreadTerminated(const OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_SelectThread Name: osSelectThread
Description: Select thread to execute Description: Select thread to execute
@ -336,11 +343,11 @@ BOOL OS_IsThreadTerminated(const OSThread *thread);
Returns: thread to execute Returns: thread to execute
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
OSThread *OS_SelectThread(void); OSThread *osSelectThread(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_RescheduleThread Name: osRescheduleThread
Description: do rescheduling threads Description: do rescheduling threads
@ -348,10 +355,10 @@ OSThread *OS_SelectThread(void);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_RescheduleThread(void); void osRescheduleThread(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_YieldThread Name: osYieldThread
Description: do thread rescheduling. current thread relinquish CPU Description: do thread rescheduling. current thread relinquish CPU
to give chance of running to other threads which has same to give chance of running to other threads which has same
@ -361,11 +368,11 @@ void OS_RescheduleThread(void);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
extern void OS_YieldThread(void); extern void osYieldThread(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_SleepThread Name: osSleepThread
Description: sleep current thread Description: sleep current thread
@ -373,11 +380,11 @@ extern void OS_YieldThread(void);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_SleepThread(OSThreadQueue *queue); void osSleepThread(OSThreadQueue *queue);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_WakeupThread Name: osWakeupThread
Description: wake up threads by queue Description: wake up threads by queue
@ -385,11 +392,11 @@ void OS_SleepThread(OSThreadQueue *queue);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_WakeupThread(OSThreadQueue *queue); void osWakeupThread(OSThreadQueue *queue);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_WakeupThreadDirect Name: osWakeupThreadDirect
Description: wake up thread by specifying thread directly Description: wake up thread by specifying thread directly
@ -397,11 +404,11 @@ void OS_WakeupThread(OSThreadQueue *queue);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_WakeupThreadDirect(OSThread *thread); void osWakeupThreadDirect(OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_DumpThreadList Name: osDumpThreadList
Description: Dump All Thread Infomation (for DEBUG) Description: Dump All Thread Infomation (for DEBUG)
@ -409,11 +416,11 @@ void OS_WakeupThreadDirect(OSThread *thread);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_DumpThreadList(void); void osDumpThreadList(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetNumberOfThread Name: osGetNumberOfThread
Description: Get number of thread which exists in system Description: Get number of thread which exists in system
@ -421,11 +428,11 @@ void OS_DumpThreadList(void);
Returns: number of thread which exists in system Returns: number of thread which exists in system
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
int OS_GetNumberOfThread(void); int osGetNumberOfThread(void);
/*==== static inlie functions ====*/ /*==== static inlie functions ====*/
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetThreadInfo Name: osGetThreadInfo
Description: Get pointer of system thread info structure. Description: Get pointer of system thread info structure.
@ -435,13 +442,13 @@ int OS_GetNumberOfThread(void);
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
extern OSThreadInfo OSi_ThreadInfo; extern OSThreadInfo OSi_ThreadInfo;
static inline OSThreadInfo *OS_GetThreadInfo(void) static inline OSThreadInfo *osGetThreadInfo(void)
{ {
return &OSi_ThreadInfo; return &OSi_ThreadInfo;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetMaxThreadId Name: osGetMaxThreadId
Description: Gets Max id number of available thread number Description: Gets Max id number of available thread number
@ -449,17 +456,17 @@ static inline OSThreadInfo *OS_GetThreadInfo(void)
Returns: Max id of available thread number Returns: Max id of available thread number
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline u32 OS_GetMaxThreadId(void) static inline u32 osGetMaxThreadId(void)
{ {
#ifndef SDK_THREAD_INFINITY #ifndef SDK_THREAD_INFINITY
return OS_GetThreadInfo()->max_entry; return osGetThreadInfo()->max_entry;
#else #else
return 0x7fffffff; // (=maximin number of int) return 0x7fffffff; // (=maximin number of int)
#endif #endif
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetThread Name: osGetThread
Description: Gets pointer to thread which id is specified Description: Gets pointer to thread which id is specified
@ -468,17 +475,17 @@ static inline u32 OS_GetMaxThreadId(void)
Returns: pointer to thread which id is specified Returns: pointer to thread which id is specified
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifndef SDK_THREAD_INFINITY #ifndef SDK_THREAD_INFINITY
static inline OSThread *OS_GetThread(u32 id) static inline OSThread *osGetThread(u32 id)
{ {
SDK_ASSERTMSG(id < OS_THREAD_MAX_NUM, "Thread id illegal\n"); SDK_ASSERTMSG(id < OS_THREAD_MAX_NUM, "Thread id illegal\n");
return OS_GetThreadInfo()->entry[id]; return osGetThreadInfo()->entry[id];
} }
#else #else
extern OSThread *OS_GetThread(u32 id); extern OSThread *osGetThread(u32 id);
#endif #endif
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetThreadId Name: osGetThreadId
Description: Gets id of specified thread Description: Gets id of specified thread
@ -486,14 +493,14 @@ extern OSThread *OS_GetThread(u32 id);
Returns: id of specified thread Returns: id of specified thread
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline u32 OS_GetThreadId(const OSThread *thread) static inline u32 osGetThreadId(const OSThread *thread)
{ {
SDK_ASSERTMSG(thread, "null thread pointer."); SDK_ASSERTMSG(thread, "null thread pointer.");
return thread->id; return thread->id;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetThreadState Name: osGetThreadState
Description: Gets state of specified thread Description: Gets state of specified thread
@ -501,14 +508,14 @@ static inline u32 OS_GetThreadId(const OSThread *thread)
Returns: state of specified thead Returns: state of specified thead
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline OSThreadState OS_GetThreadState(const OSThread *thread) static inline OSThreadState osGetThreadState(const OSThread *thread)
{ {
SDK_ASSERTMSG(thread, "null thread pointer."); SDK_ASSERTMSG(thread, "null thread pointer.");
return thread->state; return thread->state;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetThreadContext Name: osGetThreadContext
Description: Gets pointer to context of specified thread Description: Gets pointer to context of specified thread
@ -516,14 +523,14 @@ static inline OSThreadState OS_GetThreadState(const OSThread *thread)
Returns: pointer to context of specified thread Returns: pointer to context of specified thread
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline OSContext *OS_GetThreadContext(const OSThread *thread) static inline OSContext *osGetThreadContext(const OSThread *thread)
{ {
SDK_ASSERTMSG(thread, "null thread pointer."); SDK_ASSERTMSG(thread, "null thread pointer.");
return (OSContext *)&thread->context; return (OSContext *)&thread->context;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_IsThreadRunnable Name: osIsThreadRunnable
Description: Check if thread is runnable Description: Check if thread is runnable
@ -531,13 +538,13 @@ static inline OSContext *OS_GetThreadContext(const OSThread *thread)
Returns: non zero if thread is runnable Returns: non zero if thread is runnable
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline BOOL OS_IsThreadRunnable(const OSThread *thread) static inline BOOL osIsThreadRunnable(const OSThread *thread)
{ {
return thread->state == OS_THREAD_STATE_READY; return thread->state == OS_THREAD_STATE_READY;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_InitThreadQueue Name: osInitThreadQueue
Description: Initialize thread queue Description: Initialize thread queue
@ -545,7 +552,7 @@ static inline BOOL OS_IsThreadRunnable(const OSThread *thread)
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline void OS_InitThreadQueue(OSThreadQueue *queue) static inline void osInitThreadQueue(OSThreadQueue *queue)
{ {
#ifndef SDK_THREAD_INFINITY #ifndef SDK_THREAD_INFINITY
*queue = 0; *queue = 0;
@ -555,7 +562,7 @@ static inline void OS_InitThreadQueue(OSThreadQueue *queue)
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetCurrentThread Name: osGetCurrentThread
Description: Gets pointer to the current thread Description: Gets pointer to the current thread
@ -563,13 +570,13 @@ static inline void OS_InitThreadQueue(OSThreadQueue *queue)
Returns: Pointer to the current thread Returns: Pointer to the current thread
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline OSThread *OS_GetCurrentThread(void) static inline OSThread *osGetCurrentThread(void)
{ {
return OS_GetThreadInfo()->current; return osGetThreadInfo()->current;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_SetCurrentThread Name: osSetCurrentThread
Description: Saves pointer to the current thread Description: Saves pointer to the current thread
@ -577,14 +584,14 @@ static inline OSThread *OS_GetCurrentThread(void)
Returns: Pointer to the current thread Returns: Pointer to the current thread
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline void OS_SetCurrentThread(OSThread *thread) static inline void osSetCurrentThread(OSThread *thread)
{ {
OS_GetThreadInfo()->current = thread; osGetThreadInfo()->current = thread;
} }
/*==== stack check ====*/ /*==== stack check ====*/
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_SetThreadStackWarningOffset Name: osSetThreadStackWarningOffset
Description: Set warning level for stack checker Description: Set warning level for stack checker
@ -593,11 +600,11 @@ static inline void OS_SetCurrentThread(OSThread *thread)
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_SetThreadStackWarningOffset(OSThread *thread, u32 offset); void osSetThreadStackWarningOffset(OSThread *thread, u32 offset);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetStackStatus Name: osGetStackStatus
Description: check thread stack. check each CheckNUM. Description: check thread stack. check each CheckNUM.
return result. return result.
@ -609,10 +616,10 @@ void OS_SetThreadStackWarningOffset(OSThread *thread, u32 offset);
OS_STACK_ABOUT_TO_OVERFLOW about to overflow OS_STACK_ABOUT_TO_OVERFLOW about to overflow
OS_STACK_UNDERFLOW underflow OS_STACK_UNDERFLOW underflow
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
OSStackStatus OS_GetStackStatus(const OSThread *thread); OSStackStatus osGetStackStatus(const OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_CheckStack Name: osCheckStack
Description: check thread stack. check each CheckNum. Description: check thread stack. check each CheckNum.
if changed, display warning and halt. if changed, display warning and halt.
@ -623,13 +630,13 @@ OSStackStatus OS_GetStackStatus(const OSThread *thread);
( if error occurred, never return ) ( if error occurred, never return )
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#if !defined(SDK_FINALROM) && !defined(SDK_NO_MESSAGE) #if !defined(SDK_FINALROM) && !defined(SDK_NO_MESSAGE)
#define OS_CheckStack( thread ) OSi_CheckStack( __FILE__, __LINE__, (const OSThread*)thread ); #define osCheckStack( thread ) OSi_CheckStack( __FILE__, __LINE__, (const OSThread*)thread );
#else #else
#define OS_CheckStack( thread ) ((void)0) #define osCheckStack( thread ) ((void)0)
#endif #endif
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_SetThreadPriority Name: osSetThreadPriority
Description: change priority of thread Description: change priority of thread
@ -638,11 +645,11 @@ OSStackStatus OS_GetStackStatus(const OSThread *thread);
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL OS_SetThreadPriority(OSThread *thread, u32 prio); BOOL osSetThreadPriority(OSThread *thread, u32 prio);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetThreadPriority Name: osGetThreadPriority
Description: get priority of thread Description: get priority of thread
@ -650,11 +657,11 @@ BOOL OS_SetThreadPriority(OSThread *thread, u32 prio);
Returns: priority Returns: priority
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
u32 OS_GetThreadPriority(const OSThread *thread); u32 osGetThreadPriority(const OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_Sleep Name: osSleep
Description: sleep specified period Description: sleep specified period
@ -662,11 +669,11 @@ u32 OS_GetThreadPriority(const OSThread *thread);
Returns: None. Returns: None.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_Sleep(u32 msec); void osSleep(u32 msec);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_SetSwitchThreadCallback Name: osSetSwitchThreadCallback
Description: set callback called at switching thread Description: set callback called at switching thread
@ -674,13 +681,13 @@ void OS_Sleep(u32 msec);
Returns: previous callback function before set callback now Returns: previous callback function before set callback now
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
OSSwitchThreadCallback OS_SetSwitchThreadCallback(OSSwitchThreadCallback callback); OSSwitchThreadCallback osSetSwitchThreadCallback(OSSwitchThreadCallback callback);
// notice: substans is in os_callTrace.c. // notice: substans is in os_callTrace.c.
// define here because of OSThread declaration. // define here because of OSThread declaration.
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_DumpThreadCallTrace Name: osDumpThreadCallTrace
Description: dump callStack of thread Description: dump callStack of thread
@ -688,12 +695,12 @@ OSSwitchThreadCallback OS_SetSwitchThreadCallback(OSSwitchThreadCallback callbac
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_DumpThreadCallTrace(const OSThread *thread); void osDumpThreadCallTrace(const OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_DisableScheduler Name: osDisableScheduler
Description: disable scheduler Description: disable scheduler
@ -702,10 +709,10 @@ void OS_DumpThreadCallTrace(const OSThread *thread);
Returns: Previous scheduler suspend count. Returns: Previous scheduler suspend count.
Suspended if value >= 0. Suspended if value >= 0.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
u32 OS_DisableScheduler(void); u32 osDisableScheduler(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_EnableScheduler Name: osEnableScheduler
Description: enable scheduler Description: enable scheduler
@ -714,12 +721,12 @@ u32 OS_DisableScheduler(void);
Returns: Previous scheduler suspend count. Returns: Previous scheduler suspend count.
Suspended if value >= 0. Suspended if value >= 0.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
u32 OS_EnableScheduler(void); u32 osEnableScheduler(void);
#ifdef SDK_THREAD_INFINITY #ifdef SDK_THREAD_INFINITY
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_SetThreadDestructor Name: osSetThreadDestructor
Description: set thread destructor, which is called when that thread exits. Description: set thread destructor, which is called when that thread exits.
@ -728,10 +735,10 @@ u32 OS_EnableScheduler(void);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_SetThreadDestructor(OSThread *thread, OSThreadDestructor dtor); void osSetThreadDestructor(OSThread *thread, OSThreadDestructor dtor);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetThreadDestructor Name: osGetThreadDestructor
Description: get thread destructor which is set Description: get thread destructor which is set
@ -739,10 +746,10 @@ void OS_SetThreadDestructor(OSThread *thread, OSThreadDestructor dtor);
Returns: destructor function Returns: destructor function
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
OSThreadDestructor OS_GetThreadDestructor(const OSThread *thread); OSThreadDestructor osGetThreadDestructor(const OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_SetThreadParameter Name: osSetThreadParameter
Description: set user parameter which is allowed to use freely. Description: set user parameter which is allowed to use freely.
@ -751,10 +758,10 @@ OSThreadDestructor OS_GetThreadDestructor(const OSThread *thread);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_SetThreadParameter(OSThread *thread, void *parameter); void osSetThreadParameter(OSThread *thread, void *parameter);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetThreadParameter Name: osGetThreadParameter
Description: get user parameter which is set Description: get user parameter which is set
@ -762,10 +769,10 @@ void OS_SetThreadParameter(OSThread *thread, void *parameter);
Returns: user parameter which is set Returns: user parameter which is set
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void *OS_GetThreadParameter(const OSThread *thread); void *osGetThreadParameter(const OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetErrno Name: osGetErrno
Description: get system error number. Description: get system error number.
@ -773,11 +780,11 @@ void *OS_GetThreadParameter(const OSThread *thread);
Returns: error number Returns: error number
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
int OS_GetErrno(void); int osGetErrno(void);
#endif #endif
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_IsThreadInList Name: osIsThreadInList
Description: check if the specified thread is in the thread list Description: check if the specified thread is in the thread list
@ -785,10 +792,10 @@ int OS_GetErrno(void);
Returns: TRUE if thread is in the thread list Returns: TRUE if thread is in the thread list
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL OS_IsThreadInList(const OSThread *thread); BOOL osIsThreadInList(const OSThread *thread);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_SetThreadDestructorStack Name: osSetThreadDestructorStack
Description: specify stack area to call thread destructor Description: specify stack area to call thread destructor
@ -796,7 +803,7 @@ BOOL OS_IsThreadInList(const OSThread *thread);
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void OS_SetThreadDestructorStack(void *stack); void osSetThreadDestructorStack(void *stack);
#ifdef SDK_THREAD_INFINITY #ifdef SDK_THREAD_INFINITY
@ -880,7 +887,7 @@ static inline void *OSi_GetSpecificData(const OSThread *thread, int index)
// use carefully. // use carefully.
//================================================================================ //================================================================================
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetThreadList Name: osGetThreadList
Description: get first thread of thread list. Description: get first thread of thread list.
@ -888,14 +895,14 @@ static inline void *OSi_GetSpecificData(const OSThread *thread, int index)
Returns: first thread of thread list Returns: first thread of thread list
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline OSThread *OS_GetThreadList(void) static inline OSThread *osGetThreadList(void)
{ {
return OS_GetThreadInfo()->list; return osGetThreadInfo()->list;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: OS_GetNextThread Name: osGetNextThread
Description: get thread which is linked next in thread list Description: get thread which is linked next in thread list
@ -903,7 +910,7 @@ static inline OSThread *OS_GetThreadList(void)
Returns: next thread. NULL means no next thread ( specified thread may be last ) Returns: next thread. NULL means no next thread ( specified thread may be last )
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static inline OSThread *OS_GetNextThread(const OSThread *thread) static inline OSThread *osGetNextThread(const OSThread *thread)
{ {
SDK_ASSERT(thread); SDK_ASSERT(thread);
return thread->next; return thread->next;

View File

@ -24,7 +24,7 @@ extern "C" {
#include <brom/misc.h> #include <brom/misc.h>
#include <brom/types.h> #include <brom/types.h>
#include <ctr/ioreg.h> #include <ctr/ioreg.h>
#include <brom/os/ARM9/timer.h> //#include <brom/os/ARM9/timer.h>
//---- unit of tick //---- unit of tick
@ -39,7 +39,11 @@ extern void osSetTick( u64 );
//---- conversion tick count <-> real time count //---- conversion tick count <-> real time count
#ifdef SDK_ARM11
#define OS_SYSTEM_CLOCK HW_CPU_CLOCK
#else // SDK_ARM9
#define OS_SYSTEM_CLOCK HW_SYSTEM_CLOCK #define OS_SYSTEM_CLOCK HW_SYSTEM_CLOCK
#endif // SDK_ARM9
//---- sec to tick //---- sec to tick
#define OSi_SEC_TO_TICK( sec, prescale ) ((OSTick)( (OS_SYSTEM_CLOCK * (u64)(sec)) / (prescale) )) #define OSi_SEC_TO_TICK( sec, prescale ) ((OSTick)( (OS_SYSTEM_CLOCK * (u64)(sec)) / (prescale) ))

View File

@ -35,11 +35,9 @@ LOAD_UNABORT HW_BROM_NML_ABT_END (HW_BROM_NML_SIZE - HW_BROM_NML_ABT_SIZE)
NML_RO +0 NML_RO +0
{ {
*crt0_excp.o (.emb_text, +FIRST) *crt0_excp.o (.emb_text, +FIRST)
*libos*.brom*.a (:gdef:OSi_Boot) *libos*.brom*.a (:gdef:osBoot)
*libos*.brom*.a (:gdef:OSi_BootCore) *libos*.brom*.a (:gdef:osDisableInterrupts)
*libos*.brom*.a (:gdef:OSi_ClearWorkArea) *libos*.brom*.a (:gdef:osRestoreInterrupts)
*libos*.brom*.a (:gdef:OS_DisableInterrupts)
*libos*.brom*.a (:gdef:OS_RestoreInterrupts)
*libmi*.brom*.a (+RO) *libmi*.brom*.a (+RO)
*libswi*.brom*.a (+RO) *libswi*.brom*.a (+RO)
*libpxi*.brom*.a (+RO) *libpxi*.brom*.a (+RO)

View File

@ -212,6 +212,7 @@ MACRO_FLAGS += $(LMACRO_FLAGS)
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# Demote the following compiler warnings to remarks: # Demote the following compiler warnings to remarks:
# #
# 61: integer operation result is out of range
# 66: enumeration value is out of "int" range # 66: enumeration value is out of "int" range
# 108: signed bit field of length 1 # 108: signed bit field of length 1
# 177: variable was declared but never referenced # 177: variable was declared but never referenced
@ -221,7 +222,7 @@ MACRO_FLAGS += $(LMACRO_FLAGS)
#A1329W: Unsafe instruction (forced user mode transfer with write-back to base) #A1329W: Unsafe instruction (forced user mode transfer with write-back to base)
#A1581W: Added 2 bytes of padding at address 0x3e2 #A1581W: Added 2 bytes of padding at address 0x3e2
T_CFLAGS_WARN += --diag_remark 236,177 T_CFLAGS_WARN += --diag_remark 236,177
T_CFLAGS_WARN += --diag_suppress 66,108,1256,A1329W,A1581W T_CFLAGS_WARN += --diag_suppress 61,66,108,1256,A1329W,A1581W
# Promote the following compiler warnings to errors: # Promote the following compiler warnings to errors:
# #