The Pedigree Project 0.1
kernel/machine/hosted/IrqManager.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_IRQMANAGER_H
21#define KERNEL_MACHINE_HOSTED_IRQMANAGER_H
22#include "pedigree/kernel/compiler.h"
23#include "pedigree/kernel/machine/IrqManager.h"
24#include "pedigree/kernel/processor/InterruptHandler.h"
25
26#include <config.h>
27
37 public:
38 inline static HostedIrqManager& instance() {
39 return m_Instance;
40 }
41
42 irq_id_t registerIsaIrqHandler(uint8_t irq, IrqHandler* handler,
43 const IrqPolicy& policy) override;
44 irq_id_t registerPciIrqHandler(IrqHandler* handler, class Device* device,
45 const IrqPolicy& policy) override;
46 irq_id_t registerHardIsaIrqHandler(uint8_t irq, HardIrqHandler* handler,
47 const IrqPolicy& policy) override;
48 irq_id_t registerHardPciIrqHandler(HardIrqHandler* handler, class Device* device,
49 const IrqPolicy& policy) override;
50 irq_id_t registerSchedulerIrqHandler(uint8_t irq, SchedulerIrqHandler* handler,
51 const IrqPolicy& policy) override;
52 bool unregisterSchedulerIrqHandler(irq_id_t id, SchedulerIrqHandler* handler) override;
53 bool unregisterHandler(irq_id_t id, IrqHandlerBase* handler) override;
54
55 bool initialise() INITIALISATION_ONLY;
56
57 bool control(uint8_t irq, ControlCode code, size_t argument) override;
58
59 void enable(uint8_t irq, bool enable) override {
60 // Hosted has no per-line interrupt controller. Processor::setInterrupts
61 // owns the only meaningful signal mask.
62 }
63
64#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
65 static EXPORTED_PUBLIC SchedulerIrqHandler* schedulerIrqHandlerForTest(uint8_t irq);
66#endif
67
68 private:
70 inline ~HostedIrqManager() override {}
71
72 HostedIrqManager(const HostedIrqManager&) = delete;
73 HostedIrqManager& operator=(const HostedIrqManager&) = delete;
74
75 void interrupt(size_t interruptNumber, InterruptState& state) override;
76
77 HardIrqHandler* m_TimerHandler;
78 SchedulerIrqHandler* m_SchedulerHandler;
79
80 static HostedIrqManager m_Instance;
81};
82
83#endif
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
Abstract base class for interrupt-handlers.