From c1c586a072a0180430949d6c16a052f80e8a53d5 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 6 Feb 2015 03:23:37 +0300 Subject: [PATCH] Some drafts --- rpcs3/Emu/ARMv7/Modules/psv_cond.cpp | 13 +++++++++++++ rpcs3/Emu/ARMv7/Modules/psv_cond.h | 24 ++++++++++++++++++++++++ rpcs3/Emu/ARMv7/Modules/psv_mutex.cpp | 13 +++++++++++++ rpcs3/Emu/ARMv7/Modules/psv_mutex.h | 24 ++++++++++++++++++++++++ rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp | 18 ++++++++++++++++-- rpcs3/Emu/ARMv7/Modules/scePerf.cpp | 5 +++++ rpcs3/Emu/ARMv7/PSVObjectList.cpp | 6 ++++++ rpcs3/emucore.vcxproj | 4 ++++ rpcs3/emucore.vcxproj.filters | 24 ++++++++++++++++++------ 9 files changed, 123 insertions(+), 8 deletions(-) create mode 100644 rpcs3/Emu/ARMv7/Modules/psv_cond.cpp create mode 100644 rpcs3/Emu/ARMv7/Modules/psv_cond.h create mode 100644 rpcs3/Emu/ARMv7/Modules/psv_mutex.cpp create mode 100644 rpcs3/Emu/ARMv7/Modules/psv_mutex.h diff --git a/rpcs3/Emu/ARMv7/Modules/psv_cond.cpp b/rpcs3/Emu/ARMv7/Modules/psv_cond.cpp new file mode 100644 index 0000000000..c89511b19d --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/psv_cond.cpp @@ -0,0 +1,13 @@ +#include "stdafx.h" +#include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" +#include "Emu/ARMv7/PSVObjectList.h" +#include "sceLibKernel.h" +#include "psv_cond.h" + +psv_cond_t::psv_cond_t(const char* name, u32 attr, s32 mutexId) + : attr(attr) + , mutexId(mutexId) +{ + strcpy_trunc(this->name, name); +} diff --git a/rpcs3/Emu/ARMv7/Modules/psv_cond.h b/rpcs3/Emu/ARMv7/Modules/psv_cond.h new file mode 100644 index 0000000000..cd8c518615 --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/psv_cond.h @@ -0,0 +1,24 @@ +#pragma once + +struct psv_cond_t +{ + char name[32]; + u32 attr; + s32 mutexId; + +private: + psv_cond_t() = delete; + psv_cond_t(const psv_cond_t&) = delete; + psv_cond_t(psv_cond_t&&) = delete; + + psv_cond_t& operator =(const psv_cond_t&) = delete; + psv_cond_t& operator =(psv_cond_t&&) = delete; + +public: + psv_cond_t(const char* name, u32 attr, s32 mutexId); + void on_init(s32 id) {} + void on_stop() {} + +}; + +extern psv_object_list_t g_psv_cond_list; diff --git a/rpcs3/Emu/ARMv7/Modules/psv_mutex.cpp b/rpcs3/Emu/ARMv7/Modules/psv_mutex.cpp new file mode 100644 index 0000000000..7733ad54ea --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/psv_mutex.cpp @@ -0,0 +1,13 @@ +#include "stdafx.h" +#include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" +#include "Emu/ARMv7/PSVObjectList.h" +#include "sceLibKernel.h" +#include "psv_mutex.h" + +psv_mutex_t::psv_mutex_t(const char* name, u32 attr, s32 count) + : attr(attr) + , count(count) +{ + strcpy_trunc(this->name, name); +} diff --git a/rpcs3/Emu/ARMv7/Modules/psv_mutex.h b/rpcs3/Emu/ARMv7/Modules/psv_mutex.h new file mode 100644 index 0000000000..5da6ad4590 --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/psv_mutex.h @@ -0,0 +1,24 @@ +#pragma once + +struct psv_mutex_t +{ + char name[32]; + u32 attr; + s32 count; + +private: + psv_mutex_t() = delete; + psv_mutex_t(const psv_mutex_t&) = delete; + psv_mutex_t(psv_mutex_t&&) = delete; + + psv_mutex_t& operator =(const psv_mutex_t&) = delete; + psv_mutex_t& operator =(psv_mutex_t&&) = delete; + +public: + psv_mutex_t(const char* name, u32 attr, s32 count); + void on_init(s32 id) {} + void on_stop() {} + +}; + +extern psv_object_list_t g_psv_mutex_list; diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp index d7bd58c79a..016917d6de 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp @@ -10,6 +10,8 @@ #include "sceLibKernel.h" #include "psv_sema.h" #include "psv_event_flag.h" +#include "psv_mutex.h" +#include "psv_cond.h" #define RETURN_ERROR(code) { Emu.Pause(); sceLibKernel.Error("%s() failed: %s", __FUNCTION__, #code); return code; } @@ -522,7 +524,13 @@ s32 sceKernelGetSemaInfo(s32 semaId, vm::psv::ptr pInfo) s32 sceKernelCreateMutex(vm::psv::ptr pName, u32 attr, s32 initCount, vm::psv::ptr pOptParam) { - throw __FUNCTION__; + sceLibKernel.Error("sceKernelCreateMutex(pName=0x%x, attr=0x%x, initCount=%d, pOptParam=0x%x)", pName, attr, initCount, pOptParam); + + std::shared_ptr mutex(new psv_mutex_t(pName.get_ptr(), attr, initCount)); + + const s32 id = g_psv_mutex_list.add(mutex); + + return id; } s32 sceKernelDeleteMutex(s32 mutexId) @@ -616,7 +624,13 @@ s32 sceKernelGetLwMutexInfoById(s32 lwMutexId, vm::psv::ptr pName, u32 attr, s32 mutexId, vm::psv::ptr pOptParam) { - throw __FUNCTION__; + sceLibKernel.Error("sceKernelCreateCond(pName=0x%x, attr=0x%x, mutexId=0x%x, pOptParam=0x%x)", pName, attr, mutexId, pOptParam); + + std::shared_ptr cond(new psv_cond_t(pName.get_ptr(), attr, mutexId)); + + const s32 id = g_psv_cond_list.add(cond); + + return id; } s32 sceKernelDeleteCond(s32 condId) diff --git a/rpcs3/Emu/ARMv7/Modules/scePerf.cpp b/rpcs3/Emu/ARMv7/Modules/scePerf.cpp index e7939506bc..fabf63691a 100644 --- a/rpcs3/Emu/ARMv7/Modules/scePerf.cpp +++ b/rpcs3/Emu/ARMv7/Modules/scePerf.cpp @@ -134,6 +134,11 @@ s32 scePerfArmPmonSelectEvent(ARMv7Context& context, s32 threadId, u32 counter, case SCE_PERF_ARM_PMON_BRANCH_MISPREDICT: case SCE_PERF_ARM_PMON_DCACHE_MISS: + case SCE_PERF_ARM_PMON_DCACHE_STALL: + case SCE_PERF_ARM_PMON_ICACHE_STALL: + case SCE_PERF_ARM_PMON_DATA_EVICTION: + case SCE_PERF_ARM_PMON_WRITE_STALL: + case SCE_PERF_ARM_PMON_MAINTLB_STALL: case SCE_PERF_ARM_PMON_UNALIGNED: { value = 1; // these events will probably never be implemented diff --git a/rpcs3/Emu/ARMv7/PSVObjectList.cpp b/rpcs3/Emu/ARMv7/PSVObjectList.cpp index cc8e97a1c0..5e89e15c73 100644 --- a/rpcs3/Emu/ARMv7/PSVObjectList.cpp +++ b/rpcs3/Emu/ARMv7/PSVObjectList.cpp @@ -5,12 +5,18 @@ #include "Modules/sceLibKernel.h" #include "Modules/psv_sema.h" #include "Modules/psv_event_flag.h" +#include "Modules/psv_mutex.h" +#include "Modules/psv_cond.h" psv_object_list_t g_psv_sema_list; psv_object_list_t g_psv_ef_list; +psv_object_list_t g_psv_mutex_list; +psv_object_list_t g_psv_cond_list; void clear_all_psv_objects() { g_psv_sema_list.clear(); g_psv_ef_list.clear(); + g_psv_mutex_list.clear(); + g_psv_cond_list.clear(); } diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index daed4a06ea..5327e220e3 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -56,7 +56,9 @@ + + @@ -334,7 +336,9 @@ + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 0720c265c4..ea11ba34b9 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -583,7 +583,7 @@ Emu\GPU\RSX - + Emu\GPU\RSX @@ -670,7 +670,7 @@ Emu\CPU\ARMv7 - + Emu\CPU\ARMv7 @@ -696,7 +696,7 @@ Emu\CPU\ARMv7\Modules - Emu\CPU\ARMv7\Modules + Emu\CPU\ARMv7\Modules Emu\CPU\ARMv7\Modules @@ -848,6 +848,12 @@ Emu\CPU\ARMv7\Modules + + Emu\CPU\ARMv7\Objects + + + Emu\CPU\ARMv7\Objects + @@ -1350,7 +1356,7 @@ Emu\GPU\RSX - + Emu\GPU\RSX @@ -1479,7 +1485,7 @@ Emu\CPU\ARMv7\Modules - + Emu\CPU\ARMv7 @@ -1490,7 +1496,7 @@ Emu\CPU\ARMv7\Objects - Emu\CPU\ARMv7\Modules + Emu\CPU\ARMv7\Modules Emu\CPU\ARMv7\Modules @@ -1510,5 +1516,11 @@ Emu\CPU\ARMv7\Modules + + Emu\CPU\ARMv7\Objects + + + Emu\CPU\ARMv7\Objects + \ No newline at end of file