20#include "IrqManager.h"
21#include "pedigree/kernel/Log.h"
22#include "pedigree/kernel/machine/IrqHandler.h"
23#include "pedigree/kernel/machine/SchedulerIrqHandler.h"
24#include "pedigree/kernel/processor/InterruptManager.h"
25#include "pedigree/kernel/processor/Processor.h"
29#include "system/kernel/core/processor/DeviceHardIrqContext.h"
32constexpr uint8_t TimerIrq = 0;
33constexpr uint8_t SchedulerIrq = 1;
35irq_id_t signalForIrq(uint8_t irq) {
36 if (irq == TimerIrq) {
39 if (irq == SchedulerIrq) {
58 if (irq != TimerIrq || !handler || policy != IrqPolicy::syntheticHard()) {
63 if (!__atomic_compare_exchange_n(&m_TimerHandler, &expected, handler,
false, __ATOMIC_RELEASE,
67 return signalForIrq(irq);
76 if (irq != SchedulerIrq || !handler || policy != IrqPolicy::syntheticHard()) {
81 if (!__atomic_compare_exchange_n(&m_SchedulerHandler, &expected, handler,
false, __ATOMIC_RELEASE,
85 return signalForIrq(irq);
89 if (
id != SIGUSR2 || !handler) {
94 return __atomic_compare_exchange_n(&m_SchedulerHandler, &expected,
96 __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE);
100 if (
id != SIGUSR1 || !handler) {
104 HardIrqHandler* expected = __atomic_load_n(&m_TimerHandler, __ATOMIC_ACQUIRE);
108 return __atomic_compare_exchange_n(&m_TimerHandler, &expected,
113bool HostedIrqManager::initialise() {
123HostedIrqManager::HostedIrqManager() : m_TimerHandler(nullptr), m_SchedulerHandler(nullptr) {}
126 if (interruptNumber == SIGUSR1) {
127 HardIrqHandler* handler = __atomic_load_n(&m_TimerHandler, __ATOMIC_ACQUIRE);
132 size_t previousDepth = 0;
133 bool restoreDepth =
false;
136 if (disposition != HardIrqDisposition::Handled) {
137 FATAL_NOLOCK(
"Hosted timer hard stage failed to publish its deferred work");
142 if (interruptNumber == SIGUSR2) {
147 handler->schedulerIrq(SchedulerIrq, state);
152#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
154 if (irq != SchedulerIrq) {
157 return __atomic_load_n(&m_Instance.m_SchedulerHandler, __ATOMIC_ACQUIRE);
virtual HardIrqDisposition irq(irq_id_t number, InterruptState &state)=0
irq_id_t registerSchedulerIrqHandler(uint8_t irq, SchedulerIrqHandler *handler, const IrqPolicy &policy) override
bool unregisterHandler(irq_id_t id, IrqHandlerBase *handler) override
irq_id_t registerIsaIrqHandler(uint8_t irq, IrqHandler *handler, const IrqPolicy &policy) override
irq_id_t registerHardPciIrqHandler(HardIrqHandler *handler, class Device *device, const IrqPolicy &policy) override
bool unregisterSchedulerIrqHandler(irq_id_t id, SchedulerIrqHandler *handler) override
irq_id_t registerPciIrqHandler(IrqHandler *handler, class Device *device, const IrqPolicy &policy) override
void interrupt(size_t interruptNumber, InterruptState &state) override
irq_id_t registerHardIsaIrqHandler(uint8_t irq, HardIrqHandler *handler, const IrqPolicy &policy) override
bool control(uint8_t irq, ControlCode code, size_t argument) override
Handles interrupts and interrupt registrations from kernel components.
static EXPORTED_PUBLIC InterruptManager & instance()
virtual bool registerInterruptHandler(size_t nInterruptNumber, InterruptHandler *pHandler)=0