diff options
author | Revo <projectrevotpp@hotmail.com> | 2020-04-30 19:55:00 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-30 19:55:00 -0400 |
commit | 081bd6efce613ed078407ab8fd24765275385f9f (patch) | |
tree | ea91f20d1cd1ab5ae06880d1dd2e5a2c61f4db59 /arm9/lib/src/OS_arena.c | |
parent | c7dd102f628b7a64a34223278c2de09718da19f4 (diff) | |
parent | 2ac877a24f241d3bc9d875a1338c40d7325929c6 (diff) |
Merge pull request #7 from martmists/os_lib
Add OS* functions
Diffstat (limited to 'arm9/lib/src/OS_arena.c')
-rw-r--r-- | arm9/lib/src/OS_arena.c | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/arm9/lib/src/OS_arena.c b/arm9/lib/src/OS_arena.c new file mode 100644 index 00000000..b4bcbc1c --- /dev/null +++ b/arm9/lib/src/OS_arena.c @@ -0,0 +1,169 @@ +//
+// Created by red031000 on 2020-04-27.
+//
+
+#include "consts.h"
+#include "os_arena.h"
+#include "os_protectionRegion.h"
+
+extern u32 OS_GetConsoleType();
+extern BOOL OSi_MainExArenaEnabled;
+extern BOOL OSi_Initialized; // TODO: located at 0x021d36f0
+void SDK_MAIN_ARENA_LO(); // TODO: technically this should be defined in the lcf
+extern void SDK_SECTION_ARENA_EX_START(); // TODO: technically this should be defined in the lcf
+extern void SDK_SECTION_ARENA_ITCM_START(); // TODO: technically this should be defined in the lcf
+extern void SDK_SECTION_ARENA_DTCM_START(); // TODO: technically this should be defined in the lcf
+extern void SDK_IRQ_STACKSIZE(); // TODO: technically this should be defined in the lcf
+extern void SDK_SYS_STACKSIZE(); // TODO: technically this should be defined in the lcf
+
+void OS_InitArena() {
+ if (OSi_Initialized) {
+ return;
+ }
+ OSi_Initialized = TRUE;
+
+ OS_SetArenaHi(OS_ARENA_MAIN, OS_GetInitArenaHi(OS_ARENA_MAIN));
+ OS_SetArenaLo(OS_ARENA_MAIN, OS_GetInitArenaLo(OS_ARENA_MAIN));
+
+ OS_SetArenaLo(OS_ARENA_MAINEX, (void *)0);
+ OS_SetArenaHi(OS_ARENA_MAINEX, (void *)0);
+
+ OS_SetArenaHi(OS_ARENA_ITCM, OS_GetInitArenaHi(OS_ARENA_ITCM));
+ OS_SetArenaLo(OS_ARENA_ITCM, OS_GetInitArenaLo(OS_ARENA_ITCM));
+
+ OS_SetArenaHi(OS_ARENA_DTCM, OS_GetInitArenaHi(OS_ARENA_DTCM));
+ OS_SetArenaLo(OS_ARENA_DTCM, OS_GetInitArenaLo(OS_ARENA_DTCM));
+
+ OS_SetArenaHi(OS_ARENA_SHARED, OS_GetInitArenaHi(OS_ARENA_SHARED));
+ OS_SetArenaLo(OS_ARENA_SHARED, OS_GetInitArenaLo(OS_ARENA_SHARED));
+
+ OS_SetArenaHi(OS_ARENA_WRAM_MAIN, OS_GetInitArenaHi(OS_ARENA_WRAM_MAIN));
+ OS_SetArenaLo(OS_ARENA_WRAM_MAIN, OS_GetInitArenaLo(OS_ARENA_WRAM_MAIN));
+}
+
+void OS_InitArenaEx() {
+ OS_SetArenaHi(2, OS_GetInitArenaHi(OS_ARENA_MAINEX));
+ OS_SetArenaLo(2, OS_GetInitArenaLo(OS_ARENA_MAINEX));
+
+ if (!OSi_MainExArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) {
+ OS_SetProtectionRegion(1, HW_MAIN_MEM, 4MB);
+ OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 128KB);
+ }
+}
+
+void* OS_GetArenaHi(OSArenaId id) {
+ return OSi_GetArenaInfo().hi[id];
+}
+
+void* OS_GetArenaLo(OSArenaId id) {
+ return OSi_GetArenaInfo().lo[id];
+}
+
+void* OS_GetInitArenaHi(OSArenaId id) {
+ switch (id) {
+ case OS_ARENA_MAIN:
+ return (void *)OSi_MAIN_ARENA_HI_DEFAULT;
+ case OS_ARENA_MAINEX:
+ if (!OSi_MainExArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) {
+ return (void *)0;
+ } else {
+ return (void *)OSi_MAINEX_ARENA_HI_DEFAULT;
+ }
+ case OS_ARENA_ITCM:
+ return (void *)HW_ITCM_ARENA_HI_DEFAULT;
+ case OS_ARENA_DTCM:
+ u32 irqStackLo = (u32)HW_DTCM_IRQ_STACK_END - (s32)SDK_IRQ_STACKSIZE;
+ u32 sysStackLo;
+
+ if (!(s32)SDK_SYS_STACKSIZE) {
+ sysStackLo = HW_DTCM;
+ if (sysStackLo < (u32)SDK_SECTION_ARENA_DTCM_START) {
+ sysStackLo = (u32)SDK_SECTION_ARENA_DTCM_START;
+ }
+ }
+ else if ((s32)SDK_SYS_STACKSIZE < 0) {
+ sysStackLo = (u32)SDK_SECTION_ARENA_DTCM_START - (s32)SDK_SYS_STACKSIZE;
+ }
+ else {
+ sysStackLo = irqStackLo - (s32)SDK_SYS_STACKSIZE;
+ }
+ return (void*)sysStackLo;
+ case OS_ARENA_SHARED:
+ return (void *)HW_SHARED_ARENA_HI_DEFAULT;
+ case OS_ARENA_WRAM_MAIN:
+ return (void *)OSi_WRAM_MAIN_ARENA_HI_DEFAULT;
+ default:
+ return NULL;
+ }
+}
+
+void* OS_GetInitArenaLo(OSArenaId id) {
+ switch (id) {
+ case OS_ARENA_MAIN:
+ return (void *)SDK_MAIN_ARENA_LO;
+ case OS_ARENA_MAINEX:
+ if (!OSi_MainExArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) {
+ return NULL;
+ } else {
+ return (void *)SDK_SECTION_ARENA_EX_START;
+ }
+ case OS_ARENA_ITCM:
+ return (void *)SDK_SECTION_ARENA_ITCM_START;
+ case OS_ARENA_DTCM:
+ return (void *)SDK_SECTION_ARENA_DTCM_START;
+ case OS_ARENA_SHARED:
+ return (void *)HW_SHARED_ARENA_LO_DEFAULT;
+ case OS_ARENA_WRAM_MAIN:
+ return (void *)OSi_WRAM_MAIN_ARENA_LO_DEFAULT;
+ default:
+ return NULL;
+ }
+}
+
+void OS_SetArenaHi(OSArenaId id, void* newHi) {
+ OSi_GetArenaInfo().hi[id] = newHi;
+}
+
+void OS_SetArenaLo(OSArenaId id, void* newLo) {
+ OSi_GetArenaInfo().lo[id] = newLo;
+}
+
+void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) {
+ void* ptr;
+ u8* arenaLo;
+ ptr = OS_GetArenaLo(id);
+ if (!ptr) {
+ return NULL;
+ }
+ arenaLo = ptr = (void *)OSi_ROUND(ptr, align);
+ arenaLo += size;
+ arenaLo = (u8 *)OSi_ROUND(arenaLo, align);
+ if (arenaLo > (u8*)OS_GetArenaHi(id)) {
+ return NULL;
+ }
+ OS_SetArenaLo(id, arenaLo);
+
+ return ptr;
+}
+
+void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) {
+ void* ptr;
+ u8* arenaHi;
+
+ arenaHi = OS_GetArenaHi(id);
+ if (!arenaHi) {
+ return NULL;
+ }
+
+ arenaHi = (u8 *)OSi_TRUNC(arenaHi, align);
+ arenaHi -= size;
+ arenaHi = ptr = (void *)OSi_TRUNC(arenaHi, align);
+
+ if (arenaHi < (u8*)OS_GetArenaLo(id)) {
+ return NULL;
+ }
+
+ OS_SetArenaHi(id, arenaHi);
+
+ return ptr;
+}
|