From b7cd4c9e90be42476a2e242571d36cbbca2fbd4c Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 24 Apr 2014 22:32:26 -0400 Subject: added functions to map Heap and Shared memory space --- src/core/mem_map_funcs.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) (limited to 'src/core/mem_map_funcs.cpp') diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp index af4cfacbd..eff0cf4b8 100644 --- a/src/core/mem_map_funcs.cpp +++ b/src/core/mem_map_funcs.cpp @@ -12,7 +12,9 @@ namespace Memory { -std::map g_heap_gsp_map; +std::map g_heap_map; +std::map g_heap_gsp_map; +std::map 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; -- cgit v1.2.3 From 890c7261d2d6d6a760512ebe93c565ee87220983 Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 24 Apr 2014 23:56:06 -0400 Subject: - added preliminary support for svc_MapMemoryBlock - added shared memory region - moarrrr cleanups to memory_map --- src/core/mem_map_funcs.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'src/core/mem_map_funcs.cpp') diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp index eff0cf4b8..b2c39c57c 100644 --- a/src/core/mem_map_funcs.cpp +++ b/src/core/mem_map_funcs.cpp @@ -43,17 +43,22 @@ inline void _Read(T &var, const u32 addr) { // Hardware I/O register reads // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space - } else if ((vaddr & 0xFF000000) == 0x10000000 || (vaddr & 0xFF000000) == 0x1E000000) { + } else if ((vaddr >= HARDWARE_IO_VADDR) && (vaddr < HARDWARE_IO_VADDR_END)) { HW::Read(var, vaddr); // FCRAM - GSP heap - } else if ((vaddr > HEAP_GSP_VADDR) && (vaddr < HEAP_GSP_VADDR_END)) { + } else if ((vaddr >= HEAP_GSP_VADDR) && (vaddr < HEAP_GSP_VADDR_END)) { var = *((const T*)&g_heap_gsp[vaddr & HEAP_GSP_MASK]); // FCRAM - application heap - } else if ((vaddr > HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { + } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { var = *((const T*)&g_heap[vaddr & HEAP_MASK]); + // Shared memory + } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { + NOTICE_LOG(OSHLE, "wtf read"); + var = *((const T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK]); + /*else if ((vaddr & 0x3F800000) == 0x04000000) { var = *((const T*)&m_pVRAM[vaddr & VRAM_MASK]);*/ @@ -74,17 +79,22 @@ inline void _Write(u32 addr, const T data) { // Hardware I/O register writes // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space - } else if ((vaddr & 0xFF000000) == 0x10000000 || (vaddr & 0xFF000000) == 0x1E000000) { + } else if ((vaddr >= HARDWARE_IO_VADDR) && (vaddr < HARDWARE_IO_VADDR_END)) { HW::Write(vaddr, data); // FCRAM - GSP heap - } else if ((vaddr > HEAP_GSP_VADDR) && (vaddr < HEAP_GSP_VADDR_END)) { + } else if ((vaddr >= HEAP_GSP_VADDR) && (vaddr < HEAP_GSP_VADDR_END)) { *(T*)&g_heap_gsp[vaddr & HEAP_GSP_MASK] = data; // FCRAM - application heap - } else if ((vaddr > HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { + } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { *(T*)&g_heap[vaddr & HEAP_MASK] = data; + // Shared memory + } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { + NOTICE_LOG(OSHLE, "wtf read"); + *(T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK] = data; + } else if ((vaddr & 0xFF000000) == 0x14000000) { _assert_msg_(MEMMAP, false, "umimplemented write to GSP heap"); } else if ((vaddr & 0xFFF00000) == 0x1EC00000) { @@ -116,6 +126,11 @@ u8 *GetPointer(const u32 addr) { } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { return g_heap + (vaddr & HEAP_MASK); + // Shared memory + } else if ((vaddr > SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { + NOTICE_LOG(OSHLE, "wtf read"); + return g_shared_mem + (vaddr & SHARED_MEMORY_MASK); + } else { ERROR_LOG(MEMMAP, "Unknown GetPointer @ 0x%08x", vaddr); return 0; -- cgit v1.2.3 From 2672e7d88361528c9b2748114f6874d3474cb4da Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 25 Apr 2014 15:27:47 -0400 Subject: removed some cruft --- src/core/mem_map_funcs.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'src/core/mem_map_funcs.cpp') diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp index b2c39c57c..832957cb1 100644 --- a/src/core/mem_map_funcs.cpp +++ b/src/core/mem_map_funcs.cpp @@ -56,14 +56,10 @@ inline void _Read(T &var, const u32 addr) { // Shared memory } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { - NOTICE_LOG(OSHLE, "wtf read"); var = *((const T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK]); - /*else if ((vaddr & 0x3F800000) == 0x04000000) { - var = *((const T*)&m_pVRAM[vaddr & VRAM_MASK]);*/ - } else { - //_assert_msg_(MEMMAP, false, "unknown Read%d @ 0x%08X", sizeof(var) * 8, vaddr); + _assert_msg_(MEMMAP, false, "unknown Read%d @ 0x%08X", sizeof(var) * 8, vaddr); } } @@ -92,7 +88,6 @@ inline void _Write(u32 addr, const T data) { // Shared memory } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { - NOTICE_LOG(OSHLE, "wtf read"); *(T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK] = data; } else if ((vaddr & 0xFF000000) == 0x14000000) { @@ -128,7 +123,6 @@ u8 *GetPointer(const u32 addr) { // Shared memory } else if ((vaddr > SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { - NOTICE_LOG(OSHLE, "wtf read"); return g_shared_mem + (vaddr & SHARED_MEMORY_MASK); } else { -- cgit v1.2.3 From 86a515e5acd7e5fa3abd3a012ce4771d3b920754 Mon Sep 17 00:00:00 2001 From: bunnei Date: Sat, 26 Apr 2014 01:27:25 -0400 Subject: added vram to memory_map --- src/core/mem_map_funcs.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'src/core/mem_map_funcs.cpp') diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp index 832957cb1..875821adb 100644 --- a/src/core/mem_map_funcs.cpp +++ b/src/core/mem_map_funcs.cpp @@ -58,8 +58,12 @@ inline void _Read(T &var, const u32 addr) { } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { var = *((const T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK]); + // VRAM + } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) { + var = *((const T*)&g_vram[vaddr & VRAM_MASK]); + } else { - _assert_msg_(MEMMAP, false, "unknown Read%d @ 0x%08X", sizeof(var) * 8, vaddr); + //_assert_msg_(MEMMAP, false, "unknown Read%d @ 0x%08X", sizeof(var) * 8, vaddr); } } @@ -90,12 +94,10 @@ inline void _Write(u32 addr, const T data) { } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { *(T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK] = data; - } else if ((vaddr & 0xFF000000) == 0x14000000) { - _assert_msg_(MEMMAP, false, "umimplemented write to GSP heap"); - } else if ((vaddr & 0xFFF00000) == 0x1EC00000) { - _assert_msg_(MEMMAP, false, "umimplemented write to IO registers"); - } else if ((vaddr & 0xFF000000) == 0x1F000000) { - _assert_msg_(MEMMAP, false, "umimplemented write to VRAM"); + // VRAM + } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) { + *(T*)&g_vram[vaddr & VRAM_MASK] = data; + } else if ((vaddr & 0xFFF00000) == 0x1FF00000) { _assert_msg_(MEMMAP, false, "umimplemented write to DSP memory"); } else if ((vaddr & 0xFFFF0000) == 0x1FF80000) { @@ -125,6 +127,10 @@ u8 *GetPointer(const u32 addr) { } else if ((vaddr > SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { return g_shared_mem + (vaddr & SHARED_MEMORY_MASK); + // VRAM + } else if ((vaddr > VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) { + return g_vram + (vaddr & VRAM_MASK); + } else { ERROR_LOG(MEMMAP, "Unknown GetPointer @ 0x%08x", vaddr); return 0; -- cgit v1.2.3 From f78794961e2bdcb0314516a3c2409afbfcd6d470 Mon Sep 17 00:00:00 2001 From: bunnei Date: Sat, 26 Apr 2014 14:21:40 -0400 Subject: - changed HW IO map to use virtual addresses - added hooks to catch LCD IO read/writes --- src/core/mem_map_funcs.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src/core/mem_map_funcs.cpp') diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp index 875821adb..d0bec31c6 100644 --- a/src/core/mem_map_funcs.cpp +++ b/src/core/mem_map_funcs.cpp @@ -21,8 +21,16 @@ u32 _AddressPhysicalToVirtual(const u32 addr) { // Our memory interface read/write functions assume virtual addresses. Put any physical address // to virtual address translations here. This is obviously quite hacky... But we're not doing // any MMU emulation yet or anything - if ((addr >= FCRAM_PADDR) && (addr < (FCRAM_PADDR_END))) { + if ((addr >= FCRAM_PADDR) && (addr < FCRAM_PADDR_END)) { return (addr & FCRAM_MASK) | FCRAM_VADDR; + + // Hardware IO + // TODO(bunnei): FixMe + // This isn't going to work... The physical address of HARDWARE_IO conflicts with the virtual + // address of shared memory. + //} else if ((addr >= HARDWARE_IO_PADDR) && (addr < HARDWARE_IO_PADDR_END)) { + // return (addr + 0x0EB00000); + } return addr; } @@ -132,7 +140,7 @@ u8 *GetPointer(const u32 addr) { return g_vram + (vaddr & VRAM_MASK); } else { - ERROR_LOG(MEMMAP, "Unknown GetPointer @ 0x%08x", vaddr); + ERROR_LOG(MEMMAP, "unknown GetPointer @ 0x%08x", vaddr); return 0; } } -- cgit v1.2.3 From b2a6ad52f4a059b66e2a0ea12813ce968fa04277 Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 27 Apr 2014 12:40:31 -0400 Subject: added helper functions to mem_map to convert physical addresses to virtual addresses --- src/core/mem_map_funcs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/mem_map_funcs.cpp') diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp index d0bec31c6..c8daf0df5 100644 --- a/src/core/mem_map_funcs.cpp +++ b/src/core/mem_map_funcs.cpp @@ -22,7 +22,7 @@ u32 _AddressPhysicalToVirtual(const u32 addr) { // to virtual address translations here. This is obviously quite hacky... But we're not doing // any MMU emulation yet or anything if ((addr >= FCRAM_PADDR) && (addr < FCRAM_PADDR_END)) { - return (addr & FCRAM_MASK) | FCRAM_VADDR; + return VirtualAddressFromPhysical_FCRAM(addr); // Hardware IO // TODO(bunnei): FixMe -- cgit v1.2.3