]> git.dujemihanovic.xyz Git - nameless-os.git/commitdiff
Fix interrupt trap gates
authorDuje Mihanović <duje.mihanovic@skole.hr>
Sun, 8 May 2022 12:47:14 +0000 (14:47 +0200)
committerDuje Mihanović <duje.mihanovic@skole.hr>
Sun, 8 May 2022 12:47:14 +0000 (14:47 +0200)
Until now the code would set the most significant bit in the type part
of the IDT descriptor for trap gates as a result of my error, causing a
triple fault when trying to handle a double fault. A less significant, but still
noteworthy change is that the double fault handler has been slightly revamped to
print out :( on a red background and no longer spits out a warning because I
accidentally wrote a string there, not a char.

include/arch/x86/irq/idt.h
kernel/arch/x86/irq/sample_handler.c

index 8b2efa1b1aa453beb1583d11cc6d5ef9381eb032..daf586f2d5aefe44c723d5f38cb84290f0967472 100644 (file)
@@ -6,8 +6,8 @@
 #define IDT_VECTOR_COUNT 256 /* our IDT will have 256 vectors */
 #define IDT_DESCRIPTOR_SIZE 8 /* each IDT descriptor is 8 bytes long */
 
-#define IDT_TRAP_GATE          0x1F
-#define IDT_INTERRUPT_GATE     0x0E
+#define IDT_TRAP_GATE          0xF
+#define IDT_INTERRUPT_GATE     0xE
 
 struct idt_descriptor {
        uint16_t offset_1; /* bits 0-15 of offset */
index d9bd8f9c953a3e48a46b6695957e28d6650aed0d..f4f4a4bfefad5aacf742f3c6ce2046c86eb1b85e 100644 (file)
@@ -25,9 +25,9 @@ void keyb_handler(struct interrupt_frame *frame)
 __attribute__((interrupt))
 void double_fault(struct abort_frame *frame)
 {
-       *(volatile char *) (0xb8000) = ":";
-       *(volatile char *) (0xb8002) = "(";
+       *(volatile uint32_t *) (0xb8000) = 0xcf28cf3a;
+halt:
        asm volatile ("cli; hlt");
-       while(1);
+       goto halt;
 }