20#ifndef KERNEL_MACHINE_X86_COMMON_RTC_H
21#define KERNEL_MACHINE_X86_COMMON_RTC_H
22#include "pedigree/kernel/Spinlock.h"
23#include "pedigree/kernel/compiler.h"
24#include "pedigree/kernel/machine/IrqHandler.h"
25#include "pedigree/kernel/machine/Timer.h"
26#include "pedigree/kernel/machine/TimerHandlerRegistry.h"
27#include "pedigree/kernel/machine/types.h"
28#include "pedigree/kernel/process/Mutex.h"
29#include "pedigree/kernel/process/OwnedThread.h"
30#include "pedigree/kernel/process/SchedulerWorkerWake.h"
31#include "pedigree/kernel/process/TerminationDeferral.h"
32#include "pedigree/kernel/process/WaitQueue.h"
33#include "pedigree/kernel/processor/IoPort.h"
34#include "pedigree/kernel/processor/state_forward.h"
35#include "pedigree/kernel/processor/types.h"
36#include "pedigree/kernel/utilities/new"
40#include "RtcAlarmQueue.h"
52 inline static Rtc& instance() {
63 return m_DeadlineMode.value() != 0;
66 virtual void addAlarm(
class Event* pEvent,
size_t alarmSecs,
size_t alarmUsecs = 0);
104 static EXPORTED_PUBLIC uint8_t
readCmos(uint8_t index);
105 static EXPORTED_PUBLIC
void writeCmos(uint8_t index, uint8_t value);
125 uint64_t advanceCivilClock(uint64_t observed, uint64_t* elapsedSeconds =
nullptr);
126 static int deadlineWorkerEntry(
void* context);
127 int runDeadlineWorker();
128 void publishNextDeadlineLocked();
141 bool read(uint8_t index, uint8_t& value);
142 uint8_t readLocked(uint8_t index);
143 void writeLocked(uint8_t index, uint8_t value);
147 uint8_t read(uint8_t index);
152 bool write(uint8_t index, uint8_t value);
156 bool writeHardwareClock();
157 bool inhibitClockUpdatesLocked(uint8_t& status);
172 static bool waitableContext();
192 uint8_t m_CenturyIndex;
virtual uint64_t getTickCount()
void setIndexLocked(uint8_t index)
RtcAlarmQueue m_AlarmQueue
static periodicIrqInfo_t periodicIrqInfo[12]
static EXPORTED_PUBLIC uint8_t readCmos(uint8_t index)
virtual uint8_t getHour()
size_t m_PeriodicIrqInfoIndex
virtual uint8_t getDayOfMonth()
void processElapsedTime(uint64_t observed)
virtual uint8_t getMinute()
virtual void addAlarm(class Event *pEvent, size_t alarmSecs, size_t alarmUsecs=0)
Time::CpuTimeSample sampleCpuTime() override
virtual void removeAlarm(class Event *pEvent)
uint64_t m_ProcessedTickCount
virtual uint8_t getMonth()
Time::Timestamp getUnixTimestamp() override
virtual void synchronise(bool tohw=false)
bool supportsDeadlines() const override
bool armHandler(TimerHandler *handler, uint64_t absoluteDeadlineNs) override
virtual uint64_t getNanosecond()
virtual uint64_t getTickCountNano()
virtual uint8_t getSecond()
bool initialise1(uint8_t centuryIndex) INITIALISATION_ONLY
virtual uint8_t getDayOfWeek()
bool waitForUpdateCompletion(uint8_t index)
IrqDisposition irq(irq_id_t number) override
void setPeriodicInterruptEnabled(bool enabled)
bool initialise2() INITIALISATION_ONLY
PcTscClock::Calibration m_TscCalibration
PcTscClock::MonotonicPublication m_MonotonicTicks
void deadlineInterrupt() override
Atomic< uint64_t > m_TickCount
void drainRemoteAlarmDispatch(class Event *pEvent, void *owner)
virtual uint64_t getTickCountNanoFast()
TimerHandlerRegistry m_HandlerRegistry
bool write(uint8_t index, uint8_t value)
void initialiseProcessorClock() INITIALISATION_ONLY
Rtc & operator=(const Rtc &)
#define INITIALISATION_ONLY