You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.4 KiB
C

/*! \file All interrupts need to start somewhere. This file contains the entry
* points for all interrupts handled by StuBS.
* \brief The Interrupt Subsystem
* \defgroup interrupts Interrupt Handling
*/
#pragma once
#include "../types.h"
/*! \brief Initialize the IDT.
*
* The interrupt subsystem of StubBS contains all functionality to accept
* interrupts from the hardware and process them.
* In later exercises the interrupts will enable applications to
* execute core functionality (system calls).
* The entry point for the interrupt subsystem is the function
* 'interrupt_entry_VECTOR' (in `interrupt/handler.asm`).
*
* \todo(12) Register your own interrupt handlers
*/
void initInterruptHandlers();
struct InterruptContext;
/*!
* @brief Helper function for printf-debugging the InterruptContext
*/
void printContext(const InterruptContext *context);
/*!
* @brief An interrupt handler for the INVALID_OPCODE trap
*/
[[gnu::interrupt]] void handle_invalid_opcode(InterruptContext *context);
/*!
* @brief A double fault occurs when another exception occurs during exception
* handling.
*
* In this case, the OS cannot recover anymore. This can happen e.g.
* during page fault handling.
*/
[[gnu::interrupt]] void handle_double_fault(InterruptContext *context,
uint64_t error);
/*!
* @brief If the task state segment is configured incorrectly, the kernel cannot
* switch the privilege levels during interrupts.
*/
[[gnu::interrupt]] void handle_invalid_tss(InterruptContext *context,
uint64_t error);
/*!
* @brief When the CPU tried to execute an unprivileged opcode or exceeds
* segmentation bounds, the GPF exception is raised.
*/
[[gnu::interrupt]] void handle_general_protection_fault(
InterruptContext *context, uint64_t error);
/*!
* @brief With paging enabled, an invalid access to a memory page causes a page
* fault.
*/
[[gnu::interrupt]] void handle_page_fault(InterruptContext *context,
uint64_t error);
extern "C" { // disable C++ name mangling for asm function
/*! \brief Assembly interrupt handler for the keyboard.
*
* On keyboard interrupt, the register state is saved to and restored from the
* stack. This function wraps the handle_keyboard C-function.
*
* \todo Implement in assembly
*/
[[gnu::interrupt]] void handle_keyboard_asm(InterruptContext *context);
/*! \brief Higher-level Interrupt handler for the keyboard.
*
* On keyboard interrupt, the PS2-Controller may contain a valid Key that has to
* be fetched.
*
* \todo(12) Fetch a single key
* \todo(13) Extend to use the Prologue-Epilogue pattern
*/
void handle_keyboard();
}
/*! \brief handle_panic
*
* \todo Trigger a kernel panic
*/
[[gnu::interrupt]] void handle_panic(InterruptContext *context);
/*! \brief handle_timer
*
* \todo(15) Handle the timer interrupt
*/
[[gnu::interrupt]] void handle_timer(InterruptContext *context);
/*! \brief handle_assassin
*
* Handler for the assassin IPI, i.e. a thread shall be killed.
*
* \todo(15) Handle the assassin interrupt (in \MPStuBS only)
*/
[[gnu::interrupt]] void handle_assassin(InterruptContext *context);
/*! \brief handle_wakeup
*
* In Multicore systems, an IPI is used to wake a sleeping core.
*
* \todo(16) Handle the wakeup interrupt (in \MPStuBS only)
*/
[[gnu::interrupt]] void handle_wakeup(InterruptContext *context);