diff options
-rw-r--r-- | arm7/asm/OS_alloc.s | 433 | ||||
-rw-r--r-- | arm7/lib/include/OS_alloc.h | 17 | ||||
-rw-r--r-- | arm7/lib/src/OS_alloc.c | 311 | ||||
-rw-r--r-- | arm9/lib/include/OS_alloc.h | 31 | ||||
-rw-r--r-- | arm9/lib/include/consts.h | 3 | ||||
-rw-r--r-- | arm9/lib/src/OS_alloc.c | 6 | ||||
-rw-r--r-- | include/nitro/OS_alloc_shared.h | 40 | ||||
-rw-r--r-- | include/nitro/consts_shared.h | 5 |
8 files changed, 379 insertions, 467 deletions
diff --git a/arm7/asm/OS_alloc.s b/arm7/asm/OS_alloc.s deleted file mode 100644 index 1c174548..00000000 --- a/arm7/asm/OS_alloc.s +++ /dev/null @@ -1,433 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global OSiHeapInfo -OSiHeapInfo: ;0x038078F8 - .space 0x0380791C - 0x038078F8 - - .section .text - - arm_func_start OS_CheckHeap -OS_CheckHeap: ; 0x037F9D88 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - mov r7, r1 - mov r6, #0 - mov r5, r6 - mvn r4, #0 - bl OS_DisableInterrupts - ldr r1, _037F9F34 ; =OSiHeapInfo - ldr ip, [r1, r8, lsl #2] - mov r1, r4 - cmp r7, r1 - ldreq r7, [ip] - ldr r2, [ip, #16] - cmp r2, #0 - beq _037F9F24 - cmp r7, #0 - blt _037F9F24 - ldr r1, [ip, #4] - cmp r7, r1 - bge _037F9F24 - mov r1, #12 - mul r1, r7, r1 - add r3, r2, r1 - ldr r2, [r2, r1] - cmp r2, #0 - blt _037F9F24 - ldr r1, [r3, #8] - cmp r1, #0 - beq _037F9E70 - ldr r7, [r1] - cmp r7, #0 - bne _037F9F24 - b _037F9E70 -_037F9E0C: - ldr r7, [ip, #8] - cmp r7, r1 - bhi _037F9F24 - ldr r7, [ip, #12] - cmp r1, r7 - bcs _037F9F24 - ands r7, r1, #31 - bne _037F9F24 - ldr lr, [r1, #4] - cmp lr, #0 - beq _037F9E44 - ldr r7, [lr] - cmp r7, r1 - bne _037F9F24 -_037F9E44: - ldr r7, [r1, #8] - cmp r7, #64 ; 0x40 - bcc _037F9F24 - ands r1, r7, #31 - bne _037F9F24 - add r6, r6, r7 - cmp r6, #0 - ble _037F9F24 - cmp r6, r2 - bgt _037F9F24 - mov r1, lr -_037F9E70: - cmp r1, #0 - bne _037F9E0C - ldr r1, [r3, #4] - cmp r1, #0 - beq _037F9F14 - ldr r3, [r1] - cmp r3, #0 - bne _037F9F24 - b _037F9F14 -_037F9E94: - ldr r3, [ip, #8] - cmp r3, r1 - bhi _037F9F24 - ldr r3, [ip, #12] - cmp r1, r3 - bcs _037F9F24 - ands r3, r1, #31 - bne _037F9F24 - ldr lr, [r1, #4] - cmp lr, #0 - beq _037F9ECC - ldr r3, [lr] - cmp r3, r1 - bne _037F9F24 -_037F9ECC: - ldr r7, [r1, #8] - cmp r7, #64 ; 0x40 - bcc _037F9F24 - ands r3, r7, #31 - bne _037F9F24 - cmp lr, #0 - beq _037F9EF4 - add r1, r1, r7 - cmp r1, lr - bcs _037F9F24 -_037F9EF4: - add r6, r6, r7 - sub r1, r7, #32 - add r5, r5, r1 - cmp r6, #0 - ble _037F9F24 - cmp r6, r2 - bgt _037F9F24 - mov r1, lr -_037F9F14: - cmp r1, #0 - bne _037F9E94 - cmp r6, r2 - moveq r4, r5 -_037F9F24: - bl OS_RestoreInterrupts - mov r0, r4 - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037F9F34: .word OSiHeapInfo - - arm_func_start OS_CreateHeap -OS_CreateHeap: ; 0x037F9F38 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r4, r0 - mov r6, r1 - mov r5, r2 - bl OS_DisableInterrupts - ldr r1, _037F9FDC ; =OSiHeapInfo - ldr r7, [r1, r4, lsl #2] - add r1, r6, #31 - bic r6, r1, #31 - bic r5, r5, #31 - mov r4, #0 - ldr lr, [r7, #4] - mov r1, #12 - b _037F9FC0 -_037F9F74: - ldr r3, [r7, #16] - mul r2, r4, r1 - add ip, r3, r2 - ldr r2, [r3, r2] - cmp r2, #0 - bge _037F9FBC - sub r1, r5, r6 - str r1, [ip] - mov r2, #0 - str r2, [r6] - str r2, [r6, #4] - ldr r1, [ip] - str r1, [r6, #8] - str r6, [ip, #4] - str r2, [ip, #8] - bl OS_RestoreInterrupts - mov r0, r4 - b _037F9FD0 -_037F9FBC: - add r4, r4, #1 -_037F9FC0: - cmp r4, lr - blt _037F9F74 - bl OS_RestoreInterrupts - mvn r0, #0 -_037F9FD0: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037F9FDC: .word OSiHeapInfo - - arm_func_start OS_InitAlloc -OS_InitAlloc: ; 0x037F9FE0 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r7, r0 - mov r5, r1 - mov r4, r2 - mov r6, r3 - bl OS_DisableInterrupts - ldr r1, _037FA084 ; =OSiHeapInfo - str r5, [r1, r7, lsl #2] - mov r2, #12 - mul r1, r6, r2 - add r3, r5, #20 - str r3, [r5, #16] - str r6, [r5, #4] - mov r8, #0 - mvn lr, #0 - mov ip, r8 - b _037FA044 -_037FA024: - ldr r6, [r5, #16] - mul r3, r8, r2 - add r7, r6, r3 - str lr, [r6, r3] - str ip, [r7, #8] - ldr r3, [r7, #8] - str r3, [r7, #4] - add r8, r8, #1 -_037FA044: - ldr r3, [r5, #4] - cmp r8, r3 - blt _037FA024 - mvn r2, #0 - str r2, [r5] - ldr r2, [r5, #16] - add r1, r2, r1 - add r1, r1, #31 - bic r1, r1, #31 - str r1, [r5, #8] - bic r1, r4, #31 - str r1, [r5, #12] - bl OS_RestoreInterrupts - ldr r0, [r5, #8] - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037FA084: .word OSiHeapInfo - - arm_func_start OS_SetCurrentHeap -OS_SetCurrentHeap: ; 0x037FA088 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r4, r0 - mov r5, r1 - bl OS_DisableInterrupts - ldr r1, _037FA0C0 ; =OSiHeapInfo - ldr r1, [r1, r4, lsl #2] - ldr r4, [r1] - str r5, [r1] - bl OS_RestoreInterrupts - mov r0, r4 - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037FA0C0: .word OSiHeapInfo - - arm_func_start OS_FreeToHeap -OS_FreeToHeap: ; 0x037FA0C4 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r0 - mov r4, r1 - mov r6, r2 - bl OS_DisableInterrupts - mov r5, r0 - ldr r0, _037FA134 ; =OSiHeapInfo - ldr r0, [r0, r7, lsl #2] - cmp r4, #0 - ldrlt r4, [r0] - sub r6, r6, #32 - ldr r1, [r0, #16] - mov r0, #12 - mla r7, r4, r0, r1 - ldr r0, [r7, #8] - mov r1, r6 - bl DLExtract - str r0, [r7, #8] - ldr r0, [r7, #4] - mov r1, r6 - bl DLInsert - str r0, [r7, #4] - mov r0, r5 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FA134: .word OSiHeapInfo - - arm_func_start OS_AllocFromHeap -OS_AllocFromHeap: ; 0x037FA138 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r6, r0 - mov r5, r1 - mov r7, r2 - bl OS_DisableInterrupts - mov r4, r0 - ldr r1, _037FA24C ; =OSiHeapInfo - ldr r1, [r1, r6, lsl #2] - cmp r1, #0 - bne _037FA170 - bl OS_RestoreInterrupts - mov r0, #0 - b _037FA240 -_037FA170: - cmp r5, #0 - ldrlt r5, [r1] - ldr r1, [r1, #16] - mov r0, #12 - mla r6, r5, r0, r1 - add r0, r7, #32 - add r0, r0, #31 - bic r7, r0, #31 - ldr r0, [r6, #4] - mov r5, r0 - b _037FA1AC -_037FA19C: - ldr r1, [r5, #8] - cmp r7, r1 - ble _037FA1B4 - ldr r5, [r5, #4] -_037FA1AC: - cmp r5, #0 - bne _037FA19C -_037FA1B4: - cmp r5, #0 - bne _037FA1CC - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0 - b _037FA240 -_037FA1CC: - ldr r1, [r5, #8] - sub r1, r1, r7 - cmp r1, #64 ; 0x40 - bcs _037FA1EC - mov r1, r5 - bl DLExtract - str r0, [r6, #4] - b _037FA224 -_037FA1EC: - str r7, [r5, #8] - add r2, r5, r7 - str r1, [r2, #8] - ldr r0, [r5] - str r0, [r5, r7] - ldr r0, [r5, #4] - str r0, [r2, #4] - ldr r0, [r2, #4] - cmp r0, #0 - strne r2, [r0] - ldr r0, [r2] - cmp r0, #0 - strne r2, [r0, #4] - streq r2, [r6, #4] -_037FA224: - ldr r0, [r6, #8] - mov r1, r5 - bl DLAddFront - str r0, [r6, #8] - mov r0, r4 - bl OS_RestoreInterrupts - add r0, r5, #32 -_037FA240: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FA24C: .word OSiHeapInfo - - arm_func_start DLInsert -DLInsert: ; 0x037FA250 - stmfd sp!, {lr} - sub sp, sp, #4 - mov ip, r0 - mov lr, #0 - b _037FA274 -_037FA264: - cmp r1, ip - bls _037FA27C - mov lr, ip - ldr ip, [ip, #4] -_037FA274: - cmp ip, #0 - bne _037FA264 -_037FA27C: - str ip, [r1, #4] - str lr, [r1] - cmp ip, #0 - beq _037FA2BC - str r1, [ip] - ldr r3, [r1, #8] - add r2, r1, r3 - cmp r2, ip - bne _037FA2BC - ldr r2, [ip, #8] - add r2, r3, r2 - str r2, [r1, #8] - ldr ip, [ip, #4] - str ip, [r1, #4] - cmp ip, #0 - strne r1, [ip] -_037FA2BC: - cmp lr, #0 - beq _037FA2F4 - str r1, [lr, #4] - ldr r2, [lr, #8] - add r3, lr, r2 - cmp r3, r1 - bne _037FA2F8 - ldr r1, [r1, #8] - add r1, r2, r1 - str r1, [lr, #8] - str ip, [lr, #4] - cmp ip, #0 - strne lr, [ip] - b _037FA2F8 -_037FA2F4: - mov r0, r1 -_037FA2F8: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr - - arm_func_start DLExtract -DLExtract: ; 0x037FA304 - ldr r3, [r1, #4] - cmp r3, #0 - ldrne r2, [r1] - strne r2, [r3] - ldr r2, [r1] - cmp r2, #0 - ldreq r0, [r1, #4] - ldrne r1, [r1, #4] - strne r1, [r2, #4] - bx lr - - arm_func_start DLAddFront -DLAddFront: ; 0x037FA32C - str r0, [r1, #4] - mov r2, #0 - str r2, [r1] - cmp r0, #0 - strne r1, [r0] - mov r0, r1 - bx lr diff --git a/arm7/lib/include/OS_alloc.h b/arm7/lib/include/OS_alloc.h new file mode 100644 index 00000000..bf18da0f --- /dev/null +++ b/arm7/lib/include/OS_alloc.h @@ -0,0 +1,17 @@ +#ifndef POKEDIAMOND_ARM7_OS_ALLOC_H +#define POKEDIAMOND_ARM7_OS_ALLOC_H + +#include "nitro/OS_alloc_shared.h" +#include "OS_arena.h" + +Cell *DLAddFront(Cell* list, Cell* cell); +Cell *DLExtract(Cell* list, Cell* cell); +Cell *DLInsert(Cell *original, Cell *inserted); +void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size); +void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr); +OSHeapHandle OS_SetCurrentHeap(OSArenaId id, OSHeapHandle heap); +void *OS_InitAlloc(OSArenaId id, void *arenaStart, void *arenaEnd, s32 maxHeaps); +OSHeapHandle OS_CreateHeap(OSArenaId id, void *start, void *end); +s32 OS_CheckHeap(OSArenaId id, OSHeapHandle heap); + +#endif //POKEDIAMOND_ARM7_OS_ALLOC_H diff --git a/arm7/lib/src/OS_alloc.c b/arm7/lib/src/OS_alloc.c new file mode 100644 index 00000000..7ea11723 --- /dev/null +++ b/arm7/lib/src/OS_alloc.c @@ -0,0 +1,311 @@ +#include "function_target.h" +#include "consts.h" +#include "OS_alloc.h" +#include "OS_system.h" + +void* OSiHeapInfo[OS_ARENA_MAX]; + +ARM_FUNC Cell* DLAddFront(Cell* list, Cell* cell) +{ + cell->next = list; + cell->prev = NULL; + + if (list != NULL) + list->prev = cell; + return cell; +} + +ARM_FUNC Cell* DLExtract(Cell* list, Cell* cell) +{ + if (cell->next) { + cell->next->prev = cell->prev; + } + if (cell->prev == NULL) { + list = cell->next; + } else { + cell->prev->next = cell->next; + } + return list; +} + +ARM_FUNC Cell *DLInsert(Cell *original, Cell *inserted) +{ + Cell *prevCell; + Cell *nextCell; + + for (nextCell = original, prevCell = NULL; nextCell; prevCell = nextCell, nextCell = nextCell->next) + { + if (inserted <= nextCell) + break; + } + + inserted->next = nextCell; + inserted->prev = prevCell; + + if (nextCell != NULL) + { + nextCell->prev = inserted; + Cell * temp = (Cell *)((char *)inserted + inserted->size); + if (temp == nextCell) + { + inserted->size += nextCell->size; + nextCell = nextCell->next; + inserted->next = nextCell; + if (nextCell != NULL) + nextCell->prev = inserted; + } + } + + if (prevCell != NULL) + { + prevCell->next = inserted; + Cell * temp = (Cell *)((char *)prevCell + prevCell->size); + + if (temp != inserted) + return original; + + prevCell->size += inserted->size; + prevCell->next = nextCell; + if (nextCell != NULL) + nextCell->prev = prevCell; + + return original; + } + + return inserted; +} + +#define HEADERSIZE OSi_ROUND(sizeof(Cell), 32) +#define MINOBJSIZE (HEADERSIZE+32) + +ARM_FUNC void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) +{ + OSHeapInfo* heapInfo; + HeapDesc* hd; + Cell* cell; + Cell* newCell; + long leftoverSize; + + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = OSiHeapInfo[id]; + if (!heapInfo) { + (void)OS_RestoreInterrupts(enabled); + return NULL; + } + + if (heap < 0) { + heap = heapInfo->currentHeap; + } + + hd = &heapInfo->heapArray[heap]; + + size += HEADERSIZE; + size = OSi_ROUND(size, 32); + + for (cell = hd->free; cell != NULL; cell = cell->next) { + if ((long)size <= cell->size) { + break; + } + } + + if (cell == NULL) { + (void)OS_RestoreInterrupts(enabled); + return NULL; + } + + leftoverSize = cell->size - (long)size; + if (leftoverSize < MINOBJSIZE) { + hd->free = DLExtract(hd->free, cell); + } else { + cell->size = (long)size; + + newCell = (Cell *) ((char *)cell + size); + newCell->size = leftoverSize; + + newCell->prev = cell->prev; + newCell->next = cell->next; + + if (newCell->next != NULL) { + newCell->next->prev = newCell; + } + + if (newCell->prev != NULL) { + newCell->prev->next = newCell; + } else { + hd->free = newCell; + } + } + + hd->allocated = DLAddFront(hd->allocated, cell); + + (void)OS_RestoreInterrupts(enabled); + return (void *)((char *)cell + HEADERSIZE); +} + +ARM_FUNC void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr) +{ + OSHeapInfo *heapInfo; + HeapDesc *hd; + Cell *cell; + + OSIntrMode enabled = OS_DisableInterrupts(); + heapInfo = OSiHeapInfo[id]; + + if (heap < 0) { + heap = heapInfo->currentHeap; + } + + cell = (Cell *) ((char *)ptr - HEADERSIZE); + hd = &heapInfo->heapArray[heap]; + + hd->allocated = DLExtract(hd->allocated, cell); + hd->free = DLInsert(hd->free, cell); + + (void)OS_RestoreInterrupts(enabled); +} + +ARM_FUNC OSHeapHandle OS_SetCurrentHeap(OSArenaId id, OSHeapHandle heap) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + + OSHeapInfo *heapInfo = OSiHeapInfo[id]; + OSHeapHandle prev = heapInfo->currentHeap; + heapInfo->currentHeap = heap; + + (void)OS_RestoreInterrupts(enabled); + return prev; +} + +ARM_FUNC void *OS_InitAlloc(OSArenaId id, void *arenaStart, void *arenaEnd, s32 maxHeaps) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + + OSHeapInfo *heapInfo = arenaStart; + OSiHeapInfo[id] = heapInfo; + + u32 arraySize = sizeof(HeapDesc) * maxHeaps; + heapInfo->heapArray = (void *)((u32)arenaStart + sizeof(OSHeapInfo)); + heapInfo->numHeaps = maxHeaps; + + for (OSHeapHandle i = 0; i < heapInfo->numHeaps; i++) + { + HeapDesc *hd = &heapInfo->heapArray[i]; + + hd->size = -1; + hd->free = hd->allocated = NULL; + } + + heapInfo->currentHeap = -1; + + arenaStart = (void *)((char *)heapInfo->heapArray + arraySize); + arenaStart = (void *)OSi_ROUND(arenaStart, 32); + + heapInfo->arenaStart = arenaStart; + heapInfo->arenaEnd = (void *)OSi_TRUNC(arenaEnd, 32); + + (void)OS_RestoreInterrupts(enabled); + return heapInfo->arenaStart; +} + +ARM_FUNC OSHeapHandle OS_CreateHeap(OSArenaId id, void *start, void *end) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + + OSHeapInfo *heapInfo = OSiHeapInfo[id]; + + start = (void *)OSi_ROUND(start, 32); + end = (void *)OSi_TRUNC(end, 32); + + for (OSHeapHandle heap = 0; heap < heapInfo->numHeaps; heap++) + { + HeapDesc *hd = &heapInfo->heapArray[heap]; + if (hd->size < 0) + { + hd->size = (s8 *)end - (s8 *)start; + + Cell *cell = (Cell *)start; + cell->prev = NULL; + cell->next = NULL; + cell->size = hd->size; + + hd->free = cell; + hd->allocated = 0; + + (void)OS_RestoreInterrupts(enabled); + return heap; + } + } + + (void)OS_RestoreInterrupts(enabled); + return -1; +} + +//wtf nintendo is this shit +#define OSi_CHECK(exp) \ + do \ + { \ + if (!(exp)) \ + { \ + goto exit_OS_CheckHeap; \ + } \ + } while (0) + +ARM_FUNC s32 OS_CheckHeap(OSArenaId id, OSHeapHandle heap) +{ + OSHeapInfo *heapInfo; + HeapDesc *hd; + Cell *cell; + s32 total = 0; + s32 free = 0; + s32 retValue = -1; + OSIntrMode enabled = OS_DisableInterrupts(); + + heapInfo = OSiHeapInfo[id]; + + if (heap == (OSHeapHandle)-1) + { + heap = heapInfo->currentHeap; + } + + OSi_CHECK(heapInfo->heapArray); + OSi_CHECK(0 <= heap && heap < heapInfo->numHeaps); + + hd = &heapInfo->heapArray[heap]; + OSi_CHECK(0 <= hd->size); + + OSi_CHECK(hd->allocated == NULL || hd->allocated->prev == NULL); + for (cell = hd->allocated; cell; cell = cell->next) + { + OSi_CHECK(OSi_InRange(cell, heapInfo->arenaStart, heapInfo->arenaEnd)); + OSi_CHECK(OSi_OFFSET(cell, 32) == 0); + OSi_CHECK(cell->next == NULL || cell->next->prev == cell); + OSi_CHECK(MINOBJSIZE <= cell->size); + OSi_CHECK(OSi_OFFSET(cell->size, 32) == 0); + + total += cell->size; + OSi_CHECK(0 < total && total <= hd->size); + } + + OSi_CHECK(hd->free == NULL || hd->free->prev == NULL); + for (cell = hd->free; cell; cell = cell->next) + { + OSi_CHECK(OSi_InRange(cell, heapInfo->arenaStart, heapInfo->arenaEnd)); + OSi_CHECK(OSi_OFFSET(cell, 32) == 0); + OSi_CHECK(cell->next == NULL || cell->next->prev == cell); + OSi_CHECK(MINOBJSIZE <= cell->size); + OSi_CHECK(OSi_OFFSET(cell->size, 32) == 0); + OSi_CHECK(cell->next == NULL || (s8 *)cell + cell->size < (s8 *)cell->next); + + total += cell->size; + free += cell->size - HEADERSIZE; + + OSi_CHECK(0 < total && total <= hd->size); + } + + OSi_CHECK(total == hd->size); + retValue = free; + +exit_OS_CheckHeap: + (void)OS_RestoreInterrupts(enabled); + return retValue; +} diff --git a/arm9/lib/include/OS_alloc.h b/arm9/lib/include/OS_alloc.h index 5ee95395..e73c2971 100644 --- a/arm9/lib/include/OS_alloc.h +++ b/arm9/lib/include/OS_alloc.h @@ -1,32 +1,9 @@ -#ifndef POKEDIAMOND_OS_ALLOC_H -#define POKEDIAMOND_OS_ALLOC_H +#ifndef POKEDIAMOND_ARM9_OS_ALLOC_H +#define POKEDIAMOND_ARM9_OS_ALLOC_H #include "nitro/types.h" #include "OS_arena.h" - -typedef int OSHeapHandle; - -typedef struct Cell Cell; - -struct Cell { - Cell* prev; - Cell* next; - long size; -}; - -typedef struct { - long size; - Cell *free; - Cell *allocated; -} HeapDesc; - -typedef struct { - volatile OSHeapHandle currentHeap; - int numHeaps; - void* arenaStart; - void* arenaEnd; - HeapDesc* heapArray; -} OSHeapInfo; +#include "nitro/OS_alloc_shared.h" Cell* DLAddFront(Cell* list, Cell* cell); Cell* DLExtract(Cell* list, Cell* cell); @@ -34,4 +11,4 @@ Cell *DLInsert(Cell *original, Cell *inserted); void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size); void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void *ptr); -#endif //POKEDIAMOND_OS_ALLOC_H +#endif //POKEDIAMOND_ARM9_OS_ALLOC_H diff --git a/arm9/lib/include/consts.h b/arm9/lib/include/consts.h index c09e8cd9..a24e9d89 100644 --- a/arm9/lib/include/consts.h +++ b/arm9/lib/include/consts.h @@ -46,9 +46,6 @@ #define OSi_TCM_REGION_BASE_MASK 0xfffff000 -#define OSi_TRUNC(n, a) (((u32) (n)) & ~((a) - 1)) -#define OSi_ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1)) - #define OS_IE_V_BLANK (1UL << 0) #endif //POKEDIAMOND_ARM9_CONSTS_H diff --git a/arm9/lib/src/OS_alloc.c b/arm9/lib/src/OS_alloc.c index 32f386a8..00028d3c 100644 --- a/arm9/lib/src/OS_alloc.c +++ b/arm9/lib/src/OS_alloc.c @@ -35,14 +35,12 @@ ARM_FUNC Cell *DLInsert(Cell *original, Cell *inserted) {
Cell *prevCell = NULL;
Cell *nextCell = original;
-
- while (nextCell != NULL)
+
+ for (nextCell = original, prevCell = NULL; nextCell; prevCell = nextCell, nextCell = nextCell->next)
{
if (inserted <= nextCell)
break;
- prevCell = nextCell;
- nextCell = nextCell->next;
}
inserted->next = nextCell;
diff --git a/include/nitro/OS_alloc_shared.h b/include/nitro/OS_alloc_shared.h new file mode 100644 index 00000000..cf92032a --- /dev/null +++ b/include/nitro/OS_alloc_shared.h @@ -0,0 +1,40 @@ +/* + * NOTE: + * This file is shared between ARM9 and ARM7 + * DO NOT PUT PROC SPECIFIC CODE IN HERE + * Thank You! + */ + +/* + * DO NOT INCLUDE THIS FILE DIRECTLY + * Include OS_alloc.h from the specific proc's lib + */ + +#ifndef POKEDIAMOND_OS_ALLOC_SHARED_H +#define POKEDIAMOND_OS_ALLOC_SHARED_H + +typedef s32 OSHeapHandle; + +typedef struct Cell Cell; + +struct Cell { + Cell* prev; + Cell* next; + long size; +}; + +typedef struct { + long size; + Cell *free; + Cell *allocated; +} HeapDesc; + +typedef struct { + volatile OSHeapHandle currentHeap; + int numHeaps; + void* arenaStart; + void* arenaEnd; + HeapDesc* heapArray; +} OSHeapInfo; + +#endif //POKEDIAMOND_OS_ALLOC_SHARED_H diff --git a/include/nitro/consts_shared.h b/include/nitro/consts_shared.h index a7fd9dcf..151212d1 100644 --- a/include/nitro/consts_shared.h +++ b/include/nitro/consts_shared.h @@ -24,6 +24,11 @@ #define HW_PSR_DISABLE_IRQ 0x80 // Disable IRQ #define HW_PSR_DISABLE_IRQ_FIQ 0xc0 // Disable FIQ and IRQ +#define OSi_ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1)) +#define OSi_TRUNC(n, a) (((u32) (n)) & ~((a) - 1)) +#define OSi_InRange(targ, a, b) ((u32)(a) <= (u32)(targ) && (u32)(targ) < (u32)(b)) +#define OSi_OFFSET(n, a) (((u32) (n)) & ((a) - 1)) + #define OSi_GetArenaInfo() (*(OSArenaInfo*)HW_ARENA_INFO_BUF) #endif //POKEDIAMOND_CONSTS_SHARED_H |