diff --git a/rpcs3/Emu/Cell/PPCThread.cpp b/rpcs3/Emu/Cell/PPCThread.cpp deleted file mode 100644 index 4d77900d90..0000000000 --- a/rpcs3/Emu/Cell/PPCThread.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "stdafx.h" -#include "PPCThread.h" -#include "Emu/Memory/Memory.h" - -PPCThread* GetCurrentPPCThread() -{ - CPUThread* thread = GetCurrentCPUThread(); - - if(!thread || (thread->GetType() != CPU_THREAD_PPU && thread->GetType() != CPU_THREAD_SPU && thread->GetType() != CPU_THREAD_RAW_SPU)) - { - throw std::string("GetCurrentPPCThread: bad thread"); - } - - return (PPCThread*)thread; -} - -PPCThread::PPCThread(CPUThreadType type) : CPUThread(type) -{ -} - -PPCThread::~PPCThread() -{ -} - -void PPCThread::DoReset() -{ -} diff --git a/rpcs3/Emu/Cell/PPCThread.h b/rpcs3/Emu/Cell/PPCThread.h deleted file mode 100644 index 2c3fa5c05b..0000000000 --- a/rpcs3/Emu/Cell/PPCThread.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once -#include "Emu/CPU/CPUThread.h" - -class PPCThread : public CPUThread -{ -public: - virtual std::string GetThreadName() const - { - return fmt::format("%s[0x%08x]", GetFName(), PC); - } - -protected: - PPCThread(CPUThreadType type); - -public: - virtual ~PPCThread(); - -protected: - virtual void DoReset() override; -}; - -PPCThread* GetCurrentPPCThread(); diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 205dc2b4eb..9372ebe2c1 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -19,14 +19,14 @@ extern void ppu_free_tls(u32 thread); PPUThread& GetCurrentPPUThread() { - PPCThread* thread = GetCurrentPPCThread(); + CPUThread* thread = GetCurrentCPUThread(); if(!thread || thread->GetType() != CPU_THREAD_PPU) throw std::string("GetCurrentPPUThread: bad thread"); return *(PPUThread*)thread; } -PPUThread::PPUThread() : PPCThread(CPU_THREAD_PPU) +PPUThread::PPUThread() : CPUThread(CPU_THREAD_PPU) { owned_mutexes = 0; Reset(); @@ -39,8 +39,6 @@ PPUThread::~PPUThread() void PPUThread::DoReset() { - PPCThread::DoReset(); - //reset regs memset(VPR, 0, sizeof(VPR)); memset(FPR, 0, sizeof(FPR)); diff --git a/rpcs3/Emu/Cell/PPUThread.h b/rpcs3/Emu/Cell/PPUThread.h index 64c11c7563..ee0254aa6a 100644 --- a/rpcs3/Emu/Cell/PPUThread.h +++ b/rpcs3/Emu/Cell/PPUThread.h @@ -1,6 +1,6 @@ #pragma once #include "Emu/Cell/Common.h" -#include "Emu/Cell/PPCThread.h" +#include "Emu/CPU/CPUThread.h" #include "Emu/Memory/vm.h" enum @@ -467,7 +467,7 @@ struct FPRdouble static int Cmp(PPCdouble a, PPCdouble b); }; -class PPUThread : public PPCThread +class PPUThread : public CPUThread { public: PPCdouble FPR[32]; //Floating Point Register diff --git a/rpcs3/Emu/Cell/RawSPUThread.cpp b/rpcs3/Emu/Cell/RawSPUThread.cpp index 041ea63968..94f34c3fa0 100644 --- a/rpcs3/Emu/Cell/RawSPUThread.cpp +++ b/rpcs3/Emu/Cell/RawSPUThread.cpp @@ -47,7 +47,7 @@ bool RawSPUThread::Read32(const u32 addr, u32* value) case SPU_MBox_Status_offs: { - *value = (SPU.Out_MBox.GetCount() & 0xff) | (SPU.In_MBox.GetFreeCount() << 8); + *value = (SPU.Out_MBox.GetCount() & 0xff) | (SPU.In_MBox.GetFreeCount() << 8) | (SPU.Out_IntrMBox.GetCount() << 16); break; } diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index b0785cfd16..c986098d88 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -23,7 +23,7 @@ SPUThread& GetCurrentSPUThread() { - PPCThread* thread = GetCurrentPPCThread(); + CPUThread* thread = GetCurrentCPUThread(); if(!thread || (thread->GetType() != CPU_THREAD_SPU && thread->GetType() != CPU_THREAD_RAW_SPU)) { @@ -33,7 +33,7 @@ SPUThread& GetCurrentSPUThread() return *(SPUThread*)thread; } -SPUThread::SPUThread(CPUThreadType type) : PPCThread(type) +SPUThread::SPUThread(CPUThreadType type) : CPUThread(type) { assert(type == CPU_THREAD_SPU || type == CPU_THREAD_RAW_SPU); @@ -73,10 +73,8 @@ void SPUThread::Task() void SPUThread::DoReset() { - PPCThread::DoReset(); - //reset regs - memset(GPR, 0, sizeof(u128) * 128); + memset(GPR, 0, sizeof(GPR)); } void SPUThread::InitRegs() @@ -568,7 +566,7 @@ void SPUThread::WriteChannel(u32 ch, const u128& r) return; } - //if (Ini.HLELogging.GetValue()) + if (Ini.HLELogging.GetValue()) { LOG_WARNING(Log::SPU, "sys_spu_thread_throw_event(spup=%d, data0=0x%x, data1=0x%x)", spup, v & 0x00ffffff, data); } diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index fa0dfd22d9..da9ec3e025 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -1,7 +1,7 @@ #pragma once #include "Emu/Cell/Common.h" +#include "Emu/CPU/CPUThread.h" #include "Emu/Memory/atomic_type.h" -#include "PPCThread.h" #include "Emu/SysCalls/lv2/sleep_queue_type.h" #include "Emu/SysCalls/lv2/sys_event.h" #include "Emu/Event.h" @@ -287,7 +287,7 @@ union SPU_SNRConfig_hdr struct SpuGroupInfo; -class SPUThread : public PPCThread +class SPUThread : public CPUThread { public: u128 GPR[128]; // General-Purpose Registers diff --git a/rpcs3/Emu/SysCalls/Modules.cpp b/rpcs3/Emu/SysCalls/Modules.cpp index e6d8327f39..f839ead3fa 100644 --- a/rpcs3/Emu/SysCalls/Modules.cpp +++ b/rpcs3/Emu/SysCalls/Modules.cpp @@ -32,10 +32,17 @@ u32 add_ppu_func_sub(StaticFunc func) u32 add_ppu_func_sub(const char group[8], const u64 ops[], const char* name, Module* module, ppu_func_caller func) { + char group_name[9] = {}; + + if (group) + { + strcpy_trunc(group_name, group); + } + StaticFunc sf; sf.index = add_ppu_func(ModuleFunc(get_function_id(name), 0, module, func)); sf.name = name; - sf.group = *(u64*)group; + sf.group = *(u64*)group_name; sf.found = 0; // TODO: check for self-inclusions, use CRC @@ -259,6 +266,12 @@ void hook_ppu_funcs(u32* base, u32 size) { const u64 group = g_ppu_func_subs[i].group; + if (!group) + { + // skip if group not set + continue; + } + enum GroupSearchResult : u32 { GSR_SUCCESS = 0, // every function from this group has been found once @@ -320,17 +333,17 @@ void hook_ppu_funcs(u32* base, u32 size) if (g_ppu_func_subs[j].group == group) g_ppu_func_subs[j].found = 0; } - char name[9] = "????????"; + char group_name[9] = {}; - *(u64*)name = group; + *(u64*)group_name = group; if (res == GSR_SUCCESS) { - LOG_SUCCESS(LOADER, "Function group [%s] successfully hooked", std::string(name, 9).c_str()); + LOG_SUCCESS(LOADER, "Function group [%s] successfully hooked", group_name); } else { - LOG_ERROR(LOADER, "Function group [%s] failed:%s%s", std::string(name, 9).c_str(), + LOG_ERROR(LOADER, "Function group [%s] failed:%s%s", group_name, (res & GSR_MISSING ? " missing;" : ""), (res & GSR_EXCESS ? " excess;" : "")); } diff --git a/rpcs3/Emu/SysCalls/Modules.h b/rpcs3/Emu/SysCalls/Modules.h index c013bae9f1..f6a06c4827 100644 --- a/rpcs3/Emu/SysCalls/Modules.h +++ b/rpcs3/Emu/SysCalls/Modules.h @@ -151,4 +151,6 @@ void hook_ppu_funcs(u32* base, u32 size); static const u64 name ## _table[] = {__VA_ARGS__ , 0}; \ if (name ## _table[0]) add_ppu_func_sub(group, name ## _table, #name, &module, bind_func(name)) +#define op_mask(op) []() -> u64 { s32 XXX = 0; u64 _op = (op); XXX = -1; return ((op) ^ ~_op) << 32 | _op; }() + #define UNIMPLEMENTED_FUNC(module) module.Error("%s", __FUNCTION__) diff --git a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp index 2e2c07b723..d2d705477d 100644 --- a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp +++ b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp @@ -1,8 +1,10 @@ #include "stdafx.h" +#include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/CB_FUNC.h" +#include "Emu/Cell/PPUInstrTable.h" #include "Emu/CPU/CPUThreadManager.h" #include "cellAudio.h" @@ -638,6 +640,8 @@ Module libmixer("libmixer", []() ssp.clear(); }; + using namespace PPU_instr; + REG_SUB(libmixer, "surmxAAN", cellAANAddData, 0xffffffff7c691b78, 0xffffffff7c0802a6, @@ -776,7 +780,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerGetAANHandle, - 0xff00000081428250, // lwz + op_mask(LWZ(10, 2, XXX)), 0xffffffff3d607fce, 0xffffffff616bfffe, 0xffffffff812a0018, @@ -793,7 +797,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerChStripGetAANPortNo, - 0xff00000081228250, // lwz + op_mask(LWZ(9, 2, XXX)), 0xffffffff7c661b78, 0xffffffff3c608031, 0xffffffff78c60020, @@ -808,7 +812,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerSetNotifyCallback, - 0xff00000081428250, // lwz + op_mask(LWZ(10, 2, XXX)), 0xffffffff7c0802a6, 0xfffffffff821ff81, 0xfffffffff8010090, @@ -828,7 +832,7 @@ Module libmixer("libmixer", []() 0xffffffff7c0803a6, 0xffffffff4e800020, 0xffffff00419affec, // beq - 0xf0000000800a001c, // lwz + op_mask(LWZ(0, 10, XXX)), 0xffffffff79290020, 0xffffffff38810070, 0xffffffff2f800000, @@ -836,7 +840,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerRemoveNotifyCallback, - 0xff00000081628250, // lwz + op_mask(LWZ(11, 2, XXX)), 0xffffffff7c0802a6, 0xfffffffff821ff81, 0xfffffffff8010090, @@ -857,7 +861,7 @@ Module libmixer("libmixer", []() 0xfffffffff821ff71, 0xffffffff7c0802a6, 0xfffffffffbc10080, - 0xf000000083c20000, // lwz + op_mask(LWZ(30, 2, XXX)), 0xfffffffff80100a0, 0xfffffffffba10078, 0xfffffffffbe10088, @@ -881,7 +885,7 @@ Module libmixer("libmixer", []() 0xffffffff7c0802a6, 0xfffffffffbc10070, 0xfffffffffc000890, - 0xf000000083c28250, // lwz + op_mask(LWZ(30, 2, XXX)), 0xffffffff3d208031, 0xfffffffff8010090, 0xfffffffffbe10078, @@ -933,7 +937,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerSurBusAddData, - 0xff00000081428250, // lwz + op_mask(LWZ(10, 2, XXX)), 0xffffffff7c0802a6, 0xfffffffff821ff91, 0xfffffffff8010080, @@ -962,7 +966,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerChStripSetParameter, - 0xff00000081028250, // lwz + op_mask(LWZ(8, 2, XXX)), 0xffffffff7c6b1b78, 0xffffffff3c608031, 0xffffffff7c8a2378, @@ -982,7 +986,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerPause, - 0xff00000081428250, // lwz + op_mask(LWZ(10, 2, XXX)), 0xffffffff7c0802a6, 0xfffffffff821ff81, 0xfffffffff8010090, @@ -1007,7 +1011,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerGetCurrentBlockTag, - 0xff00000081628250, // lwz + op_mask(LWZ(11, 2, XXX)), 0xffffffff3d208031, 0xffffffff61290002, 0xffffffff880b0020, @@ -1021,7 +1025,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerGetTimestamp, - 0xff00000081628250, // lwz + op_mask(LWZ(11, 2, XXX)), 0xffffffff7c0802a6, 0xfffffffff821ff91, 0xfffffffff8010080, @@ -1043,7 +1047,7 @@ Module libmixer("libmixer", []() ); REG_SUB(libmixer, "surmixer", cellSurMixerBeep, - 0xff00000081228250, // lwz + op_mask(LWZ(9, 2, XXX)), 0xffffffff7c641b78, 0xffffffff80690018, 0xffffffff2f830000, diff --git a/rpcs3/Gui/Debugger.cpp b/rpcs3/Gui/Debugger.cpp index 26018d0563..66f85de571 100644 --- a/rpcs3/Gui/Debugger.cpp +++ b/rpcs3/Gui/Debugger.cpp @@ -7,7 +7,7 @@ #include "Debugger.h" #include "InterpreterDisAsm.h" #include "Emu/CPU/CPUThreadManager.h" -#include "Emu/Cell/PPCThread.h" +#include "Emu/CPU/CPUThread.h" class DbgEmuPanel : public wxPanel @@ -95,7 +95,7 @@ public: break; case DID_EXIT_THR_SYSCALL: - Emu.GetCPU().RemoveThread(((PPCThread*)event.GetClientData())->GetId()); + Emu.GetCPU().RemoveThread(((CPUThread*)event.GetClientData())->GetId()); break; } diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index a2b15df8d9..825b12b3b1 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -131,7 +131,6 @@ - true true @@ -362,7 +361,6 @@ - diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 405e2c839b..54c89cec71 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -341,9 +341,6 @@ Emu\CPU\Cell - - Emu\CPU\Cell - Emu\CPU\Cell @@ -1105,9 +1102,6 @@ Emu\CPU\Cell - - Emu\CPU\Cell - Emu\CPU\Cell