51 enum PostSyscallActionKind {
53 TerminateCurrentThread,
57 RestoreProcessorState,
71 bool closeAdmission();
74 explicit operator bool()
const {
75 return m_pManager !=
nullptr;
98 Registration& registration, FastEntry entry =
nullptr) = 0;
102 EXPORTED_PUBLIC
bool requestProcessExit(
int status);
103 EXPORTED_PUBLIC
bool requestEventReturn();
104 EXPORTED_PUBLIC
bool requestEventStatePop();
105 EXPORTED_PUBLIC
bool requestStateRestore(
const ProcessorState& state);
106 EXPORTED_PUBLIC
bool requestUserJump(uintptr_t instructionPointer, uintptr_t stackPointer);
107 EXPORTED_PUBLIC
bool requestReboot(Machine::ShutdownType type = Machine::ShutdownType::Restart);
110 virtual uintptr_t
syscall(Service_t service, uintptr_t function, uintptr_t p1 = 0,
111 uintptr_t p2 = 0, uintptr_t p3 = 0, uintptr_t p4 = 0,
112 uintptr_t p5 = 0) = 0;
114#if PEDIGREE_CONCURRENCY_SMOKE_TESTS
116 EXPORTED_PUBLIC
bool dispatchHandlerForTest(Service_t service, uintptr_t& result);
119#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
121 using PostSyscallHook = bool (*)(PostSyscallActionKind, intptr_t,
const ProcessorState*);
123 EXPORTED_PUBLIC
void setHandlerPinHook(HandlerPinHook hook);
124 EXPORTED_PUBLIC
void setPostSyscallHook(PostSyscallHook hook);
132 if (kind == RestoreProcessorState || kind == JumpToUserspace) {
133 state.~ProcessorState();
140 PostSyscallActionKind kind;
145 ProcessorState state;
161 releaseHandler(*
this,
true);
181 FastEntry entry =
nullptr);
183 if (
UNLIKELY(lease.m_pThread->hasSecurityState())) {
184 auto security = lease.m_pThread->securityState();
185 uintptr_t result = 0;
186 if (security && security->interceptSyscall(state, result)) {
190 return lease.m_Entry(lease.m_pHandler, state);
192 bool closeHandler(Registration& registration);
193 bool unregisterHandler(Registration& registration);
194 bool acquireHandler(Service_t service, HandlerLease& lease, PostSyscallAction& action);
196#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
197 bool postSyscallHookHandled(
const PostSyscallAction& action);
206 static uintptr_t dispatchVirtual(
SyscallHandler* handler, SyscallState& state);
207 static bool inCallback();
208 static void abandonedHandlerCleanup(
void* context);
209 bool requestPostSyscallAction(PostSyscallActionKind kind, intptr_t value,
210 const ProcessorState* state =
nullptr);
211 static void releaseHandler(
HandlerLease& lease,
bool normalReturn);
225#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
226 HandlerPinHook m_HandlerPinHook;
227 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