Achievements: Fix memory writes using CPU addresses

This commit is contained in:
Stenzek 2025-05-05 02:21:56 +10:00
parent ea58cd1d57
commit d326d307b4
No known key found for this signature in database

View File

@ -4776,9 +4776,31 @@ void Achievements::RAIntegrationEventHandler(const rc_client_raintegration_event
void Achievements::RAIntegrationWriteMemoryCallback(uint32_t address, uint8_t* buffer, uint32_t num_bytes,
rc_client_t* client)
{
if ((address + num_bytes) > 0x200400U) [[unlikely]]
return;
// This can be called on the UI thread, so always queue it.
llvm::SmallVector<u8, 16> data(buffer, buffer + num_bytes);
Host::RunOnCPUThread([address, data = std::move(data)]() { CPU::SafeWriteMemoryBytes(address, data); });
Host::RunOnCPUThread([address, data = std::move(data)]() {
u8* src = (address >= 0x200000U) ? CPU::g_state.scratchpad.data() : Bus::g_ram;
const u32 offset = (address & Bus::RAM_2MB_MASK); // size guarded by check above
switch (data.size())
{
case 1:
std::memcpy(&src[offset], data.data(), 1);
break;
case 2:
std::memcpy(&src[offset], data.data(), 2);
break;
case 4:
std::memcpy(&src[offset], data.data(), 4);
break;
default:
[[unlikely]] std::memcpy(&src[offset], data.data(), data.size());
break;
}
});
}
void Achievements::RAIntegrationGetGameNameCallback(char* buffer, uint32_t buffer_size, rc_client_t* client)