course 6 - interrupts
authorMinep <zelong56@gmail.com>
Sun, 13 Feb 2022 01:08:49 +0000 (01:08 +0000)
committerMinep <zelong56@gmail.com>
Sun, 13 Feb 2022 01:08:49 +0000 (01:08 +0000)
17 files changed:
.gitignore
lunaix-os/.gitignore
lunaix-os/.vscode/settings.json [deleted file]
lunaix-os/arch/x86/boot.S
lunaix-os/arch/x86/gdt.c
lunaix-os/arch/x86/idt.c [new file with mode: 0644]
lunaix-os/arch/x86/interrupt.S [new file with mode: 0644]
lunaix-os/includes/lunaix/arch/idt.h [new file with mode: 0644]
lunaix-os/includes/lunaix/interrupts/interrupts.h [new file with mode: 0644]
lunaix-os/includes/lunaix/interrupts/types.h [new file with mode: 0644]
lunaix-os/kernel/interrupts/interrupts.c [new file with mode: 0644]
lunaix-os/kernel/kernel.c
lunaix-os/kernel/tty/tty.c
lunaix-os/makefile
practice-c4/.~lock.slides.odp# [deleted file]
practice-c4/slides.odp
practice-c5/slides.odp [new file with mode: 0644]

index 6f9db1df1c03e3178d120022e9bd1ca39c8eab27..a9823a8f05fbe7cd86f4ba9d26398184d8131f58 100644 (file)
@@ -1,3 +1,3 @@
 slide-resources
-
+**/.~lock*
 workspace
index cd45af0d7b0299288119d0741a7d3975534ff7b4..6ea7e38e2423c451993953bc0ed8d1613ee100e7 100644 (file)
@@ -1,2 +1,3 @@
 dump*
-build/
\ No newline at end of file
+build/
+.vscode/settings.json
diff --git a/lunaix-os/.vscode/settings.json b/lunaix-os/.vscode/settings.json
deleted file mode 100644 (file)
index 55dd62f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "files.associations": {
-        "string.h": "c",
-        "stdint.h": "c"
-    }
-}
\ No newline at end of file
index 1eddb52c1af6b97a0663b6773689f59e21aa9907..b41d24bba5cd81b887032dbfc4272ea201223ae1 100644 (file)
         call _kernel_init
         
         subl $0x6, %esp
+
         movl $_gdt, 2(%esp)
         movw _gdt_limit, %ax
         movw %ax, (%esp)
         lgdt (%esp)
+
+        movl $_idt, 2(%esp)
+        movw _idt_limit, %ax
+        movw %ax, (%esp)
+        lidt (%esp)
+
         addl $0x6, %esp
 
         movw $0x10, %cx
index a59f3d212cdbe9fa940f98cfa35345cd5747c6d4..12bebba3693f6b7c20d8df8f1eed6572b1b8dbef 100644 (file)
@@ -4,7 +4,7 @@
 #define GDT_ENTRY 5
 
 uint64_t _gdt[GDT_ENTRY];
