Serenity Operating System
1/*
2 * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/OwnPtr.h>
10#include <AK/Types.h>
11#include <Kernel/Arch/IRQController.h>
12#include <Kernel/Interrupts/GenericInterruptHandler.h>
13
14namespace Kernel {
15
16class SpuriousInterruptHandler final : public GenericInterruptHandler {
17public:
18 static void initialize(u8 interrupt_number);
19 static void initialize_for_disabled_master_pic();
20 static void initialize_for_disabled_slave_pic();
21 virtual ~SpuriousInterruptHandler();
22 virtual bool handle_interrupt(RegisterState const& regs) override;
23
24 void register_handler(GenericInterruptHandler&);
25 void unregister_handler(GenericInterruptHandler&);
26
27 virtual bool eoi() override;
28
29 virtual size_t sharing_devices_count() const override { return 1; }
30 virtual bool is_shared_handler() const override { return false; }
31 virtual bool is_sharing_with_others() const override { return false; }
32
33 virtual HandlerType type() const override { return HandlerType::SpuriousInterruptHandler; }
34 virtual StringView purpose() const override;
35 virtual StringView controller() const override;
36
37 void enable_interrupt_vector_for_disabled_pic();
38
39private:
40 void enable_interrupt_vector();
41 void disable_interrupt_vector();
42 explicit SpuriousInterruptHandler(u8 interrupt_number);
43 bool m_enabled { false };
44 bool m_real_irq { false };
45 NonnullLockRefPtr<IRQController> m_responsible_irq_controller;
46 OwnPtr<GenericInterruptHandler> m_real_handler;
47};
48}