mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-06 07:12:14 +01:00
257 lines
6.4 KiB
C++
257 lines
6.4 KiB
C++
#include "stdafx.h"
|
|
#include "Emu/System.h"
|
|
#include "ARMv7Thread.h"
|
|
#include "PSVFuncList.h"
|
|
|
|
psv_log_base::psv_log_base(const std::string& name, init_func_t init)
|
|
: m_name(name)
|
|
, m_init(init)
|
|
{
|
|
on_error = [this](s32 code, psv_func* func)
|
|
{
|
|
if (code < 0)
|
|
{
|
|
Error("%s() failed: 0x%08X", func->name, code);
|
|
Emu.Pause();
|
|
}
|
|
};
|
|
}
|
|
|
|
std::vector<psv_func> g_psv_func_list;
|
|
std::vector<psv_log_base*> g_psv_modules;
|
|
|
|
u32 add_psv_func(psv_func data)
|
|
{
|
|
for (auto& f : g_psv_func_list)
|
|
{
|
|
assert(f.nid != data.nid || (&f - g_psv_func_list.data()) < SFI_MAX);
|
|
}
|
|
|
|
g_psv_func_list.push_back(data);
|
|
return (u32)(g_psv_func_list.size() - 1);
|
|
}
|
|
|
|
psv_func* get_psv_func_by_nid(u32 nid, u32* out_index)
|
|
{
|
|
for (auto& f : g_psv_func_list)
|
|
{
|
|
if (f.nid == nid && &f - g_psv_func_list.data())
|
|
{
|
|
const u32 index = (u32)(&f - g_psv_func_list.data());
|
|
|
|
if (index < SFI_MAX)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (out_index)
|
|
{
|
|
*out_index = index;
|
|
}
|
|
|
|
return &f;
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
psv_func* get_psv_func_by_index(u32 index)
|
|
{
|
|
if (index >= g_psv_func_list.size())
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
return &g_psv_func_list[index];
|
|
}
|
|
|
|
void execute_psv_func_by_index(ARMv7Context& context, u32 index)
|
|
{
|
|
if (auto func = get_psv_func_by_index(index))
|
|
{
|
|
const u32 old_func = context.hle_func;
|
|
context.hle_func = func->nid;
|
|
|
|
if (func->func)
|
|
{
|
|
func->func(context);
|
|
}
|
|
else
|
|
{
|
|
throw EXCEPTION("Unimplemented function");
|
|
}
|
|
|
|
// rough error code processing
|
|
if (context.GPR[0] && func->module && func->module->on_error)
|
|
{
|
|
func->module->on_error(context.GPR[0], func);
|
|
}
|
|
|
|
context.hle_func = old_func;
|
|
}
|
|
else
|
|
{
|
|
throw EXCEPTION("Invalid function index");
|
|
}
|
|
}
|
|
|
|
extern psv_log_base sceAppMgr;
|
|
extern psv_log_base sceAppUtil;
|
|
extern psv_log_base sceAudio;
|
|
extern psv_log_base sceAudiodec;
|
|
extern psv_log_base sceAudioenc;
|
|
extern psv_log_base sceAudioIn;
|
|
extern psv_log_base sceCamera;
|
|
extern psv_log_base sceCodecEngine;
|
|
extern psv_log_base sceCommonDialog;
|
|
extern psv_log_base sceCtrl;
|
|
extern psv_log_base sceDbg;
|
|
extern psv_log_base sceDeci4p;
|
|
extern psv_log_base sceDeflt;
|
|
extern psv_log_base sceDisplay;
|
|
extern psv_log_base sceFiber;
|
|
extern psv_log_base sceFios;
|
|
extern psv_log_base sceFpu;
|
|
extern psv_log_base sceGxm;
|
|
extern psv_log_base sceHttp;
|
|
extern psv_log_base sceIme;
|
|
extern psv_log_base sceJpeg;
|
|
extern psv_log_base sceJpegEnc;
|
|
extern psv_log_base sceLibc;
|
|
extern psv_log_base sceLibKernel;
|
|
extern psv_log_base sceLibm;
|
|
extern psv_log_base sceLibstdcxx;
|
|
extern psv_log_base sceLiveArea;
|
|
extern psv_log_base sceLocation;
|
|
extern psv_log_base sceMd5;
|
|
extern psv_log_base sceMotion;
|
|
extern psv_log_base sceMt19937;
|
|
extern psv_log_base sceNet;
|
|
extern psv_log_base sceNetCtl;
|
|
extern psv_log_base sceNgs;
|
|
extern psv_log_base sceNpBasic;
|
|
extern psv_log_base sceNpCommon;
|
|
extern psv_log_base sceNpManager;
|
|
extern psv_log_base sceNpMatching;
|
|
extern psv_log_base sceNpScore;
|
|
extern psv_log_base sceNpUtility;
|
|
extern psv_log_base scePerf;
|
|
extern psv_log_base scePgf;
|
|
extern psv_log_base scePhotoExport;
|
|
extern psv_log_base sceRazorCapture;
|
|
extern psv_log_base sceRtc;
|
|
extern psv_log_base sceSas;
|
|
extern psv_log_base sceScreenShot;
|
|
extern psv_log_base sceSfmt;
|
|
extern psv_log_base sceSha;
|
|
extern psv_log_base sceSqlite;
|
|
extern psv_log_base sceSsl;
|
|
extern psv_log_base sceSulpha;
|
|
extern psv_log_base sceSysmodule;
|
|
extern psv_log_base sceSystemGesture;
|
|
extern psv_log_base sceTouch;
|
|
extern psv_log_base sceUlt;
|
|
extern psv_log_base sceVideodec;
|
|
extern psv_log_base sceVoice;
|
|
extern psv_log_base sceVoiceQoS;
|
|
extern psv_log_base sceXml;
|
|
|
|
void initialize_psv_modules()
|
|
{
|
|
assert(!g_psv_func_list.size() && !g_psv_modules.size());
|
|
|
|
// fill module list
|
|
g_psv_modules.push_back(&sceAppMgr);
|
|
g_psv_modules.push_back(&sceAppUtil);
|
|
g_psv_modules.push_back(&sceAudio);
|
|
g_psv_modules.push_back(&sceAudiodec);
|
|
g_psv_modules.push_back(&sceAudioenc);
|
|
g_psv_modules.push_back(&sceAudioIn);
|
|
g_psv_modules.push_back(&sceCamera);
|
|
g_psv_modules.push_back(&sceCodecEngine);
|
|
g_psv_modules.push_back(&sceCommonDialog);
|
|
g_psv_modules.push_back(&sceCtrl);
|
|
g_psv_modules.push_back(&sceDbg);
|
|
g_psv_modules.push_back(&sceDeci4p);
|
|
g_psv_modules.push_back(&sceDeflt);
|
|
g_psv_modules.push_back(&sceDisplay);
|
|
g_psv_modules.push_back(&sceFiber);
|
|
g_psv_modules.push_back(&sceFios);
|
|
g_psv_modules.push_back(&sceFpu);
|
|
g_psv_modules.push_back(&sceGxm);
|
|
g_psv_modules.push_back(&sceHttp);
|
|
g_psv_modules.push_back(&sceIme);
|
|
g_psv_modules.push_back(&sceJpeg);
|
|
g_psv_modules.push_back(&sceJpegEnc);
|
|
g_psv_modules.push_back(&sceLibc);
|
|
g_psv_modules.push_back(&sceLibKernel);
|
|
g_psv_modules.push_back(&sceLibm);
|
|
g_psv_modules.push_back(&sceLibstdcxx);
|
|
g_psv_modules.push_back(&sceLiveArea);
|
|
g_psv_modules.push_back(&sceLocation);
|
|
g_psv_modules.push_back(&sceMd5);
|
|
g_psv_modules.push_back(&sceMotion);
|
|
g_psv_modules.push_back(&sceMt19937);
|
|
g_psv_modules.push_back(&sceNet);
|
|
g_psv_modules.push_back(&sceNetCtl);
|
|
g_psv_modules.push_back(&sceNgs);
|
|
g_psv_modules.push_back(&sceNpBasic);
|
|
g_psv_modules.push_back(&sceNpCommon);
|
|
g_psv_modules.push_back(&sceNpManager);
|
|
g_psv_modules.push_back(&sceNpMatching);
|
|
g_psv_modules.push_back(&sceNpScore);
|
|
g_psv_modules.push_back(&sceNpUtility);
|
|
g_psv_modules.push_back(&scePerf);
|
|
g_psv_modules.push_back(&scePgf);
|
|
g_psv_modules.push_back(&scePhotoExport);
|
|
g_psv_modules.push_back(&sceRazorCapture);
|
|
g_psv_modules.push_back(&sceRtc);
|
|
g_psv_modules.push_back(&sceSas);
|
|
g_psv_modules.push_back(&sceScreenShot);
|
|
g_psv_modules.push_back(&sceSfmt);
|
|
g_psv_modules.push_back(&sceSha);
|
|
g_psv_modules.push_back(&sceSqlite);
|
|
g_psv_modules.push_back(&sceSsl);
|
|
g_psv_modules.push_back(&sceSulpha);
|
|
g_psv_modules.push_back(&sceSysmodule);
|
|
g_psv_modules.push_back(&sceSystemGesture);
|
|
g_psv_modules.push_back(&sceTouch);
|
|
g_psv_modules.push_back(&sceUlt);
|
|
g_psv_modules.push_back(&sceVideodec);
|
|
g_psv_modules.push_back(&sceVoice);
|
|
g_psv_modules.push_back(&sceVoiceQoS);
|
|
g_psv_modules.push_back(&sceXml);
|
|
|
|
// setup special functions (without NIDs)
|
|
g_psv_func_list.resize(SFI_MAX);
|
|
|
|
psv_func& hle_return = g_psv_func_list[SFI_HLE_RETURN];
|
|
hle_return.nid = 0;
|
|
hle_return.name = "HLE_RETURN";
|
|
hle_return.func = [](ARMv7Context& context)
|
|
{
|
|
static_cast<ARMv7Thread&>(context).fast_stop();
|
|
};
|
|
|
|
// load functions
|
|
for (auto module : g_psv_modules)
|
|
{
|
|
module->Init();
|
|
}
|
|
}
|
|
|
|
void finalize_psv_modules()
|
|
{
|
|
for (auto module : g_psv_modules)
|
|
{
|
|
if (module->on_stop)
|
|
{
|
|
module->on_stop();
|
|
}
|
|
}
|
|
|
|
g_psv_func_list.clear();
|
|
g_psv_modules.clear();
|
|
}
|