memory.h (2492B)
1 #ifndef MEMORY_H 2 #define MEMORY_H 3 4 #include <PR/ultratypes.h> 5 6 #include "types.h" 7 8 #define MEMORY_POOL_LEFT 0 9 #define MEMORY_POOL_RIGHT 1 10 11 struct AllocOnlyPool { 12 s32 totalSpace; 13 s32 usedSpace; 14 u8 *startPtr; 15 u8 *freePtr; 16 }; 17 18 struct MemoryPool; 19 20 struct OffsetSizePair { 21 u32 offset; 22 u32 size; 23 }; 24 25 struct DmaTable { 26 u32 count; 27 u8 *srcAddr; 28 struct OffsetSizePair anim[1]; // dynamic size 29 }; 30 31 struct DmaHandlerList { 32 struct DmaTable *dmaTable; 33 void *currentAddr; 34 void *bufTarget; 35 }; 36 37 #ifndef INCLUDED_FROM_MEMORY_C 38 // Declaring this variable extern puts it in the wrong place in the bss order 39 // when this file is included from memory.c (first instead of last). Hence, 40 // ifdef hack. It was very likely subject to bss reordering originally. 41 extern struct MemoryPool *gEffectsMemoryPool; 42 #endif 43 44 uintptr_t set_segment_base_addr(s32 segment, void *addr); 45 void *get_segment_base_addr(s32 segment); 46 void *segmented_to_virtual(const void *addr); 47 void *virtual_to_segmented(u32 segment, const void *addr); 48 void move_segment_table_to_dmem(void); 49 50 void main_pool_init(void *start, void *end); 51 void *main_pool_alloc(u32 size, u32 side); 52 u32 main_pool_free(void *addr); 53 void *main_pool_realloc(void *addr, u32 size); 54 u32 main_pool_available(void); 55 u32 main_pool_push_state(void); 56 u32 main_pool_pop_state(void); 57 58 #ifndef NO_SEGMENTED_MEMORY 59 void *load_segment(s32 segment, u8 *srcStart, u8 *srcEnd, u32 side); 60 void *load_to_fixed_pool_addr(u8 *destAddr, u8 *srcStart, u8 *srcEnd); 61 void *load_segment_decompress(s32 segment, u8 *srcStart, u8 *srcEnd); 62 void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd); 63 void load_engine_code_segment(void); 64 #else 65 #define load_segment(...) 66 #define load_to_fixed_pool_addr(...) 67 #define load_segment_decompress(...) 68 #define load_segment_decompress_heap(...) 69 #define load_engine_code_segment(...) 70 #endif 71 72 struct AllocOnlyPool *alloc_only_pool_init(u32 size, u32 side); 73 void *alloc_only_pool_alloc(struct AllocOnlyPool *pool, s32 size); 74 struct AllocOnlyPool *alloc_only_pool_resize(struct AllocOnlyPool *pool, u32 size); 75 76 struct MemoryPool *mem_pool_init(u32 size, u32 side); 77 void *mem_pool_alloc(struct MemoryPool *pool, u32 size); 78 BAD_RETURN(s32) mem_pool_free(struct MemoryPool *pool, void *addr); 79 80 void *alloc_display_list(u32 size); 81 void setup_dma_table_list(struct DmaHandlerList *list, void *srcAddr, void *buffer); 82 s32 load_patchable_table(struct DmaHandlerList *list, s32 index); 83 84 #endif // MEMORY_H