mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-01-23 00:50:40 +01:00
Some bugs fixed
ARMv7 partially restored
This commit is contained in:
parent
1568930da6
commit
697b699873
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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<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;
|
||||
|
|
@ -178,9 +178,9 @@ public:
|
|||
{
|
||||
thread->Run();
|
||||
|
||||
static_cast<ARMv7Thread*>(thread)->GPR[3] = argc;
|
||||
static_cast<ARMv7Thread*>(thread)->GPR[4] = argv.addr();
|
||||
static_cast<ARMv7Thread*>(thread)->GPR[5] = envp.addr();
|
||||
//static_cast<ARMv7Thread*>(thread)->GPR[0] = argc;
|
||||
//static_cast<ARMv7Thread*>(thread)->GPR[1] = argv.addr();
|
||||
//static_cast<ARMv7Thread*>(thread)->GPR[2] = envp.addr();
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -81,6 +81,8 @@ void Module::Load()
|
|||
{
|
||||
Emu.GetModuleManager().AddFunc(i.second);
|
||||
}
|
||||
|
||||
SetLoaded(true);
|
||||
}
|
||||
|
||||
void Module::UnLoad()
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<std::unique_ptr<ModuleInitializer>> m_modules_init;
|
||||
|
||||
std::vector<u64> 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);
|
||||
|
|
|
|||
|
|
@ -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<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;
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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<u32>::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);
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue