kind of an idt i guess? i am supid
This commit is contained in:
parent
ebf9c7ee91
commit
86a2d5370d
|
@ -61,6 +61,14 @@ gdt_desc:
|
|||
; Declare _start as a function symbol with the given symbol size.
|
||||
section .text
|
||||
global _start:function (_start.end - _start)
|
||||
global load_idt
|
||||
|
||||
load_idt:
|
||||
mov edx, [esp + 4]
|
||||
lidt [edx]
|
||||
sti
|
||||
ret
|
||||
|
||||
_start:
|
||||
; The bootloader has loaded us into 32-bit protected mode on a x86
|
||||
; machine. Interrupts are disabled. Paging is disabled. The processor
|
||||
|
|
|
@ -1,19 +1,22 @@
|
|||
#include <idt.h>
|
||||
#include <terminal.h>
|
||||
|
||||
idt_gate_t idt[IDT_ENTRIES];
|
||||
idt_register_t idt_reg;
|
||||
struct idt_entry idt[256];
|
||||
unsigned long idt_address;
|
||||
unsigned long idt_ptr[2];
|
||||
|
||||
void set_idt_gate(int n, uint32_t handler) {
|
||||
idt[n].low_offset = LOW_16(handler);
|
||||
idt[n].sel = KERNEL_CS;
|
||||
idt[n].always0 = 0;
|
||||
idt[n].flags = 0x8E;
|
||||
idt[n].high_offset = HIGH_16(handler);
|
||||
void idt_init() {
|
||||
idt_address = (unsigned long)idt;
|
||||
idt_ptr[0] = (sizeof (struct idt_entry) * 256) + ((idt_address & 0xffff) << 16);
|
||||
idt_ptr[1] = idt_address >> 16;
|
||||
|
||||
load_idt(idt_ptr);
|
||||
}
|
||||
|
||||
void set_idt() {
|
||||
idt_reg.base = (uint32_t) &idt;
|
||||
idt_reg.limit = IDT_ENTRIES * sizeof(idt_gate_t) - 1;
|
||||
__asm__ __volatile__("lidtl (%0)" : : "r" (&idt_reg));
|
||||
}
|
||||
void idt_register_handler(uint8_t interrupt, unsigned long address) {
|
||||
idt[interrupt].offset_lowerbits = address & 0xffff;
|
||||
idt[interrupt].selector = KERNEL_CODE_SEGMENT_OFFSET;
|
||||
idt[interrupt].zero = 0;
|
||||
idt[interrupt].type_attr = INTERRUPT_GATE;
|
||||
idt[interrupt].offset_higherbits = (address & 0xffff0000) >> 16;
|
||||
}
|
130
arch/i386/isr.c
130
arch/i386/isr.c
|
@ -1,199 +1,199 @@
|
|||
#include <isr.h>
|
||||
#include <terminal.h>
|
||||
|
||||
__attribute__((interrupt)) void isr0(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr0(void* butterdog) {
|
||||
terminal_writeline("Division By Zero");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr1(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr1(void* butterdog) {
|
||||
terminal_writeline("Debug");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr2(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr2(void* butterdog) {
|
||||
terminal_writeline("Non Maskable Interrupt");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr3(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr3(void* butterdog) {
|
||||
terminal_writeline("Breakpoint");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr4(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr4(void* butterdog) {
|
||||
terminal_writeline("Into Detected Overflow");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr5(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr5(void* butterdog) {
|
||||
terminal_writeline("Out of Bounds");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr6(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr6(void* butterdog) {
|
||||
terminal_writeline("Invalid Opcode");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr7(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr7(void* butterdog) {
|
||||
terminal_writeline("No Coprocessor");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr8(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr8(void* butterdog) {
|
||||
terminal_writeline("Double Fault");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr9(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr9(void* butterdog) {
|
||||
terminal_writeline("Coprocessor Segment Overrun");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr10(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr10(void* butterdog) {
|
||||
terminal_writeline("Bad TSS");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr11(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr11(void* butterdog) {
|
||||
terminal_writeline("Segment Not Present");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr12(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr12(void* butterdog) {
|
||||
terminal_writeline("Stack Fault");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr13(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr13(void* butterdog) {
|
||||
terminal_writeline("General Protection Fault");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr14(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr14(void* butterdog) {
|
||||
terminal_writeline("Page Fault");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr15(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr15(void* butterdog) {
|
||||
terminal_writeline("Unknown Interrupt");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr16(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr16(void* butterdog) {
|
||||
terminal_writeline("Coprocessor Fault");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr17(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr17(void* butterdog) {
|
||||
terminal_writeline("Alignment Check");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr18(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr18(void* butterdog) {
|
||||
terminal_writeline("Machine Check");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr19(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr19(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr20(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr20(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr21(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr21(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr22(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr22(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr23(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr23(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr24(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr24(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr25(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr25(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr26(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr26(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr27(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr27(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr28(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr28(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr29(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr29(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr30(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr30(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
__attribute__((interrupt)) void isr31(struct interrupt_frame* frame) {
|
||||
__attribute__((interrupt)) void isr31(void* butterdog) {
|
||||
terminal_writeline("Reserved");
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
void isr_install(void) {
|
||||
set_idt_gate(0, (uint32_t)isr0);
|
||||
set_idt_gate(1, (uint32_t)isr1);
|
||||
set_idt_gate(2, (uint32_t)isr2);
|
||||
set_idt_gate(3, (uint32_t)isr3);
|
||||
set_idt_gate(4, (uint32_t)isr4);
|
||||
set_idt_gate(5, (uint32_t)isr5);
|
||||
set_idt_gate(6, (uint32_t)isr6);
|
||||
set_idt_gate(7, (uint32_t)isr7);
|
||||
set_idt_gate(8, (uint32_t)isr8);
|
||||
set_idt_gate(9, (uint32_t)isr9);
|
||||
set_idt_gate(10, (uint32_t)isr10);
|
||||
set_idt_gate(11, (uint32_t)isr11);
|
||||
set_idt_gate(12, (uint32_t)isr12);
|
||||
set_idt_gate(13, (uint32_t)isr13);
|
||||
set_idt_gate(14, (uint32_t)isr14);
|
||||
set_idt_gate(15, (uint32_t)isr15);
|
||||
set_idt_gate(16, (uint32_t)isr16);
|
||||
set_idt_gate(17, (uint32_t)isr17);
|
||||
set_idt_gate(18, (uint32_t)isr18);
|
||||
set_idt_gate(19, (uint32_t)isr19);
|
||||
set_idt_gate(20, (uint32_t)isr20);
|
||||
set_idt_gate(21, (uint32_t)isr21);
|
||||
set_idt_gate(22, (uint32_t)isr22);
|
||||
set_idt_gate(23, (uint32_t)isr23);
|
||||
set_idt_gate(24, (uint32_t)isr24);
|
||||
set_idt_gate(25, (uint32_t)isr25);
|
||||
set_idt_gate(26, (uint32_t)isr26);
|
||||
set_idt_gate(27, (uint32_t)isr27);
|
||||
set_idt_gate(28, (uint32_t)isr28);
|
||||
set_idt_gate(29, (uint32_t)isr29);
|
||||
set_idt_gate(30, (uint32_t)isr30);
|
||||
set_idt_gate(31, (uint32_t)isr31);
|
||||
idt_register_handler(0, (unsigned long)isr0);
|
||||
idt_register_handler(1, (unsigned long)isr1);
|
||||
idt_register_handler(2, (unsigned long)isr2);
|
||||
idt_register_handler(3, (unsigned long)isr3);
|
||||
idt_register_handler(4, (unsigned long)isr4);
|
||||
idt_register_handler(5, (unsigned long)isr5);
|
||||
idt_register_handler(6, (unsigned long)isr6);
|
||||
idt_register_handler(7, (unsigned long)isr7);
|
||||
idt_register_handler(8, (unsigned long)isr8);
|
||||
idt_register_handler(9, (unsigned long)isr9);
|
||||
idt_register_handler(10, (unsigned long)isr10);
|
||||
idt_register_handler(11, (unsigned long)isr11);
|
||||
idt_register_handler(12, (unsigned long)isr12);
|
||||
idt_register_handler(13, (unsigned long)isr13);
|
||||
idt_register_handler(14, (unsigned long)isr14);
|
||||
idt_register_handler(15, (unsigned long)isr15);
|
||||
idt_register_handler(16, (unsigned long)isr16);
|
||||
idt_register_handler(17, (unsigned long)isr17);
|
||||
idt_register_handler(18, (unsigned long)isr18);
|
||||
idt_register_handler(19, (unsigned long)isr19);
|
||||
idt_register_handler(20, (unsigned long)isr20);
|
||||
idt_register_handler(21, (unsigned long)isr21);
|
||||
idt_register_handler(22, (unsigned long)isr22);
|
||||
idt_register_handler(23, (unsigned long)isr23);
|
||||
idt_register_handler(24, (unsigned long)isr24);
|
||||
idt_register_handler(25, (unsigned long)isr25);
|
||||
idt_register_handler(26, (unsigned long)isr26);
|
||||
idt_register_handler(27, (unsigned long)isr27);
|
||||
idt_register_handler(28, (unsigned long)isr28);
|
||||
idt_register_handler(29, (unsigned long)isr29);
|
||||
idt_register_handler(30, (unsigned long)isr30);
|
||||
idt_register_handler(31, (unsigned long)isr31);
|
||||
|
||||
set_idt();
|
||||
idt_init();
|
||||
}
|
|
@ -16,17 +16,32 @@
|
|||
|
||||
void kernel_main() {
|
||||
terminal_initialize();
|
||||
terminal_writeline("Initializing terminal... done");
|
||||
terminal_writestring("Preparing interrupts... ");
|
||||
remap_pic(0x20, 0x28);
|
||||
//keyboard_init();
|
||||
isr_install();
|
||||
terminal_writeline("done");
|
||||
terminal_writestring("Preparing keyboard... ");
|
||||
keyboard_init();
|
||||
|
||||
terminal_writestring("Are interrupts enabled? ");
|
||||
if (are_interrupts_enabled() == 1) {
|
||||
terminal_writeline("yes");
|
||||
} else {
|
||||
terminal_writeline("no");
|
||||
}
|
||||
|
||||
terminal_writeline("----------");
|
||||
|
||||
terminal_writeline("hello yes");
|
||||
terminal_writestring("> ");
|
||||
|
||||
while (true);
|
||||
|
||||
while (true) {
|
||||
if (inportb(0x64) & 1) {
|
||||
const char key = keyboard_to_ascii(parse_keycode(inportb(0x60)));
|
||||
terminal_putchar(key);
|
||||
}
|
||||
}
|
||||
//while (true) {
|
||||
// if (inportb(0x64) & 1) {
|
||||
// const char key = keyboard_to_ascii(parse_keycode(inportb(0x60)));
|
||||
// terminal_putchar(key);
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
|
|
@ -399,7 +399,7 @@ void keyboard_init(void) {
|
|||
terminal_writeline("haha keyboard go brr");
|
||||
keycache = (char*)malloc(256);
|
||||
memset(keycache, 0, 256);
|
||||
set_idt_gate(33, (uint32_t)keyboard_irq);
|
||||
idt_register_handler(33, (uint32_t)keyboard_irq);
|
||||
__kbd_enabled = 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,35 +8,19 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define KERNEL_CS 0x08
|
||||
#define KERNEL_CODE_SEGMENT_OFFSET 0x08
|
||||
#define INTERRUPT_GATE 0x8e
|
||||
|
||||
typedef struct {
|
||||
uint16_t low_offset;
|
||||
uint16_t sel;
|
||||
uint8_t always0;
|
||||
uint8_t flags;
|
||||
uint16_t high_offset;
|
||||
} __attribute__((packed)) idt_gate_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t limit;
|
||||
uint32_t base;
|
||||
} __attribute__((packed)) idt_register_t;
|
||||
|
||||
struct interrupt_frame {
|
||||
size_t ip;
|
||||
size_t cs;
|
||||
size_t flags;
|
||||
size_t sp;
|
||||
size_t ss;
|
||||
struct idt_entry {
|
||||
unsigned short int offset_lowerbits;
|
||||
unsigned short int selector;
|
||||
unsigned char zero;
|
||||
unsigned char type_attr;
|
||||
unsigned short int offset_higherbits;
|
||||
};
|
||||
|
||||
#define IDT_ENTRIES 256
|
||||
extern idt_gate_t idt[IDT_ENTRIES];
|
||||
extern idt_register_t idt_reg;
|
||||
|
||||
void set_idt_gate(int n, uint32_t handler);
|
||||
void set_idt(void);
|
||||
void idt_init();
|
||||
void idt_register_handler(uint8_t interrupt, unsigned long address);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue