84#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
88 using MutationLockHook = void (*)();
91 static EXPORTED_PUBLIC
void setHandlerPinHook(HandlerPinHook hook);
94 static EXPORTED_PUBLIC
void setHandlerPrePinHook(HandlerPrePinHook hook);
97 static EXPORTED_PUBLIC
void setAtomicDrainHook(AtomicDrainHook hook);
100 EXPORTED_PUBLIC
void withMutationLockForTest(MutationLockHook hook);
112 virtual void interrupt(
size_t interruptNumber, InterruptState& state);
122 bool dispatchHandlers(InterruptState& state, uintptr_t address,
bool bIsWrite,
bool bWasPresent,
125 static const
size_t MaxMemoryTrapHandlers = 16;
126 static const
size_t MaxActiveDispatches = 64;
128 enum class SlotMode :
size_t {
136 static const size_t ModeBits = 3;
137 static const size_t ModeMask = (1 << ModeBits) - 1;
138 static const size_t GenerationShift = ModeBits;
143 ActiveDispatch() : token(
nullptr), generation(0), owner(
nullptr), slot(
nullptr) {}
152 HandlerSlot() : handler(
nullptr), publication(0) {}
160 : registry(registry), activeDispatch(
nullptr), cleanup() {}
167 static size_t makePublication(
size_t generation, SlotMode mode);
168 static size_t generationOf(
size_t publication);
169 static SlotMode modeOf(
size_t publication);
171 bool retireSlot(
HandlerSlot& slot,
size_t expectedPublication,
175 static void abandonedHandlerCleanup(
void* context);
177 bool findCurrentDispatch(
void* owner,
HandlerSlot* target,
bool& callbackContext)
const;
178 static void* currentDispatchOwner();
186#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
187 static HandlerPinHook m_HandlerPinHook;
188 static HandlerPrePinHook m_HandlerPrePinHook;
189 static AtomicDrainHook m_AtomicDrainHook;
HandlerSlot m_Handlers[MaxMemoryTrapHandlers]
EXPORTED_PUBLIC bool unregisterHandler(MemoryTrapHandler *pHandler)
static EXPORTED_PUBLIC PageFaultHandler m_Instance
EXPORTED_PUBLIC bool registerHandler(MemoryTrapHandler *pHandler)
static PageFaultHandler & instance()
PageFaultHandler() INITIALISATION_ONLY