|
|
|
@ -325,7 +325,7 @@ public: |
|
|
|
for (std::size_t retry = 0; retry < MAXIMUM_MAP_RETRIES; retry++) { |
|
|
|
auto& page_table{process->PageTable()}; |
|
|
|
const VAddr addr{GetRandomMapRegion(page_table, size)}; |
|
|
|
const ResultCode result{page_table.MapProcessCodeMemory(addr, baseAddress, size)}; |
|
|
|
const ResultCode result{page_table.MapCodeMemory(addr, baseAddress, size)}; |
|
|
|
|
|
|
|
if (result == Kernel::ResultInvalidCurrentMemory) { |
|
|
|
continue; |
|
|
|
@ -351,12 +351,12 @@ public: |
|
|
|
|
|
|
|
if (bss_size) { |
|
|
|
auto block_guard = detail::ScopeExit([&] { |
|
|
|
page_table.UnmapProcessCodeMemory(addr + nro_size, bss_addr, bss_size); |
|
|
|
page_table.UnmapProcessCodeMemory(addr, nro_addr, nro_size); |
|
|
|
page_table.UnmapCodeMemory(addr + nro_size, bss_addr, bss_size); |
|
|
|
page_table.UnmapCodeMemory(addr, nro_addr, nro_size); |
|
|
|
}); |
|
|
|
|
|
|
|
const ResultCode result{ |
|
|
|
page_table.MapProcessCodeMemory(addr + nro_size, bss_addr, bss_size)}; |
|
|
|
page_table.MapCodeMemory(addr + nro_size, bss_addr, bss_size)}; |
|
|
|
|
|
|
|
if (result == Kernel::ResultInvalidCurrentMemory) { |
|
|
|
continue; |
|
|
|
@ -530,16 +530,15 @@ public: |
|
|
|
ResultCode UnmapNro(const NROInfo& info) { |
|
|
|
// Each region must be unmapped separately to validate memory state
|
|
|
|
auto& page_table{system.CurrentProcess()->PageTable()}; |
|
|
|
CASCADE_CODE(page_table.UnmapProcessCodeMemory(info.nro_address + info.text_size + |
|
|
|
info.ro_size + info.data_size, |
|
|
|
CASCADE_CODE(page_table.UnmapCodeMemory(info.nro_address + info.text_size + info.ro_size + |
|
|
|
info.data_size, |
|
|
|
info.bss_address, info.bss_size)); |
|
|
|
CASCADE_CODE(page_table.UnmapProcessCodeMemory( |
|
|
|
info.nro_address + info.text_size + info.ro_size, |
|
|
|
info.src_addr + info.text_size + info.ro_size, info.data_size)); |
|
|
|
CASCADE_CODE(page_table.UnmapProcessCodeMemory( |
|
|
|
info.nro_address + info.text_size, info.src_addr + info.text_size, info.ro_size)); |
|
|
|
CASCADE_CODE( |
|
|
|
page_table.UnmapProcessCodeMemory(info.nro_address, info.src_addr, info.text_size)); |
|
|
|
CASCADE_CODE(page_table.UnmapCodeMemory(info.nro_address + info.text_size + info.ro_size, |
|
|
|
info.src_addr + info.text_size + info.ro_size, |
|
|
|
info.data_size)); |
|
|
|
CASCADE_CODE(page_table.UnmapCodeMemory(info.nro_address + info.text_size, |
|
|
|
info.src_addr + info.text_size, info.ro_size)); |
|
|
|
CASCADE_CODE(page_table.UnmapCodeMemory(info.nro_address, info.src_addr, info.text_size)); |
|
|
|
return ResultSuccess; |
|
|
|
} |
|
|
|
|
|
|
|
|