StuBS
|
interrupt_handler() Interrupt handler More...
Classes | |
struct | InterruptContext |
Preserved interrupt context. More... | |
Functions | |
void | interrupt_handler (Core::Interrupt::Vector vector, InterruptContext *context) |
High-Level Interrupt Handling. | |
Constants | |
void *const | interrupt_entry [] |
Array of function pointer to the default low-level interrupt handlers. | |
interrupt_handler() Interrupt handler
struct InterruptContext |
Preserved interrupt context.
After an interrupt was triggered, the core first saves the basic context (current code- & stack segment, instruction & stack pointer and the status flags register) and looks up the handling function for the vector using the IDT. In StuBS for each vector an own interrupt_entry_VECTOR
function (written in assembly in interrupt/handler.asm
) was registered during boot by kernel_init(), which all save the scratch registers on the stack before calling the C++ function interrupt_handler(). The high-level handler gets a pointer to the part of the stack which corresponds to the InterruptContext structure as second parameter. After returning from the high-level handler, the previous state is restored from this context (scratch register in assembly and basic context while executing iret
) so it can continue transparently at the previous position.
Class Members | ||
---|---|---|
uintptr_t | r11 | scratch register R11 |
uintptr_t | r10 | scratch register R10 |
uintptr_t | r9 | scratch register R9 |
uintptr_t | r8 | scratch register R8 |
uintptr_t | rdi | scratch register RDI |
uintptr_t | rsi | scratch register RSI |
uintptr_t | rdx | scratch register RDX |
uintptr_t | rcx | scratch register RCX |
uintptr_t | rax | scratch register RAX |
uintptr_t | error_code | Error Code. |
uintptr_t | ip | Instruction Pointer (at interrupt) |
uintptr_t | cs: 16 | Code segment (in case of a ring switch it is the segment of the user mode) |
uintptr_t | __pad0__: 0 | Alignment (due to 16 bit code segment) |
uintptr_t | flags | Status flags register. |
uintptr_t | sp | Stack pointer (at interrupt) |
uintptr_t | ss: 16 | Stack segment (in case of a ring switch it is the segment of the user mode) |
uintptr_t | __pad1__: 0 | Alignment (due to 16 bit stack segment) |
void* const interrupt_entry[] |
Array of function pointer to the default low-level interrupt handlers.
The index corresponds to the vectors entry function, e.g. interrupt_entry[6]
points to interrupt_entry_6
, handling the trap for invalid opcode.
The entry functions and this array are defined in assembly in interrupt/handler.asm
and used in kernel_init() to initialize the Interrupt Descriptor Table (IDT).