From b263c3ebaf84275a0acb86cd67114aa91375636f Mon Sep 17 00:00:00 2001 From: DH Date: Tue, 5 Nov 2013 21:22:58 +0200 Subject: [PATCH] - Renamed ARM9 to ARMv7. - Improved ELF32 loader. --- rpcs3/Emu/ARM9/ARM9Thread.cpp | 83 ------------------- .../ARM9Decoder.h => ARMv7/ARMv7Decoder.h} | 13 +-- .../ARM9DisAsm.h => ARMv7/ARMv7DisAsm.h} | 8 +- .../ARMv7Interpreter.h} | 8 +- .../ARM9Opcodes.h => ARMv7/ARMv7Opcodes.h} | 6 +- rpcs3/Emu/ARMv7/ARMv7Thread.cpp | 77 +++++++++++++++++ .../ARM9Thread.h => ARMv7/ARMv7Thread.h} | 6 +- rpcs3/Emu/CPU/CPUDecoder.h | 2 +- rpcs3/Emu/CPU/CPUThread.cpp | 24 +++++- rpcs3/Emu/CPU/CPUThread.h | 13 +-- rpcs3/Emu/CPU/CPUThreadManager.cpp | 4 +- rpcs3/Emu/Cell/PPCDecoder.cpp | 4 +- rpcs3/Emu/Cell/PPCDecoder.h | 2 +- rpcs3/Emu/Cell/PPCThread.cpp | 6 -- rpcs3/Emu/Cell/PPCThread.h | 4 - rpcs3/Emu/Cell/RawSPUThread.cpp | 3 +- rpcs3/Emu/System.cpp | 3 +- rpcs3/Gui/InstructionEditor.cpp | 4 +- rpcs3/Gui/InterpreterDisAsm.cpp | 10 +-- rpcs3/Loader/ELF32.cpp | 3 +- rpcs3/rpcs3.vcxproj | 2 +- rpcs3/rpcs3.vcxproj.filters | 8 +- 22 files changed, 149 insertions(+), 144 deletions(-) delete mode 100644 rpcs3/Emu/ARM9/ARM9Thread.cpp rename rpcs3/Emu/{ARM9/ARM9Decoder.h => ARMv7/ARMv7Decoder.h} (60%) rename rpcs3/Emu/{ARM9/ARM9DisAsm.h => ARMv7/ARMv7DisAsm.h} (79%) rename rpcs3/Emu/{ARM9/ARM9Interpreter.h => ARMv7/ARMv7Interpreter.h} (67%) rename rpcs3/Emu/{ARM9/ARM9Opcodes.h => ARMv7/ARMv7Opcodes.h} (71%) create mode 100644 rpcs3/Emu/ARMv7/ARMv7Thread.cpp rename rpcs3/Emu/{ARM9/ARM9Thread.h => ARMv7/ARMv7Thread.h} (85%) diff --git a/rpcs3/Emu/ARM9/ARM9Thread.cpp b/rpcs3/Emu/ARM9/ARM9Thread.cpp deleted file mode 100644 index 7cb3aef44a..0000000000 --- a/rpcs3/Emu/ARM9/ARM9Thread.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include "stdafx.h" -#include "ARM9Thread.h" -#include "ARM9Decoder.h" -#include "ARM9DisAsm.h" -#include "ARM9Interpreter.h" - -ARM9Thread::ARM9Thread() : CPUThread(CPU_THREAD_ARM9) -{ -} - -void ARM9Thread::InitRegs() -{ -} - -void ARM9Thread::InitStack() -{ -} - -u64 ARM9Thread::GetFreeStackSize() const -{ - return GetStackSize() - m_stack_point; -} - -void ARM9Thread::SetArg(const uint pos, const u64 arg) -{ - assert(0); -} - -void ARM9Thread::SetPc(const u64 pc) -{ - PC = pc; - nPC = pc + 2; -} - -wxString ARM9Thread::RegsToString() -{ - return wxEmptyString; -} - -wxString ARM9Thread::ReadRegString(wxString reg) -{ - return wxEmptyString; -} - -bool ARM9Thread::WriteRegString(wxString reg, wxString value) -{ - return true; -} - -void ARM9Thread::DoReset() -{ -} - -void ARM9Thread::DoRun() -{ - switch(Ini.CPUDecoderMode.GetValue()) - { - case 0: - //m_dec = new PPUDecoder(*new PPUDisAsm()); - break; - - case 1: - case 2: - m_dec = new ARM9Decoder(*new ARM9Interpreter(*this)); - break; - } -} - -void ARM9Thread::DoPause() -{ -} - -void ARM9Thread::DoResume() -{ -} - -void ARM9Thread::DoStop() -{ -} - -void ARM9Thread::DoCode() -{ -} \ No newline at end of file diff --git a/rpcs3/Emu/ARM9/ARM9Decoder.h b/rpcs3/Emu/ARMv7/ARMv7Decoder.h similarity index 60% rename from rpcs3/Emu/ARM9/ARM9Decoder.h rename to rpcs3/Emu/ARMv7/ARMv7Decoder.h index 7510260c60..019925c934 100644 --- a/rpcs3/Emu/ARM9/ARM9Decoder.h +++ b/rpcs3/Emu/ARMv7/ARMv7Decoder.h @@ -1,18 +1,19 @@ #pragma once #include "Emu/CPU/CPUDecoder.h" -#include "ARM9Opcodes.h" +#include "ARMv7Opcodes.h" -class ARM9Decoder : public CPUDecoder +class ARMv7Decoder : public CPUDecoder { - ARM9Opcodes& m_op; + ARMv7Opcodes& m_op; + u8 m_last_instr_size; public: - ARM9Decoder(ARM9Opcodes& op) : m_op(op) + ARMv7Decoder(ARMv7Opcodes& op) : m_op(op) { } - virtual void DecodeMemory(const u64 address) + virtual u8 DecodeMemory(const u64 address) { const u16 code0 = Memory.Read16(address); const u16 code1 = Memory.Read16(address + 2); @@ -28,5 +29,7 @@ public: m_op.UNK(opcode, code0, code1); break; } + + return 2; } }; diff --git a/rpcs3/Emu/ARM9/ARM9DisAsm.h b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h similarity index 79% rename from rpcs3/Emu/ARM9/ARM9DisAsm.h rename to rpcs3/Emu/ARMv7/ARMv7DisAsm.h index eaf9cda78b..e314836014 100644 --- a/rpcs3/Emu/ARM9/ARM9DisAsm.h +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h @@ -1,15 +1,15 @@ #pragma once -#include "Emu/ARM9/ARM9Opcodes.h" +#include "Emu/ARMv7/ARMv7Opcodes.h" #include "Emu/CPU/CPUDisAsm.h" #include "Gui/DisAsmFrame.h" #include "Emu/Memory/Memory.h" -class ARM9DisAsm +class ARMv7DisAsm : public CPUDisAsm - , public ARM9Opcodes + , public ARMv7Opcodes { public: - ARM9DisAsm(CPUDisAsmMode mode) : CPUDisAsm(mode) + ARMv7DisAsm(CPUDisAsmMode mode) : CPUDisAsm(mode) { } diff --git a/rpcs3/Emu/ARM9/ARM9Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h similarity index 67% rename from rpcs3/Emu/ARM9/ARM9Interpreter.h rename to rpcs3/Emu/ARMv7/ARMv7Interpreter.h index fc23ddbd9b..dd9229027e 100644 --- a/rpcs3/Emu/ARM9/ARM9Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -1,12 +1,12 @@ #pragma once -#include "Emu/ARM9/ARM9Opcodes.h" +#include "Emu/ARMv7/ARMv7Opcodes.h" -class ARM9Interpreter : public ARM9Opcodes +class ARMv7Interpreter : public ARMv7Opcodes { - ARM9Thread& CPU; + ARMv7Thread& CPU; public: - ARM9Interpreter(ARM9Thread& cpu) : CPU(cpu) + ARMv7Interpreter(ARMv7Thread& cpu) : CPU(cpu) { } diff --git a/rpcs3/Emu/ARM9/ARM9Opcodes.h b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h similarity index 71% rename from rpcs3/Emu/ARM9/ARM9Opcodes.h rename to rpcs3/Emu/ARMv7/ARMv7Opcodes.h index 82bafdb61f..7f37dc0d4b 100644 --- a/rpcs3/Emu/ARM9/ARM9Opcodes.h +++ b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h @@ -1,14 +1,14 @@ #pragma once -namespace ARM9_opcodes +namespace ARMv7_opcodes { - enum ARM9_MainOpcodes + enum ARMv7_MainOpcodes { }; } -class ARM9Opcodes +class ARMv7Opcodes { public: virtual void NULL_OP() = 0; diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp new file mode 100644 index 0000000000..7fbe342903 --- /dev/null +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include "ARMv7Thread.h" +#include "ARMv7Decoder.h" +#include "ARMv7DisAsm.h" +#include "ARMv7Interpreter.h" + +ARMv7Thread::ARMv7Thread() : CPUThread(CPU_THREAD_ARMv7) +{ +} + +void ARMv7Thread::InitRegs() +{ +} + +void ARMv7Thread::InitStack() +{ +} + +u64 ARMv7Thread::GetFreeStackSize() const +{ + return GetStackSize() - (m_stack_point - GetStackAddr()); +} + +void ARMv7Thread::SetArg(const uint pos, const u64 arg) +{ + assert(0); +} + +wxString ARMv7Thread::RegsToString() +{ + return wxEmptyString; +} + +wxString ARMv7Thread::ReadRegString(wxString reg) +{ + return wxEmptyString; +} + +bool ARMv7Thread::WriteRegString(wxString reg, wxString value) +{ + return true; +} + +void ARMv7Thread::DoReset() +{ +} + +void ARMv7Thread::DoRun() +{ + switch(Ini.CPUDecoderMode.GetValue()) + { + case 0: + //m_dec = new ARMv7Decoder(*new ARMv7DisAsm()); + break; + + case 1: + case 2: + m_dec = new ARMv7Decoder(*new ARMv7Interpreter(*this)); + break; + } +} + +void ARMv7Thread::DoPause() +{ +} + +void ARMv7Thread::DoResume() +{ +} + +void ARMv7Thread::DoStop() +{ +} + +void ARMv7Thread::DoCode() +{ +} \ No newline at end of file diff --git a/rpcs3/Emu/ARM9/ARM9Thread.h b/rpcs3/Emu/ARMv7/ARMv7Thread.h similarity index 85% rename from rpcs3/Emu/ARM9/ARM9Thread.h rename to rpcs3/Emu/ARMv7/ARMv7Thread.h index 466f7149f7..33ea8478a1 100644 --- a/rpcs3/Emu/ARM9/ARM9Thread.h +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.h @@ -1,10 +1,10 @@ #pragma once #include "Emu\CPU\CPUThread.h" -class ARM9Thread : public CPUThread +class ARMv7Thread : public CPUThread { public: - ARM9Thread(); + ARMv7Thread(); public: virtual void InitRegs(); @@ -13,8 +13,6 @@ public: virtual void SetArg(const uint pos, const u64 arg); public: - virtual void SetPc(const u64 pc); - virtual wxString RegsToString(); virtual wxString ReadRegString(wxString reg); virtual bool WriteRegString(wxString reg, wxString value); diff --git a/rpcs3/Emu/CPU/CPUDecoder.h b/rpcs3/Emu/CPU/CPUDecoder.h index 3ef9d4a649..430fc82b5c 100644 --- a/rpcs3/Emu/CPU/CPUDecoder.h +++ b/rpcs3/Emu/CPU/CPUDecoder.h @@ -5,7 +5,7 @@ class CPUDecoder { public: - virtual void DecodeMemory(const u64 address)=0; + virtual u8 DecodeMemory(const u64 address)=0; }; template diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 1c7f7bec99..6c792b2cc1 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -18,6 +18,7 @@ CPUThread::CPUThread(CPUThreadType type) , m_free_data(false) , m_dec(nullptr) , m_is_step(false) + , m_is_branch(false) { } @@ -45,6 +46,7 @@ void CPUThread::Reset() SetPc(0); cycle = 0; + m_is_branch = false; m_status = Stopped; m_error = 0; @@ -124,9 +126,18 @@ void CPUThread::SetEntry(const u64 pc) entry = pc; } -void CPUThread::NextPc() +void CPUThread::NextPc(u8 instr_size) { - SetPc(nPC); + if(m_is_branch) + { + m_is_branch = false; + + SetPc(nPC); + } + else + { + PC += instr_size; + } } void CPUThread::SetBranch(const u64 pc) @@ -137,9 +148,15 @@ void CPUThread::SetBranch(const u64 pc) Emu.Pause(); } + m_is_branch = true; nPC = pc; } +void CPUThread::SetPc(const u64 pc) +{ + PC = pc; +} + void CPUThread::SetError(const u32 error) { if(error == 0) @@ -279,8 +296,7 @@ void CPUThread::Task() continue; } - m_dec->DecodeMemory(PC + m_offset); - NextPc(); + NextPc(m_dec->DecodeMemory(PC + m_offset)); if(status == CPUThread_Step) { diff --git a/rpcs3/Emu/CPU/CPUThread.h b/rpcs3/Emu/CPU/CPUThread.h index 365fc5a267..a11f13103f 100644 --- a/rpcs3/Emu/CPU/CPUThread.h +++ b/rpcs3/Emu/CPU/CPUThread.h @@ -7,7 +7,7 @@ enum CPUThreadType CPU_THREAD_PPU, CPU_THREAD_SPU, CPU_THREAD_RAW_SPU, - CPU_THREAD_ARM9, + CPU_THREAD_ARMv7, }; enum CPUThreadStatus @@ -86,7 +86,7 @@ public: case CPU_THREAD_PPU: return "PPU"; case CPU_THREAD_SPU: return "SPU"; case CPU_THREAD_RAW_SPU: return "RawSPU"; - case CPU_THREAD_ARM9: return "ARM9"; + case CPU_THREAD_ARMv7: return "ARMv7"; } return "Unknown"; @@ -104,6 +104,7 @@ public: u64 PC; u64 nPC; u64 cycle; + bool m_is_branch; protected: CPUThread(CPUThreadType type); @@ -130,10 +131,10 @@ public: int ThreadStatus(); - virtual void NextPc(); - virtual void SetBranch(const u64 pc); - virtual void SetPc(const u64 pc) = 0; - virtual void SetEntry(const u64 entry); + void NextPc(u8 instr_size); + void SetBranch(const u64 pc); + void SetPc(const u64 pc); + void SetEntry(const u64 entry); void SetError(const u32 error); diff --git a/rpcs3/Emu/CPU/CPUThreadManager.cpp b/rpcs3/Emu/CPU/CPUThreadManager.cpp index 90ac8e9fc7..d4588f4930 100644 --- a/rpcs3/Emu/CPU/CPUThreadManager.cpp +++ b/rpcs3/Emu/CPU/CPUThreadManager.cpp @@ -3,7 +3,7 @@ #include "Emu\Cell\PPUThread.h" #include "Emu\Cell\SPUThread.h" #include "Emu\Cell\RawSPUThread.h" -#include "Emu\ARM9\ARM9Thread.h" +#include "Emu\ARMv7\ARMv7Thread.h" CPUThreadManager::CPUThreadManager() : m_raw_spu_num(0) @@ -32,7 +32,7 @@ CPUThread& CPUThreadManager::AddThread(CPUThreadType type) case CPU_THREAD_PPU: new_thread = new PPUThread(); break; case CPU_THREAD_SPU: new_thread = new SPUThread(); break; case CPU_THREAD_RAW_SPU: new_thread = new RawSPUThread(m_raw_spu_num++); break; - case CPU_THREAD_ARM9: new_thread = new ARM9Thread(); break; + case CPU_THREAD_ARMv7: new_thread = new ARMv7Thread(); break; default: assert(0); } diff --git a/rpcs3/Emu/Cell/PPCDecoder.cpp b/rpcs3/Emu/Cell/PPCDecoder.cpp index 285b64ea33..078d383322 100644 --- a/rpcs3/Emu/Cell/PPCDecoder.cpp +++ b/rpcs3/Emu/Cell/PPCDecoder.cpp @@ -1,7 +1,9 @@ #include "stdafx.h" #include "PPCDecoder.h" -void PPCDecoder::DecodeMemory(const u64 address) +u8 PPCDecoder::DecodeMemory(const u64 address) { Decode(Memory.Read32(address)); + + return 4; } \ No newline at end of file diff --git a/rpcs3/Emu/Cell/PPCDecoder.h b/rpcs3/Emu/Cell/PPCDecoder.h index 8294583035..3185a441a9 100644 --- a/rpcs3/Emu/Cell/PPCDecoder.h +++ b/rpcs3/Emu/Cell/PPCDecoder.h @@ -7,7 +7,7 @@ class PPCDecoder : public CPUDecoder public: virtual void Decode(const u32 code)=0; - virtual void DecodeMemory(const u64 address); + virtual u8 DecodeMemory(const u64 address); }; diff --git a/rpcs3/Emu/Cell/PPCThread.cpp b/rpcs3/Emu/Cell/PPCThread.cpp index ceb4a6988a..fb92104aa4 100644 --- a/rpcs3/Emu/Cell/PPCThread.cpp +++ b/rpcs3/Emu/Cell/PPCThread.cpp @@ -44,9 +44,3 @@ void PPCThread::InitStack() */ } -void PPCThread::SetPc(const u64 pc) -{ - PC = pc; - nPC = PC + 4; -} - diff --git a/rpcs3/Emu/Cell/PPCThread.h b/rpcs3/Emu/Cell/PPCThread.h index afcce87ca4..93b07f4bd6 100644 --- a/rpcs3/Emu/Cell/PPCThread.h +++ b/rpcs3/Emu/Cell/PPCThread.h @@ -26,10 +26,6 @@ protected: public: ~PPCThread(); - virtual void SetPc(const u64 pc) override; - - void SetError(const u32 error); - protected: virtual void DoReset() override; }; diff --git a/rpcs3/Emu/Cell/RawSPUThread.cpp b/rpcs3/Emu/Cell/RawSPUThread.cpp index 8ddbd4eb2f..6cf6b212f8 100644 --- a/rpcs3/Emu/Cell/RawSPUThread.cpp +++ b/rpcs3/Emu/Cell/RawSPUThread.cpp @@ -311,8 +311,7 @@ void RawSPUThread::Task() SPU.Status.SetValue(SPU_STATUS_RUNNING); } - m_dec->DecodeMemory(PC + m_offset); - NextPc(); + NextPc(m_dec->DecodeMemory(PC + m_offset)); for(uint i=0; iGetValue().ToULong(&opcode, 16)) { - if(CPU->GetType() == CPU_THREAD_ARM9) + if(CPU->GetType() == CPU_THREAD_ARMv7) { - t3_preview->SetLabel("Preview for ARM9Thread not implemented yet."); + t3_preview->SetLabel("Preview for ARMv7Thread not implemented yet."); } else { diff --git a/rpcs3/Gui/InterpreterDisAsm.cpp b/rpcs3/Gui/InterpreterDisAsm.cpp index 8618bd0e4e..e78bf3a47e 100644 --- a/rpcs3/Gui/InterpreterDisAsm.cpp +++ b/rpcs3/Gui/InterpreterDisAsm.cpp @@ -4,8 +4,8 @@ #include "Emu/Cell/PPUDisAsm.h" #include "Emu/Cell/SPUDecoder.h" #include "Emu/Cell/SPUDisAsm.h" -#include "Emu/ARM9/ARM9DisAsm.h" -#include "Emu/ARM9/ARM9Decoder.h" +#include "Emu/ARMv7/ARMv7DisAsm.h" +#include "Emu/ARMv7/ARMv7Decoder.h" #include "InstructionEditor.cpp" #include "RegisterEditor.cpp" @@ -135,10 +135,10 @@ void InterpreterDisAsmFrame::OnSelectUnit(wxCommandEvent& event) } break; - case CPU_THREAD_ARM9: + case CPU_THREAD_ARMv7: { - ARM9DisAsm& dis_asm = *new ARM9DisAsm(CPUDisAsm_InterpreterMode); - decoder = new ARM9Decoder(dis_asm); + ARMv7DisAsm& dis_asm = *new ARMv7DisAsm(CPUDisAsm_InterpreterMode); + decoder = new ARMv7Decoder(dis_asm); disasm = &dis_asm; } break; diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index 2d638f5572..f56160fb4d 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -59,7 +59,7 @@ bool ELF32Loader::LoadEhdrInfo() return false; } - entry = ehdr.GetEntry(); + entry = ehdr.GetEntry() & ~0x3; if(entry == 0) { ConLog.Error("elf32 error: entry is null!"); @@ -100,6 +100,7 @@ bool ELF32Loader::LoadPhdrInfo() } } } + return true; } diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 7efacc68da..43549e4f5b 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -201,7 +201,7 @@ - + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index b0ffa9690e..643c4d0e77 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -50,7 +50,7 @@ {041a844e-9f8b-4b4b-a4c5-6c72ecbde475} - + {bee6a4b4-6371-4c1b-8558-fc7888b1574e} @@ -319,12 +319,12 @@ Emu\CPU - - Emu\ARM9 - Emu\Cell + + Emu\ARMv7 +