diff options
| author | 2014-04-24 23:56:06 -0400 | |
|---|---|---|
| committer | 2014-04-24 23:56:06 -0400 | |
| commit | 890c7261d2d6d6a760512ebe93c565ee87220983 (patch) | |
| tree | 7d822f01da90c37c188faa76578c0d1733136d06 /src | |
| parent | added functions to map Heap and Shared memory space (diff) | |
| download | yuzu-890c7261d2d6d6a760512ebe93c565ee87220983.tar.gz yuzu-890c7261d2d6d6a760512ebe93c565ee87220983.tar.xz yuzu-890c7261d2d6d6a760512ebe93c565ee87220983.zip | |
- added preliminary support for svc_MapMemoryBlock
- added shared memory region
- moarrrr cleanups to memory_map
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/syscall.cpp | 38 | ||||
| -rw-r--r-- | src/core/mem_map.cpp | 10 | ||||
| -rw-r--r-- | src/core/mem_map.h | 9 | ||||
| -rw-r--r-- | src/core/mem_map_funcs.cpp | 27 |
4 files changed, 70 insertions, 14 deletions
diff --git a/src/core/hle/syscall.cpp b/src/core/hle/syscall.cpp index e5533a741..de1c11862 100644 --- a/src/core/hle/syscall.cpp +++ b/src/core/hle/syscall.cpp | |||
| @@ -15,14 +15,29 @@ | |||
| 15 | 15 | ||
| 16 | namespace Syscall { | 16 | namespace Syscall { |
| 17 | 17 | ||
| 18 | enum ControlMemoryOperation { | ||
| 19 | MEMORY_OPERATION_HEAP = 0x00000003, | ||
| 20 | MEMORY_OPERATION_GSP_HEAP = 0x00010003, | ||
| 21 | }; | ||
| 22 | |||
| 23 | enum MapMemoryPermission { | ||
| 24 | MEMORY_PERMISSION_UNMAP = 0x00000000, | ||
| 25 | MEMORY_PERMISSION_NORMAL = 0x00000001, | ||
| 26 | }; | ||
| 27 | |||
| 18 | /// Map application or GSP heap memory | 28 | /// Map application or GSP heap memory |
| 19 | Result ControlMemory(void* outaddr, u32 addr0, u32 addr1, u32 size, u32 operation, u32 permissions) { | 29 | Result ControlMemory(void* outaddr, u32 addr0, u32 addr1, u32 size, u32 operation, u32 permissions) { |
| 20 | u32 virtual_address = 0x00000000; | 30 | u32 virtual_address = 0x00000000; |
| 21 | 31 | ||
| 22 | switch (operation) { | 32 | switch (operation) { |
| 23 | 33 | ||
| 24 | // Map GSP heap memory? | 34 | // Map normal heap memory |
| 25 | case 0x00010003: | 35 | case MEMORY_OPERATION_HEAP: |
| 36 | virtual_address = Memory::MapBlock_Heap(size, operation, permissions); | ||
| 37 | break; | ||
| 38 | |||
| 39 | // Map GSP heap memory | ||
| 40 | case MEMORY_OPERATION_GSP_HEAP: | ||
| 26 | virtual_address = Memory::MapBlock_HeapGSP(size, operation, permissions); | 41 | virtual_address = Memory::MapBlock_HeapGSP(size, operation, permissions); |
| 27 | break; | 42 | break; |
| 28 | 43 | ||
| @@ -31,7 +46,22 @@ Result ControlMemory(void* outaddr, u32 addr0, u32 addr1, u32 size, u32 operatio | |||
| 31 | ERROR_LOG(OSHLE, "Unknown ControlMemory operation %08X", operation); | 46 | ERROR_LOG(OSHLE, "Unknown ControlMemory operation %08X", operation); |
| 32 | } | 47 | } |
| 33 | 48 | ||
| 34 | Core::g_app_core->SetReg(1, Memory::MapBlock_HeapGSP(size, operation, permissions)); | 49 | Core::g_app_core->SetReg(1, virtual_address); |
| 50 | return 0; | ||
| 51 | } | ||
| 52 | |||
| 53 | /// Maps a memory block to specified address | ||
| 54 | Result MapMemoryBlock(Handle memblock, u32 addr, u32 mypermissions, u32 otherpermission) { | ||
| 55 | int x = 0; | ||
| 56 | switch (mypermissions) { | ||
| 57 | case MEMORY_PERMISSION_NORMAL: | ||
| 58 | case MEMORY_PERMISSION_NORMAL + 1: | ||
| 59 | case MEMORY_PERMISSION_NORMAL + 2: | ||
| 60 | Memory::MapBlock_Shared(memblock, addr, mypermissions); | ||
| 61 | break; | ||
| 62 | default: | ||
| 63 | ERROR_LOG(OSHLE, "Unknown MapMemoryBlock permissions %08X", mypermissions); | ||
| 64 | } | ||
| 35 | return 0; | 65 | return 0; |
| 36 | } | 66 | } |
| 37 | 67 | ||
| @@ -93,7 +123,7 @@ const HLE::FunctionDef Syscall_Table[] = { | |||
| 93 | {0x1C, NULL, "CancelTimer"}, | 123 | {0x1C, NULL, "CancelTimer"}, |
| 94 | {0x1D, NULL, "ClearTimer"}, | 124 | {0x1D, NULL, "ClearTimer"}, |
| 95 | {0x1E, NULL, "CreateMemoryBlock"}, | 125 | {0x1E, NULL, "CreateMemoryBlock"}, |
| 96 | {0x1F, NULL, "MapMemoryBlock"}, | 126 | {0x1F, WrapI_UUUU<MapMemoryBlock>, "MapMemoryBlock"}, |
| 97 | {0x20, NULL, "UnmapMemoryBlock"}, | 127 | {0x20, NULL, "UnmapMemoryBlock"}, |
| 98 | {0x21, NULL, "CreateAddressArbiter"}, | 128 | {0x21, NULL, "CreateAddressArbiter"}, |
| 99 | {0x22, NULL, "ArbitrateAddress"}, | 129 | {0x22, NULL, "ArbitrateAddress"}, |
diff --git a/src/core/mem_map.cpp b/src/core/mem_map.cpp index f0090206e..96245e320 100644 --- a/src/core/mem_map.cpp +++ b/src/core/mem_map.cpp | |||
| @@ -19,6 +19,7 @@ MemArena g_arena; ///< The MemArena class | |||
| 19 | u8* g_heap = NULL; ///< Application heap (main memory) | 19 | u8* g_heap = NULL; ///< Application heap (main memory) |
| 20 | u8* g_heap_gsp = NULL; ///< GSP heap (main memory) | 20 | u8* g_heap_gsp = NULL; ///< GSP heap (main memory) |
| 21 | u8* g_vram = NULL; ///< Video memory (VRAM) pointer | 21 | u8* g_vram = NULL; ///< Video memory (VRAM) pointer |
| 22 | u8* g_shared_mem = NULL; ///< Shared memory | ||
| 22 | 23 | ||
| 23 | u8* g_physical_bootrom = NULL; ///< Bootrom physical memory | 24 | u8* g_physical_bootrom = NULL; ///< Bootrom physical memory |
| 24 | u8* g_uncached_bootrom = NULL; | 25 | u8* g_uncached_bootrom = NULL; |
| @@ -26,13 +27,14 @@ u8* g_uncached_bootrom = NULL; | |||
| 26 | u8* g_physical_fcram = NULL; ///< Main physical memory (FCRAM) | 27 | u8* g_physical_fcram = NULL; ///< Main physical memory (FCRAM) |
| 27 | u8* g_physical_heap_gsp = NULL; ///< GSP heap physical memory | 28 | u8* g_physical_heap_gsp = NULL; ///< GSP heap physical memory |
| 28 | u8* g_physical_vram = NULL; ///< Video physical memory (VRAM) | 29 | u8* g_physical_vram = NULL; ///< Video physical memory (VRAM) |
| 29 | u8* g_physical_scratchpad = NULL; ///< Scratchpad memory used for main thread stack | 30 | u8* g_physical_shared_mem = NULL; ///< Physical shared memory |
| 30 | 31 | ||
| 31 | // We don't declare the IO region in here since its handled by other means. | 32 | // We don't declare the IO region in here since its handled by other means. |
| 32 | static MemoryView g_views[] = { | 33 | static MemoryView g_views[] = { |
| 33 | {&g_vram, &g_physical_vram, VRAM_VADDR, VRAM_SIZE, 0}, | 34 | {&g_vram, &g_physical_vram, VRAM_VADDR, VRAM_SIZE, 0}, |
| 34 | {&g_heap_gsp, &g_physical_heap_gsp, HEAP_GSP_VADDR, HEAP_GSP_SIZE, 0}, | 35 | {&g_heap, &g_physical_fcram, HEAP_VADDR, HEAP_SIZE, MV_IS_PRIMARY_RAM}, |
| 35 | {&g_heap, &g_physical_fcram, HEAP_VADDR, HEAP_SIZE, MV_IS_PRIMARY_RAM}, | 36 | {&g_shared_mem, &g_physical_shared_mem, SHARED_MEMORY_VADDR, SHARED_MEMORY_SIZE, 0}, |
| 37 | {&g_heap_gsp, &g_physical_heap_gsp, HEAP_GSP_VADDR, HEAP_GSP_SIZE, 0}, | ||
| 36 | }; | 38 | }; |
| 37 | 39 | ||
| 38 | /*static MemoryView views[] = | 40 | /*static MemoryView views[] = |
diff --git a/src/core/mem_map.h b/src/core/mem_map.h index 5346d04ee..ab96e210f 100644 --- a/src/core/mem_map.h +++ b/src/core/mem_map.h | |||
| @@ -21,8 +21,11 @@ enum { | |||
| 21 | SCRATCHPAD_SIZE = 0x00004000, ///< Typical stack size - TODO: Read from exheader | 21 | SCRATCHPAD_SIZE = 0x00004000, ///< Typical stack size - TODO: Read from exheader |
| 22 | HEAP_GSP_SIZE = 0x02000000, ///< GSP heap size... TODO: Define correctly? | 22 | HEAP_GSP_SIZE = 0x02000000, ///< GSP heap size... TODO: Define correctly? |
| 23 | HEAP_SIZE = FCRAM_SIZE, ///< Application heap size | 23 | HEAP_SIZE = FCRAM_SIZE, ///< Application heap size |
| 24 | SHARED_MEMORY_SIZE = 0x04000000, ///< Shared memory size | ||
| 25 | HARDWARE_IO_SIZE = 0x01000000, | ||
| 24 | 26 | ||
| 25 | SHARED_MEMORY_VADDR = 0x10000000, ///< Shared memory | 27 | SHARED_MEMORY_VADDR = 0x10000000, ///< Shared memory |
| 28 | SHARED_MEMORY_VADDR_END = (SHARED_MEMORY_VADDR + SHARED_MEMORY_SIZE), | ||
| 26 | 29 | ||
| 27 | HEAP_PADDR = HEAP_GSP_SIZE, | 30 | HEAP_PADDR = HEAP_GSP_SIZE, |
| 28 | HEAP_PADDR_END = (HEAP_PADDR + HEAP_SIZE), | 31 | HEAP_PADDR_END = (HEAP_PADDR + HEAP_SIZE), |
| @@ -38,12 +41,17 @@ enum { | |||
| 38 | SCRATCHPAD_MASK = (SCRATCHPAD_SIZE - 1), ///< Scratchpad memory mask | 41 | SCRATCHPAD_MASK = (SCRATCHPAD_SIZE - 1), ///< Scratchpad memory mask |
| 39 | HEAP_GSP_MASK = (HEAP_GSP_SIZE - 1), | 42 | HEAP_GSP_MASK = (HEAP_GSP_SIZE - 1), |
| 40 | HEAP_MASK = (HEAP_SIZE - 1), | 43 | HEAP_MASK = (HEAP_SIZE - 1), |
| 44 | SHARED_MEMORY_MASK = (SHARED_MEMORY_SIZE - 1), | ||
| 41 | 45 | ||
| 42 | FCRAM_PADDR = 0x20000000, ///< FCRAM physical address | 46 | FCRAM_PADDR = 0x20000000, ///< FCRAM physical address |
| 43 | FCRAM_PADDR_END = (FCRAM_PADDR + FCRAM_SIZE), ///< FCRAM end of physical space | 47 | FCRAM_PADDR_END = (FCRAM_PADDR + FCRAM_SIZE), ///< FCRAM end of physical space |
| 44 | FCRAM_VADDR = 0x08000000, ///< FCRAM virtual address | 48 | FCRAM_VADDR = 0x08000000, ///< FCRAM virtual address |
| 45 | FCRAM_VADDR_END = (FCRAM_VADDR + FCRAM_SIZE), ///< FCRAM end of virtual space | 49 | FCRAM_VADDR_END = (FCRAM_VADDR + FCRAM_SIZE), ///< FCRAM end of virtual space |
| 46 | 50 | ||
| 51 | HARDWARE_IO_VADDR = 0x1EC00000, | ||
| 52 | HARDWARE_IO_VADDR_END = (HARDWARE_IO_VADDR + HARDWARE_IO_SIZE), | ||
| 53 | |||
| 54 | |||
| 47 | VRAM_VADDR = 0x1F000000, | 55 | VRAM_VADDR = 0x1F000000, |
| 48 | SCRATCHPAD_VADDR_END = 0x10000000, | 56 | SCRATCHPAD_VADDR_END = 0x10000000, |
| 49 | SCRATCHPAD_VADDR = (SCRATCHPAD_VADDR_END - SCRATCHPAD_SIZE), ///< Stack space | 57 | SCRATCHPAD_VADDR = (SCRATCHPAD_VADDR_END - SCRATCHPAD_SIZE), ///< Stack space |
| @@ -84,6 +92,7 @@ extern u8 *g_base; | |||
| 84 | extern u8* g_heap_gsp; ///< GSP heap (main memory) | 92 | extern u8* g_heap_gsp; ///< GSP heap (main memory) |
| 85 | extern u8* g_heap; ///< Application heap (main memory) | 93 | extern u8* g_heap; ///< Application heap (main memory) |
| 86 | extern u8* g_vram; ///< Video memory (VRAM) | 94 | extern u8* g_vram; ///< Video memory (VRAM) |
| 95 | extern u8* g_shared_mem; ///< Shared memory | ||
| 87 | 96 | ||
| 88 | void Init(); | 97 | void Init(); |
| 89 | void Shutdown(); | 98 | void Shutdown(); |
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) { | |||
| 43 | 43 | ||
| 44 | // Hardware I/O register reads | 44 | // Hardware I/O register reads |
| 45 | // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space | 45 | // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space |
| 46 | } else if ((vaddr & 0xFF000000) == 0x10000000 || (vaddr & 0xFF000000) == 0x1E000000) { | 46 | } else if ((vaddr >= HARDWARE_IO_VADDR) && (vaddr < HARDWARE_IO_VADDR_END)) { |
| 47 | HW::Read<T>(var, vaddr); | 47 | HW::Read<T>(var, vaddr); |
| 48 | 48 | ||
| 49 | // FCRAM - GSP heap | 49 | // FCRAM - GSP heap |
| 50 | } else if ((vaddr > HEAP_GSP_VADDR) && (vaddr < HEAP_GSP_VADDR_END)) { | 50 | } else if ((vaddr >= HEAP_GSP_VADDR) && (vaddr < HEAP_GSP_VADDR_END)) { |
| 51 | var = *((const T*)&g_heap_gsp[vaddr & HEAP_GSP_MASK]); | 51 | var = *((const T*)&g_heap_gsp[vaddr & HEAP_GSP_MASK]); |
| 52 | 52 | ||
| 53 | // FCRAM - application heap | 53 | // FCRAM - application heap |
| 54 | } else if ((vaddr > HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { | 54 | } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { |
| 55 | var = *((const T*)&g_heap[vaddr & HEAP_MASK]); | 55 | var = *((const T*)&g_heap[vaddr & HEAP_MASK]); |
| 56 | 56 | ||
| 57 | // Shared memory | ||
| 58 | } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { | ||
| 59 | NOTICE_LOG(OSHLE, "wtf read"); | ||
| 60 | var = *((const T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK]); | ||
| 61 | |||
| 57 | /*else if ((vaddr & 0x3F800000) == 0x04000000) { | 62 | /*else if ((vaddr & 0x3F800000) == 0x04000000) { |
| 58 | var = *((const T*)&m_pVRAM[vaddr & VRAM_MASK]);*/ | 63 | var = *((const T*)&m_pVRAM[vaddr & VRAM_MASK]);*/ |
| 59 | 64 | ||
| @@ -74,17 +79,22 @@ inline void _Write(u32 addr, const T data) { | |||
| 74 | 79 | ||
| 75 | // Hardware I/O register writes | 80 | // Hardware I/O register writes |
| 76 | // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space | 81 | // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space |
| 77 | } else if ((vaddr & 0xFF000000) == 0x10000000 || (vaddr & 0xFF000000) == 0x1E000000) { | 82 | } else if ((vaddr >= HARDWARE_IO_VADDR) && (vaddr < HARDWARE_IO_VADDR_END)) { |
| 78 | HW::Write<T>(vaddr, data); | 83 | HW::Write<T>(vaddr, data); |
| 79 | 84 | ||
| 80 | // FCRAM - GSP heap | 85 | // FCRAM - GSP heap |
| 81 | } else if ((vaddr > HEAP_GSP_VADDR) && (vaddr < HEAP_GSP_VADDR_END)) { | 86 | } else if ((vaddr >= HEAP_GSP_VADDR) && (vaddr < HEAP_GSP_VADDR_END)) { |
| 82 | *(T*)&g_heap_gsp[vaddr & HEAP_GSP_MASK] = data; | 87 | *(T*)&g_heap_gsp[vaddr & HEAP_GSP_MASK] = data; |
| 83 | 88 | ||
| 84 | // FCRAM - application heap | 89 | // FCRAM - application heap |
| 85 | } else if ((vaddr > HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { | 90 | } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { |
| 86 | *(T*)&g_heap[vaddr & HEAP_MASK] = data; | 91 | *(T*)&g_heap[vaddr & HEAP_MASK] = data; |
| 87 | 92 | ||
| 93 | // Shared memory | ||
| 94 | } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { | ||
| 95 | NOTICE_LOG(OSHLE, "wtf read"); | ||
| 96 | *(T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK] = data; | ||
| 97 | |||
| 88 | } else if ((vaddr & 0xFF000000) == 0x14000000) { | 98 | } else if ((vaddr & 0xFF000000) == 0x14000000) { |
| 89 | _assert_msg_(MEMMAP, false, "umimplemented write to GSP heap"); | 99 | _assert_msg_(MEMMAP, false, "umimplemented write to GSP heap"); |
| 90 | } else if ((vaddr & 0xFFF00000) == 0x1EC00000) { | 100 | } else if ((vaddr & 0xFFF00000) == 0x1EC00000) { |
| @@ -116,6 +126,11 @@ u8 *GetPointer(const u32 addr) { | |||
| 116 | } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { | 126 | } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { |
| 117 | return g_heap + (vaddr & HEAP_MASK); | 127 | return g_heap + (vaddr & HEAP_MASK); |
| 118 | 128 | ||
| 129 | // Shared memory | ||
| 130 | } else if ((vaddr > SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { | ||
| 131 | NOTICE_LOG(OSHLE, "wtf read"); | ||
| 132 | return g_shared_mem + (vaddr & SHARED_MEMORY_MASK); | ||
| 133 | |||
| 119 | } else { | 134 | } else { |
| 120 | ERROR_LOG(MEMMAP, "Unknown GetPointer @ 0x%08x", vaddr); | 135 | ERROR_LOG(MEMMAP, "Unknown GetPointer @ 0x%08x", vaddr); |
| 121 | return 0; | 136 | return 0; |