Some bugs fixed
ARMv7 partially restored
This commit is contained in:
@@ -112,7 +112,7 @@ void ARMv7Thread::FastCall(u32 addr)
|
|||||||
|
|
||||||
m_status = Running;
|
m_status = Running;
|
||||||
PC = addr;
|
PC = addr;
|
||||||
LR = Emu.m_cpu_thr_stop;
|
LR = Emu.GetCPUThreadStop();
|
||||||
SetCurrentNamedThread(this);
|
SetCurrentNamedThread(this);
|
||||||
|
|
||||||
CPUThread::Task();
|
CPUThread::Task();
|
||||||
|
|||||||
@@ -155,20 +155,20 @@ public:
|
|||||||
if (!values.size())
|
if (!values.size())
|
||||||
return *this;
|
return *this;
|
||||||
|
|
||||||
assert(argc == 0);
|
//assert(argc == 0);
|
||||||
|
|
||||||
envp.set(vm::alloc((u32)sizeof(envp), stack_align, vm::main));
|
//envp.set(vm::alloc((u32)sizeof(envp), stack_align, vm::main));
|
||||||
*envp = 0;
|
//*envp = 0;
|
||||||
argv.set(vm::alloc(u32(sizeof(argv)* values.size()), stack_align, vm::main));
|
//argv.set(vm::alloc(u32(sizeof(argv)* values.size()), stack_align, vm::main));
|
||||||
|
|
||||||
for (auto &arg : values)
|
for (auto &arg : values)
|
||||||
{
|
{
|
||||||
u32 arg_size = align(u32(arg.size() + 1), stack_align);
|
//u32 arg_size = align(u32(arg.size() + 1), stack_align);
|
||||||
u32 arg_addr = vm::alloc(arg_size, stack_align, vm::main);
|
//u32 arg_addr = vm::alloc(arg_size, stack_align, vm::main);
|
||||||
|
|
||||||
std::strcpy(vm::get_ptr<char>(arg_addr), arg.c_str());
|
//std::strcpy(vm::get_ptr<char>(arg_addr), arg.c_str());
|
||||||
|
|
||||||
argv[argc++] = arg_addr;
|
//argv[argc++] = arg_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -178,9 +178,9 @@ public:
|
|||||||
{
|
{
|
||||||
thread->Run();
|
thread->Run();
|
||||||
|
|
||||||
static_cast<ARMv7Thread*>(thread)->GPR[3] = argc;
|
//static_cast<ARMv7Thread*>(thread)->GPR[0] = argc;
|
||||||
static_cast<ARMv7Thread*>(thread)->GPR[4] = argv.addr();
|
//static_cast<ARMv7Thread*>(thread)->GPR[1] = argv.addr();
|
||||||
static_cast<ARMv7Thread*>(thread)->GPR[5] = envp.addr();
|
//static_cast<ARMv7Thread*>(thread)->GPR[2] = envp.addr();
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ void PPUThread::InitRegs()
|
|||||||
//GPR[12] = Emu.GetMallocPageSize();
|
//GPR[12] = Emu.GetMallocPageSize();
|
||||||
GPR[13] = Memory.PRXMem.GetStartAddr() + 0x7060;
|
GPR[13] = Memory.PRXMem.GetStartAddr() + 0x7060;
|
||||||
|
|
||||||
LR = Emu.GetPPUThreadExit();
|
LR = Emu.GetCPUThreadExit();
|
||||||
CTR = PC;
|
CTR = PC;
|
||||||
CR.CR = 0x22000082;
|
CR.CR = 0x22000082;
|
||||||
VSCR.NJ = 1;
|
VSCR.NJ = 1;
|
||||||
@@ -202,7 +202,7 @@ u64 PPUThread::FastCall2(u32 addr, u32 rtoc)
|
|||||||
m_status = Running;
|
m_status = Running;
|
||||||
PC = addr;
|
PC = addr;
|
||||||
GPR[2] = rtoc;
|
GPR[2] = rtoc;
|
||||||
LR = Emu.m_cpu_thr_stop;
|
LR = Emu.GetCPUThreadStop();
|
||||||
SetCurrentNamedThread(this);
|
SetCurrentNamedThread(this);
|
||||||
|
|
||||||
CPUThread::Task();
|
CPUThread::Task();
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ void Module::Load()
|
|||||||
{
|
{
|
||||||
Emu.GetModuleManager().AddFunc(i.second);
|
Emu.GetModuleManager().AddFunc(i.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetLoaded(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Module::UnLoad()
|
void Module::UnLoad()
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ void Emulator::Load()
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOG_NOTICE(LOADER, " ");//used to be skip_line
|
LOG_NOTICE(LOADER, " ");//used to be skip_line
|
||||||
vfsFile sfo("/app_home/PARAM.SFO");
|
vfsFile sfo("/app_home/../PARAM.SFO");
|
||||||
PSFLoader psf(sfo);
|
PSFLoader psf(sfo);
|
||||||
psf.Load(false);
|
psf.Load(false);
|
||||||
std::string title = psf.GetString("TITLE");
|
std::string title = psf.GetString("TITLE");
|
||||||
@@ -212,7 +212,7 @@ void Emulator::Load()
|
|||||||
LOG_NOTICE(LOADER, "Serial: %s", title_id.c_str());
|
LOG_NOTICE(LOADER, "Serial: %s", title_id.c_str());
|
||||||
|
|
||||||
// bdvd inserting imitation
|
// bdvd inserting imitation
|
||||||
vfsFile f1("/app_home/dev_bdvd.path");
|
vfsFile f1("/app_home/../dev_bdvd.path");
|
||||||
if (f1.IsOpened())
|
if (f1.IsOpened())
|
||||||
{
|
{
|
||||||
std::string bdvd;
|
std::string bdvd;
|
||||||
@@ -246,7 +246,7 @@ void Emulator::Load()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// trying to load some info from PARAM.SFO
|
// trying to load some info from PARAM.SFO
|
||||||
vfsFile f2("/app_home/PARAM.SFO");
|
vfsFile f2("/app_home/../PARAM.SFO");
|
||||||
if (f2.IsOpened())
|
if (f2.IsOpened())
|
||||||
{
|
{
|
||||||
PSFLoader psf(f2);
|
PSFLoader psf(f2);
|
||||||
|
|||||||
+7
-6
@@ -84,7 +84,8 @@ class Emulator
|
|||||||
uint m_mode;
|
uint m_mode;
|
||||||
|
|
||||||
u32 m_rsx_callback;
|
u32 m_rsx_callback;
|
||||||
u32 m_ppu_thr_exit;
|
u32 m_cpu_thr_exit;
|
||||||
|
u32 m_cpu_thr_stop;
|
||||||
std::vector<std::unique_ptr<ModuleInitializer>> m_modules_init;
|
std::vector<std::unique_ptr<ModuleInitializer>> m_modules_init;
|
||||||
|
|
||||||
std::vector<u64> m_break_points;
|
std::vector<u64> m_break_points;
|
||||||
@@ -114,7 +115,6 @@ public:
|
|||||||
std::string m_elf_path;
|
std::string m_elf_path;
|
||||||
std::string m_emu_path;
|
std::string m_emu_path;
|
||||||
std::string m_title_id;
|
std::string m_title_id;
|
||||||
u32 m_cpu_thr_stop;
|
|
||||||
s32 m_sdk_version;
|
s32 m_sdk_version;
|
||||||
|
|
||||||
Emulator();
|
Emulator();
|
||||||
@@ -172,12 +172,12 @@ public:
|
|||||||
m_rsx_callback = addr;
|
m_rsx_callback = addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetPPUThreadExit(u32 addr)
|
void SetCPUThreadExit(u32 addr)
|
||||||
{
|
{
|
||||||
m_ppu_thr_exit = addr;
|
m_cpu_thr_exit = addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetPPUThreadStop(u32 addr)
|
void SetCPUThreadStop(u32 addr)
|
||||||
{
|
{
|
||||||
m_cpu_thr_stop = addr;
|
m_cpu_thr_stop = addr;
|
||||||
}
|
}
|
||||||
@@ -191,7 +191,8 @@ public:
|
|||||||
u32 GetMallocPageSize() { return m_info.GetProcParam().malloc_pagesize; }
|
u32 GetMallocPageSize() { return m_info.GetProcParam().malloc_pagesize; }
|
||||||
|
|
||||||
u32 GetRSXCallback() const { return m_rsx_callback; }
|
u32 GetRSXCallback() const { return m_rsx_callback; }
|
||||||
u32 GetPPUThreadExit() const { return m_ppu_thr_exit; }
|
u32 GetCPUThreadExit() const { return m_cpu_thr_exit; }
|
||||||
|
u32 GetCPUThreadStop() const { return m_cpu_thr_stop; }
|
||||||
|
|
||||||
void CheckStatus();
|
void CheckStatus();
|
||||||
bool BootGame(const std::string& path);
|
bool BootGame(const std::string& path);
|
||||||
|
|||||||
+25
-4
@@ -43,6 +43,7 @@ namespace loader
|
|||||||
m_phdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum);
|
m_phdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum);
|
||||||
m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_phoff : m_ehdr.data_be.e_phoff));
|
m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_phoff : m_ehdr.data_be.e_phoff));
|
||||||
size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum) * sizeof(phdr);
|
size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum) * sizeof(phdr);
|
||||||
|
|
||||||
if (m_stream->Read(m_phdrs.data(), size) != size)
|
if (m_stream->Read(m_phdrs.data(), size) != size)
|
||||||
return broken_file;
|
return broken_file;
|
||||||
}
|
}
|
||||||
@@ -51,9 +52,9 @@ namespace loader
|
|||||||
|
|
||||||
if (m_ehdr.data_le.e_shnum)
|
if (m_ehdr.data_le.e_shnum)
|
||||||
{
|
{
|
||||||
m_phdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_shnum : m_ehdr.data_be.e_shnum);
|
m_shdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_shnum : m_ehdr.data_be.e_shnum);
|
||||||
m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_shoff : m_ehdr.data_be.e_shoff));
|
m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_shoff : m_ehdr.data_be.e_shoff));
|
||||||
size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum) * sizeof(phdr);
|
size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_shnum : m_ehdr.data_be.e_shnum) * sizeof(phdr);
|
||||||
|
|
||||||
if (m_stream->Read(m_shdrs.data(), size) != size)
|
if (m_stream->Read(m_shdrs.data(), size) != size)
|
||||||
return broken_file;
|
return broken_file;
|
||||||
@@ -85,7 +86,27 @@ namespace loader
|
|||||||
switch (machine)
|
switch (machine)
|
||||||
{
|
{
|
||||||
case MACHINE_MIPS: break;
|
case MACHINE_MIPS: break;
|
||||||
case MACHINE_ARM: arm7_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); break;
|
case MACHINE_ARM:
|
||||||
|
{
|
||||||
|
auto armv7_thr_stop_data = vm::psv::ptr<u32>::make(Memory.PSV.RAM.AllocAlign(3 * 4));
|
||||||
|
armv7_thr_stop_data[0] = 0xf870; // HACK
|
||||||
|
armv7_thr_stop_data[1] = 0x0001; // index 1
|
||||||
|
Emu.SetCPUThreadExit(armv7_thr_stop_data.addr());
|
||||||
|
|
||||||
|
u32 entry = m_ehdr.data_le.e_entry + (u32)Memory.PSV.RAM.GetStartAddr();
|
||||||
|
|
||||||
|
auto code = vm::psv::ptr<const u32>::make(entry & ~3);
|
||||||
|
|
||||||
|
// very rough way to find entry point in .sceModuleInfo.rodata
|
||||||
|
while (code[0] != 0xffffffffu)
|
||||||
|
{
|
||||||
|
entry = code[0] + 0x81000000;
|
||||||
|
code++;
|
||||||
|
}
|
||||||
|
|
||||||
|
arm7_thread(entry & ~1 /* TODO: Thumb/ARM encoding selection */, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MACHINE_SPU: spu_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); break;
|
case MACHINE_SPU: spu_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,7 +129,7 @@ namespace loader
|
|||||||
case 0x00000001: //LOAD
|
case 0x00000001: //LOAD
|
||||||
if (phdr.data_le.p_memsz)
|
if (phdr.data_le.p_memsz)
|
||||||
{
|
{
|
||||||
if ((machine != MACHINE_SPU || Emu.IsStopped()) && !vm::alloc(vaddr, memsz, vm::main))
|
if (machine == MACHINE_ARM && !Memory.PSV.RAM.AllocFixed(vaddr, memsz))
|
||||||
{
|
{
|
||||||
LOG_ERROR(LOADER, "%s(): AllocFixed(0x%llx, 0x%x) failed", __FUNCTION__, vaddr, memsz);
|
LOG_ERROR(LOADER, "%s(): AllocFixed(0x%llx, 0x%x) failed", __FUNCTION__, vaddr, memsz);
|
||||||
|
|
||||||
|
|||||||
@@ -350,12 +350,12 @@ namespace loader
|
|||||||
ppu_thr_exit_data[0] = ADDI(r11, 0, 41);
|
ppu_thr_exit_data[0] = ADDI(r11, 0, 41);
|
||||||
ppu_thr_exit_data[1] = SC(2);
|
ppu_thr_exit_data[1] = SC(2);
|
||||||
ppu_thr_exit_data[2] = BLR();
|
ppu_thr_exit_data[2] = BLR();
|
||||||
Emu.SetPPUThreadExit(ppu_thr_exit_data.addr());
|
Emu.SetCPUThreadExit(ppu_thr_exit_data.addr());
|
||||||
|
|
||||||
auto ppu_thr_stop_data = vm::ptr<u32>::make(Memory.MainMem.AllocAlign(2 * 4));
|
auto ppu_thr_stop_data = vm::ptr<u32>::make(Memory.MainMem.AllocAlign(2 * 4));
|
||||||
ppu_thr_stop_data[0] = SC(4);
|
ppu_thr_stop_data[0] = SC(4);
|
||||||
ppu_thr_stop_data[1] = BLR();
|
ppu_thr_stop_data[1] = BLR();
|
||||||
Emu.SetPPUThreadStop(ppu_thr_stop_data.addr());
|
Emu.SetCPUThreadStop(ppu_thr_stop_data.addr());
|
||||||
|
|
||||||
vm::write64(Memory.PRXMem.AllocAlign(0x10000), 0xDEADBEEFABADCAFE);
|
vm::write64(Memory.PRXMem.AllocAlign(0x10000), 0xDEADBEEFABADCAFE);
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user