From b2e54254261c2e047afc712e21d0d0052284ba1c Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 28 Feb 2020 18:22:32 +0200 Subject: [PATCH] Kernel: Add SpuriousInterruptHandler class This type of interrupt handler should handle spurious IRQs. --- .../Interrupts/SpuriousInterruptHandler.cpp | 83 +++++++++++++++++++ Kernel/Interrupts/SpuriousInterruptHandler.h | 61 ++++++++++++++ Kernel/Makefile | 1 + 3 files changed, 145 insertions(+) create mode 100644 Kernel/Interrupts/SpuriousInterruptHandler.cpp create mode 100644 Kernel/Interrupts/SpuriousInterruptHandler.h diff --git a/Kernel/Interrupts/SpuriousInterruptHandler.cpp b/Kernel/Interrupts/SpuriousInterruptHandler.cpp new file mode 100644 index 00000000000..bc9ebe96a2c --- /dev/null +++ b/Kernel/Interrupts/SpuriousInterruptHandler.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2020, Liav A. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +namespace Kernel { + +void SpuriousInterruptHandler::initialize(u8 interrupt_number) +{ + new SpuriousInterruptHandler(interrupt_number); +} + +void SpuriousInterruptHandler::register_handler(GenericInterruptHandler&) +{ +} +void SpuriousInterruptHandler::unregister_handler(GenericInterruptHandler&) +{ +} + +bool SpuriousInterruptHandler::eoi() +{ + // FIXME: Actually check if IRQ7 or IRQ15 are spurious, and if not, call EOI with the correct interrupt number. + if (interrupt_number() == 15) + InterruptManagement::the().eoi(7); + return false; +} + +SpuriousInterruptHandler::SpuriousInterruptHandler(u8 irq) + : GenericInterruptHandler(irq) +{ +} + +SpuriousInterruptHandler::~SpuriousInterruptHandler() +{ +} + +void SpuriousInterruptHandler::handle_interrupt(RegisterState&) +{ + // FIXME: Actually check if IRQ7 or IRQ15 are spurious, and if not, call the real handler to handle the IRQ. + kprintf("Spurious Interrupt, vector %d\n", interrupt_number()); +} + +void SpuriousInterruptHandler::enable_interrupt_vector() +{ + if (m_enabled) + return; + m_enabled = true; + InterruptManagement::the().enable(interrupt_number()); +} + +void SpuriousInterruptHandler::disable_interrupt_vector() +{ + if (!m_enabled) + return; + m_enabled = false; + InterruptManagement::the().disable(interrupt_number()); +} + +} diff --git a/Kernel/Interrupts/SpuriousInterruptHandler.h b/Kernel/Interrupts/SpuriousInterruptHandler.h new file mode 100644 index 00000000000..5abb6988f44 --- /dev/null +++ b/Kernel/Interrupts/SpuriousInterruptHandler.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020, Liav A. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace Kernel { + +class SpuriousInterruptHandler final : public GenericInterruptHandler { +public: + static void initialize(u8 interrupt_number); + virtual ~SpuriousInterruptHandler(); + virtual void handle_interrupt(RegisterState& regs) override; + + void register_handler(GenericInterruptHandler&); + void unregister_handler(GenericInterruptHandler&); + + virtual bool eoi() override; + + virtual size_t sharing_devices_count() const override { return 1; } + virtual bool is_shared_handler() const override { return false; } + virtual bool is_sharing_with_others() const override { return false; } + + virtual HandlerPurpose purpose() const override { return HandlerPurpose::SpuriousInterruptHandler; } + +private: + void enable_interrupt_vector(); + void disable_interrupt_vector(); + explicit SpuriousInterruptHandler(u8 interrupt_number); + bool m_enabled; + OwnPtr m_real_handler; +}; +} diff --git a/Kernel/Makefile b/Kernel/Makefile index f86922cc79c..8919868c543 100644 --- a/Kernel/Makefile +++ b/Kernel/Makefile @@ -19,6 +19,7 @@ OBJS = \ Interrupts/PIC.o \ Interrupts/GenericInterruptHandler.o \ Interrupts/UnhandledInterruptHandler.o \ + Interrupts/SpuriousInterruptHandler.o \ Interrupts/IRQHandler.o \ Interrupts/SharedIRQHandler.o \ CMOS.o \