132 friend class X86GdtManager;
154 static void initialisationDone();
157 static void deinitialise();
162 static size_t isInitialised();
166 static uintptr_t getBasePointer();
169 static uintptr_t getStackPointer();
172 static uintptr_t getInstructionPointer();
182 static bool saveState(SchedulerState& state);
186 static void restoreState(SchedulerState& state,
volatile uintptr_t* pLock = 0)
NORETURN;
190 static void restoreState(SyscallState& state,
volatile uintptr_t* pLock = 0)
NORETURN;
201 static void switchState(
bool bInterrupts, SchedulerState& a, SchedulerState& b,
202 volatile uintptr_t* pLock = 0);
204 static void switchState(
bool bInterrupts, SchedulerState& a, SyscallState& b,
205 volatile uintptr_t* pLock = 0);
216 static void saveAndJumpKernel(
bool bInterrupts, SchedulerState& s,
volatile uintptr_t* pLock,
217 uintptr_t address, uintptr_t stack, uintptr_t p1 = 0,
218 uintptr_t p2 = 0, uintptr_t p3 = 0, uintptr_t p4 = 0);
229 static void saveAndJumpUser(
bool bInterrupts, SchedulerState& s,
volatile uintptr_t* pLock,
230 uintptr_t address, uintptr_t stack, uintptr_t p1 = 0,
231 uintptr_t p2 = 0, uintptr_t p3 = 0, uintptr_t p4 = 0);
241 static void jumpKernel(
volatile uintptr_t* pLock, uintptr_t address, uintptr_t stack,
242 uintptr_t p1 = 0, uintptr_t p2 = 0, uintptr_t p3 = 0,
253 static
void jumpUser(volatile uintptr_t* pLock, uintptr_t address, uintptr_t stack,
254 uintptr_t p1 = 0, uintptr_t p2 = 0, uintptr_t p3 = 0,
258 static
void breakpoint();
266 static
size_t getDebugBreakpointCount();
272 static uintptr_t getDebugBreakpoint(
size_t nBpNumber, DebugFlags::FaultType& nFaultType,
273 size_t& nLength,
bool& bEnabled);
280 static
void enableDebugBreakpoint(
size_t nBpNumber, uintptr_t nLinearAddress,
281 DebugFlags::FaultType nFaultType,
size_t nLength);
285 static
void disableDebugBreakpoint(
size_t nBpNumber);
289 static uintptr_t getDebugStatus();
292 static
void haltUntilInterrupt();
298 static
void setInterrupts(
bool bEnable);
301 static
bool getInterrupts();
308 static void maskInterruptsForSignalReturn();
310 static uintptr_t hostedExecutionThreadId();
312 static bool onHostedExecutionThread();
314 static void enterHostedSignalFrame();
316 static void leaveHostedSignalFrame();
318 static bool inHostedSignalFrame();
319#if PEDIGREE_HOSTED_SMOKE_TESTS
321 static size_t hostedSignalFrameDepthForTest();
326 static bool inDeviceHardIrq();
332 static ExecutionContext executionContext();
342#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
344 static size_t deviceHardIrqDepthForTest();
352 static void setDeviceHardIrqOperationHookForTest(DeviceHardIrqOperationHook hook);
355 static size_t deviceHardIrqOperationDenialsForTest();
357 enum class HostedContextSwitchStage {
358 SwitchStateReturnedMasked,
359 SchedulerBookkeepingComplete,
360 SchedulerRestoringInterrupts,
363 using HostedContextSwitchHook = void (*)(HostedContextSwitchStage stage);
366 static void setHostedContextSwitchHook(HostedContextSwitchHook hook);
369 static void notifyHostedContextSwitchStage(HostedContextSwitchStage stage);
375 static void setSingleStep(
bool bEnable, InterruptState& state);
380 static void invalidate(
void* pAddress);
416#if X86_COMMON && !HOSTED
420 uint64_t processors);
424 static bool tlbInvalidationFailureActive();
427 static bool tlbInvalidationTerminal();
432 static void invalidateICache(uintptr_t nAddr);
436 static void invalidateDCache(uintptr_t nAddr);
440 static void flushDCache(uintptr_t nAddr);
446 static void flushDCacheAndInvalidateICache(uintptr_t startAddr, uintptr_t endAddr);
462 static size_t index();
466 static ProcessorInformation& information();
469 static ProcessorInformation* informationAt(
size_t cpu);
472 static size_t getCount();
475 static void setTlsBase(uintptr_t newBase);
478 static uintptr_t getUserGsBase();
479 static void setUserGsBase(uintptr_t newBase);
491 static ProcessorInformation::KernelGsAnchor m_BootstrapKernelGsAnchor;
495 MUST_USE_RESULT static bool closeTlbInvalidationAdmissionForTerminalFailure(
503 static void _breakpoint();
505 static
void _haltUntilInterrupt();
507 static
bool m_bInterrupts;
518 static size_t m_nProcessors;