From 5e0489dcc0bc04f76011866157a8ce0851068d98 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sat, 13 Aug 2016 17:58:19 +0300 Subject: [PATCH] cpu_init removed --- rpcs3/Emu/CPU/CPUThread.cpp | 5 +++ rpcs3/Emu/CPU/CPUThread.h | 12 ++++--- rpcs3/Emu/Cell/PPUThread.cpp | 4 +-- rpcs3/Emu/Cell/PPUThread.h | 1 - rpcs3/Emu/Cell/SPUThread.cpp | 3 +- rpcs3/Emu/Cell/SPUThread.h | 2 +- rpcs3/Emu/PSP2/ARMv7Module.cpp | 7 ++--- rpcs3/Emu/PSP2/ARMv7Thread.cpp | 42 ++++++++----------------- rpcs3/Emu/PSP2/ARMv7Thread.h | 3 +- rpcs3/Emu/PSP2/Modules/sceLibKernel.cpp | 7 ++--- 10 files changed, 34 insertions(+), 52 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 47dab45ee0..f73dc2c6ca 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -145,3 +145,8 @@ void cpu_thread::run() state -= cpu_flag::stop; lock_notify(); } + +std::string cpu_thread::dump() const +{ + return fmt::format("Type: %s\n" "State: %s\n", typeid(*this).name(), state.load()); +} diff --git a/rpcs3/Emu/CPU/CPUThread.h b/rpcs3/Emu/CPU/CPUThread.h index 2bc666df5e..cef0c19563 100644 --- a/rpcs3/Emu/CPU/CPUThread.h +++ b/rpcs3/Emu/CPU/CPUThread.h @@ -3,7 +3,7 @@ #include "../Utilities/Thread.h" #include "../Utilities/bit_set.h" -// cpu_thread state flags +// Thread state flags enum class cpu_flag : u32 { stop, // Thread not running (HLE, initial state) @@ -20,12 +20,12 @@ enum class cpu_flag : u32 __bitset_enum_max }; -// cpu_flag set for pause state +// Flag set for pause state constexpr bs_t cpu_state_pause = cpu_flag::suspend + cpu_flag::dbg_global_pause + cpu_flag::dbg_pause; class cpu_thread : public named_thread { - void on_task() override; + void on_task() override final; public: virtual void on_stop() override; @@ -47,8 +47,10 @@ public: // Run thread void run(); - virtual std::string dump() const = 0; // Print CPU state - virtual void cpu_init() {} // Obsolete, must be removed + // Print CPU state + virtual std::string dump() const; + + // Thread entry point function virtual void cpu_task() = 0; }; diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 0c44c24fb5..9dd10e543a 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -78,9 +78,7 @@ std::string ppu_thread::get_name() const std::string ppu_thread::dump() const { - std::string ret; - ret += fmt::format("Type: %s\n", typeid(*this).name()); - ret += fmt::format("State: %s\n", state.load()); + std::string ret = cpu_thread::dump(); ret += fmt::format("Priority: %d\n", prio); ret += "\nRegisters:\n=========\n"; diff --git a/rpcs3/Emu/Cell/PPUThread.h b/rpcs3/Emu/Cell/PPUThread.h index 704b891a5f..18a239279b 100644 --- a/rpcs3/Emu/Cell/PPUThread.h +++ b/rpcs3/Emu/Cell/PPUThread.h @@ -26,7 +26,6 @@ public: virtual std::string get_name() const override; virtual std::string dump() const override; - virtual void cpu_init() override final {} virtual void cpu_task() override; virtual ~ppu_thread() override; diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index f5d5c92196..8df2900ca8 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -128,7 +128,8 @@ std::string SPUThread::get_name() const std::string SPUThread::dump() const { - std::string ret = "Registers:\n=========\n"; + std::string&& ret = cpu_thread::dump(); + ret += "Registers:\n=========\n"; for (uint i = 0; i<128; ++i) ret += fmt::format("GPR[%d] = %s\n", i, gpr[i]); diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index 2c0543e903..37fffdce2e 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -493,9 +493,9 @@ class SPUThread : public cpu_thread public: virtual std::string get_name() const override; virtual std::string dump() const override; - virtual void cpu_init() override; virtual void cpu_task() override; virtual ~SPUThread() override; + void cpu_init(); protected: SPUThread(const std::string& name); diff --git a/rpcs3/Emu/PSP2/ARMv7Module.cpp b/rpcs3/Emu/PSP2/ARMv7Module.cpp index a821ec560b..93d5eb0d91 100644 --- a/rpcs3/Emu/PSP2/ARMv7Module.cpp +++ b/rpcs3/Emu/PSP2/ARMv7Module.cpp @@ -636,12 +636,9 @@ void arm_load_exec(const arm_exec_object& elf) const u32 stack_size = proc_param->sceUserMainThreadStackSize ? proc_param->sceUserMainThreadStackSize->value() : 256 * 1024; const u32 priority = proc_param->sceUserMainThreadPriority ? proc_param->sceUserMainThreadPriority->value() : 160; - auto thread = idm::make_ptr(thread_name); + auto thread = idm::make_ptr(thread_name, priority, stack_size); - thread->PC = entry_point; - thread->stack_size = stack_size; - thread->prio = priority; - thread->cpu_init(); + thread->write_pc(entry_point, 0); thread->TLS = fxm::make_always(tls_faddr + start_addr, tls_fsize, tls_vsize)->alloc(); // Initialize args diff --git a/rpcs3/Emu/PSP2/ARMv7Thread.cpp b/rpcs3/Emu/PSP2/ARMv7Thread.cpp index 91a890e3f0..58180ac32a 100644 --- a/rpcs3/Emu/PSP2/ARMv7Thread.cpp +++ b/rpcs3/Emu/PSP2/ARMv7Thread.cpp @@ -17,7 +17,8 @@ std::string ARMv7Thread::get_name() const std::string ARMv7Thread::dump() const { - std::string result = "Registers:\n=========\n"; + std::string result = cpu_thread::dump(); + result += "Registers:\n=========\n"; for(int i=0; i<15; ++i) { result += fmt::format("r%u\t= 0x%08x\n", i, GPR[i]); @@ -34,33 +35,6 @@ std::string ARMv7Thread::dump() const return result; } -void ARMv7Thread::cpu_init() -{ - if (!stack_addr) - { - if (!stack_size) - { - fmt::throw_exception("Invalid stack size" HERE); - } - - stack_addr = vm::alloc(stack_size, vm::main); - - if (!stack_addr) - { - fmt::throw_exception("Out of stack memory" HERE); - } - } - - memset(GPR, 0, sizeof(GPR)); - APSR.APSR = 0; - IPSR.IPSR = 0; - ISET = PC & 1 ? Thumb : ARM; // select instruction set - PC = PC & ~1; // and fix PC - ITSTATE.IT = 0; - SP = stack_addr + stack_size; - TLS = 0; -} - extern thread_local std::string(*g_tls_log_prefix)(); void ARMv7Thread::cpu_task() @@ -119,10 +93,20 @@ ARMv7Thread::~ARMv7Thread() } } -ARMv7Thread::ARMv7Thread(const std::string& name) +ARMv7Thread::ARMv7Thread(const std::string& name, u32 prio, u32 stack) : cpu_thread() , m_name(name) + , prio(prio) + , stack_addr(vm::alloc(stack, vm::main)) + , stack_size(stack) { + verify(__func__), stack_size, stack_addr; + + std::memset(GPR, 0, sizeof(GPR)); + APSR.APSR = 0; + IPSR.IPSR = 0; + ITSTATE.IT = 0; + SP = stack_addr + stack_size; } void ARMv7Thread::fast_call(u32 addr) diff --git a/rpcs3/Emu/PSP2/ARMv7Thread.h b/rpcs3/Emu/PSP2/ARMv7Thread.h index a288473f65..ad251572d5 100644 --- a/rpcs3/Emu/PSP2/ARMv7Thread.h +++ b/rpcs3/Emu/PSP2/ARMv7Thread.h @@ -16,12 +16,11 @@ class ARMv7Thread final : public cpu_thread public: virtual std::string get_name() const override; virtual std::string dump() const override; - virtual void cpu_init() override; virtual void cpu_task() override; virtual void cpu_task_main(); virtual ~ARMv7Thread() override; - ARMv7Thread(const std::string& name); + ARMv7Thread(const std::string& name, u32 prio = 160, u32 stack = 256 * 1024); union { diff --git a/rpcs3/Emu/PSP2/Modules/sceLibKernel.cpp b/rpcs3/Emu/PSP2/Modules/sceLibKernel.cpp index 2c190178a3..25f8b0faca 100644 --- a/rpcs3/Emu/PSP2/Modules/sceLibKernel.cpp +++ b/rpcs3/Emu/PSP2/Modules/sceLibKernel.cpp @@ -93,12 +93,9 @@ arm_error_code sceKernelCreateThread(vm::cptr pName, vm::ptr(pName.get_ptr()); + const auto thread = idm::make_ptr(pName.get_ptr(), initPriority, stackSize); - thread->PC = entry.addr(); - thread->prio = initPriority; - thread->stack_size = stackSize; - thread->cpu_init(); + thread->write_pc(entry.addr(), 0); thread->TLS = fxm::get()->alloc(); return NOT_AN_ERROR(thread->id);