-uint16_t _gdt_limit = sizeof(_gdt);
+uint16_t _gdt_limit = sizeof(_gdt) - 1;
 
 void _set_gdt_entry(uint32_t index, uint32_t base, uint32_t limit, uint32_t flags) {
     _gdt[index] = SEG_BASE_H(base) | flags | SEG_LIM_H(limit) | SEG_BASE_M(base);
diff --git a/lunaix-os/arch/x86/idt.c b/lunaix-os/arch/x86/idt.c
new file mode 100644 (file)
index 0000000..08acda2
--- /dev/null
@@ -0,0 +1,22 @@
+#include <lunaix/arch/idt.h>
+#include <lunaix/interrupts/interrupts.h>
+#include <lunaix/interrupts/types.h>
+#include <stdint.h>
+
+#define IDT_ENTRY 32
+
+uint64_t _idt[IDT_ENTRY];
+uint16_t _idt_limit = sizeof(_idt) - 1;
+
+void _set_idt_entry(uint32_t vector, uint16_t seg_selector, void (*isr)(), uint8_t dpl) {
+    uintptr_t offset = (uintptr_t)isr;
+    _idt[vector] = (offset & 0xffff0000) | IDT_ATTR(dpl);
+    _idt[vector] <<= 32;
+    _idt[vector] |= (seg_selector << 16) | (offset & 0x0000ffff);
+}
+
+
+void
+_init_idt() {
+    _set_idt_entry(FAULT_DIVISION_ERROR, 0x08, _asm_isr0, 0);
+}
\ No newline at end of file
diff --git a/lunaix-os/arch/x86/interrupt.S b/lunaix-os/arch/x86/interrupt.S
new file mode 100644 (file)
index 0000000..584b143
--- /dev/null
@@ -0,0 +1,27 @@
+.macro isr_template vector, no_error_code=1
+    .global _asm_isr\vector
+    .type _asm_isr\vector, @function
+    _asm_isr\vector:
+        .if \no_error_code
+            pushl $0x0
+        .endif
+        pushl $\vector
+        jmp interrupt_wrapper
+.endm
+
+.section .text
+    isr_template 0
+
+    interrupt_wrapper:
+
+        movl %esp, %eax
+        andl $0xfffffff0, %esp
+        subl $16, %esp
+        movl %eax, (%esp)
+
+        call interrupt_handler
+        pop %eax
+        movl %eax, %esp
+        addl $8, %esp
+
+        iret
\ No newline at end of file
diff --git a/lunaix-os/includes/lunaix/arch/idt.h b/lunaix-os/includes/lunaix/arch/idt.h
new file mode 100644 (file)
index 0000000..4a0d28d
--- /dev/null
@@ -0,0 +1,4 @@
+#define IDT_ATTR(dpl)                   ((0x70 << 5) | (dpl & 3) << 13 | 1 << 15)
+
+void
+_init_idt();
\ No newline at end of file
diff --git a/lunaix-os/includes/lunaix/interrupts/interrupts.h b/lunaix-os/includes/lunaix/interrupts/interrupts.h
new file mode 100644 (file)
index 0000000..723ba67
--- /dev/null
@@ -0,0 +1,15 @@
+#pragma pack(push, 1)
+typedef struct {
+    unsigned int vector;
+    unsigned int err_code;
+    unsigned int eip;
+    unsigned short cs;
+    unsigned int eflags;
+} isr_param;
+#pragma pack(pop)
+
+void
+_asm_isr0();
+
+void
+interrupt_handler(isr_param* param);
\ No newline at end of file
diff --git a/lunaix-os/includes/lunaix/interrupts/types.h b/lunaix-os/includes/lunaix/interrupts/types.h
new file mode 100644 (file)
index 0000000..888ca1f
--- /dev/null
@@ -0,0 +1,23 @@
+// Ref: Intel Manuel Vol.3 Figure 6-1
+#define FAULT_DIVISION_ERROR            0x0
+#define FAULT_TRAP_DEBUG_EXCEPTION      0x1
+#define INT_NMI                         0x2
+#define TRAP_BREAKPOINT                 0x3
+#define TRAP_OVERFLOW                   0x4
+#define FAULT_BOUND_EXCEED              0x5
+#define FAULT_INVALID_OPCODE            0x6
+#define FAULT_NO_MATH_PROCESSOR         0x7
+#define ABORT_DOUBLE_FAULT              0x8
+#define FAULT_RESERVED_0                0x9
+#define FAULT_INVALID_TSS               0xa
+#define FAULT_SEG_NOT_PRESENT           0xb
+#define FAULT_STACK_SEG_FAULT           0xc
+#define FAULT_GENERAL_PROTECTION        0xd
+#define FAULT_PAGE_FAULT                0xe
+#define FAULT_RESERVED_1                0xf
+#define FAULT_X87_FAULT                 0x10
+#define FAULT_ALIGNMENT_CHECK           0x11
+#define ABORT_MACHINE_CHECK             0x12
+#define FAULT_SIMD_FP_EXCEPTION         0x13
+#define FAULT_VIRTUALIZATION_EXCEPTION  0x14
+#define FAULT_CONTROL_PROTECTION        0x15
\ No newline at end of file
diff --git a/lunaix-os/kernel/interrupts/interrupts.c b/lunaix-os/kernel/interrupts/interrupts.c
new file mode 100644 (file)
index 0000000..9cbf41b
--- /dev/null
@@ -0,0 +1,17 @@
+#include "interrupts.h"
+#include <lunaix/tty/tty.h>
+
+void isr0 (isr_param* param) {
+    tty_clear();
+    tty_put_str("!!PANIC!!");
+}
+
+void 
+interrupt_handler(isr_param* param) {
+    switch (param->vector)
+    {
+        case 0:
+            isr0(param);
+            break;
+    }
+}
\ No newline at end of file
index b0ef73053d186b44b600d5f7551fa6f11670bee7..72f2f4e40b05cbaf7690dd5e9c1a144ab80ab531 100644 (file)
@@ -1,11 +1,13 @@
 #include <lunaix/tty/tty.h>
 #include <lunaix/arch/gdt.h>
+#include <lunaix/arch/idt.h>
 
 void
 _kernel_init()
 {
     // TODO
     _init_gdt();
+    _init_idt();
 }
 
 void
index db9c28b572decbe640339f229156da15816a0755..bef5c5a90213a1271c7d10cca1a7bdb6f67a2efb 100644 (file)
@@ -73,4 +73,6 @@ tty_clear()
     for (uint32_t i = 0; i < TTY_WIDTH * TTY_HEIGHT; i++) {
         *(buffer + i) = theme_color;
     }
+    tty_x = 0;
+    tty_y = 0;
 }
\ No newline at end of file
index c7531fb2cad3549fe9e8ba339e58ab84d590edda..2ff30c0eb64237e3c90822de8c5da038dfa66d73 100644 (file)
@@ -39,7 +39,7 @@ $(ISO_DIR):
 
 $(OBJECT_DIR)/%.S.o: %.S
        @mkdir -p $(@D)
-       $(CC) -c $< -o $@
+       $(CC) $(INCLUDES) -c $< -o $@
 
 $(OBJECT_DIR)/%.c.o: %.c 
        @mkdir -p $(@D)
diff --git a/practice-c4/.~lock.slides.odp# b/practice-c4/.~lock.slides.odp#
deleted file mode 100644 (file)
index 2039466..0000000
+++ /dev/null
@@ -1 +0,0 @@
-,lxsky,lunaixsky-PC,12.02.2022 15:08,file:///home/lxsky/.config/libreoffice/4;
\ No newline at end of file
index 8b8f9b0ea4d9936e2eb91b0d4a5b30566a378d8e..17805d3e1f70b33a3b8c3e7abb781220949b98ac 100644 (file)
Binary files a/practice-c4/slides.odp and b/practice-c4/slides.odp differ
diff --git a/practice-c5/slides.odp b/practice-c5/slides.odp
new file mode 100644 (file)
index 0000000..3f81883
Binary files /dev/null and b/practice-c5/slides.odp differ