Exceptions fixed

This commit is contained in:
Nekotekina 2014-07-11 15:32:34 +04:00
parent ad524798fa
commit 2fe52451e1
2 changed files with 13 additions and 13 deletions

View file

@ -283,7 +283,7 @@ void CPUThread::ExecOnce()
#ifdef _WIN32 #ifdef _WIN32
void _se_translator(unsigned int u, EXCEPTION_POINTERS* pExp) 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) if (addr < 0x100000000 && u == EXCEPTION_ACCESS_VIOLATION)
{ {
// TODO: allow recovering from a page fault // TODO: allow recovering from a page fault

View file

@ -359,19 +359,19 @@ bool MemoryBlockLE::Write128(const u64 addr, const u128 value)
//MemoryBase //MemoryBase
void MemoryBase::Write8(u64 addr, const u8 data) 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) 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) 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 else
{ {
@ -381,12 +381,12 @@ void MemoryBase::Write32(u64 addr, const u32 data)
void MemoryBase::Write64(u64 addr, const u64 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) 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) 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) u8 MemoryBase::Read8(u64 addr)
{ {
return *(u8*)((u64)GetBaseAddr() + addr); return *(u8*)((u64)GetBaseAddr() + (u32)addr);
} }
u16 MemoryBase::Read16(u64 addr) u16 MemoryBase::Read16(u64 addr)
{ {
return re16(*(u16*)((u64)GetBaseAddr() + addr)); return re16(*(u16*)((u64)GetBaseAddr() + (u32)addr));
} }
u32 MemoryBase::Read32(u64 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 else
{ {
@ -450,12 +450,12 @@ u32 MemoryBase::Read32(u64 addr)
u64 MemoryBase::Read64(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) 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; } template<> __forceinline u64 MemoryBase::ReverseData<1>(u64 val) { return val; }