Files
MentOS/mentos/inc/descriptor_tables/isr.h
T
Enrico Fraccaroli (Galfurian) 1b2bc49d41 Update license and remove unused files.
2022-01-27 15:12:36 -05:00

100 lines
4.2 KiB
C

/// @file isr.h
/// @brief Data structures concerning the Interrupt Service Routines (ISRs).
/// @copyright (c) 2014-2022 This file is distributed under the MIT License.
/// See LICENSE.md for details.
/// @addtogroup descriptor_tables Descriptor Tables
/// @{
/// @addtogroup isr Interrupt Service Routines (ISRs)
/// @brief are software routines that hardware invokes in response to an interrupt.
/// @{
#pragma once
#include "kernel.h"
// TODO: see interrupt_handler_t in Linux, it is quite different.
/// @brief Interrupt handler definition.
/// @details An interrupt handler is an interrupt service routine called
/// to manage interrupt requests, or CPU execptions.
/// @param f An interrupt stack frame.
typedef void (*interrupt_handler_t)(pt_regs *f);
/// @brief For each exceptions isrs_init sets a default handler which
/// prints the rose exceptions and stops kernel execution.
void isrs_init();
/// @brief For each interrupt irq_init sets a default handler which
/// prints the rose IRQ line and stops kernel execution.
void irq_init();
/* Even if an interrupt service routine is called for exceptions and
* interrupts, we use two distinct methods to logically setup an ISR to
* handle theme. Tecnically speacking, exceptions are synchronous interrupts
* generated by CPU. For an exception we have an ISR. Interrupts are
* asynchronous events generated by PIC. Furthermore, multiple ISRs can be set
* for a same IRQ.
*/
/// @brief Installs an ISR to handle an interrupt.
/// @param i interrupt identifier.
/// @param handler interrupt handler.
/// @param description interrupt description.
/// @return 0 on success, -1 otherwise.
int isr_install_handler(unsigned i, interrupt_handler_t handler, char *description);
/// @brief Uninstall an ISR handler.
/// @param i interrupt identifier.
/// @return 0 on success, -1 otherwise.
int isr_uninstall_handler(unsigned i);
/// @brief Installs an ISR to handle an interrupt.
/// @param i interrupt identifier.
/// @param handler interrupt handler.
/// @param description interrupt description.
/// @return 0 on success, -1 otherwise.
int irq_install_handler(unsigned i, interrupt_handler_t handler, char *description);
/// @brief Uninstall an IRQ handler.
/// @param i interrupt identifier.
/// @param handler interrupt handler.
/// @return 0 on success, -1 otherwise.
int irq_uninstall_handler(unsigned i, interrupt_handler_t handler);
/// @brief Method called by CPU to handle interrupts.
/// @param f The interrupt stack frame.
extern void irq_handler(pt_regs *f);
/// @brief Method called by CPU to handle exceptions.
/// @param f The interrupt stack frame.
extern void isq_handler(pt_regs *f);
//==== List of exceptions generated internally by the CPU ======================
#define DIVIDE_ERROR 0 ///< DE Divide Error.
#define DEBUG_EXC 1 ///< DB Debug.
#define NMI_INTERRUPT 2 ///< Non Mascable Interrupt.
#define BREAKPOINT 3 ///< BP Breakpoint.
#define OVERFLOW 4 ///< OF Overflow.
#define BOUND_RANGE_EXCEED 5 ///< BR Bound Range Exception.
#define INVALID_OPCODE 6 ///< UD Invalid OpCode Exception.
#define DEV_NOT_AVL 7 ///< NM Device Not Available.
#define DOUBLE_FAULT 8 ///< DF Double Fault.
#define COPROC_SEG_OVERRUN 9 ///< Coprocessor Segment Overrun.
#define INVALID_TSS 10 ///< TS Invalid TSS.
#define SEGMENT_NOT_PRESENT 11 ///< NP Segment Not Present.
#define STACK_SEGMENT_FAULT 12 ///< SS Stack Segment Fault.
#define GENERAL_PROTECTION 13 ///< GP General Protection.
#define PAGE_FAULT 14 ///< PF Page Fault.
#define INT_RSV 15 ///< XX Reserverd.
#define FLOATING_POINT_ERR 16 ///< MF Floating Point.
#define ALIGNMENT_CHECK 17 ///< AC Alignment Check.
#define MACHINE_CHECK 18 ///< MC Machine Check.
#define SIMD_FP_EXC 19 ///< XF Streaming SIMD Exception.
#define VIRT_EXC 20 ///< Virtualization Exception.
// Reserved [21-29].
#define SECURITY_EXC 30 ///< Security Exception.
#define TRIPLE_FAULT 31 ///< Triple Fault
#define SYSTEM_CALL 80 ///< System call interrupt.
//==============================================================================
/// @}
/// @}