50 enum PostSyscallActionKind {
52 TerminateCurrentThread,
56 RestoreProcessorState,
70 bool closeAdmission();
73 explicit operator bool()
const {
74 return m_pManager !=
nullptr;
97 Registration& registration, FastEntry entry =
nullptr) = 0;
101 EXPORTED_PUBLIC
bool requestProcessExit(
int status);
102 EXPORTED_PUBLIC
bool requestEventReturn();
103 EXPORTED_PUBLIC
bool requestEventStatePop();
104 EXPORTED_PUBLIC
bool requestStateRestore(
const ProcessorState& state);
105 EXPORTED_PUBLIC
bool requestUserJump(uintptr_t instructionPointer, uintptr_t stackPointer);
106 EXPORTED_PUBLIC
bool requestReboot(Machine::ShutdownType type = Machine::ShutdownType::Restart);
109 virtual uintptr_t
syscall(Service_t service, uintptr_t function, uintptr_t p1 = 0,
110 uintptr_t p2 = 0, uintptr_t p3 = 0, uintptr_t p4 = 0,
111 uintptr_t p5 = 0) = 0;
113#if PEDIGREE_CONCURRENCY_SMOKE_TESTS
115 EXPORTED_PUBLIC
bool dispatchHandlerForTest(Service_t service, uintptr_t& result);
118#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
120 using PostSyscallHook = bool (*)(PostSyscallActionKind, intptr_t,
const ProcessorState*);
122 EXPORTED_PUBLIC
void setHandlerPinHook(HandlerPinHook hook);
123 EXPORTED_PUBLIC
void setPostSyscallHook(PostSyscallHook hook);
131 if (kind == RestoreProcessorState || kind == JumpToUserspace) {
132 state.~ProcessorState();
139 PostSyscallActionKind kind;
144 ProcessorState state;
160 m_pManager->releaseHandler(*
this,
true);
181 FastEntry entry =
nullptr);
183 return lease.m_Entry(lease.m_pHandler, state);
185 bool closeHandler(Registration& registration);
186 bool unregisterHandler(Registration& registration);
187 bool acquireHandler(Service_t service, HandlerLease& lease, PostSyscallAction& action);
189#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
190 bool postSyscallHookHandled(
const PostSyscallAction& action);
199 static uintptr_t dispatchVirtual(
SyscallHandler* handler, SyscallState& state);
200 static bool inCallback();
201 static void abandonedHandlerCleanup(
void* context);
202 bool requestPostSyscallAction(PostSyscallActionKind kind, intptr_t value,
203 const ProcessorState* state =
nullptr);
204 void releaseHandler(
HandlerLease& lease,
bool normalReturn);
218#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
219 HandlerPinHook m_HandlerPinHook;
220 PostSyscallHook m_PostSyscallHook;
virtual uintptr_t syscall(Service_t service, uintptr_t function, uintptr_t p1=0, uintptr_t p2=0, uintptr_t p3=0, uintptr_t p4=0, uintptr_t p5=0)=0