kind of an idt i guess? i am supid

This commit is contained in:
hippoz 2020-11-22 18:05:26 +02:00
parent ebf9c7ee91
commit 86a2d5370d
6 changed files with 122 additions and 112 deletions

View file

@ -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

View file

@ -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;
}

View file

@ -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();
}

View file

@ -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);
// }
//}
}

View file

@ -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;
}

View file

@ -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
}