Accept functions directly in GuestToHostFunction & add memory range asserts.

This commit is contained in:
Skyth 2024-11-24 19:52:36 +03:00
parent 031229166a
commit 588b5677eb
4 changed files with 14 additions and 7 deletions

View file

@ -6,7 +6,7 @@
SWA_API void Game_PlaySound(const char* pName)
{
void* soundPlayerSharedPtr = g_userHeap.Alloc(8);
GuestToHostFunction<void>(0x82B4DF50, soundPlayerSharedPtr, ((be<uint32_t>*)g_memory.Translate(0x83367900))->get(), 7, 0, 0);
GuestToHostFunction<void>(sub_82B4DF50, soundPlayerSharedPtr, ((be<uint32_t>*)g_memory.Translate(0x83367900))->get(), 7, 0, 0);
auto soundPlayer = (be<uint32_t>*)g_memory.Translate(*(be<uint32_t>*)soundPlayerSharedPtr);
auto soundPlayerVtable = (be<uint32_t>*)g_memory.Translate(*soundPlayer);
@ -18,7 +18,7 @@ SWA_API void Game_PlaySound(const char* pName)
GuestToHostFunction<void>(virtualFunction, soundPlayer, strAllocation, 0);
g_userHeap.Free(strAllocation);
GuestToHostFunction<void>(0x822C0890, *((be<uint32_t>*)soundPlayerSharedPtr + 1));
GuestToHostFunction<void>(sub_822C0890, *((be<uint32_t>*)soundPlayerSharedPtr + 1));
g_userHeap.Free(soundPlayerSharedPtr);
}

View file

@ -301,8 +301,8 @@ FORCEINLINE PPC_FUNC(HostToGuestFunction)
}
}
template<typename T, typename... TArgs>
FORCEINLINE T GuestToHostFunction(uint32_t addr, TArgs... argv)
template<typename T, typename TFunction, typename... TArgs>
FORCEINLINE T GuestToHostFunction(const TFunction& func, TArgs... argv)
{
auto args = std::make_tuple(argv...);
auto& currentCtx = *GetPPCContext();
@ -313,10 +313,15 @@ FORCEINLINE T GuestToHostFunction(uint32_t addr, TArgs... argv)
newCtx.r13 = currentCtx.r13;
newCtx.fpscr = currentCtx.fpscr;
_translate_args_to_guest<GuestToHostFunction<T, TArgs...>>(newCtx, (uint8_t*)g_memory.base, args);
_translate_args_to_guest<GuestToHostFunction<T, TFunction, TArgs...>>(newCtx, (uint8_t*)g_memory.base, args);
SetPPCContext(newCtx);
(*(PPCFunc**)(newCtx.fn + uint64_t(addr) * 2))(newCtx, (uint8_t*)g_memory.base);
if constexpr (std::is_function_v<TFunction>)
func(newCtx, (uint8_t*)g_memory.base);
else
(*(PPCFunc**)(newCtx.fn + uint64_t(func) * 2))(newCtx, (uint8_t*)g_memory.base);
currentCtx.fpscr = newCtx.fpscr;
SetPPCContext(currentCtx);

View file

@ -16,11 +16,13 @@ public:
void* Translate(size_t offset) const noexcept
{
assert(offset < 0x100000000ull);
return base + offset;
}
uint32_t MapVirtual(void* host) const noexcept
{
assert(host >= base && host < (base + size));
return static_cast<uint32_t>(static_cast<char*>(host) - base);
}
};

@ -1 +1 @@
Subproject commit 62e3188a811aef25e84f63bd2957432e081a6dad
Subproject commit 7dd4f91ac635b001a56cc7a27af48f0436bbad3f