Skip to content

Commit b2e5425

Browse files
supercomputer7awesomekling
authored andcommitted
Kernel: Add SpuriousInterruptHandler class
This type of interrupt handler should handle spurious IRQs.
1 parent e22ab33 commit b2e5425

File tree

3 files changed

+145
-0
lines changed

3 files changed

+145
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions are met:
7+
*
8+
* 1. Redistributions of source code must retain the above copyright notice, this
9+
* list of conditions and the following disclaimer.
10+
*
11+
* 2. Redistributions in binary form must reproduce the above copyright notice,
12+
* this list of conditions and the following disclaimer in the documentation
13+
* and/or other materials provided with the distribution.
14+
*
15+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25+
*/
26+
27+
#include <Kernel/Interrupts/InterruptManagement.h>
28+
#include <Kernel/Interrupts/SpuriousInterruptHandler.h>
29+
30+
namespace Kernel {
31+
32+
void SpuriousInterruptHandler::initialize(u8 interrupt_number)
33+
{
34+
new SpuriousInterruptHandler(interrupt_number);
35+
}
36+
37+
void SpuriousInterruptHandler::register_handler(GenericInterruptHandler&)
38+
{
39+
}
40+
void SpuriousInterruptHandler::unregister_handler(GenericInterruptHandler&)
41+
{
42+
}
43+
44+
bool SpuriousInterruptHandler::eoi()
45+
{
46+
// FIXME: Actually check if IRQ7 or IRQ15 are spurious, and if not, call EOI with the correct interrupt number.
47+
if (interrupt_number() == 15)
48+
InterruptManagement::the().eoi(7);
49+
return false;
50+
}
51+
52+
SpuriousInterruptHandler::SpuriousInterruptHandler(u8 irq)
53+
: GenericInterruptHandler(irq)
54+
{
55+
}
56+
57+
SpuriousInterruptHandler::~SpuriousInterruptHandler()
58+
{
59+
}
60+
61+
void SpuriousInterruptHandler::handle_interrupt(RegisterState&)
62+
{
63+
// FIXME: Actually check if IRQ7 or IRQ15 are spurious, and if not, call the real handler to handle the IRQ.
64+
kprintf("Spurious Interrupt, vector %d\n", interrupt_number());
65+
}
66+
67+
void SpuriousInterruptHandler::enable_interrupt_vector()
68+
{
69+
if (m_enabled)
70+
return;
71+
m_enabled = true;
72+
InterruptManagement::the().enable(interrupt_number());
73+
}
74+
75+
void SpuriousInterruptHandler::disable_interrupt_vector()
76+
{
77+
if (!m_enabled)
78+
return;
79+
m_enabled = false;
80+
InterruptManagement::the().disable(interrupt_number());
81+
}
82+
83+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions are met:
7+
*
8+
* 1. Redistributions of source code must retain the above copyright notice, this
9+
* list of conditions and the following disclaimer.
10+
*
11+
* 2. Redistributions in binary form must reproduce the above copyright notice,
12+
* this list of conditions and the following disclaimer in the documentation
13+
* and/or other materials provided with the distribution.
14+
*
15+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25+
*/
26+
27+
#pragma once
28+
29+
#include <AK/HashTable.h>
30+
#include <AK/OwnPtr.h>
31+
#include <AK/Types.h>
32+
#include <Kernel/Arch/i386/CPU.h>
33+
#include <Kernel/Interrupts/GenericInterruptHandler.h>
34+
35+
namespace Kernel {
36+
37+
class SpuriousInterruptHandler final : public GenericInterruptHandler {
38+
public:
39+
static void initialize(u8 interrupt_number);
40+
virtual ~SpuriousInterruptHandler();
41+
virtual void handle_interrupt(RegisterState& regs) override;
42+
43+
void register_handler(GenericInterruptHandler&);
44+
void unregister_handler(GenericInterruptHandler&);
45+
46+
virtual bool eoi() override;
47+
48+
virtual size_t sharing_devices_count() const override { return 1; }
49+
virtual bool is_shared_handler() const override { return false; }
50+
virtual bool is_sharing_with_others() const override { return false; }
51+
52+
virtual HandlerPurpose purpose() const override { return HandlerPurpose::SpuriousInterruptHandler; }
53+
54+
private:
55+
void enable_interrupt_vector();
56+
void disable_interrupt_vector();
57+
explicit SpuriousInterruptHandler(u8 interrupt_number);
58+
bool m_enabled;
59+
OwnPtr<GenericInterruptHandler> m_real_handler;
60+
};
61+
}

Kernel/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ OBJS = \
1919
Interrupts/PIC.o \
2020
Interrupts/GenericInterruptHandler.o \
2121
Interrupts/UnhandledInterruptHandler.o \
22+
Interrupts/SpuriousInterruptHandler.o \
2223
Interrupts/IRQHandler.o \
2324
Interrupts/SharedIRQHandler.o \
2425
CMOS.o \

0 commit comments

Comments
 (0)