The Pedigree Project 0.1
kernel/machine/hosted/Timer.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
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"
30
31#include <config.h>
32
33#include "TickSource.h"
34
38class HostedTimer : public Timer, private SplitIrqHandler {
39 public:
40 inline static HostedTimer& instance() {
41 return m_Instance;
42 }
43
44 //
45 // Timer interface
46 //
47 virtual bool registerHandler(TimerHandler* handler);
48 virtual bool unregisterHandler(TimerHandler* handler);
49 virtual void addAlarm(class Event* pEvent, size_t alarmSecs, size_t alarmUsecs = 0);
50 virtual void removeAlarm(class Event* pEvent);
51 virtual size_t removeAlarm(class Event* pEvent, bool bRetZero);
52 virtual size_t getYear();
53 virtual uint8_t getMonth();
54 virtual uint8_t getDayOfMonth();
55 virtual uint8_t getDayOfWeek();
56 virtual uint8_t getHour();
57 virtual uint8_t getMinute();
58 virtual uint8_t getSecond();
59 virtual uint64_t getNanosecond();
60 virtual uint64_t getTickCount();
61 virtual uint64_t getTickCountNano();
62
67 bool initialise3();
69 virtual void synchronise(bool tohw = false);
71 void uninitialise();
72
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);
80
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);
103#endif
104
105 protected:
109 virtual ~HostedTimer();
110
111 private:
118
119 HardStageDisposition hardIrq(irq_id_t number, InterruptState& state, size_t& work) override;
120 void threadedIrq(size_t work) override;
121 bool quiesceIrqSources() override;
122 void rearmIrqSources(size_t work) override;
123
125 void processTimerBatch(uint64_t delta);
126
128 size_t m_Year;
130 uint8_t m_Month;
134 uint8_t m_DayOfWeek;
136 uint8_t m_Hour;
138 uint8_t m_Minute;
140 uint8_t m_Second;
142 uint64_t m_Nanosecond;
143
146
148 irq_id_t m_IrqId;
149
152
155
158
160 class Alarm {
161 public:
162 Alarm(class Event* pEvent, size_t time, class Thread* pThread)
163 : m_pEvent(pEvent), m_Time(time), m_pThread(pThread) {}
164 class Event* m_pEvent;
165 size_t m_Time;
166 class Thread* m_pThread;
167
168 private:
169 Alarm(const Alarm&);
170 Alarm& operator=(const Alarm&);
171 };
172
175
178
179#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
180 static AlarmSendAdmissionHook m_AlarmSendAdmissionHook;
181#endif
182
184 bool m_bInitialized = false;
185
187 bool m_bPrepared = false;
188};
189
192#endif
Definition Event.h:49
bool initialise1() INITIALISATION_ONLY
virtual uint8_t getDayOfMonth()
HostedTimer(const HostedTimer &)
virtual ~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
virtual size_t getYear()
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()
bool initialise3()
void uninitialise()
virtual uint8_t getDayOfWeek()
bool quiesceIrqSources() override
virtual uint64_t getNanosecond()
Definition List.h:61