From 620e8048cebf34072bd22b9de1b01bfeffc288b8 Mon Sep 17 00:00:00 2001 From: haxted Date: Thu, 24 Jul 2025 03:08:56 +0300 Subject: [PATCH 1/2] A --- src/kernel/cpu/isr.asm | 122 ++++++++++++++------------------------ tools/kernel/make_disk.sh | 8 +-- 2 files changed, 50 insertions(+), 80 deletions(-) diff --git a/src/kernel/cpu/isr.asm b/src/kernel/cpu/isr.asm index 0112b0f7..a06554b1 100644 --- a/src/kernel/cpu/isr.asm +++ b/src/kernel/cpu/isr.asm @@ -3,6 +3,46 @@ bits 64 + +; macro for pushing all registers (since pusha doesn't exist for 64 bit regs) +%macro pusha64 0 + push rax + push rbx + push rcx + push rdx + push rsi + push rdi + push rbp + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 +%endmacro + +; macro for popping all registers (since popa doesn't exist for 64 bit regs) +%macro popa64 0 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop rbp + pop rdi + pop rsi + pop rdx + pop rcx + pop rbx + pop rax +%endmacro + + global asm_finalize asm_finalize: ; rdi = switch stack pointer @@ -15,21 +55,7 @@ asm_finalize: ; mov ds, ebp mov es, ebp - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 - pop r9 - pop r8 - pop rbp - pop rdi - pop rsi - pop rdx - pop rcx - pop rbx - pop rax + popa64 add rsp, 16 ; pop error code and interrupt number iretq ; pops (CS, EIP, EFLAGS) and also (SS, ESP) if privilege change occurs @@ -55,21 +81,7 @@ syscall_entry: push qword 0 ; error push qword 0 ; interrupt - push rax - push rbx - push rcx - push rdx - push rsi - push rdi - push rbp - push r8 - push r9 - push r10 - push r11 - push r12 - push r13 - push r14 - push r15 + pusha64 mov rbp, ds push rbp @@ -83,21 +95,7 @@ syscall_entry: mov ds, ebp mov es, ebp - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 - pop r9 - pop r8 - pop rbp - pop rdi - pop rsi - pop rdx - pop rcx - pop rbx - pop rax + popa64 add rsp, 16 ; pop error code and interrupt number add rsp, 40 ; pop other interrupt stuff @@ -107,21 +105,7 @@ syscall_entry: o64 sysret isr_common: - push rax - push rbx - push rcx - push rdx - push rsi - push rdi - push rbp - push r8 - push r9 - push r10 - push r11 - push r12 - push r13 - push r14 - push r15 + pusha64 mov rbp, ds push rbp @@ -143,21 +127,7 @@ asm_isr_exit: ; mov ds, ebp mov es, ebp - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 - pop r9 - pop r8 - pop rbp - pop rdi - pop rsi - pop rdx - pop rcx - pop rbx - pop rax + popa64 add rsp, 16 ; pop error code and interrupt number iretq ; pops (CS, EIP, EFLAGS) and also (SS, ESP) if privilege change occurs @@ -249,4 +219,4 @@ asm_isr_redirect_table: %rep 48 dq isr%+i %assign i i+1 -%endrep \ No newline at end of file +%endrep diff --git a/tools/kernel/make_disk.sh b/tools/kernel/make_disk.sh index fd93569a..760802c9 100755 --- a/tools/kernel/make_disk.sh +++ b/tools/kernel/make_disk.sh @@ -36,10 +36,10 @@ SIZE_IN_BLOCKS=$((($SIZE_IN_BYTES / 512) * 2 + 500000)) if [ -z "$4" ]; then dd if=/dev/zero of="${3}" bs=512 count=$SIZE_IN_BLOCKS - parted "${3}" mklabel msdos - parted "${3}" mkpart primary ext4 2048s 68157440B - parted "${3}" set 1 boot on - parted "${3}" mkpart primary ext4 136314880B 100% + sudo parted "${3}" mklabel msdos + sudo parted "${3}" mkpart primary ext4 2048s 68157440B + sudo parted "${3}" set 1 boot on + sudo parted "${3}" mkpart primary ext4 136314880B 100% "$LIMINE_EXEC" bios-install "${3}" fi From 059670f284815467c472fc49d4ac49667edc751e Mon Sep 17 00:00:00 2001 From: haxted Date: Thu, 24 Jul 2025 22:58:09 +0300 Subject: [PATCH 2/2] B --- src/kernel/cpu/gdt.c | 75 +++++++++++++------------------------------- 1 file changed, 21 insertions(+), 54 deletions(-) diff --git a/src/kernel/cpu/gdt.c b/src/kernel/cpu/gdt.c index 43d4a9ad..6bad63dc 100644 --- a/src/kernel/cpu/gdt.c +++ b/src/kernel/cpu/gdt.c @@ -1,4 +1,5 @@ #include +#include #include // GDT & TSS Entry configurator @@ -10,6 +11,17 @@ static TSSPtr tss; TSSPtr *tssPtr = &tss; +void gdt_set_entry(int idx, uint32_t base, uint32_t limit, uint8_t access, + uint8_t granularity) { + gdt.descriptors[idx].base_low = (base & 0xffff); + gdt.descriptors[idx].base_mid = (base >> 16) & 0xff; + gdt.descriptors[idx].access = access; + gdt.descriptors[idx].granularity = + ((limit >> 16) & 0x0f) | (granularity & 0xf0); + gdt.descriptors[idx].base_high = (base >> 24) & 0xff; + gdt.descriptors[idx].limit = limit; +} + void gdt_load_tss(TSSPtr *tss) { size_t addr = (size_t)tss; @@ -44,80 +56,35 @@ void gdt_reload() { void initiateGDT() { // Null descriptor. (0) - gdt.descriptors[0].limit = 0; - gdt.descriptors[0].base_low = 0; - gdt.descriptors[0].base_mid = 0; - gdt.descriptors[0].access = 0; - gdt.descriptors[0].granularity = 0; - gdt.descriptors[0].base_high = 0; + gdt_set_entry(0, 0, 0, 0, 0); // Kernel code 16. (8) - gdt.descriptors[1].limit = 0xffff; - gdt.descriptors[1].base_low = 0; - gdt.descriptors[1].base_mid = 0; - gdt.descriptors[1].access = 0b10011010; - gdt.descriptors[1].granularity = 0b00000000; - gdt.descriptors[1].base_high = 0; + gdt_set_entry(1, 0, 0xffff, 0b10011010, 0); // Kernel data 16. (16) - gdt.descriptors[2].limit = 0xffff; - gdt.descriptors[2].base_low = 0; - gdt.descriptors[2].base_mid = 0; - gdt.descriptors[2].access = 0b10010010; - gdt.descriptors[2].granularity = 0b00000000; - gdt.descriptors[2].base_high = 0; + gdt_set_entry(2, 0, 0xffff, 0b10010010, 0); // Kernel code 32. (24) - gdt.descriptors[3].limit = 0xffff; - gdt.descriptors[3].base_low = 0; - gdt.descriptors[3].base_mid = 0; - gdt.descriptors[3].access = 0b10011010; - gdt.descriptors[3].granularity = 0b11001111; - gdt.descriptors[3].base_high = 0; + gdt_set_entry(3, 0, 0xffff, 0b10011010, 0b11001111); // Kernel data 32. (32) - gdt.descriptors[4].limit = 0xffff; - gdt.descriptors[4].base_low = 0; - gdt.descriptors[4].base_mid = 0; - gdt.descriptors[4].access = 0b10010010; - gdt.descriptors[4].granularity = 0b11001111; - gdt.descriptors[4].base_high = 0; + gdt_set_entry(4, 0, 0xffff, 0b10010010, 0b11001111); // Kernel code 64. (40) - gdt.descriptors[5].limit = 0; - gdt.descriptors[5].base_low = 0; - gdt.descriptors[5].base_mid = 0; - gdt.descriptors[5].access = 0b10011010; - gdt.descriptors[5].granularity = 0b00100000; - gdt.descriptors[5].base_high = 0; + gdt_set_entry(5, 0, 0, 0b10011010, 0b00100000); // Kernel data 64. (48) - gdt.descriptors[6].limit = 0; - gdt.descriptors[6].base_low = 0; - gdt.descriptors[6].base_mid = 0; - gdt.descriptors[6].access = 0b10010010; - gdt.descriptors[6].granularity = 0; - gdt.descriptors[6].base_high = 0; + gdt_set_entry(6, 0, 0, 0b10010010, 0); // SYSENTER gdt.descriptors[7] = (GDTEntry){0}; // (56) gdt.descriptors[8] = (GDTEntry){0}; // (64) // User code 64. (72) - gdt.descriptors[10].limit = 0; - gdt.descriptors[10].base_low = 0; - gdt.descriptors[10].base_mid = 0; - gdt.descriptors[10].access = 0b11111010; - gdt.descriptors[10].granularity = 0b00100000; - gdt.descriptors[10].base_high = 0; + gdt_set_entry(10, 0, 0, 0b11111010, 0b00100000); // User data 64. (80) - gdt.descriptors[9].limit = 0; - gdt.descriptors[9].base_low = 0; - gdt.descriptors[9].base_mid = 0; - gdt.descriptors[9].access = 0b11110010; - gdt.descriptors[9].granularity = 0; - gdt.descriptors[9].base_high = 0; + gdt_set_entry(9, 0, 0, 0b11110010, 0); // TSS. (88) gdt.tss.length = 104;