mirror of https://github.com/RPCS3/rpcs3.git
Fix shared memory page flags
TODO: From hw testing, it seems like sys_memory_get_page_attribute and sys_rsx_context_iomap check page size a little differently get_page_attribute() always go by area flags, sys_rsx_context_iomap checks page by the page granularity This means that if the area page size 64k, but shared memory is mapped with SYS_MEMORY_GRANULARITY_1M It can be mapped for rsxio, but the page attribute will indicate 64k page size :thonk: rsxio memory is verified to need 1m pages.
This commit is contained in:
parent
7470388e5a
commit
a43e7c172c
|
@ -309,7 +309,7 @@ error_code sys_mmapper_map_shared_memory(u32 addr, u32 mem_id, u64 flags)
|
||||||
return mem.ret;
|
return mem.ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!area->falloc(addr, mem->size, &mem->shm))
|
if (!area->falloc(addr, mem->size, &mem->shm, mem->align == 0x10000 ? SYS_MEMORY_PAGE_SIZE_64K : SYS_MEMORY_PAGE_SIZE_1M))
|
||||||
{
|
{
|
||||||
mem->counter--;
|
mem->counter--;
|
||||||
return CELL_EBUSY;
|
return CELL_EBUSY;
|
||||||
|
@ -339,7 +339,7 @@ error_code sys_mmapper_search_and_map(u32 start_addr, u32 mem_id, u64 flags, vm:
|
||||||
return CELL_ESRCH;
|
return CELL_ESRCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
const u32 addr = area->alloc(mem->size, mem->align, &mem->shm);
|
const u32 addr = area->alloc(mem->size, mem->align, &mem->shm, mem->align == 0x10000 ? SYS_MEMORY_PAGE_SIZE_64K : SYS_MEMORY_PAGE_SIZE_1M);
|
||||||
|
|
||||||
if (!addr)
|
if (!addr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -665,8 +665,14 @@ namespace vm
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 block_t::alloc(const u32 orig_size, u32 align, const std::shared_ptr<utils::shm>* src)
|
u32 block_t::alloc(const u32 orig_size, u32 align, const std::shared_ptr<utils::shm>* src, u64 flags)
|
||||||
{
|
{
|
||||||
|
if (!src)
|
||||||
|
{
|
||||||
|
// Use the block's flags
|
||||||
|
flags = this->flags;
|
||||||
|
}
|
||||||
|
|
||||||
vm::writer_lock lock(0);
|
vm::writer_lock lock(0);
|
||||||
|
|
||||||
// Determine minimal alignment
|
// Determine minimal alignment
|
||||||
|
@ -720,8 +726,14 @@ namespace vm
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 block_t::falloc(u32 addr, const u32 orig_size, const std::shared_ptr<utils::shm>* src)
|
u32 block_t::falloc(u32 addr, const u32 orig_size, const std::shared_ptr<utils::shm>* src, u64 flags)
|
||||||
{
|
{
|
||||||
|
if (!src)
|
||||||
|
{
|
||||||
|
// Use the block's flags
|
||||||
|
flags = this->flags;
|
||||||
|
}
|
||||||
|
|
||||||
vm::writer_lock lock(0);
|
vm::writer_lock lock(0);
|
||||||
|
|
||||||
// Determine minimal alignment
|
// Determine minimal alignment
|
||||||
|
|
|
@ -161,10 +161,10 @@ namespace vm
|
||||||
const u64 flags; // Currently unused
|
const u64 flags; // Currently unused
|
||||||
|
|
||||||
// Search and map memory (min alignment is 0x10000)
|
// Search and map memory (min alignment is 0x10000)
|
||||||
u32 alloc(u32 size, u32 align = 0x10000, const std::shared_ptr<utils::shm>* = nullptr);
|
u32 alloc(u32 size, u32 align = 0x10000, const std::shared_ptr<utils::shm>* = nullptr, u64 flags = 0);
|
||||||
|
|
||||||
// Try to map memory at fixed location
|
// Try to map memory at fixed location
|
||||||
u32 falloc(u32 addr, u32 size, const std::shared_ptr<utils::shm>* = nullptr);
|
u32 falloc(u32 addr, u32 size, const std::shared_ptr<utils::shm>* = nullptr, u64 flags = 0);
|
||||||
|
|
||||||
// Unmap memory at specified location previously returned by alloc(), return size
|
// Unmap memory at specified location previously returned by alloc(), return size
|
||||||
u32 dealloc(u32 addr, const std::shared_ptr<utils::shm>* = nullptr);
|
u32 dealloc(u32 addr, const std::shared_ptr<utils::shm>* = nullptr);
|
||||||
|
|
Loading…
Reference in New Issue