Skip to content

Commit

Permalink
attempting to patch jit64 and lazy wii device map
Browse files Browse the repository at this point in the history
  • Loading branch information
booto committed May 22, 2013
1 parent eb3c590 commit 4cdd616
Show file tree
Hide file tree
Showing 9 changed files with 258 additions and 27 deletions.
4 changes: 3 additions & 1 deletion Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp
Expand Up @@ -82,6 +82,8 @@ bool CBoot::EmulatedBS2_GC()
Memory::Write_U32(0x4c000064, 0x80000800); // write default FPU Handler: rfi
Memory::Write_U32(0x4c000064, 0x80000C00); // write default Syscall Handler: rfi



Memory::Write_U64((u64)CEXIIPL::GetGCTime() * (u64)40500000, 0x800030D8); // preset time base ticks
// HIO checks this
//Memory::Write_U16(0x8200, 0x000030e6); // Console type
Expand Down Expand Up @@ -272,7 +274,7 @@ bool CBoot::SetupWiiMemory(unsigned int _CountryCode)
// 40 is copied from 88 after running apploader
Memory::Write_U32(0x00090204, 0x00003140); // IOS revision (IOS9, v2.4)
Memory::Write_U32(0x00062507, 0x00003144); // IOS date in USA format (June 25, 2007)
Memory::Write_U16(0x0113, 0x0000315e); // Apploader
Memory::Write_U16(0x0113, 0x0000315e); // Apploader version
Memory::Write_U32(0x0000FF16, 0x00003158); // DDR ram vendor code
Memory::Write_U32(0x00000000, 0x00003160); // Init semaphore (sysmenu waits for this to clear)
Memory::Write_U32(0x00090204, 0x00003188); // Expected IOS revision
Expand Down
96 changes: 72 additions & 24 deletions Source/Core/Core/Src/Core.cpp
Expand Up @@ -417,30 +417,78 @@ void EmuThread()

// Setup Initial State

