8#include "SchedulerTimer.h"
9#include "pedigree/kernel/machine/IrqManager.h"
10#include "pedigree/kernel/machine/Machine.h"
11#include "pedigree/kernel/machine/SchedulerTimerDispatchCleanup.h"
12#include "pedigree/kernel/machine/SchedulerTimerHandler.h"
13#include "pedigree/kernel/processor/Processor.h"
15#include "DeviceTree.h"
16#include "GenericTimer.h"
19constexpr uint64_t NanosecondsPerSecond = 1000000000ULL;
20constexpr uint32_t TicksPerSecond = 100;
29VirtSchedulerTimer::VirtSchedulerTimer()
35 m_Initialised(false) {}
37VirtSchedulerTimer::~VirtSchedulerTimer() {
41uint64_t VirtSchedulerTimer::counter()
const {
42 return VirtGenericTimer::count();
45uint64_t VirtSchedulerTimer::ticksToNanoseconds(uint64_t ticks)
const {
46 return (ticks / m_Frequency) * NanosecondsPerSecond +
47 (ticks % m_Frequency) * NanosecondsPerSecond / m_Frequency;
50bool VirtSchedulerTimer::initialise() {
54 m_Frequency = VirtGenericTimer::frequency();
58 m_IntervalTicks =
static_cast<uint32_t
>(m_Frequency / TicksPerSecond);
59 if (!m_IntervalTicks) {
62 VirtGenericTimer::virtualControl(0);
64 IrqManager& manager = *Machine::instance().getIrqManager();
66 IrqPolicy::levelHard());
71 m_LastCount = counter();
72 VirtGenericTimer::setVirtualTimer(m_IntervalTicks);
77void VirtSchedulerTimer::uninitialise() {
81 VirtGenericTimer::virtualControl(0);
82 IrqManager& manager = *Machine::instance().getIrqManager();
87 m_Initialised =
false;
98uint64_t VirtSchedulerTimer::nominalQuantumNs()
const {
99 return NanosecondsPerSecond / TicksPerSecond;
102void VirtSchedulerTimer::schedulerIrq(irq_id_t number, InterruptState& state) {
103 if (number != m_IrqId) {
108 VirtGenericTimer::setVirtualTimer(m_IntervalTicks);
109 const uint64_t now = counter();
110 const uint64_t elapsed = ticksToNanoseconds(now - m_LastCount);
117 dispatch.handler()->
timer(elapsed, state);
virtual irq_id_t registerSchedulerIrqHandler(uint8_t irq, SchedulerIrqHandler *handler, const IrqPolicy &policy)
virtual bool unregisterSchedulerIrqHandler(irq_id_t Id, SchedulerIrqHandler *handler)
bool beginDispatch(size_t owner, DispatchGuard &guard)
bool publish(size_t owner, SchedulerTimerHandler *handler)
bool unpublish(size_t owner, SchedulerTimerHandler *handler)
virtual void timer(uint64_t delta, InterruptState &state)=0
static bool canRemoveHandlerInCurrentContext()
bool registerHandler(SchedulerTimerHandler *handler) override
bool removeHandler(SchedulerTimerHandler *handler) override