diff options
author | red031000 <rubenru09@aol.com> | 2020-06-09 02:15:17 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-06-09 02:15:17 +0100 |
commit | 07655aabe84bdbb3aff84200b38d46bd22f1b488 (patch) | |
tree | 39537c5e70c9eb2c48b9800b67d68c39f1c2f6f4 /arm7/lib/src | |
parent | 5c81c47e15be06a204475e0524910cdf8ae13354 (diff) |
arm7 OS_arena
Diffstat (limited to 'arm7/lib/src')
-rw-r--r-- | arm7/lib/src/OS_arena.c | 110 | ||||
-rw-r--r-- | arm7/lib/src/OS_init.c | 1 | ||||
-rw-r--r-- | arm7/lib/src/OS_system.c | 2 |
3 files changed, 110 insertions, 3 deletions
diff --git a/arm7/lib/src/OS_arena.c b/arm7/lib/src/OS_arena.c new file mode 100644 index 00000000..516fc10b --- /dev/null +++ b/arm7/lib/src/OS_arena.c @@ -0,0 +1,110 @@ +#include "function_target.h" +#include "consts.h" +#include "OS_arena.h" + +static BOOL OSi_Initialized = FALSE; + +extern void SDK_SUBPRIV_ARENA_LO(void); +extern void SDK_WRAM_ARENA_LO(void); +extern void SDK_IRQ_STACKSIZE(void); +extern void SDK_SYS_STACKSIZE(void); + +ARM_FUNC void OS_InitArena(void) +{ + if (OSi_Initialized) + { + return; + } + OSi_Initialized = TRUE; + + OS_SetArenaHi(OS_ARENA_MAIN_SUBPRIV, OS_GetInitArenaHi(OS_ARENA_MAIN_SUBPRIV)); + OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, OS_GetInitArenaLo(OS_ARENA_MAIN_SUBPRIV)); + + OS_SetArenaHi(OS_ARENA_WRAM_SUB, OS_GetInitArenaHi(OS_ARENA_WRAM_SUB)); + OS_SetArenaLo(OS_ARENA_WRAM_SUB, OS_GetInitArenaLo(OS_ARENA_WRAM_SUB)); + + OS_SetArenaHi(OS_ARENA_WRAM_SUBPRIV, OS_GetInitArenaHi(OS_ARENA_WRAM_SUBPRIV)); + OS_SetArenaLo(OS_ARENA_WRAM_SUBPRIV, OS_GetInitArenaLo(OS_ARENA_WRAM_SUBPRIV)); +} + +ARM_FUNC void* OS_GetArenaHi(OSArenaId id) +{ + return OSi_GetArenaInfo().hi[id]; +} + +ARM_FUNC void* OS_GetArenaLo(OSArenaId id) +{ + return OSi_GetArenaInfo().lo[id]; +} + +ARM_FUNC void* OS_GetInitArenaHi(OSArenaId id) +{ + switch (id) { + case OS_ARENA_MAIN_SUBPRIV: + return (void *)HW_MAIN_MEM_SUB_END; + case OS_ARENA_WRAM_SUB: + return (void *)HW_WRAM_END; + case OS_ARENA_WRAM_SUBPRIV: + { + u32 irqStackLo = (u32)HW_PRV_WRAM_IRQ_STACK_END - (s32)SDK_IRQ_STACKSIZE; + u32 sysStackLo = (u32)HW_PRV_WRAM; + + if ((u32)SDK_WRAM_ARENA_LO > (u32)HW_PRV_WRAM) + { + sysStackLo = (u32)SDK_WRAM_ARENA_LO; + } + + if (!(s32)SDK_SYS_STACKSIZE) + { + return (void *)sysStackLo; + } + else if ((s32)SDK_SYS_STACKSIZE < 0) + { + sysStackLo -= (s32)SDK_SYS_STACKSIZE; + } + else + { + sysStackLo = irqStackLo - (s32)SDK_SYS_STACKSIZE; + } + + return (void *)sysStackLo; + } + default: + return NULL; + } +} + +ARM_FUNC void* OS_GetInitArenaLo(OSArenaId id) { + switch (id) { + case OS_ARENA_MAIN_SUBPRIV: + return (void *)((u32)0x027fafcc); //todo SDK_SUBPRIV_ARENA_LO + case OS_ARENA_WRAM_SUB: + { + u32 wramSubLo = ((u32)SDK_WRAM_ARENA_LO); + if ((u32)HW_WRAM_END < (u32)wramSubLo) + { + wramSubLo = (u32)HW_WRAM_END; + } + return (void *)wramSubLo; + } + case OS_ARENA_WRAM_SUBPRIV: + { + u32 privWramLo = HW_PRV_WRAM; + if ((u32)SDK_WRAM_ARENA_LO > (u32)privWramLo) + { + privWramLo = (u32)SDK_WRAM_ARENA_LO; + } + return (void *)privWramLo; + } + default: + return NULL; + } +} + +ARM_FUNC void OS_SetArenaHi(OSArenaId id, void* newHi) { + OSi_GetArenaInfo().hi[id] = newHi; +} + +ARM_FUNC void OS_SetArenaLo(OSArenaId id, void* newLo) { + OSi_GetArenaInfo().lo[id] = newLo; +} diff --git a/arm7/lib/src/OS_init.c b/arm7/lib/src/OS_init.c index 082b3e70..f4972638 100644 --- a/arm7/lib/src/OS_init.c +++ b/arm7/lib/src/OS_init.c @@ -1,7 +1,6 @@ #include "function_target.h" #include "OS_init.h" -extern void OS_InitArena(void); extern void PXI_Init(void); extern void OS_InitLock(void); extern void OS_InitIrqTable(void); diff --git a/arm7/lib/src/OS_system.c b/arm7/lib/src/OS_system.c index 120eddbf..11417e91 100644 --- a/arm7/lib/src/OS_system.c +++ b/arm7/lib/src/OS_system.c @@ -1,8 +1,6 @@ #include "function_target.h" #include "OS_system.h" -#pragma optimize_for_size on - extern void FUN_037F8CB4(s32 count); ARM_FUNC asm OSIntrMode OS_EnableInterrupts(void) |