From a38580c8191b464b9d474ebdbfc3970909d6a6b1 Mon Sep 17 00:00:00 2001 From: James Benton Date: Fri, 28 Jan 2022 20:42:05 +0000 Subject: [PATCH] cafe/nn_ec: Add more functions. --- .../src/cafe/libraries/nn_ec/nn_ec.cpp | 2 + src/libdecaf/src/cafe/libraries/nn_ec/nn_ec.h | 2 + .../src/cafe/libraries/nn_ec/nn_ec_lib.cpp | 49 ++++++++++++++++ .../src/cafe/libraries/nn_ec/nn_ec_lib.h | 19 +++++++ .../libraries/nn_ec/nn_ec_memorymanager.cpp | 23 ++++++-- .../libraries/nn_ec/nn_ec_memorymanager.h | 21 +++++-- .../src/cafe/libraries/nn_ec/nn_ec_query.cpp | 56 +++++++++++++++++++ .../src/cafe/libraries/nn_ec/nn_ec_query.h | 25 +++++++++ .../src/cafe/libraries/nn_ec/nn_ec_result.h | 11 ++++ 9 files changed, 196 insertions(+), 12 deletions(-) create mode 100644 src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_lib.cpp create mode 100644 src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_lib.h create mode 100644 src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_query.cpp create mode 100644 src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_query.h create mode 100644 src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_result.h diff --git a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec.cpp b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec.cpp index 3149c1aa..772fbea5 100644 --- a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec.cpp +++ b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec.cpp @@ -17,8 +17,10 @@ Library::registerSymbols() registerCatalogSymbols(); registerItemListSymbols(); + registerLibSymbols(); registerMemoryManagerSymbols(); registerMoneySymbols(); + registerQuerySymbols(); registerRootObjectSymbols(); registerShoppingCatalogSymbols(); } diff --git a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec.h b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec.h index 92423569..e136794b 100644 --- a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec.h +++ b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec.h @@ -17,8 +17,10 @@ protected: void registerCatalogSymbols(); void registerItemListSymbols(); + void registerLibSymbols(); void registerMemoryManagerSymbols(); void registerMoneySymbols(); + void registerQuerySymbols(); void registerRootObjectSymbols(); void registerShoppingCatalogSymbols(); diff --git a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_lib.cpp b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_lib.cpp new file mode 100644 index 00000000..bfb5ad37 --- /dev/null +++ b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_lib.cpp @@ -0,0 +1,49 @@ +#include "cafe/libraries/nn_ec/nn_ec.h" +#include "cafe/libraries/nn_ec/nn_ec_lib.h" +#include "cafe/libraries/nn_ec/nn_ec_memorymanager.h" +#include "cafe/libraries/nn_ec/nn_ec_result.h" + +#include "cafe/libraries/cafe_hle_stub.h" + +namespace cafe::nn_ec +{ + +nn::Result +Initialize(uint32_t unk0) +{ + decaf_warn_stub(); + return nn::ResultSuccess; +} + +nn::Result +Finalize() +{ + decaf_warn_stub(); + return nn::ResultSuccess; +} + +nn::Result +SetAllocator(MemoryManager::AllocFn allocFn, + MemoryManager::FreeFn freeFn) +{ + auto test = nn::Result(0xC1603C80); + if (!allocFn || !freeFn) { + return ResultInvalidArgument; + } + + internal::MemoryManager_SetAllocator(allocFn, freeFn); + return nn::ResultSuccess; +} + +void +Library::registerLibSymbols() +{ + RegisterFunctionExportName("Initialize__Q2_2nn2ecFUi", + Initialize); + RegisterFunctionExportName("Finalize__Q2_2nn2ecFv", + Finalize); + RegisterFunctionExportName("SetAllocator__Q2_2nn2ecFPFUii_PvPFPv_v", + SetAllocator); +} + +} // namespace cafe::nn_ec diff --git a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_lib.h b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_lib.h new file mode 100644 index 00000000..ef3ca513 --- /dev/null +++ b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_lib.h @@ -0,0 +1,19 @@ +#pragma once +#include "nn_ec_memorymanager.h" + +#include "nn/nn_result.h" +#include + +namespace cafe::nn_ec +{ + +nn::Result +Initialize(uint32_t unk0); + +nn::Result +Finalize(); + +nn::Result +SetAllocator(MemoryManager::AllocFn allocate, MemoryManager::FreeFn free); + +} // namespace cafe::nn_ec diff --git a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_memorymanager.cpp b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_memorymanager.cpp index 533495b3..e3069236 100644 --- a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_memorymanager.cpp +++ b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_memorymanager.cpp @@ -33,8 +33,8 @@ MemoryManager_GetSingleton() virt_ptr MemoryManager_Constructor(virt_ptr self) { - self->_allocFn = sDefaultAllocFn; - self->_freeFn = sDefaultFreeFn; + self->allocFn = sDefaultAllocFn; + self->freeFn = sDefaultFreeFn; return self; } @@ -43,21 +43,32 @@ MemoryManager_Allocate(virt_ptr self, uint32_t size, uint32_t align) { - std::unique_lock lock { self->_mutex }; - return cafe::invoke(cpu::this_core::state(), self->_allocFn, size, align); + std::unique_lock lock { self->mutex }; + return cafe::invoke(cpu::this_core::state(), self->allocFn, size, align); } void MemoryManager_Free(virt_ptr self, virt_ptr ptr) { - std::unique_lock lock { self->_mutex }; - return cafe::invoke(cpu::this_core::state(), self->_freeFn, ptr); + std::unique_lock lock { self->mutex }; + return cafe::invoke(cpu::this_core::state(), self->freeFn, ptr); } namespace internal { +void +MemoryManager_SetAllocator(MemoryManager::AllocFn allocFn, + MemoryManager::FreeFn freeFn) +{ + auto memoryManager = MemoryManager_GetSingleton(); + + std::unique_lock lock { memoryManager->mutex }; + memoryManager->allocFn = allocFn; + memoryManager->freeFn = freeFn; +} + static virt_ptr defaultAllocFn(uint32_t size, uint32_t align) { return coreinit::MEMAllocFromDefaultHeapEx(size, align); diff --git a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_memorymanager.h b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_memorymanager.h index 8e27d857..e695df0f 100644 --- a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_memorymanager.h +++ b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_memorymanager.h @@ -11,14 +11,14 @@ struct MemoryManager using AllocFn = virt_func_ptr(uint32_t size, uint32_t align)>; using FreeFn = virt_func_ptr ptr)>; - be2_struct _mutex; - be2_val _allocFn; - be2_val _freeFn; + be2_struct mutex; + be2_val allocFn; + be2_val freeFn; UNKNOWN(0x48 - 0x34); }; -CHECK_OFFSET(MemoryManager, 0x00, _mutex); -CHECK_OFFSET(MemoryManager, 0x2C, _allocFn); -CHECK_OFFSET(MemoryManager, 0x30, _freeFn); +CHECK_OFFSET(MemoryManager, 0x00, mutex); +CHECK_OFFSET(MemoryManager, 0x2C, allocFn); +CHECK_OFFSET(MemoryManager, 0x30, freeFn); CHECK_SIZE(MemoryManager, 0x48); virt_ptr @@ -36,4 +36,13 @@ void MemoryManager_Free(virt_ptr self, virt_ptr ptr); +namespace internal +{ + +void +MemoryManager_SetAllocator(MemoryManager::AllocFn allocFn, + MemoryManager::FreeFn freeFn); + +} // internal + } // namespace cafe::nn_ec diff --git a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_query.cpp b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_query.cpp new file mode 100644 index 00000000..008ebb00 --- /dev/null +++ b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_query.cpp @@ -0,0 +1,56 @@ +#include "cafe/libraries/nn_ec/nn_ec.h" +#include "cafe/libraries/nn_ec/nn_ec_query.h" +#include "cafe/libraries/nn_ec/nn_ec_rootobject.h" + +#include "cafe/libraries/cafe_hle_stub.h" + +namespace cafe::nn_ec +{ + +virt_ptr +Query_Constructor(virt_ptr self) +{ + if (!self) { + self = virt_cast(RootObject_New(sizeof(Query))); + if (!self) { + return nullptr; + } + } + + self->impl = nullptr; + return self; +} + +void +Query_Destructor(virt_ptr self, + ghs::DestructorFlags flags) +{ + Query_Clear(self); + + if (flags & ghs::DestructorFlags::FreeMemory) { + RootObject_Free(self); + } +} + +void +Query_Clear(virt_ptr self) +{ + if (self->impl) { + decaf_warn_stub(); + } + + self->impl = nullptr; +} + +void +Library::registerQuerySymbols() +{ + RegisterFunctionExportName("__ct__Q3_2nn2ec5QueryFv", + Query_Constructor); + RegisterFunctionExportName("__dt__Q3_2nn2ec5QueryFv", + Query_Destructor); + RegisterFunctionExportName("Clear__Q3_2nn2ec5QueryFv", + Query_Clear); +} + +} // namespace cafe::nn_ec diff --git a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_query.h b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_query.h new file mode 100644 index 00000000..8c6b1334 --- /dev/null +++ b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_query.h @@ -0,0 +1,25 @@ +#pragma once +#include "cafe/libraries/nn_ec/nn_ec_rootobject.h" +#include "cafe/libraries/nn_ec/nn_ec_noncopyable.h" + +#include + +namespace cafe::nn_ec +{ + +struct Query : RootObject +{ + be2_virt_ptr impl; +}; + +virt_ptr +Query_Constructor(virt_ptr self); + +void +Query_Destructor(virt_ptr self, + ghs::DestructorFlags flags); + +void +Query_Clear(virt_ptr self); + +} // namespace cafe::nn_ec diff --git a/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_result.h b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_result.h new file mode 100644 index 00000000..366cfae8 --- /dev/null +++ b/src/libdecaf/src/cafe/libraries/nn_ec/nn_ec_result.h @@ -0,0 +1,11 @@ +#pragma once +#include "nn/nn_result.h" + +namespace cafe::nn_ec +{ + +static constexpr nn::Result ResultInvalidArgument { + nn::Result::MODULE_NN_EC, nn::Result::LEVEL_USAGE, 0x3C80 +}; + +} // namespace cafe::nn_ec