Serenity Operating System
at master 59 lines 1.4 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/Arch/InterruptManagement.h> 8#include <Kernel/Debug.h> 9#include <Kernel/InterruptDisabler.h> 10#include <Kernel/Interrupts/IRQHandler.h> 11 12namespace Kernel { 13 14IRQHandler::IRQHandler(u8 irq) 15 : GenericInterruptHandler(irq) 16 , m_responsible_irq_controller(InterruptManagement::the().get_responsible_irq_controller(irq)) 17{ 18 if (is_registered()) 19 disable_irq(); 20} 21 22IRQHandler::~IRQHandler() = default; 23 24bool IRQHandler::eoi() 25{ 26 dbgln_if(IRQ_DEBUG, "EOI IRQ {}", interrupt_number()); 27 if (!m_shared_with_others) { 28 m_responsible_irq_controller->eoi(*this); 29 return true; 30 } 31 return false; 32} 33 34void IRQHandler::enable_irq() 35{ 36 dbgln_if(IRQ_DEBUG, "Enable IRQ {}", interrupt_number()); 37 if (!is_registered()) 38 register_interrupt_handler(); 39 m_enabled = true; 40 if (!m_shared_with_others) 41 m_responsible_irq_controller->enable(*this); 42} 43 44void IRQHandler::disable_irq() 45{ 46 dbgln_if(IRQ_DEBUG, "Disable IRQ {}", interrupt_number()); 47 m_enabled = false; 48 if (!m_shared_with_others) 49 m_responsible_irq_controller->disable(*this); 50} 51 52void IRQHandler::change_irq_number(u8 irq) 53{ 54 InterruptDisabler disabler; 55 change_interrupt_number(irq); 56 m_responsible_irq_controller = InterruptManagement::the().get_responsible_irq_controller(irq); 57} 58 59}