Files
Sylva/include/interrupt/idt.h
T
2026-06-06 10:37:51 +08:00

49 lines
1.1 KiB
C

#pragma once
#include <efi.h>
// IDT entry (64-bit gate descriptor)
struct idt_entry {
UINT16 offset_low;
UINT16 selector;
UINT8 ist; // IST index (bits 0-2), reserved (bits 3-6), type (bit 7)
UINT8 type_attr; // P (bit 7), DPL (bits 5-6), 0 (bit 4), type (bits 0-3)
UINT16 offset_mid;
UINT32 offset_high;
UINT32 reserved;
} __attribute__((packed));
struct idt_ptr {
UINT16 limit;
UINT64 base;
} __attribute__((packed));
// Interrupt frame saved by ISR stubs
struct trap_frame {
// Pushed by ISR stub (general-purpose registers)
UINT64 r11;
UINT64 r10;
UINT64 r9;
UINT64 r8;
UINT64 rdi;
UINT64 rsi;
UINT64 rdx;
UINT64 rcx;
UINT64 rax;
// Pushed by ISR stub (metadata)
UINT64 vector;
UINT64 error_code;
// Pushed by CPU (interrupt frame)
UINT64 rip;
UINT64 cs;
UINT64 rflags;
UINT64 rsp;
UINT64 ss;
} __attribute__((packed));
// Handler function type
typedef void (*isr_handler_t)(trap_frame*);
void idt_init(void);
void idt_set_handler(UINT8 vector, isr_handler_t handler);