From 697b699873909ab89ba686215b2068261cc03826 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 1 Dec 2014 01:04:47 +0300 Subject: [PATCH] Some bugs fixed ARMv7 partially restored --- rpcs3/Emu/ARMv7/ARMv7Thread.cpp | 2 +- rpcs3/Emu/ARMv7/ARMv7Thread.h | 22 +++++++++++----------- rpcs3/Emu/Cell/PPUThread.cpp | 4 ++-- rpcs3/Emu/SysCalls/Modules.cpp | 2 ++ rpcs3/Emu/System.cpp | 6 +++--- rpcs3/Emu/System.h | 13 +++++++------ rpcs3/Loader/ELF32.cpp | 29 +++++++++++++++++++++++++---- rpcs3/Loader/ELF64.cpp | 4 ++-- 8 files changed, 53 insertions(+), 29 deletions(-) diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp index 7f98249d9d..40423d511d 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp @@ -112,7 +112,7 @@ void ARMv7Thread::FastCall(u32 addr) m_status = Running; PC = addr; - LR = Emu.m_cpu_thr_stop; + LR = Emu.GetCPUThreadStop(); SetCurrentNamedThread(this); CPUThread::Task(); diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.h b/rpcs3/Emu/ARMv7/ARMv7Thread.h index 8737454857..543b19cf0c 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.h +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.h @@ -155,20 +155,20 @@ public: if (!values.size()) return *this; - assert(argc == 0); + //assert(argc == 0); - envp.set(vm::alloc((u32)sizeof(envp), stack_align, vm::main)); - *envp = 0; - argv.set(vm::alloc(u32(sizeof(argv)* values.size()), stack_align, vm::main)); + //envp.set(vm::alloc((u32)sizeof(envp), stack_align, vm::main)); + //*envp = 0; + //argv.set(vm::alloc(u32(sizeof(argv)* values.size()), stack_align, vm::main)); for (auto &arg : values) { - u32 arg_size = align(u32(arg.size() + 1), stack_align); - u32 arg_addr = vm::alloc(arg_size, stack_align, vm::main); + //u32 arg_size = align(u32(arg.size() + 1), stack_align); + //u32 arg_addr = vm::alloc(arg_size, stack_align, vm::main); - std::strcpy(vm::get_ptr(arg_addr), arg.c_str()); + //std::strcpy(vm::get_ptr(arg_addr), arg.c_str()); - argv[argc++] = arg_addr; + //argv[argc++] = arg_addr; } return *this; @@ -178,9 +178,9 @@ public: { thread->Run(); - static_cast(thread)->GPR[3] = argc; - static_cast(thread)->GPR[4] = argv.addr(); - static_cast(thread)->GPR[5] = envp.addr(); + //static_cast(thread)->GPR[0] = argc; + //static_cast(thread)->GPR[1] = argv.addr(); + //static_cast(thread)->GPR[2] = envp.addr(); return *this; } diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index c9703c10ce..0364198974 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -92,7 +92,7 @@ void PPUThread::InitRegs() //GPR[12] = Emu.GetMallocPageSize(); GPR[13] = Memory.PRXMem.GetStartAddr() + 0x7060; - LR = Emu.GetPPUThreadExit(); + LR = Emu.GetCPUThreadExit(); CTR = PC; CR.CR = 0x22000082; VSCR.NJ = 1; @@ -202,7 +202,7 @@ u64 PPUThread::FastCall2(u32 addr, u32 rtoc) m_status = Running; PC = addr; GPR[2] = rtoc; - LR = Emu.m_cpu_thr_stop; + LR = Emu.GetCPUThreadStop(); SetCurrentNamedThread(this); CPUThread::Task(); diff --git a/rpcs3/Emu/SysCalls/Modules.cpp b/rpcs3/Emu/SysCalls/Modules.cpp index c11dcc4f33..26b6931544 100644 --- a/rpcs3/Emu/SysCalls/Modules.cpp +++ b/rpcs3/Emu/SysCalls/Modules.cpp @@ -81,6 +81,8 @@ void Module::Load() { Emu.GetModuleManager().AddFunc(i.second); } + + SetLoaded(true); } void Module::UnLoad() diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index fbd7f542ac..b13e6899df 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -203,7 +203,7 @@ void Emulator::Load() } LOG_NOTICE(LOADER, " ");//used to be skip_line - vfsFile sfo("/app_home/PARAM.SFO"); + vfsFile sfo("/app_home/../PARAM.SFO"); PSFLoader psf(sfo); psf.Load(false); std::string title = psf.GetString("TITLE"); @@ -212,7 +212,7 @@ void Emulator::Load() LOG_NOTICE(LOADER, "Serial: %s", title_id.c_str()); // bdvd inserting imitation - vfsFile f1("/app_home/dev_bdvd.path"); + vfsFile f1("/app_home/../dev_bdvd.path"); if (f1.IsOpened()) { std::string bdvd; @@ -246,7 +246,7 @@ void Emulator::Load() } // trying to load some info from PARAM.SFO - vfsFile f2("/app_home/PARAM.SFO"); + vfsFile f2("/app_home/../PARAM.SFO"); if (f2.IsOpened()) { PSFLoader psf(f2); diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 8d47101caa..dd5409cc71 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -84,7 +84,8 @@ class Emulator uint m_mode; u32 m_rsx_callback; - u32 m_ppu_thr_exit; + u32 m_cpu_thr_exit; + u32 m_cpu_thr_stop; std::vector> m_modules_init; std::vector m_break_points; @@ -114,7 +115,6 @@ public: std::string m_elf_path; std::string m_emu_path; std::string m_title_id; - u32 m_cpu_thr_stop; s32 m_sdk_version; Emulator(); @@ -172,12 +172,12 @@ public: 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; } @@ -191,7 +191,8 @@ public: u32 GetMallocPageSize() { return m_info.GetProcParam().malloc_pagesize; } 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(); bool BootGame(const std::string& path); diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index fb83221f96..1466d56f52 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -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_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); + if (m_stream->Read(m_phdrs.data(), size) != size) return broken_file; } @@ -51,9 +52,9 @@ namespace loader 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)); - 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) return broken_file; @@ -85,7 +86,27 @@ namespace loader switch (machine) { 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::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::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; } @@ -108,7 +129,7 @@ namespace loader case 0x00000001: //LOAD 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); diff --git a/rpcs3/Loader/ELF64.cpp b/rpcs3/Loader/ELF64.cpp index ea44995c02..09607fc407 100644 --- a/rpcs3/Loader/ELF64.cpp +++ b/rpcs3/Loader/ELF64.cpp @@ -350,12 +350,12 @@ namespace loader ppu_thr_exit_data[0] = ADDI(r11, 0, 41); ppu_thr_exit_data[1] = SC(2); 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::make(Memory.MainMem.AllocAlign(2 * 4)); ppu_thr_stop_data[0] = SC(4); 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); /*