PowerPC::ppcState.spr[SPR_DBAT0U] = 0x80001FFF;
PowerPC::ppcState.spr[SPR_DBAT0L] = 0x00000002;
PowerPC::ppcState.spr[SPR_DBAT1U] = 0xC0001FFF;
PowerPC::ppcState.spr[SPR_DBAT1L] = 0x0000002A;
PowerPC::ppcState.spr[SPR_DBAT2U] = 0;
PowerPC::ppcState.spr[SPR_DBAT2L] = 0;
PowerPC::ppcState.spr[SPR_DBAT3U] = 0xFFF0001F;
PowerPC::ppcState.spr[SPR_DBAT3L] = 0xFFF00001;
PowerPC::ppcState.spr[SPR_IBAT0U] = 0x80001FFF;
PowerPC::ppcState.spr[SPR_IBAT0L] = 0x00000002;
PowerPC::ppcState.spr[SPR_IBAT1U] = 0;
PowerPC::ppcState.spr[SPR_IBAT1L] = 0;
PowerPC::ppcState.spr[SPR_IBAT2U] = 0;
PowerPC::ppcState.spr[SPR_IBAT2L] = 0;
PowerPC::ppcState.spr[SPR_IBAT3U] = 0xFFF0001F;
PowerPC::ppcState.spr[SPR_IBAT3L] = 0xFFF00001;
MMUTable::on_ibatl_change(0, PowerPC::ppcState.spr[SPR_IBAT0U], PowerPC::ppcState.spr[SPR_IBAT0L]);
MMUTable::on_ibatl_change(1, PowerPC::ppcState.spr[SPR_IBAT1U], PowerPC::ppcState.spr[SPR_IBAT1L]);
MMUTable::on_ibatl_change(2, PowerPC::ppcState.spr[SPR_IBAT2U], PowerPC::ppcState.spr[SPR_IBAT2L]);
MMUTable::on_ibatl_change(3, PowerPC::ppcState.spr[SPR_IBAT3U], PowerPC::ppcState.spr[SPR_IBAT3L]);
MMUTable::on_dbatl_change(0, PowerPC::ppcState.spr[SPR_DBAT0U], PowerPC::ppcState.spr[SPR_DBAT0L]);
MMUTable::on_dbatl_change(1, PowerPC::ppcState.spr[SPR_DBAT1U], PowerPC::ppcState.spr[SPR_DBAT1L]);
MMUTable::on_dbatl_change(2, PowerPC::ppcState.spr[SPR_DBAT2U], PowerPC::ppcState.spr[SPR_DBAT2L]);
MMUTable::on_dbatl_change(3, PowerPC::ppcState.spr[SPR_DBAT3U], PowerPC::ppcState.spr[SPR_DBAT3L]);
if (g_CoreStartupParameter.bWii)
{
PowerPC::ppcState.spr[SPR_DBAT0U] = 0x80001FFF;
PowerPC::ppcState.spr[SPR_DBAT0L] = 0x00000002;
PowerPC::ppcState.spr[SPR_DBAT1U] = 0xC0001FFF;
PowerPC::ppcState.spr[SPR_DBAT1L] = 0x0000002A;
PowerPC::ppcState.spr[SPR_DBAT2U] = 0;
PowerPC::ppcState.spr[SPR_DBAT2L] = 0;
PowerPC::ppcState.spr[SPR_DBAT3U] = 0x0000001F;
PowerPC::ppcState.spr[SPR_DBAT3L] = 0x00000001;
PowerPC::ppcState.spr[SPR_DBAT4U] = 0x90001FFF;
PowerPC::ppcState.spr[SPR_DBAT4L] = 0x10000002;
PowerPC::ppcState.spr[SPR_DBAT5U] = 0xD0001FFF;
PowerPC::ppcState.spr[SPR_DBAT5L] = 0x1000002A;
PowerPC::ppcState.spr[SPR_DBAT6U] = 0;
PowerPC::ppcState.spr[SPR_DBAT6L] = 0;
PowerPC::ppcState.spr[SPR_DBAT7U] = 0;
PowerPC::ppcState.spr[SPR_DBAT7L] = 0;


PowerPC::ppcState.spr[SPR_IBAT0U] = 0x80001FFF;
PowerPC::ppcState.spr[SPR_IBAT0L] = 0x00000002;
PowerPC::ppcState.spr[SPR_IBAT1U] = 0;
PowerPC::ppcState.spr[SPR_IBAT1L] = 0;
PowerPC::ppcState.spr[SPR_IBAT2U] = 0;
PowerPC::ppcState.spr[SPR_IBAT2L] = 0;
PowerPC::ppcState.spr[SPR_IBAT3U] = 0x0000001F;
PowerPC::ppcState.spr[SPR_IBAT3L] = 0x00000001;
PowerPC::ppcState.spr[SPR_IBAT4U] = 0x90001FFF;
PowerPC::ppcState.spr[SPR_IBAT4L] = 0x10000002;
PowerPC::ppcState.spr[SPR_IBAT5U] = 0;
PowerPC::ppcState.spr[SPR_IBAT5L] = 0;
PowerPC::ppcState.spr[SPR_IBAT6U] = 0;
PowerPC::ppcState.spr[SPR_IBAT6L] = 0;
PowerPC::ppcState.spr[SPR_IBAT7U] = 0;
PowerPC::ppcState.spr[SPR_IBAT7L] = 0;

MMUTable::on_ibatl_change(0, PowerPC::ppcState.spr[SPR_IBAT0U], PowerPC::ppcState.spr[SPR_IBAT0L]);
MMUTable::on_ibatl_change(3, PowerPC::ppcState.spr[SPR_IBAT3U], PowerPC::ppcState.spr[SPR_IBAT3L]);
MMUTable::on_ibatl_change(4, PowerPC::ppcState.spr[SPR_IBAT4U], PowerPC::ppcState.spr[SPR_IBAT4L]);
MMUTable::on_dbatl_change(0, PowerPC::ppcState.spr[SPR_DBAT0U], PowerPC::ppcState.spr[SPR_DBAT0L]);
MMUTable::on_dbatl_change(1, PowerPC::ppcState.spr[SPR_DBAT1U], PowerPC::ppcState.spr[SPR_DBAT1L]);
MMUTable::on_dbatl_change(3, PowerPC::ppcState.spr[SPR_DBAT3U], PowerPC::ppcState.spr[SPR_DBAT3L]);
MMUTable::on_dbatl_change(4, PowerPC::ppcState.spr[SPR_DBAT4U], PowerPC::ppcState.spr[SPR_DBAT4L]);
MMUTable::on_dbatl_change(5, PowerPC::ppcState.spr[SPR_DBAT5U], PowerPC::ppcState.spr[SPR_DBAT5L]);

}
else
{
PowerPC::ppcState.spr[SPR_DBAT0U] = 0x80001FFF;
PowerPC::ppcState.spr[SPR_DBAT0L] = 0x00000002;
PowerPC::ppcState.spr[SPR_DBAT1U] = 0xC0001FFF;
PowerPC::ppcState.spr[SPR_DBAT1L] = 0x0000002A;
PowerPC::ppcState.spr[SPR_DBAT2U] = 0;
PowerPC::ppcState.spr[SPR_DBAT2L] = 0;
PowerPC::ppcState.spr[SPR_DBAT3U] = 0xFFF0001F;
PowerPC::ppcState.spr[SPR_DBAT3L] = 0xFFF00001;
PowerPC::ppcState.spr[SPR_IBAT0U] = 0x80001FFF;
PowerPC::ppcState.spr[SPR_IBAT0L] = 0x00000002;
PowerPC::ppcState.spr[SPR_IBAT1U] = 0;
PowerPC::ppcState.spr[SPR_IBAT1L] = 0;
PowerPC::ppcState.spr[SPR_IBAT2U] = 0;
PowerPC::ppcState.spr[SPR_IBAT2L] = 0;
PowerPC::ppcState.spr[SPR_IBAT3U] = 0xFFF0001F;
PowerPC::ppcState.spr[SPR_IBAT3L] = 0xFFF00001;
MMUTable::on_ibatl_change(0, PowerPC::ppcState.spr[SPR_IBAT0U], PowerPC::ppcState.spr[SPR_IBAT0L]);
MMUTable::on_ibatl_change(3, PowerPC::ppcState.spr[SPR_IBAT3U], PowerPC::ppcState.spr[SPR_IBAT3L]);
MMUTable::on_dbatl_change(0, PowerPC::ppcState.spr[SPR_DBAT0U], PowerPC::ppcState.spr[SPR_DBAT0L]);
MMUTable::on_dbatl_change(1, PowerPC::ppcState.spr[SPR_DBAT1U], PowerPC::ppcState.spr[SPR_DBAT1L]);
MMUTable::on_dbatl_change(3, PowerPC::ppcState.spr[SPR_DBAT3U], PowerPC::ppcState.spr[SPR_DBAT3L]);
}

