rpcsx/rpcs3/Emu/Cell/lv2/sys_vm.cpp

139 lines
3 KiB
C++
Raw Normal View History

#include "stdafx.h"
2014-08-23 16:51:51 +02:00
#include "sys_vm.h"
2016-05-25 12:31:29 +02:00
#include "sys_memory.h"
namespace vm { using namespace ps3; }
2016-05-13 15:55:34 +02:00
logs::channel sys_vm("sys_vm", logs::level::notice);
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, vm::ptr<u32> addr)
{
sys_vm.error("sys_vm_memory_map(vsize=0x%x, psize=0x%x, cid=0x%x, flags=0x%llx, policy=0x%llx, addr=*0x%x)", vsize, psize, cid, flag, policy, addr);
2016-05-25 12:31:29 +02:00
if (!vsize || !psize || vsize & 0x2000000 || vsize > 0x10000000 || psize > 0x10000000 || policy != SYS_VM_POLICY_AUTO_RECOMMENDED)
{
return CELL_EINVAL;
}
2015-07-11 22:44:53 +02:00
if (cid != SYS_MEMORY_CONTAINER_ID_INVALID && !idm::check<lv2_memory_container>(cid))
{
2016-05-25 12:31:29 +02:00
return CELL_ESRCH;
}
2014-10-01 15:18:38 +02:00
2016-05-25 12:31:29 +02:00
// Look for unmapped space (roughly)
for (u32 found = 0x60000000; found <= 0xC0000000 - vsize; found += 0x2000000)
{
// Try to map
if (const auto area = vm::map(found, vsize, flag))
{
// Alloc all memory (shall not fail)
2016-08-15 02:11:49 +02:00
verify(HERE), area->alloc(vsize);
2016-05-25 12:31:29 +02:00
// Write a pointer for the allocated memory
*addr = found;
return CELL_OK;
}
}
2016-05-25 12:31:29 +02:00
return CELL_ENOMEM;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_unmap(u32 addr)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_unmap(addr=0x%x)", addr);
2015-07-11 22:44:53 +02:00
if (!vm::unmap(addr))
{
return CELL_EINVAL;
}
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_append_memory(u32 addr, u32 size)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_append_memory(addr=0x%x, size=0x%x)", addr, size);
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_return_memory(u32 addr, u32 size)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_return_memory(addr=0x%x, size=0x%x)", addr, size);
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_lock(u32 addr, u32 size)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_lock(addr=0x%x, size=0x%x)", addr, size);
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_unlock(u32 addr, u32 size)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_unlock(addr=0x%x, size=0x%x)", addr, size);
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_touch(u32 addr, u32 size)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_touch(addr=0x%x, size=0x%x)", addr, size);
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_flush(u32 addr, u32 size)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_flush(addr=0x%x, size=0x%x)", addr, size);
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_invalidate(u32 addr, u32 size)
{
sys_vm.todo("sys_vm_invalidate(addr=0x%x, size=0x%x)", addr, size);
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_store(u32 addr, u32 size)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_store(addr=0x%x, size=0x%x)", addr, size);
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_sync(u32 addr, u32 size)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_sync(addr=0x%x, size=0x%x)", addr, size);
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_test(u32 addr, u32 size, vm::ptr<u64> result)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_test(addr=0x%x, size=0x%x, result=*0x%x)", addr, size, result);
*result = SYS_VM_STATE_ON_MEMORY;
return CELL_OK;
}
2016-05-25 12:31:29 +02:00
ppu_error_code sys_vm_get_statistics(u32 addr, vm::ptr<sys_vm_statistics_t> stat)
{
2016-05-25 12:31:29 +02:00
sys_vm.warning("sys_vm_get_statistics(addr=0x%x, stat=*0x%x)", addr, stat);
2014-09-03 18:33:30 +02:00
stat->page_fault_ppu = 0;
stat->page_fault_spu = 0;
stat->page_in = 0;
stat->page_out = 0;
stat->pmem_total = 0;
2014-09-03 18:33:30 +02:00
stat->pmem_used = 0;
stat->timestamp = 0;
return CELL_OK;
}