diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/ldr/ldr.cpp | 10 | ||||
| -rw-r--r-- | src/core/memory.cpp | 8 |
2 files changed, 10 insertions, 8 deletions
diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp index ca119dd3a..453d90a22 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp | |||
| @@ -335,10 +335,7 @@ public: | |||
| 335 | vm_manager.ReprotectRange(*map_address + header.rw_offset, header.rw_size, | 335 | vm_manager.ReprotectRange(*map_address + header.rw_offset, header.rw_size, |
| 336 | Kernel::VMAPermission::ReadWrite); | 336 | Kernel::VMAPermission::ReadWrite); |
| 337 | 337 | ||
| 338 | Core::System::GetInstance().ArmInterface(0).ClearInstructionCache(); | 338 | Core::System::GetInstance().InvalidateCpuInstructionCaches(); |
| 339 | Core::System::GetInstance().ArmInterface(1).ClearInstructionCache(); | ||
| 340 | Core::System::GetInstance().ArmInterface(2).ClearInstructionCache(); | ||
| 341 | Core::System::GetInstance().ArmInterface(3).ClearInstructionCache(); | ||
| 342 | 339 | ||
| 343 | nro.insert_or_assign(*map_address, NROInfo{hash, nro_size + bss_size}); | 340 | nro.insert_or_assign(*map_address, NROInfo{hash, nro_size + bss_size}); |
| 344 | 341 | ||
| @@ -391,10 +388,7 @@ public: | |||
| 391 | Kernel::MemoryState::ModuleCodeStatic) == RESULT_SUCCESS); | 388 | Kernel::MemoryState::ModuleCodeStatic) == RESULT_SUCCESS); |
| 392 | ASSERT(process->UnmapMemory(mapped_addr, 0, nro_size) == RESULT_SUCCESS); | 389 | ASSERT(process->UnmapMemory(mapped_addr, 0, nro_size) == RESULT_SUCCESS); |
| 393 | 390 | ||
| 394 | Core::System::GetInstance().ArmInterface(0).ClearInstructionCache(); | 391 | Core::System::GetInstance().InvalidateCpuInstructionCaches(); |
| 395 | Core::System::GetInstance().ArmInterface(1).ClearInstructionCache(); | ||
| 396 | Core::System::GetInstance().ArmInterface(2).ClearInstructionCache(); | ||
| 397 | Core::System::GetInstance().ArmInterface(3).ClearInstructionCache(); | ||
| 398 | 392 | ||
| 399 | nro.erase(iter); | 393 | nro.erase(iter); |
| 400 | IPC::ResponseBuilder rb{ctx, 2}; | 394 | IPC::ResponseBuilder rb{ctx, 2}; |
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 70abd856a..41fd2a6a0 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -53,6 +53,14 @@ void PageTable::Resize(std::size_t address_space_width_in_bits) { | |||
| 53 | 53 | ||
| 54 | pointers.resize(num_page_table_entries); | 54 | pointers.resize(num_page_table_entries); |
| 55 | attributes.resize(num_page_table_entries); | 55 | attributes.resize(num_page_table_entries); |
| 56 | |||
| 57 | // The default is a 39-bit address space, which causes an initial 1GB allocation size. If the | ||
| 58 | // vector size is subsequently decreased (via resize), the vector might not automatically | ||
| 59 | // actually reallocate/resize its underlying allocation, which wastes up to ~800 MB for | ||
| 60 | // 36-bit titles. Call shrink_to_fit to reduce capacity to what's actually in use. | ||
| 61 | |||
| 62 | pointers.shrink_to_fit(); | ||
| 63 | attributes.shrink_to_fit(); | ||
| 56 | } | 64 | } |
| 57 | 65 | ||
| 58 | static void MapPages(PageTable& page_table, VAddr base, u64 size, u8* memory, PageType type) { | 66 | static void MapPages(PageTable& page_table, VAddr base, u64 size, u8* memory, PageType type) { |