software interrupt

This commit is contained in:
uosfz 2025-02-12 19:37:35 +01:00
parent 57ec3792e9
commit 8620679634
Signed by: uosfz
SSH key fingerprint: SHA256:FlktuluyhTQg3jHZNLKwxOOC5hbfrUXM0tz3IA3lGJo
3 changed files with 61 additions and 2 deletions

View file

@ -2,5 +2,6 @@
#define KARLOS_MEM_H
void init_gdt();
void init_idt();
#endif

View file

@ -95,10 +95,13 @@ void _start()
// memory stuff
init_gdt();
init_idt();
println("Test after init_gdt");
println("Test after init");
check_initrd();
__asm__("int $0x80" :: );
// check_initrd();
// hang for now
panic("end of kernel");

View file

@ -1,4 +1,5 @@
#include <stdint.h>
#include "output.h" // remove later, this is only for interrupt handler
uint64_t gdt[3];
@ -49,3 +50,57 @@ void init_gdt() {
__asm__ ("mov %0, %%ds" :: "r"(DATA_SEGMENT << 3));
// TODO set code segment -> iret?
}
__attribute__ ((packed))
struct int_desc_entry {
uint16_t offset1;
uint16_t selector;
uint8_t ist;
uint8_t attr;
uint16_t offset2;
uint32_t offset3;
uint32_t pad;
};
#define PRIV_KERNEL 0
#define PRIV_USER 3
void write_segment_selector(uint16_t *ss, uint16_t index) {
*ss = (uint16_t)PRIV_KERNEL
| 0 // use GDT
| (index << 3)
;
}
#define GATE_TYPE_INTERRUPT 0xe
void write_int_desc_entry(struct int_desc_entry *e, uint64_t offset) {
e->offset1 = (uint16_t) (offset & 0xffff);
write_segment_selector(&e->selector, CODE_SEGMENT);
e->ist = 0;
e->attr = (uint8_t)GATE_TYPE_INTERRUPT
| (uint8_t)(PRIV_KERNEL << 5)
| (uint8_t)(1 << 7) // present
;
e->offset2 = (uint16_t) ((offset >> 16) & 0xffff);
e->offset3 = (uint32_t) ((offset >> 32) & 0xffffffff);
e->pad = 0;
}
void basic_interrupt_handler(void) {
panic("Hello Interrupt!\n");
}
#define NUM_INTERRUPTS 256
struct int_desc_entry idt[NUM_INTERRUPTS];
void init_idt() {
write_int_desc_entry(&idt[0x80], (uint64_t)(intptr_t)basic_interrupt_handler);
uint8_t idtr[10];
*(uint16_t*)idtr = sizeof(idt) - 1;
*(uint64_t**)(idtr + 2) = (uint64_t*)idt;
__asm__ ("lidt (%0)" :: "r"(idtr));
}