mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-10-11 22:49:55 +00:00
VM/sys_mmapper: Fix sys_mmapper error checking
This commit is contained in:
@@ -235,7 +235,7 @@ error_code sys_mmapper_allocate_address(ppu_thread& ppu, u64 size, u64 flags, u6
|
||||
case 0x40000000:
|
||||
case 0x80000000:
|
||||
{
|
||||
if (const auto area = vm::find_map(static_cast<u32>(size), static_cast<u32>(alignment), flags & SYS_MEMORY_PAGE_SIZE_MASK))
|
||||
if (const auto area = vm::find_map(static_cast<u32>(size), static_cast<u32>(alignment), vm::mapping_comp | (flags & SYS_MEMORY_PAGE_SIZE_MASK)))
|
||||
{
|
||||
sys_mmapper.warning("sys_mmapper_allocate_address(): Found VM 0x%x area (vsize=0x%x)", area->addr, size);
|
||||
|
||||
@@ -638,7 +638,7 @@ error_code sys_mmapper_free_address(ppu_thread& ppu, u32 addr)
|
||||
|
||||
const auto mem = vm::get(vm::any, addr);
|
||||
|
||||
if (!mem || mem->addr != addr)
|
||||
if (!mem || mem->addr != addr || !(mem->flags & vm::mapping_comp))
|
||||
{
|
||||
return {CELL_EINVAL, addr};
|
||||
}
|
||||
@@ -733,7 +733,7 @@ error_code sys_mmapper_map_shared_memory(ppu_thread& ppu, u32 addr, u32 mem_id,
|
||||
|
||||
const auto area = vm::get(vm::any, addr);
|
||||
|
||||
if (!area || addr < 0x20000000 || addr >= 0xC0000000)
|
||||
if (!area || !(area->flags & vm::mapping_comp))
|
||||
{
|
||||
return CELL_EINVAL;
|
||||
}
|
||||
@@ -813,7 +813,7 @@ error_code sys_mmapper_search_and_map(ppu_thread& ppu, u32 start_addr, u32 mem_i
|
||||
|
||||
const auto area = vm::get(vm::any, start_addr);
|
||||
|
||||
if (!area || start_addr != area->addr || start_addr < 0x20000000 || start_addr >= 0xC0000000)
|
||||
if (!area || start_addr != area->addr || !(area->flags & vm::mapping_comp))
|
||||
{
|
||||
return {CELL_EINVAL, start_addr};
|
||||
}
|
||||
@@ -894,7 +894,7 @@ error_code sys_mmapper_unmap_shared_memory(ppu_thread& ppu, u32 addr, vm::ptr<u3
|
||||
|
||||
const auto area = vm::get(vm::any, addr);
|
||||
|
||||
if (!area || addr < 0x20000000 || addr >= 0xC0000000)
|
||||
if (!area || !(area->flags & vm::mapping_comp))
|
||||
{
|
||||
return {CELL_EINVAL, addr};
|
||||
}
|
||||
@@ -943,7 +943,7 @@ error_code sys_mmapper_enable_page_fault_notification(ppu_thread& ppu, u32 start
|
||||
sys_mmapper.warning("sys_mmapper_enable_page_fault_notification(start_addr=0x%x, event_queue_id=0x%x)", start_addr, event_queue_id);
|
||||
|
||||
auto mem = vm::get(vm::any, start_addr);
|
||||
if (!mem || start_addr != mem->addr || start_addr < 0x20000000 || start_addr >= 0xC0000000)
|
||||
if (!mem || start_addr != mem->addr || !(mem->flags & vm::mapping_comp))
|
||||
{
|
||||
return {CELL_EINVAL, start_addr};
|
||||
}
|
||||
|
||||
+18
-2
@@ -1286,7 +1286,7 @@ namespace vm
|
||||
return true;
|
||||
}
|
||||
|
||||
static constexpr u64 process_block_flags(u64 flags)
|
||||
static constexpr u64 process_block_flags(u64 flags, bool is_savestate = false, u32 addr = 0)
|
||||
{
|
||||
if ((flags & block_size_mask) == 0)
|
||||
{
|
||||
@@ -1302,6 +1302,20 @@ namespace vm
|
||||
flags &= ~stack_guarded;
|
||||
}
|
||||
|
||||
if (is_savestate)
|
||||
{
|
||||
// For backwards compatibility
|
||||
const s32 version = GET_SERIALIZATION_VERSION(lv2_memory);
|
||||
|
||||
if (version < 4)
|
||||
{
|
||||
if (addr >= 0x20000000 && addr < 0xC0000000)
|
||||
{
|
||||
flags |= mapping_comp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
@@ -1811,6 +1825,8 @@ namespace vm
|
||||
|
||||
void block_t::save(utils::serial& ar, std::map<utils::shm*, usz>& shared)
|
||||
{
|
||||
USING_SERIALIZATION_VERSION(lv2_memory);
|
||||
|
||||
auto& m_map = (m.*block_map)();
|
||||
|
||||
ar(addr, size, flags);
|
||||
@@ -1853,7 +1869,7 @@ namespace vm
|
||||
: m_id(init_block_id())
|
||||
, addr(ar)
|
||||
, size(ar)
|
||||
, flags(process_block_flags(ar.pop<u64>()))
|
||||
, flags(process_block_flags(ar.pop<u64>(), true, addr))
|
||||
{
|
||||
if (flags & preallocated)
|
||||
{
|
||||
|
||||
@@ -132,6 +132,7 @@ namespace vm
|
||||
bf0_0x1 = 0x1, // TODO: document
|
||||
bf0_0x2 = 0x2, // TODO: document
|
||||
rsx_incomp = 0x4, // Block is not compatible for RSX mappings, despite 1MB pages
|
||||
mapping_comp = 0x8, // Block is compatible for sys_mmapper mappings
|
||||
|
||||
bf0_mask = bf0_0x1 | bf0_0x2,
|
||||
};
|
||||
|
||||
@@ -48,9 +48,14 @@ SERIALIZATION_VER(lv2_vm, 4, 1)
|
||||
SERIALIZATION_VER(lv2_net, 5, 1, 2/*TCP Feign conection loss*/, 3/*P2PS stream_disconnected status*/)
|
||||
SERIALIZATION_VER(lv2_fs, 6, 1, 2/*NPDRM key saving*/)
|
||||
SERIALIZATION_VER(lv2_prx_overlay, 7, 2)
|
||||
SERIALIZATION_VER(lv2_memory, 8, 3)
|
||||
SERIALIZATION_VER(lv2_memory, 8, 3, 4/*sys_mmapper strict mapping*/)
|
||||
SERIALIZATION_VER(lv2_config, 9, 1)
|
||||
|
||||
namespace vm
|
||||
{
|
||||
SERIALIZATION_VER(lv2_memory, 8, 3, 4/*sys_mmapper string mapping*/)
|
||||
}
|
||||
|
||||
namespace rsx
|
||||
{
|
||||
SERIALIZATION_VER(rsx, 10, 1, 2/*Pending flip*/, 3/*avconf scan_mode*/)
|
||||
|
||||
Reference in New Issue
Block a user