2012-05-12 23:08:43 +02:00
|
|
|
|
|
|
|
#include <ogc/machine/processor.h>
|
|
|
|
|
2012-01-21 21:57:41 +01:00
|
|
|
#include "DeviceHandler.hpp"
|
|
|
|
#include "wdvd.h"
|
|
|
|
#include "disc.h"
|
|
|
|
#include "usbstorage.h"
|
|
|
|
#include "mem2.hpp"
|
|
|
|
#include "alt_ios.h"
|
|
|
|
#include "sys.h"
|
|
|
|
#include "wbfs.h"
|
|
|
|
#include "gecko.h"
|
|
|
|
|
|
|
|
extern "C" {extern u8 currentPartition;}
|
|
|
|
extern int __Arena2Lo;
|
|
|
|
|
|
|
|
#define HAVE_AHBPROT ((*(vu32*)0xcd800064 == 0xFFFFFFFF) ? 1 : 0)
|
|
|
|
#define MEM_REG_BASE 0xd8b4000
|
|
|
|
#define MEM_PROT (MEM_REG_BASE + 0x20a)
|
|
|
|
|
|
|
|
static void disable_memory_protection()
|
|
|
|
{
|
|
|
|
gprintf("Disable memory protection...");
|
|
|
|
int mem_prot = read32(MEM_PROT);
|
|
|
|
gprintf("current value: %08X...", mem_prot);
|
|
|
|
write32(MEM_PROT, mem_prot & 0x0000FFFF);
|
|
|
|
gprintf("done\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
static u32 apply_patch(const u8 *pattern, u32 pattern_size, const u8 *patch, u32 patch_size, u32 patch_offset)
|
|
|
|
{
|
|
|
|
//gprintf("Applying AHBPROT patch...");
|
|
|
|
u8 *ptr_start = (u8*)*((u32*)0x80003134), *ptr_end = (u8*)0x94000000;
|
|
|
|
u32 found = 0;
|
|
|
|
u8 *location = NULL;
|
|
|
|
while (ptr_start < (ptr_end - patch_size))
|
|
|
|
{
|
|
|
|
if (!memcmp(ptr_start, pattern, pattern_size))
|
|
|
|
{
|
|
|
|
found++;
|
|
|
|
location = ptr_start + patch_offset;
|
|
|
|
u8 *start = location;
|
|
|
|
u32 i;
|
|
|
|
for (i = 0; i < patch_size; i++)
|
|
|
|
*location++ = patch[i];
|
|
|
|
|
|
|
|
DCFlushRange((u8 *)(((u32)start) >> 5 << 5), (patch_size >> 5 << 5) + 64);
|
|
|
|
ICInvalidateRange((u8 *)(((u32)start) >> 5 << 5), (patch_size >> 5 << 5) + 64);
|
|
|
|
}
|
|
|
|
ptr_start++;
|
|
|
|
}
|
|
|
|
//gprintf("done\n");
|
|
|
|
return found;
|
|
|
|
}
|
|
|
|
|
|
|
|
const u8 es_set_ahbprot_pattern[] = { 0x68, 0x5B, 0x22, 0xEC, 0x00, 0x52, 0x18, 0x9B, 0x68, 0x1B, 0x46, 0x98, 0x07, 0xDB };
|
|
|
|
const u8 es_set_ahbprot_patch[] = { 0x01 };
|
|
|
|
|
|
|
|
u32 IOSPATCH_AHBPROT()
|
|
|
|
{
|
|
|
|
if (HAVE_AHBPROT)
|
|
|
|
{
|
|
|
|
disable_memory_protection();
|
|
|
|
return apply_patch((const u8 *) es_set_ahbprot_pattern, sizeof(es_set_ahbprot_pattern), (const u8 *) es_set_ahbprot_patch, sizeof(es_set_ahbprot_patch), 25);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool loadIOS(int ios, bool launch_game)
|
|
|
|
{
|
2012-05-13 17:36:43 +02:00
|
|
|
gprintf("Reloading into IOS %i from %i (AHBPROT: %u)...\n", ios, IOS_GetVersion(), HAVE_AHBPROT);
|
2012-01-21 21:57:41 +01:00
|
|
|
|
|
|
|
Close_Inputs();
|
|
|
|
DeviceHandler::Instance()->UnMountAll();
|
|
|
|
|
|
|
|
WDVD_Close();
|
|
|
|
USBStorage_Deinit();
|
|
|
|
|
|
|
|
bool iosOK = IOS_ReloadIOS(ios) == 0;
|
|
|
|
|
|
|
|
gprintf("%s, Current IOS: %i\n", iosOK ? "OK" : "FAILED!", IOS_GetVersion());
|
|
|
|
|
2012-05-12 23:08:43 +02:00
|
|
|
if(launch_game)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
|
|
|
DeviceHandler::Instance()->MountAll();
|
|
|
|
DeviceHandler::Instance()->Open_WBFS(currentPartition);
|
|
|
|
Disc_Init();
|
|
|
|
}
|
2012-05-12 23:08:43 +02:00
|
|
|
else
|
|
|
|
Open_Inputs();
|
2012-01-21 21:57:41 +01:00
|
|
|
|
|
|
|
return iosOK;
|
2012-05-12 23:08:43 +02:00
|
|
|
}
|