diff options
author | Liav A <liavalb@gmail.com> | 2020-02-28 18:22:32 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-02-29 00:12:46 +0100 |
commit | b2e54254261c2e047afc712e21d0d0052284ba1c (patch) | |
tree | 07a7a605d42c8391aa036f90f4193aa9a0dc1ce8 | |
parent | e22ab33a4dc45816dc053392b989ee59133e1e34 (diff) | |
download | serenity-b2e54254261c2e047afc712e21d0d0052284ba1c.zip |
Kernel: Add SpuriousInterruptHandler class
This type of interrupt handler should handle spurious IRQs.
-rw-r--r-- | Kernel/Interrupts/SpuriousInterruptHandler.cpp | 83 | ||||
-rw-r--r-- | Kernel/Interrupts/SpuriousInterruptHandler.h | 61 | ||||
-rw-r--r-- | Kernel/Makefile | 1 |
3 files changed, 145 insertions, 0 deletions
diff --git a/Kernel/Interrupts/SpuriousInterruptHandler.cpp b/Kernel/Interrupts/SpuriousInterruptHandler.cpp new file mode 100644 index 0000000000..bc9ebe96a2 --- /dev/null +++ b/Kernel/Interrupts/SpuriousInterruptHandler.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il> + * 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 <Kernel/Interrupts/InterruptManagement.h> +#include <Kernel/Interrupts/SpuriousInterruptHandler.h> + +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 0000000000..5abb6988f4 --- /dev/null +++ b/Kernel/Interrupts/SpuriousInterruptHandler.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il> + * 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 <AK/HashTable.h> +#include <AK/OwnPtr.h> +#include <AK/Types.h> +#include <Kernel/Arch/i386/CPU.h> +#include <Kernel/Interrupts/GenericInterruptHandler.h> + +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<GenericInterruptHandler> m_real_handler; +}; +} diff --git a/Kernel/Makefile b/Kernel/Makefile index f86922cc79..8919868c54 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 \ |