diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index c19d8f48e2..df917d11aa 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -283,7 +283,7 @@ void CPUThread::ExecOnce() #ifdef _WIN32 void _se_translator(unsigned int u, EXCEPTION_POINTERS* pExp) { - const u64 addr = (u64)Memory.GetBaseAddr() - (u64)pExp->ExceptionRecord->ExceptionAddress; + const u64 addr = (u64)pExp->ExceptionRecord->ExceptionInformation[1] - (u64)Memory.GetBaseAddr(); if (addr < 0x100000000 && u == EXCEPTION_ACCESS_VIOLATION) { // TODO: allow recovering from a page fault diff --git a/rpcs3/Emu/Memory/Memory.cpp b/rpcs3/Emu/Memory/Memory.cpp index f6e39be85f..dc6b77e0ef 100644 --- a/rpcs3/Emu/Memory/Memory.cpp +++ b/rpcs3/Emu/Memory/Memory.cpp @@ -359,19 +359,19 @@ bool MemoryBlockLE::Write128(const u64 addr, const u128 value) //MemoryBase void MemoryBase::Write8(u64 addr, const u8 data) { - *(u8*)((u64)GetBaseAddr() + addr) = data; + *(u8*)((u64)GetBaseAddr() + (u32)addr) = data; } void MemoryBase::Write16(u64 addr, const u16 data) { - *(u16*)((u64)GetBaseAddr() + addr) = re16(data); + *(u16*)((u64)GetBaseAddr() + (u32)addr) = re16(data); } void MemoryBase::Write32(u64 addr, const u32 data) { - if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET || !RawSPUMem[(addr - RAW_SPU_BASE_ADDR) / RAW_SPU_OFFSET]) + if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET || addr >= 0x100000000 || !RawSPUMem[(addr - RAW_SPU_BASE_ADDR) / RAW_SPU_OFFSET]) { - *(u32*)((u64)GetBaseAddr() + addr) = re32(data); + *(u32*)((u64)GetBaseAddr() + (u32)addr) = re32(data); } else { @@ -381,12 +381,12 @@ void MemoryBase::Write32(u64 addr, const u32 data) void MemoryBase::Write64(u64 addr, const u64 data) { - *(u64*)((u64)GetBaseAddr() + addr) = re64(data); + *(u64*)((u64)GetBaseAddr() + (u32)addr) = re64(data); } void MemoryBase::Write128(u64 addr, const u128 data) { - *(u128*)((u64)GetBaseAddr() + addr) = re128(data); + *(u128*)((u64)GetBaseAddr() + (u32)addr) = re128(data); } bool MemoryBase::Write8NN(u64 addr, const u8 data) @@ -426,19 +426,19 @@ bool MemoryBase::Write128NN(u64 addr, const u128 data) u8 MemoryBase::Read8(u64 addr) { - return *(u8*)((u64)GetBaseAddr() + addr); + return *(u8*)((u64)GetBaseAddr() + (u32)addr); } u16 MemoryBase::Read16(u64 addr) { - return re16(*(u16*)((u64)GetBaseAddr() + addr)); + return re16(*(u16*)((u64)GetBaseAddr() + (u32)addr)); } u32 MemoryBase::Read32(u64 addr) { - if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET || !RawSPUMem[(addr - RAW_SPU_BASE_ADDR) / RAW_SPU_OFFSET]) + if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET || addr >= 0x100000000 || !RawSPUMem[(addr - RAW_SPU_BASE_ADDR) / RAW_SPU_OFFSET]) { - return re32(*(u32*)((u64)GetBaseAddr() + addr)); + return re32(*(u32*)((u64)GetBaseAddr() + (u32)addr)); } else { @@ -450,12 +450,12 @@ u32 MemoryBase::Read32(u64 addr) u64 MemoryBase::Read64(u64 addr) { - return re64(*(u64*)((u64)GetBaseAddr() + addr)); + return re64(*(u64*)((u64)GetBaseAddr() + (u32)addr)); } u128 MemoryBase::Read128(u64 addr) { - return re128(*(u128*)((u64)GetBaseAddr() + addr)); + return re128(*(u128*)((u64)GetBaseAddr() + (u32)addr)); } template<> __forceinline u64 MemoryBase::ReverseData<1>(u64 val) { return val; }