20#ifndef KERNEL_MACHINE_HOSTED_COMMON_TIMER_H
21#define KERNEL_MACHINE_HOSTED_COMMON_TIMER_H
22#include "pedigree/kernel/machine/IrqEventCounter.h"
23#include "pedigree/kernel/machine/IrqManager.h"
24#include "pedigree/kernel/machine/SchedulerTimer.h"
25#include "pedigree/kernel/machine/SplitIrqHandler.h"
26#include "pedigree/kernel/machine/Timer.h"
27#include "pedigree/kernel/machine/TimerHandlerRegistry.h"
28#include "pedigree/kernel/processor/state_forward.h"
29#include "pedigree/kernel/utilities/List.h"
33#include "TickSource.h"
49 virtual void addAlarm(
class Event* pEvent,
size_t alarmSecs,
size_t alarmUsecs = 0);
73#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
74 using HandlerPinHook = TimerHandlerRegistry::HandlerPinHook;
75 using HandlerPrePinHook = TimerHandlerRegistry::HandlerPrePinHook;
76 using HandlerHazardClaimHook = TimerHandlerRegistry::HandlerHazardClaimHook;
77 using HandlerAtomicDrainHook = TimerHandlerRegistry::HandlerAtomicDrainHook;
78 using HandlerMutationLockHook = TimerHandlerRegistry::MutationLockHook;
79 using AlarmSendAdmissionHook = void (*)(
class Event* event);
82 static EXPORTED_PUBLIC
void setHandlerPinHook(HandlerPinHook hook);
84 static EXPORTED_PUBLIC
void setHandlerPrePinHook(HandlerPrePinHook hook);
86 static EXPORTED_PUBLIC
void setHandlerHazardClaimHook(HandlerHazardClaimHook hook);
88 static EXPORTED_PUBLIC
void setHandlerAtomicDrainHook(HandlerAtomicDrainHook hook);
90 static EXPORTED_PUBLIC
void withHandlerMutationLockForTest(HandlerMutationLockHook hook);
92 static EXPORTED_PUBLIC
bool dispatchHandlerForTest(
TimerHandler* handler, uint64_t delta);
94 static EXPORTED_PUBLIC
size_t activeDispatchCountForTest(
TimerHandler* handler);
96 static EXPORTED_PUBLIC
size_t claimedDispatchCountForTest();
98 static EXPORTED_PUBLIC
void setAlarmSendAdmissionHookForTest(AlarmSendAdmissionHook hook);
100 static EXPORTED_PUBLIC
bool alarmLockHeldForTest();
102 static EXPORTED_PUBLIC
bool setSignalIntervalForTest(uint64_t nanoseconds);
119 HardStageDisposition
hardIrq(irq_id_t number, InterruptState& state,
size_t& work)
override;
163 : m_pEvent(pEvent), m_Time(time), m_pThread(pThread) {}
164 class Event* m_pEvent;
179#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
180 static AlarmSendAdmissionHook m_AlarmSendAdmissionHook;
bool initialise1() INITIALISATION_ONLY
virtual uint8_t getDayOfMonth()
HostedTimer(const HostedTimer &)
virtual uint8_t getHour()
static HostedTimer m_Instance
void processTimerBatch(uint64_t delta)
IrqEventCounter m_PendingExpirations
HardStageDisposition hardIrq(irq_id_t number, InterruptState &state, size_t &work) override
HostedTickSource m_TickSource
void rearmIrqSources(size_t work) override
virtual void addAlarm(class Event *pEvent, size_t alarmSecs, size_t alarmUsecs=0)
virtual uint8_t getMonth()
TimerHandlerRegistry m_HandlerRegistry
virtual uint8_t getMinute()
HostedTimer() INITIALISATION_ONLY
virtual void removeAlarm(class Event *pEvent)
HostedTimer & operator=(const HostedTimer &)
virtual uint64_t getTickCountNano()
void threadedIrq(size_t work) override
virtual uint8_t getSecond()
virtual void synchronise(bool tohw=false)
virtual uint64_t getTickCount()
virtual uint8_t getDayOfWeek()
bool quiesceIrqSources() override
virtual uint64_t getNanosecond()
#define INITIALISATION_ONLY