diff --git a/core/memory/memory.cpp b/core/memory/memory.cpp index 2da31a5..fe951e9 100644 --- a/core/memory/memory.cpp +++ b/core/memory/memory.cpp @@ -6,6 +6,7 @@ #include "utility/utility.h" #include +#include LOG_DEFINE_MODULE(memory); @@ -299,4 +300,40 @@ void installHook_long(uintptr_t dst, uintptr_t src, _t_hook& pGateway, size_t le protect((uintptr_t)pGateway.data.data(), pGateway.data.size(), SceProtExecute | SceProtRead, nullptr); } + +int VirtualLock::check_mmaped(void* addr, size_t len) { + return 0; +} + +VirtualLock& VirtualLock::instance() { + static VirtualLock instance; + return instance; +} + +void VirtualLock::lock() { + MMLock.lock(); +} + +void VirtualLock::unlock() { + MMLock.unlock(); +} + +void MLOCK(VirtualLock& vLock) { + vLock.lock(); +} + +void MUNLOCK(VirtualLock& vLock) { + vLock.unlock(); +} + +int check_mmaped(void* addr, size_t len) { + LOG_USE_MODULE(memory); + VirtualLock& vLock = VirtualLock::instance(); + MLOCK(vLock); + + int result = vLock.check_mmaped(addr, len); + + MUNLOCK(vLock); + return result; +} } // namespace memory \ No newline at end of file diff --git a/core/memory/memory.h b/core/memory/memory.h index 39b867e..e826723 100644 --- a/core/memory/memory.h +++ b/core/memory/memory.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include constexpr int SceProtRead = 1; constexpr int SceProtWrite = 2; @@ -25,6 +26,20 @@ struct _t_hook { std::array data; // Should be enough for inserting the hook (min 14 max 14+8) }; +class VirtualLock { +public: + int check_mmaped(void* addr, size_t len); + static VirtualLock& instance(); + void lock(); + void unlock(); + +private: + std::mutex MMLock; +}; + +void MLOCK(VirtualLock& vLock); +void MUNLOCK(VirtualLock& vLock); + __APICALL int getpagesize(void); __APICALL uint64_t getTotalSystemMemory(); __APICALL uintptr_t reserve(uint64_t start, uint64_t size, uint64_t alignment, bool isGpu); @@ -37,6 +52,7 @@ __APICALL bool allocFixed(uint64_t address, uint64_t size, int prot); __APICALL bool free(uint64_t address); __APICALL bool protect(uint64_t address, uint64_t size, int prot, int* oldMode = nullptr); __APICALL int getProtection(uint64_t address); +__APICALL int check_mmaped(void* addr, size_t len); __APICALL void installHook_long(uintptr_t dst, uintptr_t src, _t_hook& pGateway, size_t lenOpCodes); } // namespace memory diff --git a/modules/libSceGameLiveStreaming/entry.cpp b/modules/libSceGameLiveStreaming/entry.cpp index 574cd01..0b55209 100644 --- a/modules/libSceGameLiveStreaming/entry.cpp +++ b/modules/libSceGameLiveStreaming/entry.cpp @@ -97,6 +97,12 @@ EXPORT SYSV_ABI int32_t sceGameLiveStreamingClearSocialFeedbackMessages(const Sc return Ok; } +EXPORT SYSV_ABI int32_t sceGameLiveStreamingSetStandbyScreenResource(const char* resource) { + LOG_USE_MODULE(libSceGameLiveStreaming); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} + EXPORT SYSV_ABI int32_t sceGameLiveStreamingTerminate() { LOG_USE_MODULE(libSceGameLiveStreaming); LOG_ERR(L"todo %S", __FUNCTION__); diff --git a/modules/libSceNpManager/codes.h b/modules/libSceNpManager/codes.h index 6299be8..16648c2 100644 --- a/modules/libSceNpManager/codes.h +++ b/modules/libSceNpManager/codes.h @@ -26,4 +26,5 @@ constexpr uint32_t SCE_NP_LANGUAGE_CODE_MAX_LEN = (5); constexpr uint32_t SCE_NP_COUNTRY_CODE_LENGTH = (2); constexpr uint32_t SCE_NP_NO_AGE_RESTRICTION = (0); constexpr uint32_t SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY = (0x1); -constexpr uint32_t SCE_NP_PLUS_EVENT_RECHECK_NEEDED = (0x1); \ No newline at end of file +constexpr uint32_t SCE_NP_PLUS_EVENT_RECHECK_NEEDED = (0x1); +constexpr uint32_t SCE_NP_IN_GAME_MESSAGE_DATA_SIZE_MAX = (512); \ No newline at end of file diff --git a/modules/libSceNpManager/entry.cpp b/modules/libSceNpManager/entry.cpp index 4371a28..cabb2f6 100644 --- a/modules/libSceNpManager/entry.cpp +++ b/modules/libSceNpManager/entry.cpp @@ -340,4 +340,60 @@ EXPORT SYSV_ABI int sceNpInGameMessageInitialize(size_t poolSize, void* option) LOG_ERR(L"todo %S", __FUNCTION__); return Ok; } + +EXPORT SYSV_ABI int32_t sceNpInGameMessageAbortHandle(int32_t libCtxId, int32_t handleId) { + LOG_USE_MODULE(libSceNpManager); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} + +EXPORT SYSV_ABI int32_t sceNpInGameMessageCreateHandle(int32_t libCtxId) { + LOG_USE_MODULE(libSceNpManager); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} + +EXPORT SYSV_ABI int32_t sceNpInGameMessageDeleteHandle(int32_t libCtxId, int32_t handleId) { + LOG_USE_MODULE(libSceNpManager); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} + +EXPORT SYSV_ABI int32_t sceNpInGameMessagePrepare(int32_t libCtxId, int32_t handleId, const void* pReserved, SceNpInGameMessageEventCallbackA cbFunc, + void* pUserArg) { + LOG_USE_MODULE(libSceNpManager); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} + +EXPORT SYSV_ABI int32_t sceNpInGameMessagePrepareA(int32_t libCtxId, int32_t handleId, const void* pReserved, SceNpInGameMessageEventCallbackA cbFunc, + void* pUserArg) { + LOG_USE_MODULE(libSceNpManager); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} + +EXPORT SYSV_ABI int32_t sceNpInGameMessageSendData(int32_t libCtxId, const SceNpPeerAddressA* pTo, const SceNpPeerAddressA* pFrom, const SceNpInGameMessageData* pMessage) { + LOG_USE_MODULE(libSceNpManager); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} + +EXPORT SYSV_ABI int32_t sceNpInGameMessageSendDataA(int32_t libCtxId, const SceNpPeerAddressA* pTo, const SceNpPeerAddressA* pFrom, const SceNpInGameMessageData* pMessage) { + LOG_USE_MODULE(libSceNpManager); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} + +EXPORT SYSV_ABI int32_t sceNpInGameMessageGetMemoryPoolStatistics(int32_t libCtxId, SceNpInGameMessageMemoryPoolStatistics* pMemStats) { + LOG_USE_MODULE(libSceNpManager); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} + +EXPORT SYSV_ABI int32_t sceNpInGameMessageTerminate(int32_t libCtxId) { + LOG_USE_MODULE(libSceNpManager); + LOG_ERR(L"todo %S", __FUNCTION__); + return Ok; +} } diff --git a/modules/libSceNpManager/types.h b/modules/libSceNpManager/types.h index 49be2e8..790fa43 100644 --- a/modules/libSceNpManager/types.h +++ b/modules/libSceNpManager/types.h @@ -152,3 +152,17 @@ struct SceNpCreateAsyncRequestParameter { uint64_t cpuAffinityMask; int threadPriority; }; + +struct SceNpInGameMessageData { + char data[SCE_NP_IN_GAME_MESSAGE_DATA_SIZE_MAX]; + size_t dataSize; +}; + +typedef void* SceNpInGameMessageEventCallbackA(int32_t libCtxId, const SceNpPeerAddressA* pTo, const SceNpOnlineId* pToOnlineId, const SceNpPeerAddressA* pFrom, const SceNpOnlineId* pFromOnlineId, const SceNpInGameMessageData* pMessage, void* pUserArg); + +struct SceNpInGameMessageMemoryPoolStatistics { + size_t poolSize; + size_t maxInuseSize; + size_t currentInuseSize; + int32_t reserved; +}; diff --git a/modules/libSceUlt/entry.cpp b/modules/libSceUlt/entry.cpp index 44db98b..ffc7e73 100644 --- a/modules/libSceUlt/entry.cpp +++ b/modules/libSceUlt/entry.cpp @@ -37,6 +37,16 @@ EXPORT SYSV_ABI int32_t _sceUltWaitingQueueResourcePoolCreate(SceUltWaitingQueue return Ok; } +EXPORT SYSV_ABI int32_t _sceUltUlthreadRuntimeOptParamInitialize(SceUltUlthreadOptParam* optParam) { + LOG_USE_MODULE(libSceUlt); + return Ok; +} + +EXPORT SYSV_ABI int32_t sceUltUlthreadRuntimeGetWorkAreaSize(uint32_t maxUlThread, uint32_t maxWorkerThread) { + LOG_USE_MODULE(libSceUlt); + return 8; +} + EXPORT SYSV_ABI int32_t _sceUltQueueDataResourcePoolCreate(SceUltQueueDataResourcePool* pool, const char* name, uint32_t numData, size_t dataSize, uint32_t numQueueObjs, SceUltWaitingQueueResourcePool* waitingQueue, void* workArea, SceUltQueueDataResourcePoolOptParam* param) { diff --git a/modules/libSceUlt/types.h b/modules/libSceUlt/types.h index 874675a..5d7649d 100644 --- a/modules/libSceUlt/types.h +++ b/modules/libSceUlt/types.h @@ -58,6 +58,11 @@ struct SceUltQueue { char _unknown[336]; }; +struct SceUltUlthreadOptParam { + uint32_t attr; + char _unknown[127-4]; +}; + struct SceUltMutexOptParam { char _unknown[128]; -}; +}; \ No newline at end of file diff --git a/modules/libkernel/entry.cpp b/modules/libkernel/entry.cpp index a6bebad..5856ae1 100644 --- a/modules/libkernel/entry.cpp +++ b/modules/libkernel/entry.cpp @@ -261,6 +261,16 @@ EXPORT SYSV_ABI int sceKernelMprotect(uint64_t addr, size_t len, int prot) { return memory::protect(addr, len, prot, nullptr) ? Ok : getErr(ErrCode::_EACCES); } +EXPORT SYSV_ABI int sceKernelMlock(void* addr, size_t len) { + LOG_USE_MODULE(libkernel); + return memory::check_mmaped(addr, len) ? Ok : getErr(ErrCode::_EACCES); +} + +EXPORT SYSV_ABI int sceKernelMunlock(void* addr, size_t len) { + LOG_USE_MODULE(libkernel); + return memory::check_mmaped(addr, len) ? Ok : getErr(ErrCode::_EACCES); +} + EXPORT SYSV_ABI int sceKernelMsync(void* addr, size_t len, int flags) { LOG_USE_MODULE(libkernel); LOG_ERR(L"todo %S", __FUNCTION__);