for(int i=0;i<16;i++)
{
PowerPC::ppcState.sr[i]=0xffffffff;
Expand Down
69 changes: 69 additions & 0 deletions Source/Core/Core/Src/HW/Memmap.cpp
Expand Up @@ -374,6 +374,53 @@ int MMIO_Device_EFB_write32(void* context, const u32 addr, const u32 in)
}


/*
int rfh_read8(const void* context, const u32 addr, u8 &out)
{
ReadFromHardware<u8>(out, addr, addr, FLAG_READ);
return 0;
}
int rfh_read16(const void* context, const u32 addr, u8 &out)
{
ReadFromHardware<u16>(out, addr, addr, FLAG_READ);
return 0;
}
int rfh_read32(const void* context, const u32 addr, u8 &out)
{
ReadFromHardware<u32>(out, addr, addr, FLAG_READ);
return 0;
}
int rfh_read64(const void* context, const u32 addr, u8 &out)
{
ReadFromHardware<u64>(out, addr, addr, FLAG_READ);
return 0;
}
int wth_write8(void* context, const u32 addr, const u8 in)
{
WriteToHardware<u8>(addr, in, addr, FLAG_WRITE);
return 0;
}
int wth_write16(void* context, const u32 addr, const u8 in)
{
WriteToHardware<u16>(addr, in, addr, FLAG_WRITE);
return 0;
}
int wth_write32(void* context, const u32 addr, const u32 in)
{
WriteToHardware<u32>(addr, in, addr, FLAG_WRITE);
return 0;
}
int wth_write64(void* context, const u32 addr, const u64 in)
{
WriteToHardware<u64>(addr, in, addr, FLAG_WRITE);
return 0;
}
*/







Expand Down Expand Up @@ -608,6 +655,28 @@ void InitHWMemFuncsWii()
#endif
MMUTable::map_physical(m_pRAM, RAM_SIZE, 0x00000000);
MMUTable::map_physical(m_pEXRAM, EXRAM_SIZE, 0x10000000);
MMUTable::map_physical(m_pL1Cache, L1_CACHE_SIZE, 0xe0000000);
struct MMUTable::DAccessFuncs daf;

