added functions to map Heap and Shared memory space
This commit is contained in:
		@@ -16,15 +16,15 @@ u8*    g_base                   = NULL;         ///< The base pointer to the aut
 | 
			
		||||
 | 
			
		||||
MemArena g_arena;                               ///< The MemArena class
 | 
			
		||||
 | 
			
		||||
u8* g_heap_gsp                  = NULL;         ///< GSP heap (main memory)
 | 
			
		||||
u8* g_heap                      = NULL;         ///< Application heap (main memory)
 | 
			
		||||
u8* g_heap_gsp                  = NULL;         ///< GSP heap (main memory)
 | 
			
		||||
u8* g_vram                      = NULL;         ///< Video memory (VRAM) pointer
 | 
			
		||||
 | 
			
		||||
u8* g_physical_bootrom          = NULL;         ///< Bootrom physical memory
 | 
			
		||||
u8* g_uncached_bootrom          = NULL;
 | 
			
		||||
 | 
			
		||||
u8* g_physical_fcram            = NULL;         ///< Main physical memory (FCRAM)
 | 
			
		||||
u8* g_physical_heap_gsp         = NULL;
 | 
			
		||||
u8* g_physical_heap_gsp         = NULL;         ///< GSP heap physical memory
 | 
			
		||||
u8* g_physical_vram             = NULL;         ///< Video physical memory (VRAM)
 | 
			
		||||
