Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
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/Arch/i386/CPU.h>
28#include <Kernel/Interrupts/IRQHandler.h>
29#include <Kernel/Interrupts/InterruptManagement.h>
30
31//#define IRQ_DEBUG
32
33namespace Kernel {
34
35IRQHandler::IRQHandler(u8 irq)
36 : GenericInterruptHandler(irq)
37{
38}
39
40IRQHandler::~IRQHandler()
41{
42}
43
44bool IRQHandler::eoi()
45{
46#ifdef IRQ_DEBUG
47 dbg() << "EOI IRQ " << interrupt_number();
48#endif
49 if (!m_shared_with_others) {
50 InterruptManagement::the().eoi(interrupt_number());
51 return true;
52 }
53 return false;
54}
55
56void IRQHandler::enable_irq()
57{
58#ifdef IRQ_DEBUG
59 dbg() << "Enable IRQ " << interrupt_number();
60#endif
61 if (!m_shared_with_others)
62 InterruptManagement::the().enable(interrupt_number());
63 else
64 m_enabled = true;
65}
66
67void IRQHandler::disable_irq()
68{
69#ifdef IRQ_DEBUG
70 dbg() << "Disable IRQ " << interrupt_number();
71#endif
72 if (!m_shared_with_others)
73 InterruptManagement::the().disable(interrupt_number());
74 else
75 m_enabled = false;
76}
77
78void IRQHandler::change_irq_number(u8 irq)
79{
80 InterruptDisabler disabler;
81 change_interrupt_number(irq);
82}
83
84}