Core: Add Creator, Data to CustomIRHandlers, return them + lock on Add

This commit is contained in:
Stefanos Kornilios Misis Poiitidis 2022-06-15 01:48:32 +03:00
parent 7100a2eaee
commit 18074307f6
5 changed files with 33 additions and 10 deletions

View File

@ -193,8 +193,8 @@ namespace FEXCore::Context {
return CTX->UnloadAOTIRCacheEntry(Entry);
}
bool AddCustomIREntrypoint(FEXCore::Context::Context *CTX, uintptr_t Entrypoint, std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)> Handler) {
return CTX->AddCustomIREntrypoint(Entrypoint, Handler);
CustomIRResult AddCustomIREntrypoint(FEXCore::Context::Context *CTX, uintptr_t Entrypoint, std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)> Handler, void *Creator, void *Data) {
return CTX->AddCustomIREntrypoint(Entrypoint, Handler, Creator, Data);
}
namespace Debug {

View File

@ -174,7 +174,7 @@ namespace FEXCore::Context {
}
// returns false if a handler was already registered
bool AddCustomIREntrypoint(uintptr_t Entrypoint, std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)> Handler);
CustomIRResult AddCustomIREntrypoint(uintptr_t Entrypoint, std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)> Handler, void *Creator, void *Data);
void RemoveCustomIREntrypoint(uintptr_t Entrypoint);
@ -348,7 +348,7 @@ namespace FEXCore::Context {
FEX_CONFIG_OPT(AppFilename, APP_FILENAME);
std::shared_mutex CustomIRMutex;
std::unordered_map<uint64_t, std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)>> CustomIRHandlers;
std::unordered_map<uint64_t, std::tuple<std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)>, void *, void *>> CustomIRHandlers;
};
uint64_t HandleSyscall(FEXCore::HLE::SyscallHandler *Handler, FEXCore::Core::CpuStateFrame *Frame, FEXCore::HLE::SyscallArguments *Args);

View File

@ -701,7 +701,7 @@ namespace FEXCore::Context {
if (Handler != CustomIRHandlers.end()) {
TotalInstructions = 1;
TotalInstructionsLength = 1;
Handler->second(GuestRIP, Thread->OpDispatcher.get());
std::get<0>(Handler->second)(GuestRIP, Thread->OpDispatcher.get());
lk.unlock();
} else {
lk.unlock();
@ -1156,12 +1156,20 @@ namespace FEXCore::Context {
Thread->LookupCache->Erase(GuestRIP);
}
bool Context::AddCustomIREntrypoint(uintptr_t Entrypoint, std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)> Handler) {
CustomIRResult Context::AddCustomIREntrypoint(uintptr_t Entrypoint, std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)> Handler, void *Creator, void *Data) {
LOGMAN_THROW_A_FMT(Config.Is64BitMode || !(Entrypoint >> 32), "64-bit Entrypoint in 32-bit mode {:x}", Entrypoint);
std::scoped_lock lk(CustomIRMutex);
std::unique_lock lk(CustomIRMutex);
return CustomIRHandlers.emplace(Entrypoint, Handler).second;
auto InsertedIterator = CustomIRHandlers.emplace(Entrypoint, std::tuple(Handler, Creator, Data));
if (!InsertedIterator.second) {
const auto &[fn, Creator, Data] = InsertedIterator.first->second;
return CustomIRResult(std::move(lk), Creator, Data);
} else {
lk.unlock();
return CustomIRResult(std::move(lk), 0, 0);
}
}
void Context::RemoveCustomIREntrypoint(uintptr_t Entrypoint) {

View File

@ -11,6 +11,8 @@
#include <ostream>
#include <memory>
#include <set>
#include <mutex>
#include <shared_mutex>
namespace FEXCore {
class CodeLoader;
@ -52,6 +54,19 @@ namespace FEXCore::Context {
MODE_64BIT,
};
struct CustomIRResult {
void *Creator;
void *Data;
explicit operator bool() const noexcept { return !lock; }
CustomIRResult(std::unique_lock<std::shared_mutex> &&lock, void *Creator, void *Data):
Creator(Creator), Data(Data), lock(std::move(lock)) { }
private:
std::unique_lock<std::shared_mutex> lock;
};
using CustomCPUFactoryType = std::function<std::unique_ptr<FEXCore::CPU::CPUBackend> (FEXCore::Context::Context*, FEXCore::Core::InternalThreadState *Thread)>;
using ExitHandler = std::function<void(uint64_t ThreadId, FEXCore::Context::ExitReason)>;
@ -255,5 +270,5 @@ namespace FEXCore::Context {
FEX_DEFAULT_VISIBILITY void MarkMemoryShared(FEXCore::Context::Context *CTX);
FEX_DEFAULT_VISIBILITY void ConfigureAOTGen(FEXCore::Core::InternalThreadState *Thread, std::set<uint64_t> *ExternalBranches, uint64_t SectionMaxAddress);
FEX_DEFAULT_VISIBILITY bool AddCustomIREntrypoint(FEXCore::Context::Context *CTX, uintptr_t Entrypoint, std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)> Handler);
FEX_DEFAULT_VISIBILITY CustomIRResult AddCustomIREntrypoint(FEXCore::Context::Context *CTX, uintptr_t Entrypoint, std::function<void(uintptr_t Entrypoint, FEXCore::IR::IREmitter *)> Handler, void *Creator = nullptr, void *Data = nullptr);
}

View File

@ -110,7 +110,7 @@ public:
return false;
}
return AddCustomIREntrypoint(CTX, EntryRIP, [ParsedCodePtr = ParsedCode.get()](uintptr_t Entrypoint, FEXCore::IR::IREmitter *emit) {
return !!AddCustomIREntrypoint(CTX, EntryRIP, [ParsedCodePtr = ParsedCode.get()](uintptr_t Entrypoint, FEXCore::IR::IREmitter *emit) {
emit->CopyData(*ParsedCodePtr);
});
}