u8* g_physical_scratchpad       = NULL;         ///< Scratchpad memory used for main thread stack
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,8 @@ enum {
 | 
			
		||||
    HEAP_GSP_SIZE           = 0x02000000,   ///< GSP heap size... TODO: Define correctly?
 | 
			
		||||
    HEAP_SIZE               = FCRAM_SIZE,   ///< Application heap size
 | 
			
		||||
 | 
			
		||||
    SHARED_MEMORY_VADDR     = 0x10000000,   ///< Shared memory
 | 
			
		||||
 | 
			
		||||
    HEAP_PADDR              = HEAP_GSP_SIZE,
 | 
			
		||||
    HEAP_PADDR_END          = (HEAP_PADDR + HEAP_SIZE),
 | 
			
		||||
    HEAP_VADDR              = 0x08000000,
 | 
			
		||||
@@ -49,10 +51,11 @@ enum {
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
/// Represents a block of heap memory mapped by ControlMemory
 | 
			
		||||
struct HeapBlock {
 | 
			
		||||
    HeapBlock() : base_address(0), address(0), size(0), operation(0), permissions(0) {
 | 
			
		||||
/// Represents a block of memory mapped by ControlMemory/MapMemoryBlock
 | 
			
		||||
struct MemoryBlock {
 | 
			
		||||
    MemoryBlock() : handle(0), base_address(0), address(0), size(0), operation(0), permissions(0) {
 | 
			
		||||
    }
 | 
			
		||||
    u32 handle;
 | 
			
		||||
    u32 base_address;
 | 
			
		||||
    u32 address;
 | 
			
		||||
    u32 size;
 | 
			
		||||
@@ -98,10 +101,26 @@ void Write32(const u32 addr, const u32 data);
 | 
			
		||||
 | 
			
		||||
u8* GetPointer(const u32 Address);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Maps a block of memory in shared memory
 | 
			
		||||
 * @param handle Handle to map memory block for
 | 
			
		||||
 * @param addr Address to map memory block to
 | 
			
		||||
 * @param permissions Memory map permissions
 | 
			
		||||
 */
 | 
			
		||||
u32 MapBlock_Shared(u32 handle, u32 addr,u32 permissions) ;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Maps a block of memory on the heap
 | 
			
		||||
 * @param size Size of block in bytes
 | 
			
		||||
 * @param operation Memory map operation type
 | 
			
		||||
 * @param flags Memory allocation flags
 | 
			
		||||
 */
 | 
			
		||||
u32 MapBlock_Heap(u32 size, u32 operation, u32 permissions);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Maps a block of memory on the GSP heap
 | 
			
		||||
 * @param size Size of block in bytes
 | 
			
		||||
 * @param operation Control memory operation
 | 
			
		||||
 * @param operation Memory map operation type
 | 
			
		||||
 * @param permissions Control memory permissions
 | 
			
		||||
 */
 | 
			
		||||
u32 MapBlock_HeapGSP(u32 size, u32 operation, u32 permissions);
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,9 @@
 | 
			
		||||
 | 
			
		||||
namespace Memory {
 | 
			
		||||
 | 
			
		||||
std::map<u32, HeapBlock> g_heap_gsp_map;
 | 
			
		||||
std::map<u32, MemoryBlock> g_heap_map;
 | 
			
		||||
std::map<u32, MemoryBlock> g_heap_gsp_map;
 | 
			
		||||
std::map<u32, MemoryBlock> g_shared_map;
 | 
			
		||||
 | 
			
		||||
/// Convert a physical address to virtual address
 | 
			
		||||
u32 _AddressPhysicalToVirtual(const u32 addr) {
 | 
			
		||||
@@ -120,13 +122,59 @@ u8 *GetPointer(const u32 addr) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Maps a block of memory in shared memory
 | 
			
		||||
 * @param handle Handle to map memory block for
 | 
			
		||||
 * @param addr Address to map memory block to
 | 
			
		||||
 * @param permissions Memory map permissions
 | 
			
		||||
 */
 | 
			
		||||
u32 MapBlock_Shared(u32 handle, u32 addr,u32 permissions) {
 | 
			
		||||
    MemoryBlock block;
 | 
			
		||||
    
 | 
			
		||||
    block.handle        = handle;
 | 
			
		||||
    block.base_address  = addr;
 | 
			
		||||
    block.permissions   = permissions;
 | 
			
		||||
    
 | 
			
		||||
    if (g_shared_map.size() > 0) {
 | 
			
		||||
        const MemoryBlock last_block = g_shared_map.rbegin()->second;
 | 
			
		||||
        block.address = last_block.address + last_block.size;
 | 
			
		||||
    }
 | 
			
		||||
    g_shared_map[block.GetVirtualAddress()] = block;
 | 
			
		||||
 | 
			
		||||
    return block.GetVirtualAddress();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Maps a block of memory on the heap
 | 
			
		||||
 * @param size Size of block in bytes
 | 
			
		||||
 * @param operation Memory map operation type
 | 
			
		||||
 * @param flags Memory allocation flags
 | 
			
		||||
 */
 | 
			
		||||
u32 MapBlock_Heap(u32 size, u32 operation, u32 permissions) {
 | 
			
		||||
    MemoryBlock block;
 | 
			
		||||
    
 | 
			
		||||
    block.base_address  = HEAP_VADDR;
 | 
			
		||||
    block.size          = size;
 | 
			
		||||
    block.operation     = operation;
 | 
			
		||||
    block.permissions   = permissions;
 | 
			
		||||
    
 | 
			
		||||
    if (g_heap_map.size() > 0) {
 | 
			
		||||
        const MemoryBlock last_block = g_heap_map.rbegin()->second;
 | 
			
		||||
        block.address = last_block.address + last_block.size;
 | 
			
		||||
    }
 | 
			
		||||
    g_heap_map[block.GetVirtualAddress()] = block;
 | 
			
		||||
 | 
			
		||||
    return block.GetVirtualAddress();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Maps a block of memory on the GSP heap
 | 
			
		||||
 * @param size Size of block in bytes
 | 
			
		||||
 * @param operation Memory map operation type
 | 
			
		||||
 * @param flags Memory allocation flags
 | 
			
		||||
 */
 | 
			
		||||
u32 MapBlock_HeapGSP(u32 size, u32 operation, u32 permissions) {
 | 
			
		||||
    HeapBlock block;
 | 
			
		||||
    MemoryBlock block;
 | 
			
		||||
    
 | 
			
		||||
    block.base_address  = HEAP_GSP_VADDR;
 | 
			
		||||
    block.size          = size;
 | 
			
		||||
@@ -134,7 +182,7 @@ u32 MapBlock_HeapGSP(u32 size, u32 operation, u32 permissions) {
 | 
			
		||||
    block.permissions   = permissions;
 | 
			
		||||
    
 | 
			
		||||
    if (g_heap_gsp_map.size() > 0) {
 | 
			
		||||
        const HeapBlock last_block = g_heap_gsp_map.rbegin()->second;
 | 
			
		||||
        const MemoryBlock last_block = g_heap_gsp_map.rbegin()->second;
 | 
			
		||||
        block.address = last_block.address + last_block.size;
 | 
			
		||||
    }
 | 
			
		||||
    g_heap_gsp_map[block.GetVirtualAddress()] = block;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user