// this is lazy...
extern int rfh_read8(const void* context, const u32 addr, u8 &out);
extern int rfh_read16(const void* context, const u32 addr, u16 &out);
extern int rfh_read32(const void* context, const u32 addr, u32 &out);
extern int rfh_read64(const void* context, const u32 addr, u64 &out);
extern int wth_write8(void* context, const u32 addr, const u8 in);
extern int wth_write16(void* context, const u32 addr, const u16 in);
extern int wth_write32(void* context, const u32 addr, const u32 in);
extern int wth_write64(void* context, const u32 addr, const u64 in);
MMUTable::daf_reset_to_no_except(&daf);
daf.read_u8 = &rfh_read8;
daf.read_u16 = &rfh_read16;
daf.read_u32 = &rfh_read32;
daf.read_u64 = &rfh_read64;
daf.write_u8 = &wth_write8;
daf.write_u16 = &wth_write16;
daf.write_u32 = &wth_write32;
daf.write_u64 = &wth_write64;
MMUTable::map_mmio_device(&daf, NULL, 0x1000000, 0x0d000000);
}

writeFn32 GetHWWriteFun32(const u32 _Address)
Expand Down
42 changes: 42 additions & 0 deletions Source/Core/Core/Src/HW/MemmapFunctions.cpp
Expand Up @@ -632,6 +632,48 @@ void WriteUnchecked_U32(const u32 _iValue, const u32 _Address)
WriteToHardware<u32>(_Address, _iValue, _Address, FLAG_NO_EXCEPTION);
}

int rfh_read8(const void* context, const u32 addr, u8 &out)
{
ReadFromHardware<u8>(out, addr, addr, FLAG_READ);
return 0;
}
int rfh_read16(const void* context, const u32 addr, u16 &out)
{
ReadFromHardware<u16>(out, addr, addr, FLAG_READ);
return 0;
}
int rfh_read32(const void* context, const u32 addr, u32 &out)
{
ReadFromHardware<u32>(out, addr, addr, FLAG_READ);
return 0;
}
int rfh_read64(const void* context, const u32 addr, u64 &out)
{
ReadFromHardware<u64>(out, addr, addr, FLAG_READ);
return 0;
}
int wth_write8(void* context, const u32 addr, const u8 in)
{
WriteToHardware<u8>(addr, in, addr, FLAG_WRITE);
return 0;
}
int wth_write16(void* context, const u32 addr, const u16 in)
{
WriteToHardware<u16>(addr, in, addr, FLAG_WRITE);
return 0;
}

int wth_write32(void* context, const u32 addr, const u32 in)
{
WriteToHardware<u32>(addr, in, addr, FLAG_WRITE);
return 0;
}
int wth_write64(void* context, const u32 addr, const u64 in)
{
WriteToHardware<u64>(addr, in, addr, FLAG_WRITE);
return 0;
}

