mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-13 10:18:40 +12:00
RealToVirtualAddr became vm::get_addr()
This commit is contained in:
parent
c4558d2ca7
commit
5195b2b1b4
9 changed files with 61 additions and 58 deletions
|
@ -95,20 +95,18 @@ s32 sceKernelCreateThread(
|
||||||
s32 cpuAffinityMask,
|
s32 cpuAffinityMask,
|
||||||
vm::psv::ptr<const SceKernelThreadOptParam> pOptParam)
|
vm::psv::ptr<const SceKernelThreadOptParam> pOptParam)
|
||||||
{
|
{
|
||||||
sceLibKernel.Error("sceKernelCreateThread(pName=0x%x ('%s'), entry=0x%x, initPriority=%d, stackSize=0x%x, attr=0x%x, cpuAffinityMask=0x%x, pOptParam=0x%x)",
|
sceLibKernel.Error("sceKernelCreateThread(pName=0x%x, entry=0x%x, initPriority=%d, stackSize=0x%x, attr=0x%x, cpuAffinityMask=0x%x, pOptParam=0x%x)",
|
||||||
pName, pName.get_ptr(), entry, initPriority, stackSize, attr, cpuAffinityMask, pOptParam);
|
pName, entry, initPriority, stackSize, attr, cpuAffinityMask, pOptParam);
|
||||||
|
|
||||||
std::string name = pName.get_ptr();
|
ARMv7Thread& new_thread = static_cast<ARMv7Thread&>(Emu.GetCPU().AddThread(CPU_THREAD_ARMv7));
|
||||||
|
|
||||||
ARMv7Thread& new_thread = *(ARMv7Thread*)&Emu.GetCPU().AddThread(CPU_THREAD_ARMv7);
|
|
||||||
|
|
||||||
u32 id = new_thread.GetId();
|
u32 id = new_thread.GetId();
|
||||||
new_thread.SetEntry(entry.addr() ^ 1);
|
new_thread.SetEntry(entry.addr() ^ 1);
|
||||||
new_thread.SetPrio(initPriority);
|
new_thread.SetPrio(initPriority);
|
||||||
new_thread.SetStackSize(stackSize);
|
new_thread.SetStackSize(stackSize);
|
||||||
new_thread.SetName(name);
|
new_thread.SetName(pName.get_ptr());
|
||||||
|
|
||||||
sceLibKernel.Error("*** New ARMv7 Thread [%s] (entry_addr=0x%x): id = %d", name.c_str(), entry.addr(), id);
|
sceLibKernel.Error("*** New ARMv7 Thread [%s] (entry_addr=0x%x)^1: id = %d", pName.get_ptr(), entry, id);
|
||||||
|
|
||||||
new_thread.Run();
|
new_thread.Run();
|
||||||
|
|
||||||
|
@ -128,15 +126,17 @@ s32 sceKernelStartThread(s32 threadId, u32 argSize, vm::psv::ptr<const void> pAr
|
||||||
RETURN_ERROR(SCE_KERNEL_ERROR_INVALID_UID);
|
RETURN_ERROR(SCE_KERNEL_ERROR_INVALID_UID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ARMv7Thread& thread = static_cast<ARMv7Thread&>(*t);
|
||||||
|
|
||||||
// push arg block onto the stack
|
// push arg block onto the stack
|
||||||
u32 pos = (static_cast<ARMv7Thread*>(t.get())->SP -= argSize);
|
const u32 pos = (thread.SP -= argSize);
|
||||||
memcpy(vm::get_ptr<void>(pos), pArgBlock.get_ptr(), argSize);
|
memcpy(vm::get_ptr<void>(pos), pArgBlock.get_ptr(), argSize);
|
||||||
|
|
||||||
// set SceKernelThreadEntry function arguments
|
// set SceKernelThreadEntry function arguments
|
||||||
static_cast<ARMv7Thread*>(t.get())->write_gpr(0, argSize);
|
thread.write_gpr(0, argSize);
|
||||||
static_cast<ARMv7Thread*>(t.get())->write_gpr(1, pos);
|
thread.write_gpr(1, pos);
|
||||||
|
|
||||||
t->Exec();
|
thread.Exec();
|
||||||
return SCE_OK;
|
return SCE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,21 +83,6 @@ public:
|
||||||
|
|
||||||
void UnregisterPages(u64 addr, u32 size);
|
void UnregisterPages(u64 addr, u32 size);
|
||||||
|
|
||||||
u32 RealToVirtualAddr(const void* addr)
|
|
||||||
{
|
|
||||||
const u64 res = (u64)addr - (u64)GetBaseAddr();
|
|
||||||
|
|
||||||
if ((u32)res == res)
|
|
||||||
{
|
|
||||||
return (u32)res;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
assert(!addr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 InitRawSPU(MemoryBlock* raw_spu);
|
u32 InitRawSPU(MemoryBlock* raw_spu);
|
||||||
|
|
||||||
void CloseRawSPU(MemoryBlock* raw_spu, const u32 num);
|
void CloseRawSPU(MemoryBlock* raw_spu, const u32 num);
|
||||||
|
|
|
@ -52,6 +52,20 @@ namespace vm
|
||||||
return g_locations[location].deallocator(addr);
|
return g_locations[location].deallocator(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 get_addr(const void* real_pointer)
|
||||||
|
{
|
||||||
|
const u64 diff = (u64)real_pointer - (u64)g_base_addr;
|
||||||
|
const u32 res = (u32)diff;
|
||||||
|
|
||||||
|
if (res == diff)
|
||||||
|
{
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(!real_pointer);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
namespace ps3
|
namespace ps3
|
||||||
{
|
{
|
||||||
u32 main_alloc(u32 size)
|
u32 main_alloc(u32 size)
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace vm
|
||||||
template<typename T = void>
|
template<typename T = void>
|
||||||
T* const get_ptr(u32 addr)
|
T* const get_ptr(u32 addr)
|
||||||
{
|
{
|
||||||
return (T*)((u8*)g_base_addr + addr);
|
return reinterpret_cast<T*>(static_cast<u8*>(g_base_addr) + addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -40,6 +40,8 @@ namespace vm
|
||||||
return *get_ptr<T>(addr);
|
return *get_ptr<T>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 get_addr(const void* real_pointer);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct cast_ptr
|
struct cast_ptr
|
||||||
{
|
{
|
||||||
|
@ -65,7 +67,7 @@ namespace vm
|
||||||
{
|
{
|
||||||
__forceinline static u32 cast(const u64 addr, const char* func)
|
__forceinline static u32 cast(const u64 addr, const char* func)
|
||||||
{
|
{
|
||||||
const u32 res = (u32)addr;
|
const u32 res = static_cast<u32>(addr);
|
||||||
if (res != addr)
|
if (res != addr)
|
||||||
{
|
{
|
||||||
throw fmt::Format("%s(): invalid address 0x%llx", func, addr);
|
throw fmt::Format("%s(): invalid address 0x%llx", func, addr);
|
||||||
|
@ -96,42 +98,42 @@ namespace vm
|
||||||
|
|
||||||
static u8 read8(u32 addr)
|
static u8 read8(u32 addr)
|
||||||
{
|
{
|
||||||
return *((u8*)g_base_addr + addr);
|
return get_ref<u8>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write8(u32 addr, u8 value)
|
static void write8(u32 addr, u8 value)
|
||||||
{
|
{
|
||||||
*((u8*)g_base_addr + addr) = value;
|
get_ref<u8>(addr) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 read16(u32 addr)
|
static u16 read16(u32 addr)
|
||||||
{
|
{
|
||||||
return re16(*(u16*)((u8*)g_base_addr + addr));
|
return get_ref<be_t<u16>>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write16(u32 addr, be_t<u16> value)
|
static void write16(u32 addr, be_t<u16> value)
|
||||||
{
|
{
|
||||||
*(be_t<u16>*)((u8*)g_base_addr + addr) = value;
|
get_ref<be_t<u16>>(addr) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 read32(u32 addr)
|
static u32 read32(u32 addr)
|
||||||
{
|
{
|
||||||
return re32(*(u32*)((u8*)g_base_addr + addr));;
|
return get_ref<be_t<u32>>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write32(u32 addr, be_t<u32> value)
|
static void write32(u32 addr, be_t<u32> value)
|
||||||
{
|
{
|
||||||
*(be_t<u32>*)((u8*)g_base_addr + addr) = value;
|
get_ref<be_t<u32>>(addr) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 read64(u32 addr)
|
static u64 read64(u32 addr)
|
||||||
{
|
{
|
||||||
return re64(*(u64*)((u8*)g_base_addr + addr));
|
return get_ref<be_t<u64>>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write64(u32 addr, be_t<u64> value)
|
static void write64(u32 addr, be_t<u64> value)
|
||||||
{
|
{
|
||||||
*(be_t<u64>*)((u8*)g_base_addr + addr) = value;
|
get_ref<be_t<u64>>(addr) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write16(u32 addr, u16 value)
|
static void write16(u32 addr, u16 value)
|
||||||
|
@ -151,12 +153,12 @@ namespace vm
|
||||||
|
|
||||||
static u128 read128(u32 addr)
|
static u128 read128(u32 addr)
|
||||||
{
|
{
|
||||||
return re128(*(u128*)((u8*)g_base_addr + addr));
|
return get_ref<be_t<u128>>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write128(u32 addr, u128 value)
|
static void write128(u32 addr, u128 value)
|
||||||
{
|
{
|
||||||
*(u128*)((u8*)g_base_addr + addr) = re128(value);
|
get_ref<be_t<u128>>(addr) = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,52 +168,52 @@ namespace vm
|
||||||
|
|
||||||
static u8 read8(u32 addr)
|
static u8 read8(u32 addr)
|
||||||
{
|
{
|
||||||
return *((u8*)g_base_addr + addr);
|
return get_ref<u8>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write8(u32 addr, u8 value)
|
static void write8(u32 addr, u8 value)
|
||||||
{
|
{
|
||||||
*((u8*)g_base_addr + addr) = value;
|
get_ref<u8>(addr) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 read16(u32 addr)
|
static u16 read16(u32 addr)
|
||||||
{
|
{
|
||||||
return *(u16*)((u8*)g_base_addr + addr);
|
return get_ref<u16>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write16(u32 addr, u16 value)
|
static void write16(u32 addr, u16 value)
|
||||||
{
|
{
|
||||||
*(u16*)((u8*)g_base_addr + addr) = value;
|
get_ref<u16>(addr) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 read32(u32 addr)
|
static u32 read32(u32 addr)
|
||||||
{
|
{
|
||||||
return *(u32*)((u8*)g_base_addr + addr);
|
return get_ref<u32>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write32(u32 addr, u32 value)
|
static void write32(u32 addr, u32 value)
|
||||||
{
|
{
|
||||||
*(u32*)((u8*)g_base_addr + addr) = value;
|
get_ref<u32>(addr) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 read64(u32 addr)
|
static u64 read64(u32 addr)
|
||||||
{
|
{
|
||||||
return *(u64*)((u8*)g_base_addr + addr);
|
return get_ref<u64>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write64(u32 addr, u64 value)
|
static void write64(u32 addr, u64 value)
|
||||||
{
|
{
|
||||||
*(u64*)((u8*)g_base_addr + addr) = value;
|
get_ref<u64>(addr) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u128 read128(u32 addr)
|
static u128 read128(u32 addr)
|
||||||
{
|
{
|
||||||
return *(u128*)((u8*)g_base_addr + addr);
|
return get_ref<u128>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write128(u32 addr, u128 value)
|
static void write128(u32 addr, u128 value)
|
||||||
{
|
{
|
||||||
*(u128*)((u8*)g_base_addr + addr) = value;
|
get_ref<u128>(addr) = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,7 @@ s64 spursInit(
|
||||||
{
|
{
|
||||||
#ifdef PRX_DEBUG_XXX
|
#ifdef PRX_DEBUG_XXX
|
||||||
return cb_call<s32, vm::ptr<CellSpurs>, u32, u32, s32, s32, s32, u32, u32, u32, u32, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x74E4, libsre_rtoc,
|
return cb_call<s32, vm::ptr<CellSpurs>, u32, u32, s32, s32, s32, u32, u32, u32, u32, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x74E4, libsre_rtoc,
|
||||||
spurs, revision, sdkVersion, nSpus, spuPriority, ppuPriority, flags, Memory.RealToVirtualAddr(prefix), prefixSize, container, Memory.RealToVirtualAddr(swlPriority), swlMaxSpu, swlIsPreem);
|
spurs, revision, sdkVersion, nSpus, spuPriority, ppuPriority, flags, vm::get_addr(prefix), prefixSize, container, vm::get_addr(swlPriority), swlMaxSpu, swlIsPreem);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// SPURS initialization (asserts should actually rollback and return the error instead)
|
// SPURS initialization (asserts should actually rollback and return the error instead)
|
||||||
|
@ -700,7 +700,7 @@ s64 spursInit(
|
||||||
s32 res = CELL_OK;
|
s32 res = CELL_OK;
|
||||||
#ifdef PRX_DEBUG
|
#ifdef PRX_DEBUG
|
||||||
res = cb_call<s32, vm::ptr<CellSpurs>, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x10428, libsre_rtoc,
|
res = cb_call<s32, vm::ptr<CellSpurs>, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x10428, libsre_rtoc,
|
||||||
spurs, Memory.RealToVirtualAddr(swlPriority), swlMaxSpu, swlIsPreem);
|
spurs, vm::get_addr(swlPriority), swlMaxSpu, swlIsPreem);
|
||||||
#endif
|
#endif
|
||||||
assert(res == CELL_OK);
|
assert(res == CELL_OK);
|
||||||
}
|
}
|
||||||
|
@ -1327,7 +1327,7 @@ s32 spursAddWorkload(
|
||||||
{
|
{
|
||||||
#ifdef PRX_DEBUG_XXX
|
#ifdef PRX_DEBUG_XXX
|
||||||
return cb_call<s32, vm::ptr<CellSpurs>, vm::ptr<u32>, vm::ptr<const void>, u32, u64, u32, u32, u32, u32, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x96EC, libsre_rtoc,
|
return cb_call<s32, vm::ptr<CellSpurs>, vm::ptr<u32>, vm::ptr<const void>, u32, u64, u32, u32, u32, u32, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x96EC, libsre_rtoc,
|
||||||
spurs, wid, pm, size, data, Memory.RealToVirtualAddr(priorityTable), minContention, maxContention,
|
spurs, wid, pm, size, data, vm::get_addr(priorityTable), minContention, maxContention,
|
||||||
nameClass.addr(), nameInstance.addr(), hook.addr(), hookArg.addr());
|
nameClass.addr(), nameInstance.addr(), hook.addr(), hookArg.addr());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1752,7 +1752,7 @@ s64 cellSpursGetWorkloadFlag(vm::ptr<CellSpurs> spurs, vm::ptr<vm::bptr<CellSpur
|
||||||
return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN;
|
return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN;
|
||||||
}
|
}
|
||||||
|
|
||||||
flag->set(Memory.RealToVirtualAddr(&spurs->m.wklFlag));
|
flag->set(vm::get_addr(&spurs->m.wklFlag));
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -367,12 +367,12 @@ struct CellSpurs
|
||||||
|
|
||||||
__forceinline vm::ptr<sys_lwmutex_t> get_lwmutex()
|
__forceinline vm::ptr<sys_lwmutex_t> get_lwmutex()
|
||||||
{
|
{
|
||||||
return vm::ptr<sys_lwmutex_t>::make(Memory.RealToVirtualAddr(&m.mutex));
|
return vm::ptr<sys_lwmutex_t>::make(vm::get_addr(&m.mutex));
|
||||||
}
|
}
|
||||||
|
|
||||||
__forceinline vm::ptr<sys_lwcond_t> get_lwcond()
|
__forceinline vm::ptr<sys_lwcond_t> get_lwcond()
|
||||||
{
|
{
|
||||||
return vm::ptr<sys_lwcond_t>::make(Memory.RealToVirtualAddr(&m.cond));
|
return vm::ptr<sys_lwcond_t>::make(vm::get_addr(&m.cond));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -321,7 +321,6 @@ s32 syncRwmReadEndOp(CellSyncRwm::data_t& rwm)
|
||||||
{
|
{
|
||||||
if (!rwm.m_readers.data())
|
if (!rwm.m_readers.data())
|
||||||
{
|
{
|
||||||
cellSync->Error("syncRwmReadEndOp(rwm_addr=0x%x): m_readers == 0 (m_writers=%d)", Memory.RealToVirtualAddr(&rwm), (u16)rwm.m_writers);
|
|
||||||
return CELL_SYNC_ERROR_ABORT;
|
return CELL_SYNC_ERROR_ABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,6 +353,7 @@ s32 cellSyncRwmRead(vm::ptr<CellSyncRwm> rwm, vm::ptr<void> buffer)
|
||||||
// prx: decrease m_readers (return 0x8041010C if already zero)
|
// prx: decrease m_readers (return 0x8041010C if already zero)
|
||||||
if (s32 res = rwm->data.atomic_op(CELL_OK, syncRwmReadEndOp))
|
if (s32 res = rwm->data.atomic_op(CELL_OK, syncRwmReadEndOp))
|
||||||
{
|
{
|
||||||
|
cellSync->Error("syncRwmReadEndOp(rwm=0x%x) failed: m_readers == 0", rwm);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,10 +14,12 @@ SysCallBase sys_lwcond("sys_lwcond");
|
||||||
|
|
||||||
s32 lwcond_create(sys_lwcond_t& lwcond, sys_lwmutex_t& lwmutex, u64 name_u64)
|
s32 lwcond_create(sys_lwcond_t& lwcond, sys_lwmutex_t& lwmutex, u64 name_u64)
|
||||||
{
|
{
|
||||||
std::shared_ptr<Lwcond> lw(new Lwcond(name_u64, Memory.RealToVirtualAddr(&lwcond)));
|
const u32 addr = vm::get_addr(&lwmutex);
|
||||||
|
|
||||||
|
std::shared_ptr<Lwcond> lw(new Lwcond(name_u64, addr));
|
||||||
|
|
||||||
const u32 id = sys_lwcond.GetNewId(lw, TYPE_LWCOND);
|
const u32 id = sys_lwcond.GetNewId(lw, TYPE_LWCOND);
|
||||||
const u32 addr = Memory.RealToVirtualAddr(&lwmutex);
|
|
||||||
lw->queue.set_full_name(fmt::Format("Lwcond(%d, addr=0x%x)", id, lw->addr));
|
lw->queue.set_full_name(fmt::Format("Lwcond(%d, addr=0x%x)", id, lw->addr));
|
||||||
lwcond.lwmutex.set(addr);
|
lwcond.lwmutex.set(addr);
|
||||||
lwcond.lwcond_queue = id;
|
lwcond.lwcond_queue = id;
|
||||||
|
|
|
@ -22,7 +22,7 @@ s32 lwmutex_create(sys_lwmutex_t& lwmutex, u32 protocol, u32 recursive, u64 name
|
||||||
lwmutex.recursive_count.write_relaxed(be_t<u32>::make(0));
|
lwmutex.recursive_count.write_relaxed(be_t<u32>::make(0));
|
||||||
u32 sq_id = sys_lwmutex.GetNewId(sq, TYPE_LWMUTEX);
|
u32 sq_id = sys_lwmutex.GetNewId(sq, TYPE_LWMUTEX);
|
||||||
lwmutex.sleep_queue = sq_id;
|
lwmutex.sleep_queue = sq_id;
|
||||||
sq->set_full_name(fmt::Format("Lwmutex(%d, addr=0x%x)", sq_id, Memory.RealToVirtualAddr(&lwmutex)));
|
sq->set_full_name(fmt::Format("Lwmutex(%d, addr=0x%x)", sq_id, vm::get_addr(&lwmutex)));
|
||||||
|
|
||||||
// passing be_t<u32> (test)
|
// passing be_t<u32> (test)
|
||||||
sys_lwmutex.Notice("*** lwmutex created [%s] (attribute=0x%x): sq_id = %d", std::string((const char*)&name_u64, 8).c_str(), lwmutex.attribute, sq_id);
|
sys_lwmutex.Notice("*** lwmutex created [%s] (attribute=0x%x): sq_id = %d", std::string((const char*)&name_u64, 8).c_str(), lwmutex.attribute, sq_id);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue