From: Minep Date: Sun, 13 Feb 2022 01:08:49 +0000 (+0000) Subject: course 6 - interrupts X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/commitdiff_plain/f4aab93debd6eed5115c2328ada3160512027bd2?ds=sidebyside course 6 - interrupts --- diff --git a/.gitignore b/.gitignore index 6f9db1d..a9823a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ slide-resources - +**/.~lock* workspace diff --git a/lunaix-os/.gitignore b/lunaix-os/.gitignore index cd45af0..6ea7e38 100644 --- a/lunaix-os/.gitignore +++ b/lunaix-os/.gitignore @@ -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 index 55dd62f..0000000 --- a/lunaix-os/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "files.associations": { - "string.h": "c", - "stdint.h": "c" - } -} \ No newline at end of file diff --git a/lunaix-os/arch/x86/boot.S b/lunaix-os/arch/x86/boot.S index 1eddb52..b41d24b 100644 --- a/lunaix-os/arch/x86/boot.S +++ b/lunaix-os/arch/x86/boot.S @@ -28,10 +28,17 @@ 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 diff --git a/lunaix-os/arch/x86/gdt.c b/lunaix-os/arch/x86/gdt.c index a59f3d2..12bebba 100644 --- a/lunaix-os/arch/x86/gdt.c +++ b/lunaix-os/arch/x86/gdt.c @@ -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 index 0000000..08acda2 --- /dev/null +++ b/lunaix-os/arch/x86/idt.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +#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 index 0000000..584b143 --- /dev/null +++ b/lunaix-os/arch/x86/interrupt.S @@ -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 index 0000000..4a0d28d --- /dev/null +++ b/lunaix-os/includes/lunaix/arch/idt.h @@ -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 index 0000000..723ba67 --- /dev/null +++ b/lunaix-os/includes/lunaix/interrupts/interrupts.h @@ -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 index 0000000..888ca1f --- /dev/null +++ b/lunaix-os/includes/lunaix/interrupts/types.h @@ -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 index 0000000..9cbf41b --- /dev/null +++ b/lunaix-os/kernel/interrupts/interrupts.c @@ -0,0 +1,17 @@ +#include "interrupts.h" +#include + +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 diff --git a/lunaix-os/kernel/kernel.c b/lunaix-os/kernel/kernel.c index b0ef730..72f2f4e 100644 --- a/lunaix-os/kernel/kernel.c +++ b/lunaix-os/kernel/kernel.c @@ -1,11 +1,13 @@ #include #include +#include void _kernel_init() { // TODO _init_gdt(); + _init_idt(); } void diff --git a/lunaix-os/kernel/tty/tty.c b/lunaix-os/kernel/tty/tty.c index db9c28b..bef5c5a 100644 --- a/lunaix-os/kernel/tty/tty.c +++ b/lunaix-os/kernel/tty/tty.c @@ -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 diff --git a/lunaix-os/makefile b/lunaix-os/makefile index c7531fb..2ff30c0 100644 --- a/lunaix-os/makefile +++ b/lunaix-os/makefile @@ -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 index 2039466..0000000 --- a/practice-c4/.~lock.slides.odp# +++ /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 diff --git a/practice-c4/slides.odp b/practice-c4/slides.odp index 8b8f9b0..17805d3 100644 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 index 0000000..3f81883 Binary files /dev/null and b/practice-c5/slides.odp differ