Some bugs fixed

ARMv7 partially restored
This commit is contained in:
Nekotekina
2014-12-01 01:04:47 +03:00
parent 1568930da6
commit 697b699873
8 changed files with 53 additions and 29 deletions
+1 -1
View File
@@ -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();
+11 -11
View File
@@ -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;
} }
+2 -2
View File
@@ -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();
+2
View File
@@ -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()
+3 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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);
+2 -2
View File
@@ -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);
/* /*