diff options
Diffstat (limited to 'include/nitro/os_alloc.c')
-rw-r--r-- | include/nitro/os_alloc.c | 257 |
1 files changed, 0 insertions, 257 deletions
diff --git a/include/nitro/os_alloc.c b/include/nitro/os_alloc.c deleted file mode 100644 index 9ba92e18..00000000 --- a/include/nitro/os_alloc.c +++ /dev/null @@ -1,257 +0,0 @@ -// -// Created by mart on 4/23/20. -// - -#include "os_alloc.h" -#include "consts.h" -#include "os_system.h" - -extern Cell* DLInsert(Cell* list, Cell* cell); -extern Cell* DLAddFront(Cell* list, Cell* cell); - -void* OSiHeapInfo[OS_ARENA_MAX] = { - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -}; - -#ifdef MATCH_ASM -asm static Cell* DLExtract(Cell* list, Cell* cell) -{ - ldr r3, [r1, #0x4] - cmp r3, #0x0 - ldrne r2, [r1, #0x0] - strne r2, [r3, #0x0] - ldr r2, [r1, #0x0] - cmp r2, #0x0 - ldreq r0, [r1, #0x4] - ldrne r1, [r1, #0x4] - strne r1, [r2, #0x4] - bx lr -} -#else -static Cell* DLExtract(Cell* list, Cell* cell) -{ - if (cell->next) { - cell->prev = cell->next->prev; - } - if (cell->prev) { - cell->prev->next = cell->next; - return list; - } - else { - return cell->next; - } -} -#endif - -#define HEADERSIZE OSi_ROUND(sizeof(Cell), 32) -#define MINOBJSIZE (HEADERSIZE+32) - -#ifdef MATCH_ASM -asm void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr) { - stmdb sp!, {r4-r7, lr} - sub sp,sp,#0x4 - mov r7,r0 - mov r5,r1 - mov r4,r2 - bl OS_DisableInterrupts - ldr r1,=OSiHeapInfo - mov r6,r0 - ldr r0,[r1,r7,lsl #0x2] - cmp r5,#0x0 - ldrlt r5,[r0,#0x0] - ldr r1,[r0,#0x10] - mov r0,#0xc - mla r7,r5,r0,r1 - sub r4,r4,#0x20 - ldr r0,[r7,#0x8] - mov r1,r4 - bl DLExtract - str r0,[r7,#0x8] - ldr r0,[r7,#0x4] - mov r1,r4 - bl DLInsert - str r0,[r7,#0x4] - mov r0,r6 - bl OS_RestoreInterrupts - add sp,sp,#0x4 - ldmia sp!,{ r4-r7, lr } - bx lr -} -#else -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); - - OS_RestoreInterrupts(enabled); -} -#endif - -#ifdef MATCH_ASM -asm void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) { - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r6, r0 - mov r5, r1 - mov r7, r2 - bl OS_DisableInterrupts - ldr r1, =OSiHeapInfo - mov r4, r0 - ldr r1, [r1, r6, lsl #0x2] - cmp r1, #0x0 - bne _020CC7AC - bl OS_RestoreInterrupts - add sp, sp, #0x4 - mov r0, #0x0 - ldmia sp!, {r4-r7,lr} - bx lr -_020CC7AC: - cmp r5, #0x0 - ldrlt r5, [r1, #0x0] - ldr r1, [r1, #0x10] - mov r0, #0xc - mla r6, r5, r0, r1 - ldr r0, [r6, #0x4] - add r1, r7, #0x20 - add r1, r1, #0x1f - mov r5, r0 - cmp r0, #0x0 - bic r7, r1, #0x1f - beq _020CC7F4 -_020CC7DC: - ldr r1, [r5, #0x8] - cmp r7, r1 - ble _020CC7F4 - ldr r5, [r5, #0x4] - cmp r5, #0x0 - bne _020CC7DC -_020CC7F4: - cmp r5, #0x0 - bne _020CC814 - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #0x4 - mov r0, #0x0 - ldmia sp!, {r4-r7,lr} - bx lr -_020CC814: - ldr r1, [r5, #0x8] - sub r1, r1, r7 - cmp r1, #0x40 - bhs _020CC834 - mov r1, r5 - bl DLExtract - str r0, [r6, #0x4] - b _020CC86C -_020CC834: - str r7, [r5, #0x8] - add r2, r5, r7 - str r1, [r2, #0x8] - ldr r0, [r5, #0x0] - str r0, [r5, r7] - ldr r0, [r5, #0x4] - str r0, [r2, #0x4] - ldr r0, [r2, #0x4] - cmp r0, #0x0 - strne r2, [r0, #0x0] - ldr r0, [r2, #0x0] - cmp r0, #0x0 - strne r2, [r0, #0x4] - streq r2, [r6, #0x4] -_020CC86C: - ldr r0, [r6, #0x8] - mov r1, r5 - bl DLAddFront - str r0, [r6, #0x8] - mov r0, r4 - bl OS_RestoreInterrupts - add r0, r5, #0x20 - add sp, sp, #0x4 - ldmia sp!, {r4-r7,lr} - bx lr -} -#else -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) { - 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) { - 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); - - OS_RestoreInterrupts(enabled); - return (void *)((char *)cell + HEADERSIZE); -} -#endif
\ No newline at end of file |