// *********************************************************************************
// Warning: Test Area
//
Expand Down
16 changes: 16 additions & 0 deletions Source/Core/Core/Src/PowerPC/Gekko.h
Expand Up @@ -692,6 +692,22 @@ enum
SPR_DBAT2L = 541,
SPR_DBAT3U = 542,
SPR_DBAT3L = 543,
SPR_IBAT4U = 560,
SPR_IBAT4L = 561,
SPR_IBAT5U = 562,
SPR_IBAT5L = 563,
SPR_IBAT6U = 564,
SPR_IBAT6L = 565,
SPR_IBAT7U = 566,
SPR_IBAT7L = 567,
SPR_DBAT4U = 568,
SPR_DBAT4L = 569,
SPR_DBAT5U = 570,
SPR_DBAT5L = 571,
SPR_DBAT6U = 572,
SPR_DBAT6L = 573,
SPR_DBAT7U = 574,
SPR_DBAT7L = 575,
SPR_GQR0 = 912,
SPR_HID0 = 1008,
SPR_HID1 = 1009,
Expand Down
Expand Up @@ -204,8 +204,9 @@ void Interpreter::lmw(UGeckoInstruction _inst)
u32 TempReg = Memory::Read_U32(uAddress);
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
{
PanicAlert("DSI exception in lmw");
//PanicAlert("DSI exception in lmw");
NOTICE_LOG(POWERPC, "DSI exception in lmw");
PowerPC::CheckExceptions();
return;
}
else
Expand All @@ -224,8 +225,9 @@ void Interpreter::stmw(UGeckoInstruction _inst)
Memory::Write_U32(m_GPR[iReg], uAddress);
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
{
PanicAlert("DSI exception in stmw");
//PanicAlert("DSI exception in stmw");
NOTICE_LOG(POWERPC, "DSI exception in stmw");
PowerPC::CheckExceptions();
return;
}
}
Expand Down
Expand Up @@ -452,6 +452,18 @@ void Interpreter::mtspr(UGeckoInstruction _inst)
case SPR_IBAT3U:
MMUTable::on_ibatu_change(3, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_IBAT4U:
MMUTable::on_ibatu_change(4, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_IBAT5U:
MMUTable::on_ibatu_change(5, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_IBAT6U:
MMUTable::on_ibatu_change(6, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_IBAT7U:
MMUTable::on_ibatu_change(7, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_IBAT0L:
MMUTable::on_ibatl_change(0, rSPR(iIndex-1), rSPR(iIndex));
break;
Expand All @@ -464,6 +476,18 @@ void Interpreter::mtspr(UGeckoInstruction _inst)
case SPR_IBAT3L:
MMUTable::on_ibatl_change(3, rSPR(iIndex-1), rSPR(iIndex));
break;
case SPR_IBAT4L:
MMUTable::on_ibatl_change(4, rSPR(iIndex-1), rSPR(iIndex));
break;
case SPR_IBAT5L:
MMUTable::on_ibatl_change(5, rSPR(iIndex-1), rSPR(iIndex));
break;
case SPR_IBAT6L:
MMUTable::on_ibatl_change(6, rSPR(iIndex-1), rSPR(iIndex));
break;
case SPR_IBAT7L:
MMUTable::on_ibatl_change(7, rSPR(iIndex-1), rSPR(iIndex));
break;
case SPR_DBAT0U:
MMUTable::on_dbatu_change(0, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
Expand All @@ -476,6 +500,18 @@ void Interpreter::mtspr(UGeckoInstruction _inst)
case SPR_DBAT3U:
MMUTable::on_dbatu_change(3, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_DBAT4U:
MMUTable::on_dbatu_change(4, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_DBAT5U:
MMUTable::on_dbatu_change(5, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_DBAT6U:
MMUTable::on_dbatu_change(6, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_DBAT7U:
MMUTable::on_dbatu_change(7, oldValue, rSPR(iIndex), rSPR(iIndex+1));
break;
case SPR_DBAT0L:
MMUTable::on_dbatl_change(0, rSPR(iIndex-1), rSPR(iIndex));
break;
Expand All @@ -488,6 +524,18 @@ void Interpreter::mtspr(UGeckoInstruction _inst)
case SPR_DBAT3L:
MMUTable::on_dbatl_change(3, rSPR(iIndex-1), rSPR(iIndex));
break;
case SPR_DBAT4L:
MMUTable::on_dbatl_change(4, rSPR(iIndex-1), rSPR(iIndex));
break;
case SPR_DBAT5L:
MMUTable::on_dbatl_change(5, rSPR(iIndex-1), rSPR(iIndex));
break;
case SPR_DBAT6L:
MMUTable::on_dbatl_change(6, rSPR(iIndex-1), rSPR(iIndex));
break;
case SPR_DBAT7L:
MMUTable::on_dbatl_change(7, rSPR(iIndex-1), rSPR(iIndex));
break;
}
}

Expand Down
2 changes: 2 additions & 0 deletions Source/Core/Core/Src/PowerPC/Jit64/Jit_Branch.cpp
Expand Up @@ -22,6 +22,7 @@
#include "../../CoreTiming.h"
#include "../PPCTables.h"
#include "x64Emitter.h"
#include "../../HW/MMUTable.h"

#include "Jit.h"
#include "JitRegCache.h"
Expand Down Expand Up @@ -69,6 +70,7 @@ void Jit64::rfi(UGeckoInstruction inst)
AND(32, R(EAX), Imm32(mask & clearMSR13));
OR(32, M(&MSR), R(EAX));
// NPC = SRR0;
ABI_CallFunction(thunks.ProtectFunction((void*)&MMUTable::on_msr_change, 0));
MOV(32, R(EAX), M(&SRR0));
WriteRfiExitDestInEAX();
}
Expand Down

0 comments on commit 4cdd616

Please sign in to comment.