From b2ec0360554df404f149a58e79c4d5d2f6f55263 Mon Sep 17 00:00:00 2001 From: RaphProductions <81994075+RaphProductions@users.noreply.github.com> Date: Fri, 16 May 2025 08:01:37 +0200 Subject: [PATCH] =?UTF-8?q?kernel=20-=20various=20changes=20+=20vmm:=20hig?= =?UTF-8?q?her=20half=20should=20not=20be=20identify-mapped=20+=20panic:?= =?UTF-8?q?=20now=20displays=20current=20process=20+=20kernel:=20fix=20phy?= =?UTF-8?q?sical=20addresses=20(d=CC=B7=CC=93=CD=83=CD=8A=CD=81=CC=92?= =?UTF-8?q?=CC=A7=CC=A9=CC=9C=CC=A6=CC=A5=CC=B0=CD=94=CC=BB=CD=94=CC=96?= =?UTF-8?q?=CD=8E=CD=9C=CC=B3=CC=97=CC=ABo=CC=B8=CC=9B=CC=91=CC=90=CC=BF?= =?UTF-8?q?=CD=A0=CC=BF=CD=9D=CD=86=CD=99=CD=8E=CC=A0=CD=8E=CC=A9=CC=A4?= =?UTF-8?q?=CC=AD=CC=AC=CC=99=CD=9A=CC=AC=CC=A3=CD=87=CC=A4=CC=BC=20=CC=B7?= =?UTF-8?q?=CC=82=CD=9B=CD=86=CD=9D=CD=A0=CD=81=CD=82=CC=97=CC=9F=CD=85?= =?UTF-8?q?=CC=98=CD=8E=CC=A5=CC=A4=CC=ADN=CC=B4=CC=8A=CC=90=CC=85=CC=80?= =?UTF-8?q?=CC=8C=CC=8F=CD=9D=CC=9B=CC=95=CD=86=CC=8B=CD=A0=CC=A8=CC=A5?= =?UTF-8?q?=CC=A9=CD=85=CC=BA=CD=9C=CD=9A=CC=BA=CC=A0=CD=99=CC=BC=CC=99?= =?UTF-8?q?=CC=AF=CC=B1=CD=9A=CC=ABo=CC=B5=CD=84=CC=81=CC=8D=CD=80=CC=83?= =?UTF-8?q?=CC=8B=CC=87=CC=84=CD=83=CD=9D=CD=8A=CC=8E=CC=AA=CD=9A=CC=9E?= =?UTF-8?q?=CC=9E=CC=9C=CD=8E=CD=89=CC=A6t=CC=B6=CC=82=CC=91=CC=93=CD=8C?= =?UTF-8?q?=CD=82=CC=BE=CC=91=CD=84=CD=92=CC=BE=CC=BE=CC=81=CD=90=CD=86?= =?UTF-8?q?=CD=8A=CD=82=CD=8D=CC=A9=CC=A1=CC=A4=CC=B9=CC=A4=20=CC=B4=CD=98?= =?UTF-8?q?=CC=9A=CD=9D=CC=8A=CC=9A=CC=8D=CC=92=CD=9B=CD=8C=CD=98=CC=8C?= =?UTF-8?q?=CD=82=CD=98=CC=AB=CC=BA=CC=A8=CC=A6I=CC=B6=CD=82=CC=81=CD=9C?= =?UTF-8?q?=CC=A5=CD=9A=CC=AF=CC=96=CC=99=CC=A9d=CC=B8=CC=92=CD=A0=CC=A2?= =?UTF-8?q?=CC=97=CD=89=CC=A0=CC=A1=CC=B9e=CC=B8=CC=9A=CD=91=CC=88=CC=8B?= =?UTF-8?q?=CC=89=CC=8B=CD=98=CC=93=CC=90=CC=8A=CC=AA=CC=BA=CC=A1=CD=8E?= =?UTF-8?q?=CD=96=CD=9A=CC=97=CC=9F=CC=9F=CC=A5=CD=8D=CD=9Cn=CC=B8=CC=8D?= =?UTF-8?q?=CD=90=CD=97=CC=88=CD=8C=CC=80=CD=83=CD=A0=CC=83=CC=81=CD=81?= =?UTF-8?q?=CC=A1t=CC=B6=CC=92=CC=84=CD=92=CC=83=CC=90=CD=88=CD=88=CD=9C?= =?UTF-8?q?=CC=A6=CC=A2=CC=BB=CC=B0=CD=8E=CC=AA=CC=B0i=CC=B4=CC=83=CC=90?= =?UTF-8?q?=CC=8D=CC=81=CC=BE=CC=80=CC=8F=CC=8F=CC=91=CC=9A=CD=92=CD=95?= =?UTF-8?q?=CC=BC=CC=BB=CD=93=CD=9A=CD=85=CD=95=CC=B2=CC=AC=CC=A4=CD=88?= =?UTF-8?q?=CC=9C=CC=A3f=CC=B7=CD=9B=CC=BC=CC=BB=CC=A0=CC=A0=CC=A1=CD=94?= =?UTF-8?q?=CC=AA=CD=8D=CC=A8y=CC=B4=CC=93=CD=92=CC=9A=CC=86=CC=8E=CD=89?= =?UTF-8?q?=CD=93=20=CC=B6=CC=8C=CC=89=CC=95=CC=81=CC=91=CD=97=CD=8B=CC=80?= =?UTF-8?q?=CD=85=CC=9F=CD=99=CD=96=CC=99=CC=9F=CD=8D=CC=9F=CD=95=CC=9E?= =?UTF-8?q?=CC=A5=CC=B9=CD=87=CD=85M=CC=B7=CD=83=CD=99=CC=AC=CC=B2a=CC=B6?= =?UTF-8?q?=CC=8D=CD=80=CC=AB=CC=B0=CC=9E=CC=BA=CC=96p=CC=B6=CD=8B=CD=82?= =?UTF-8?q?=CC=8F=CC=8D=CC=BE=CC=BD=CC=A1=CC=97=CC=96=CC=A8=CC=B9=CC=A9?= =?UTF-8?q?=CC=AB=CC=A1=CC=AF=CC=9E=CC=AC=CD=9C=CD=85=20=CC=B6=CC=80=CC=BD?= =?UTF-8?q?=CD=98=CD=91=CC=82=CC=BF=CC=84=CC=88=CC=87=CD=83=CC=A7=CC=AB?= =?UTF-8?q?=CD=89=CC=9D=CC=AE=CC=B3=CC=A8=CD=8E=CD=8D=CC=A7=CC=B1=CC=9F?= =?UTF-8?q?=CC=AA=CC=9DH=CC=B6=CD=80=CC=AE=CC=97=CC=A3=CC=A8=CC=AA=CC=A8?= =?UTF-8?q?=CD=93=CC=BA=CD=99=CD=88=CD=99i=CC=B6=CC=94=CC=90=CC=87=CC=89?= =?UTF-8?q?=CD=83=CD=92=CD=98=CD=9B=CC=85=CC=BF=CC=95=CD=8A=CC=8D=CD=86?= =?UTF-8?q?=CC=B0=CD=87=CC=B9=CC=A7=CD=99=CC=A9=CD=8D=CD=8E=CC=A1=CC=AE?= =?UTF-8?q?=CC=A4=CC=A6=CC=9C=CC=BB=CD=8E=CC=9Eg=CC=B7=CC=91=CC=91=CD=8B?= =?UTF-8?q?=CD=84=CD=8C=CD=9D=CD=90=CD=A0=CC=8A=CD=9D=CD=80=CD=96=CD=99?= =?UTF-8?q?=CD=8D=CD=93=CC=AF=CC=AA=CC=A9h=CC=B4=CC=82=CD=9D=CD=8A=CD=91?= =?UTF-8?q?=CD=9B=CC=86=CC=AB=CC=AA=CC=9F=CC=9E=CC=AD=CC=9F=CC=A2=CC=A1?= =?UTF-8?q?=CD=95=CC=96=CD=8Ee=CC=B4=CD=86=CC=92=CC=BE=CC=BE=CD=83=CC=88?= =?UTF-8?q?=CD=8A=CD=83=CC=A1=CC=97=CC=A8=CC=B1=CC=B1=CD=99=CD=94=CC=BB?= =?UTF-8?q?=CD=85=CC=A4=CD=8Er=CC=B5=CC=94=CC=8C=CC=9B=CC=83=CC=87=CD=8A?= =?UTF-8?q?=CC=BD=CD=80=CC=89=CC=BD=CC=8A=CD=8C=CC=BF=CC=81=CD=88=CC=A9?= =?UTF-8?q?=CD=8D=20=CC=B7=CC=87=CC=9B=CC=87=CD=84=CC=91=CC=8D=CC=8A=CD=92?= =?UTF-8?q?=CC=84=CD=81=CD=9B=CC=A9=CC=A8=CC=B9=CC=A1=CC=B9H=CC=B7=CD=8B?= =?UTF-8?q?=CD=81=CC=9A=CD=98=CC=86=CD=A0=CD=8B=CC=82=CD=98=CC=AA=CC=A8?= =?UTF-8?q?=CC=9C=CD=9C=CC=A4=CD=8D=CC=BB=CD=8E=CC=B2=CC=9Ca=CC=B7=CD=81?= =?UTF-8?q?=CC=81=CC=BD=CC=89=CC=92=CD=8C=CD=81=CC=93=CC=A8=CC=A0=CD=93?= =?UTF-8?q?=CC=AB=CD=85=CC=B2l=CC=B4=CC=86=CC=8E=CC=84=CC=95=CC=8A=CD=84?= =?UTF-8?q?=CC=90=CC=BE=CC=8F=CC=BF=CC=9B=CD=88=CC=A4=CC=BA=CC=A2=CC=B1?= =?UTF-8?q?=CC=99=CC=ACf=CC=B8=CC=82=CC=B0=CD=93=CC=A6=CC=BA=CC=B0=CC=AF?= =?UTF-8?q?=CD=9A=CD=9C=CC=A2=CC=A3=CC=99=CD=9C=CD=94=CC=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- GNUmakefile | 2 +- kernel/src/arch/x86_64/idt.c | 17 +++--- kernel/src/arch/x86_64/idt.h | 4 +- kernel/src/arch/x86_64/msr.h | 26 +++------ kernel/src/arch/x86_64/pit.c | 13 ++--- kernel/src/arch/x86_64/pit.h | 3 +- kernel/src/arch/x86_64/smp.c | 53 ++++++++++--------- kernel/src/arch/x86_64/sse.c | 2 +- kernel/src/arch/x86_64/syscall.c | 3 +- kernel/src/arch/x86_64/syscall.h | 2 +- kernel/src/dev/ioapic.c | 62 ++++++++++++---------- kernel/src/dev/ioapic.h | 18 +++---- kernel/src/dev/lapic.c | 14 ++--- kernel/src/fs/vfs.c | 26 ++++----- kernel/src/fs/vfs.h | 40 +++++++------- kernel/src/lib/spinlock.h | 34 ++++++------ kernel/src/lib/string.c | 1 - kernel/src/main.c | 31 ++++++----- kernel/src/mm/vmm.c | 6 +-- kernel/src/sched/sched.c | 7 ++- kernel/src/sched/sched.h | 2 +- kernel/src/sys/acpi.c | 6 +-- kernel/src/sys/acpi/madt.c | 46 ++++++++-------- kernel/src/sys/acpi/madt.h | 6 +-- kernel/src/sys/errhnd/panic.c | 88 ++++++++++++++++--------------- kernel/src/sys/log.c | 10 ++-- kernel/src/sys/syscall.c | 2 +- kernel/src/sys/syscall.h | 2 +- testing/sk-hello.elf | Bin 4312 -> 4320 bytes testing/test.asm | 1 + testing/test.o | Bin 608 -> 608 bytes 32 files changed, 265 insertions(+), 265 deletions(-) mode change 100755 => 100644 kernel/src/arch/x86_64/pit.h diff --git a/.gitignore b/.gitignore index 31c65c9..bda1078 100755 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ /.cache *.iso *.hdd -/compile_commands.json \ No newline at end of file +/compile_commands.json +/.idea \ No newline at end of file diff --git a/GNUmakefile b/GNUmakefile index 5745a01..3adffb8 100755 --- a/GNUmakefile +++ b/GNUmakefile @@ -6,7 +6,7 @@ MAKEFLAGS += -rR ARCH := x86_64 # Default user QEMU flags. These are appended to the QEMU command calls. -QEMUFLAGS := -m 2G -debugcon stdio -no-reboot -no-shutdown +QEMUFLAGS := -m 2G -debugcon stdio -no-reboot -no-shutdown override IMAGE_NAME := sild-live-$(ARCH) diff --git a/kernel/src/arch/x86_64/idt.c b/kernel/src/arch/x86_64/idt.c index 2e7ab3f..39ce4ce 100644 --- a/kernel/src/arch/x86_64/idt.c +++ b/kernel/src/arch/x86_64/idt.c @@ -1,11 +1,11 @@ // #include "sys/log.h" +#include "arch/x86_64/smp.h" #include "dev/ioapic.h" #include "dev/lapic.h" #include "mm/vmm.h" -#include "arch/x86_64/smp.h" #include "sys/errhnd/panic.h" +#include #include -#include #include __attribute__((aligned(0x10))) static idt_entry_t idt[256]; @@ -50,9 +50,9 @@ void idt_init() { } // Do not use the legacy PIC. - //pic_init(); - //pic_unmask_irq(1); - //pic_unmask_irq(8); + // pic_init(); + // pic_unmask_irq(1); + // pic_unmask_irq(8); __asm__ volatile("lidt %0" : : "m"(idtr)); // load the new IDT __asm__ volatile("sti"); // set the interrupt flag @@ -60,11 +60,10 @@ void idt_init() { log("idt - initialized\n"); } - void idt_int_handler(registers_t *regs) { vmm_load_pagemap(vmm_kernel_pm); - //log("kernel - Interrupt %d\n", regs->int_no); - + // log("kernel - Interrupt %d\n", regs->int_no); + if (regs->int_no < 32) { panic_ctx("A CPU exception occured.", regs); } @@ -79,5 +78,5 @@ void idt_int_handler(registers_t *regs) { } lapic_eoi(); - //pic_ack(regs->int_no - 32); + // pic_ack(regs->int_no - 32); } \ No newline at end of file diff --git a/kernel/src/arch/x86_64/idt.h b/kernel/src/arch/x86_64/idt.h index 32569f2..3bf8d94 100644 --- a/kernel/src/arch/x86_64/idt.h +++ b/kernel/src/arch/x86_64/idt.h @@ -5,7 +5,7 @@ // VT = Vector type #define IDT_VT_UNDEFINED 0 #define IDT_VT_EXCEPTION 1 -#define IDT_VT_IRQ 2 +#define IDT_VT_IRQ 2 typedef struct { uint64_t r15; @@ -55,7 +55,7 @@ typedef struct { uint64_t base; } __attribute__((packed)) idtr_t; -typedef void(*idt_irq_handler_t)(registers_t *regs); +typedef void (*idt_irq_handler_t)(registers_t *regs); void idt_register_irq(uint8_t vector, void *isr); void idt_set_descriptor(uint8_t vector, void *isr, uint8_t flags); diff --git a/kernel/src/arch/x86_64/msr.h b/kernel/src/arch/x86_64/msr.h index 1761298..5354f78 100644 --- a/kernel/src/arch/x86_64/msr.h +++ b/kernel/src/arch/x86_64/msr.h @@ -5,24 +5,14 @@ #define IA32_GS_MSR 0xC0000101 #define IA32_GS_KERNEL_MSR 0xC0000102 -static inline void wrmsr(uint64_t msr, uint64_t value) -{ - uint32_t low = value & 0xFFFFFFFF; - uint32_t high = value >> 32; - asm volatile ( - "wrmsr" - : - : "c"(msr), "a"(low), "d"(high) - ); +static inline void wrmsr(uint64_t msr, uint64_t value) { + uint32_t low = value & 0xFFFFFFFF; + uint32_t high = value >> 32; + asm volatile("wrmsr" : : "c"(msr), "a"(low), "d"(high)); } -static inline uint64_t rdmsr(uint64_t msr) -{ - uint32_t low, high; - asm volatile ( - "rdmsr" - : "=a"(low), "=d"(high) - : "c"(msr) - ); - return ((uint64_t)high << 32) | low; +static inline uint64_t rdmsr(uint64_t msr) { + uint32_t low, high; + asm volatile("rdmsr" : "=a"(low), "=d"(high) : "c"(msr)); + return ((uint64_t)high << 32) | low; } \ No newline at end of file diff --git a/kernel/src/arch/x86_64/pit.c b/kernel/src/arch/x86_64/pit.c index bc64f81..2818395 100644 --- a/kernel/src/arch/x86_64/pit.c +++ b/kernel/src/arch/x86_64/pit.c @@ -1,14 +1,14 @@ -#include "arch//x86_64/idt.h" +#include "arch/x86_64/idt.h" #include "sched/sched.h" +#include +#include #include #include -#include -#include uint32_t tick = 0; void pit_handler(registers_t *regs) { - //log("PIT"); + // log("PIT"); tick++; schedule(regs); } @@ -18,12 +18,13 @@ void pit_init() { uint16_t div = (uint16_t)(1193180 / 1000); outb(0x40, (uint8_t)div); outb(0x40, (uint8_t)(div >> 8)); - idt_register_irq(0, pit_handler); } +void pit_enable() { idt_register_irq(0, pit_handler); } + void pit_sleep(uint32_t ms) { uint64_t start = tick; while (tick - start < ms) { - __asm__ volatile ("nop"); + __asm__ volatile("nop"); } } \ No newline at end of file diff --git a/kernel/src/arch/x86_64/pit.h b/kernel/src/arch/x86_64/pit.h old mode 100755 new mode 100644 index 1884a1e..92c7bde --- a/kernel/src/arch/x86_64/pit.h +++ b/kernel/src/arch/x86_64/pit.h @@ -1,12 +1,13 @@ #ifndef PIT_H #define PIT_H +#include #include -#include extern uint32_t tick; void pit_init(); void pit_sleep(uint32_t ms); +void pit_enable(); #endif \ No newline at end of file diff --git a/kernel/src/arch/x86_64/smp.c b/kernel/src/arch/x86_64/smp.c index 2355478..d913504 100644 --- a/kernel/src/arch/x86_64/smp.c +++ b/kernel/src/arch/x86_64/smp.c @@ -1,49 +1,52 @@ -#include "arch//x86_64/smp.h" +#include "arch/x86_64/smp.h" #include "lib/spinlock.h" -#include "sys/log.h" #include "limine.h" +#include "sys/log.h" #include __attribute__(( - used, - section(".limine_requests"))) static volatile struct limine_mp_request + used, section(".limine_requests"))) static volatile struct limine_mp_request smp_request = {.id = LIMINE_MP_REQUEST, .revision = 0}; uint32_t bootstrap_lapic_id = 0; uint32_t smp_cpu_count = 0; // Number of processors -spinlock_t smp_lock = { 0 }; +spinlock_t smp_lock = {0}; uint32_t ctr = 0; -void smp_entry(struct limine_mp_info* smp_info) { - //spinlock_acquire(&smp_lock); +void smp_entry(struct limine_mp_info *smp_info) { + // spinlock_acquire(&smp_lock); - log("smp - CPU %d started (LAPIC ID: %d)\n", smp_info->processor_id, smp_info->lapic_id); - __atomic_fetch_add(&ctr, 1, __ATOMIC_SEQ_CST); + log("smp - CPU %d started (LAPIC ID: %d)\n", smp_info->processor_id, + smp_info->lapic_id); + __atomic_fetch_add(&ctr, 1, __ATOMIC_SEQ_CST); - while (1) - ;; - //spinlock_release(&smp_lock); + while (1) + ; + ; + // spinlock_release(&smp_lock); } void smp_init() { - bootstrap_lapic_id = smp_request.response->bsp_lapic_id; - smp_cpu_count = smp_request.response->cpu_count; + bootstrap_lapic_id = smp_request.response->bsp_lapic_id; + smp_cpu_count = smp_request.response->cpu_count; - log("smp - detected %d CPUs\n", smp_cpu_count); + log("smp - detected %d CPUs\n", smp_cpu_count); - for (uint64_t i = 0; i < smp_cpu_count; i++) { - if (smp_request.response->cpus[i]->lapic_id != bootstrap_lapic_id) { - uint32_t old_ctr = __atomic_load_n(&ctr, __ATOMIC_SEQ_CST); + for (uint64_t i = 0; i < smp_cpu_count; i++) { + if (smp_request.response->cpus[i]->lapic_id != bootstrap_lapic_id) { + uint32_t old_ctr = __atomic_load_n(&ctr, __ATOMIC_SEQ_CST); - __atomic_store_n(&smp_request.response->cpus[i]->goto_address, smp_entry, __ATOMIC_SEQ_CST); + __atomic_store_n(&smp_request.response->cpus[i]->goto_address, smp_entry, + __ATOMIC_SEQ_CST); - while (__atomic_load_n(&ctr, __ATOMIC_SEQ_CST) == old_ctr) - ; - } else { - log("smp - CPU %d is the bootstrap processor (LAPIC ID: %d)\n", i, smp_request.response->cpus[i]->lapic_id); - } + while (__atomic_load_n(&ctr, __ATOMIC_SEQ_CST) == old_ctr) + ; + } else { + log("smp - CPU %d is the bootstrap processor (LAPIC ID: %d)\n", i, + smp_request.response->cpus[i]->lapic_id); } + } - log("smp - initialized\n"); + log("smp - initialized\n"); } \ No newline at end of file diff --git a/kernel/src/arch/x86_64/sse.c b/kernel/src/arch/x86_64/sse.c index 1fe79ce..84339f0 100644 --- a/kernel/src/arch/x86_64/sse.c +++ b/kernel/src/arch/x86_64/sse.c @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/kernel/src/arch/x86_64/syscall.c b/kernel/src/arch/x86_64/syscall.c index 34e7df3..8d6a97d 100644 --- a/kernel/src/arch/x86_64/syscall.c +++ b/kernel/src/arch/x86_64/syscall.c @@ -10,7 +10,8 @@ void __x86_64_syscall_init() { wrmsr(IA32_EFER, efer); uint64_t star = 0; star |= ((uint64_t)0x28 << 32); // kernel cs - star |= ((uint64_t)0x30 << 48); // user cs base (SYSCALL adds 16 for CS=0x38, 24 for SS=0x40) + star |= ((uint64_t)0x30 + << 48); // user cs base (SYSCALL adds 16 for CS=0x38, 24 for SS=0x40) wrmsr(IA32_STAR, star); wrmsr(IA32_LSTAR, (uint64_t)syscall_entry); wrmsr(IA32_CSTAR, 0x0); diff --git a/kernel/src/arch/x86_64/syscall.h b/kernel/src/arch/x86_64/syscall.h index c64911c..479d406 100644 --- a/kernel/src/arch/x86_64/syscall.h +++ b/kernel/src/arch/x86_64/syscall.h @@ -1,6 +1,6 @@ #pragma once -#define IA32_EFER 0xC0000080 +#define IA32_EFER 0xC0000080 #define IA32_STAR 0xC0000081 #define IA32_LSTAR 0xC0000082 #define IA32_CSTAR 0xC0000083 diff --git a/kernel/src/dev/ioapic.c b/kernel/src/dev/ioapic.c index 8c216ce..5803024 100644 --- a/kernel/src/dev/ioapic.c +++ b/kernel/src/dev/ioapic.c @@ -1,11 +1,11 @@ #include "sys/acpi/madt.h" #include -#include #include +#include void ioapic_init() { - madt_ioapic* ioapic = acpi_madt_ioapic_list[0]; - + madt_ioapic *ioapic = acpi_madt_ioapic_list[0]; + uint32_t val = ioapic_read(ioapic, IOAPIC_VER); uint32_t count = ((val >> 16) & 0xFF); @@ -14,44 +14,49 @@ void ioapic_init() { } for (uint8_t i = 0; i <= count; ++i) { - ioapic_write(ioapic, IOAPIC_REDTBL+2*i, 0x00010000 | (32 + i)); - ioapic_write(ioapic, IOAPIC_REDTBL+2*i+1, 0); + ioapic_write(ioapic, IOAPIC_REDTBL + 2 * i, 0x00010000 | (32 + i)); + ioapic_write(ioapic, IOAPIC_REDTBL + 2 * i + 1, 0); } - + log("ioapic - initialized\n"); } -void ioapic_write(madt_ioapic* ioapic, uint8_t reg, uint32_t val) { - *((volatile uint32_t*)(HIGHER_HALF(ioapic->apic_addr) + IOAPIC_REGSEL)) = reg; - *((volatile uint32_t*)(HIGHER_HALF(ioapic->apic_addr) + IOAPIC_IOWIN)) = val; +void ioapic_write(madt_ioapic *ioapic, uint8_t reg, uint32_t val) { + *((volatile uint32_t *)(HIGHER_HALF(ioapic->apic_addr) + IOAPIC_REGSEL)) = + reg; + *((volatile uint32_t *)(HIGHER_HALF(ioapic->apic_addr) + IOAPIC_IOWIN)) = val; } -uint32_t ioapic_read(madt_ioapic* ioapic, uint8_t reg) { - *((volatile uint32_t*)(HIGHER_HALF(ioapic->apic_addr) + IOAPIC_REGSEL)) = reg; - return *((volatile uint32_t*)(HIGHER_HALF(ioapic->apic_addr) + IOAPIC_IOWIN)); +uint32_t ioapic_read(madt_ioapic *ioapic, uint8_t reg) { + *((volatile uint32_t *)(HIGHER_HALF(ioapic->apic_addr) + IOAPIC_REGSEL)) = + reg; + return *( + (volatile uint32_t *)(HIGHER_HALF(ioapic->apic_addr) + IOAPIC_IOWIN)); } -void ioapic_set_entry(madt_ioapic* ioapic, uint8_t idx, uint64_t data) { +void ioapic_set_entry(madt_ioapic *ioapic, uint8_t idx, uint64_t data) { ioapic_write(ioapic, (uint8_t)(IOAPIC_REDTBL + idx * 2), (uint32_t)data); - ioapic_write(ioapic, (uint8_t)(IOAPIC_REDTBL + idx * 2 + 1), (uint32_t)(data >> 32)); + ioapic_write(ioapic, (uint8_t)(IOAPIC_REDTBL + idx * 2 + 1), + (uint32_t)(data >> 32)); } - -uint64_t ioapic_gsi_count(madt_ioapic* ioapic) { +uint64_t ioapic_gsi_count(madt_ioapic *ioapic) { return (ioapic_read(ioapic, 1) & 0xff0000) >> 16; } -madt_ioapic* ioapic_get_gsi(uint32_t gsi) { +madt_ioapic *ioapic_get_gsi(uint32_t gsi) { for (uint64_t i = 0; i < acpi_madt_ioapic_length; i++) { - madt_ioapic* ioapic = acpi_madt_ioapic_list[i]; - if (ioapic->gsi_base <= gsi && ioapic->gsi_base + ioapic_gsi_count(ioapic) > gsi) + madt_ioapic *ioapic = acpi_madt_ioapic_list[i]; + if (ioapic->gsi_base <= gsi && + ioapic->gsi_base + ioapic_gsi_count(ioapic) > gsi) return ioapic; } - return (madt_ioapic*)0; + return (madt_ioapic *)0; } -void ioapic_redirect_gsi(uint32_t lapic_id, uint8_t vec, uint32_t gsi, uint16_t flags, bool mask) { - madt_ioapic* ioapic = ioapic_get_gsi(gsi); +void ioapic_redirect_gsi(uint32_t lapic_id, uint8_t vec, uint32_t gsi, + uint16_t flags, bool mask) { + madt_ioapic *ioapic = ioapic_get_gsi(gsi); uint64_t redirect = vec; @@ -63,8 +68,10 @@ void ioapic_redirect_gsi(uint32_t lapic_id, uint8_t vec, uint32_t gsi, uint16_t redirect |= (1 << 15); } - if (mask) redirect |= (1 << 16); - else redirect &= ~(1 << 16); + if (mask) + redirect |= (1 << 16); + else + redirect &= ~(1 << 16); redirect |= (uint64_t)lapic_id << 56; @@ -73,9 +80,10 @@ void ioapic_redirect_gsi(uint32_t lapic_id, uint8_t vec, uint32_t gsi, uint16_t ioapic_write(ioapic, redir_table + 1, (uint32_t)(redirect >> 32)); } -void ioapic_redirect_irq(uint32_t lapic_id, uint8_t vec, uint8_t irq, bool mask) { +void ioapic_redirect_irq(uint32_t lapic_id, uint8_t vec, uint8_t irq, + bool mask) { uint8_t idx = 0; - madt_iso* iso = (madt_iso*)0; + madt_iso *iso = (madt_iso *)0; while (idx < acpi_madt_iso_length) { iso = acpi_madt_iso_list[idx]; @@ -91,7 +99,7 @@ void ioapic_redirect_irq(uint32_t lapic_id, uint8_t vec, uint8_t irq, bool mask) uint32_t ioapic_get_redirect_irq(uint8_t irq) { uint8_t idx = 0; - madt_iso* iso; + madt_iso *iso; while (idx < acpi_madt_iso_length) { iso = acpi_madt_iso_list[idx]; diff --git a/kernel/src/dev/ioapic.h b/kernel/src/dev/ioapic.h index a5c1793..86f7c6f 100644 --- a/kernel/src/dev/ioapic.h +++ b/kernel/src/dev/ioapic.h @@ -5,20 +5,20 @@ #include #define IOAPIC_REGSEL 0x0 -#define IOAPIC_IOWIN 0x10 +#define IOAPIC_IOWIN 0x10 -#define IOAPIC_ID 0x0 -#define IOAPIC_VER 0x01 -#define IOAPIC_ARB 0x02 +#define IOAPIC_ID 0x0 +#define IOAPIC_VER 0x01 +#define IOAPIC_ARB 0x02 #define IOAPIC_REDTBL 0x10 +void ioapic_write(madt_ioapic *ioapic, uint8_t reg, uint32_t val); +uint32_t ioapic_read(madt_ioapic *ioapic, uint8_t reg); -void ioapic_write(madt_ioapic* ioapic, uint8_t reg, uint32_t val); -uint32_t ioapic_read(madt_ioapic* ioapic, uint8_t reg); - -void ioapic_redirect_irq(uint32_t lapic_id, uint8_t vec, uint8_t irq, bool mask); +void ioapic_redirect_irq(uint32_t lapic_id, uint8_t vec, uint8_t irq, + bool mask); uint32_t ioapic_get_redirect_irq(uint8_t irq); -void ioapic_set_entry(madt_ioapic* ioapic, uint8_t idx, uint64_t data); +void ioapic_set_entry(madt_ioapic *ioapic, uint8_t idx, uint64_t data); void ioapic_init(); \ No newline at end of file diff --git a/kernel/src/dev/lapic.c b/kernel/src/dev/lapic.c index 8b3c83f..b83c3c4 100644 --- a/kernel/src/dev/lapic.c +++ b/kernel/src/dev/lapic.c @@ -27,7 +27,7 @@ void lapic_calibrate_timer() { lapic_write(LAPIC_TIMER_DIV, 0); lapic_write(LAPIC_TIMER_LVT, (1 << 16) | 0xff); lapic_write(LAPIC_TIMER_INITCNT, 0xFFFFFFFF); - //pit_sleep(1); // 1 ms + // pit_sleep(1); // 1 ms lapic_write(LAPIC_TIMER_LVT, LAPIC_TIMER_DISABLE); uint32_t ticks = 0xFFFFFFFF - lapic_read(LAPIC_TIMER_CURCNT); apic_ticks = ticks; @@ -35,16 +35,14 @@ void lapic_calibrate_timer() { } void lapic_write(uint32_t reg, uint32_t val) { - *((volatile uint32_t*)(HIGHER_HALF(0xfee00000) + reg)) = val; + *((volatile uint32_t *)(HIGHER_HALF(0xfee00000) + reg)) = val; } uint32_t lapic_read(uint32_t reg) { - return *((volatile uint32_t*)(HIGHER_HALF(0xfee00000) + reg)); + return *((volatile uint32_t *)(HIGHER_HALF(0xfee00000) + reg)); } -void lapic_eoi() { - lapic_write((uint8_t)0xb0, 0x0); -} +void lapic_eoi() { lapic_write((uint8_t)0xb0, 0x0); } void lapic_ipi(uint32_t id, uint8_t dat) { lapic_write(LAPIC_ICRHI, id << LAPIC_ICDESTSHIFT); @@ -59,6 +57,4 @@ void lapic_send_others_int(uint32_t id, uint32_t vec) { lapic_ipi(id, vec | LAPIC_ICRAES); } -uint32_t lapic_get_id() { - return lapic_read(0x0020) >> LAPIC_ICDESTSHIFT; -} \ No newline at end of file +uint32_t lapic_get_id() { return lapic_read(0x0020) >> LAPIC_ICDESTSHIFT; } \ No newline at end of file diff --git a/kernel/src/fs/vfs.c b/kernel/src/fs/vfs.c index 72cd25d..bcbf98f 100644 --- a/kernel/src/fs/vfs.c +++ b/kernel/src/fs/vfs.c @@ -1,19 +1,19 @@ #include "fs/vfs.h" +#include "lib/string.h" #include "mm/liballoc/liballoc.h" #include "mm/memop.h" -#include "lib/string.h" vnode_t *vfs_create_node(char *name, vnode_type_t type) { - vnode_t *node = (vnode_t *)malloc(sizeof(vnode_t)); - if (!node) { - return NULL; - } - memset(node, 0, sizeof(vnode_t)); - strncpy(node->name, name, sizeof(node->name) - 1); - node->type = type; - node->ops = NULL; - //node->parent = NULL; - //node->child = NULL; - //node->next = NULL; - return node; + vnode_t *node = (vnode_t *)malloc(sizeof(vnode_t)); + if (!node) { + return NULL; + } + memset(node, 0, sizeof(vnode_t)); + strncpy(node->name, name, sizeof(node->name) - 1); + node->type = type; + node->ops = NULL; + // node->parent = NULL; + // node->child = NULL; + // node->next = NULL; + return node; } \ No newline at end of file diff --git a/kernel/src/fs/vfs.h b/kernel/src/fs/vfs.h index 6a1c4c2..a85c826 100644 --- a/kernel/src/fs/vfs.h +++ b/kernel/src/fs/vfs.h @@ -6,41 +6,41 @@ struct vnode; #define VN_FILE 1 -#define VN_DIR 2 +#define VN_DIR 2 typedef uint32_t vnode_type_t; typedef struct vnode_ops { - int (*read)(struct vnode* vn, void* buf, size_t off, size_t size); - struct vnode* (*lookup)(struct vnode* vn, const char* name); + int (*read)(struct vnode *vn, void *buf, size_t off, size_t size); + struct vnode *(*lookup)(struct vnode *vn, const char *name); } vnode_ops_t; typedef struct vnode { - char name[256]; - vnode_type_t type; - uint32_t refcount; - //struct vnode* parent; - //struct vnode* child; - //struct vnode* next; + char name[256]; + vnode_type_t type; + uint32_t refcount; + // struct vnode* parent; + // struct vnode* child; + // struct vnode* next; - struct vnode_ops* ops; - void* internal; + struct vnode_ops *ops; + void *internal; } vnode_t; typedef struct mountpoint { - char name[32]; - struct fs* fs; - vnode_t* mountpoint; + char name[32]; + struct fs *fs; + vnode_t *mountpoint; } mountpoint_t; typedef struct fs { - char name[32]; - struct vnode* root; - int (*mount)(struct vnode* mountpoint); + char name[32]; + struct vnode *root; + int (*mount)(struct vnode *mountpoint); } fs_t; void vfs_init(void); -int vfs_mount(char *path, fs_t* fs); +int vfs_mount(char *path, fs_t *fs); int vfs_unmount(char *path); -int vfs_open(const char* path, vnode_t** result); -int vfs_read(vnode_t* vn, void* buf, size_t off, size_t size); +int vfs_open(const char *path, vnode_t **result); +int vfs_read(vnode_t *vn, void *buf, size_t off, size_t size); diff --git a/kernel/src/lib/spinlock.h b/kernel/src/lib/spinlock.h index 49229f7..bf54abe 100644 --- a/kernel/src/lib/spinlock.h +++ b/kernel/src/lib/spinlock.h @@ -4,28 +4,28 @@ #include typedef struct spinlock { - volatile int locked; + volatile int locked; } spinlock_t; static inline void spinlock_acquire(spinlock_t *lock) { - //uint64_t timeout = 1000000; // Adjust this value based on your needs - - for (;;) { - if (__atomic_exchange_n(&lock->locked, 1, __ATOMIC_ACQUIRE) == 0) { - return; - } - - while (__atomic_load_n(&lock->locked, __ATOMIC_RELAXED)) { - /**if (--timeout == 0) { - // Force unlock after too many attempts - __atomic_store_n(&lock->locked, 0, __ATOMIC_RELEASE); - continue; - }**/ - __asm__ volatile("pause" ::: "memory"); - } + // uint64_t timeout = 1000000; // Adjust this value based on your needs + + for (;;) { + if (__atomic_exchange_n(&lock->locked, 1, __ATOMIC_ACQUIRE) == 0) { + return; } + + while (__atomic_load_n(&lock->locked, __ATOMIC_RELAXED)) { + /**if (--timeout == 0) { + // Force unlock after too many attempts + __atomic_store_n(&lock->locked, 0, __ATOMIC_RELEASE); + continue; + }**/ + __asm__ volatile("pause" ::: "memory"); + } + } } static inline void spinlock_release(spinlock_t *lock) { - __atomic_store_n(&lock->locked, 0, __ATOMIC_RELEASE); + __atomic_store_n(&lock->locked, 0, __ATOMIC_RELEASE); } \ No newline at end of file diff --git a/kernel/src/lib/string.c b/kernel/src/lib/string.c index 35caf14..71eb5a9 100644 --- a/kernel/src/lib/string.c +++ b/kernel/src/lib/string.c @@ -78,4 +78,3 @@ char *strncpy(char *dest, const char *src, size_t n) { dest[i] = '\0'; return dest; } - diff --git a/kernel/src/main.c b/kernel/src/main.c index 746aab4..e1dde83 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -1,3 +1,6 @@ +#include "arch/x86_64/pit.h" +#include "arch/x86_64/smp.h" +#include "arch/x86_64/sse.h" #include "dev/ioapic.h" #include "dev/lapic.h" #include "exec/elf.h" @@ -9,25 +12,22 @@ #include "sched/sched.h" #include "sys/acpi.h" #include "sys/acpi/madt.h" -#include "arch//x86_64/pit.h" -#include "arch//x86_64/smp.h" -#include "arch//x86_64/sse.h" #include "sys/syscall.h" +#include +#include +#include #include +#include #include #include #include #include #include -#include -#include -#include #include #include #include #include #include -#include __attribute__(( used, section(".limine_requests"))) static volatile LIMINE_BASE_REVISION(3); @@ -79,7 +79,7 @@ void kmain(void) { idt_init(); pmm_init(); vmm_init(); - + kernel_vma_context = vma_create_context(vmm_kernel_pm); if (!kernel_vma_context) { log("kernel - vma ctx creation failed. halting\n"); @@ -87,7 +87,7 @@ void kmain(void) { while (1) asm("hlt"); } - + acpi_init(); madt_init(); ioapic_init(); @@ -97,21 +97,20 @@ void kmain(void) { syscall_init(); sched_init(); - - //vfs_init(); + // vfs_init(); - - //panic("No working initialization program found. (This is normal due to " - // "Soaplin's current state, so please do not report this as a bug)"); + // panic("No working initialization program found. (This is normal due to " + // "Soaplin's current state, so please do not report this as a bug)"); program_t *p = elf_load(module_request.response->modules[0]->address, 1); - sched_process *proc = sched_create("Test", p->entry, p->pm, - SCHED_USER_PROCESS); + sched_process *proc = + sched_create("Test", p->entry, p->pm, SCHED_USER_PROCESS); log("kernel - Soaplin initialized sucessfully.\n"); + pit_enable(); while (1) ; ; diff --git a/kernel/src/mm/vmm.c b/kernel/src/mm/vmm.c index cc246f0..f84bf9b 100644 --- a/kernel/src/mm/vmm.c +++ b/kernel/src/mm/vmm.c @@ -49,7 +49,7 @@ void vmm_release_pm(pagemap_t *pm) { } void vmm_sanity_check() { - uint64_t *my_memory = pmm_request_page(); + uint64_t *my_memory = HIGHER_HALF(pmm_request_page()); *my_memory = 0x40; pagemap_t *pm = vmm_alloc_pm(); @@ -113,14 +113,14 @@ void vmm_init() { log("vmm - mapping address from 0x0 to 0x100000000...\n"); for (uint64_t gb4 = 0; gb4 < 0x100000000; gb4 += PMM_PAGE_SIZE) { - vmm_map(vmm_kernel_pm, gb4, gb4, VMM_PRESENT | VMM_WRITABLE); + //vmm_map(vmm_kernel_pm, gb4, gb4, VMM_PRESENT | VMM_WRITABLE); vmm_map(vmm_kernel_pm, (uint64_t)HIGHER_HALF(gb4), gb4, VMM_PRESENT | VMM_WRITABLE); } vmm_load_pagemap(vmm_kernel_pm); - vmm_sanity_check(); + //vmm_sanity_check(); log("vmm - initialized!\n"); } diff --git a/kernel/src/sched/sched.c b/kernel/src/sched/sched.c index 3ebb371..69e0abf 100644 --- a/kernel/src/sched/sched.c +++ b/kernel/src/sched/sched.c @@ -1,13 +1,13 @@ #include "sched/sched.h" +#include "arch/x86_64/idt.h" #include "arch/x86_64/msr.h" #include "mm/memop.h" #include "mm/pmm.h" #include "mm/vmm.h" -#include "arch//x86_64/idt.h" #include "sys/log.h" #include -#include #include +#include sched_process *proc_list; sched_process *curr_proc; @@ -114,7 +114,6 @@ sched_process *sched_create(char *name, uint64_t entry_point, pagemap_t *pm, "disabled.\n"); } - log("sched - created process '%s' (pid: %d, rip: %p)\n", proc->name, proc->pid, proc->regs.rip); return proc; @@ -158,6 +157,6 @@ void schedule(registers_t *regs) { memcpy(regs, &curr_proc->regs, sizeof(registers_t)); wrmsr(IA32_GS_KERNEL_MSR, (uint64_t)curr_proc); - //log("sched - proc %d\n", curr_proc->pid); + // log("sched - proc %d\n", curr_proc->pid); vmm_load_pagemap(curr_proc->pm); } \ No newline at end of file diff --git a/kernel/src/sched/sched.h b/kernel/src/sched/sched.h index 4a05629..971b651 100644 --- a/kernel/src/sched/sched.h +++ b/kernel/src/sched/sched.h @@ -1,7 +1,7 @@ #pragma once -#include "mm/vmm.h" #include "arch/x86_64/idt.h" +#include "mm/vmm.h" #define SCHED_KERNEL_PROCESS 0 // A process that runs in kernel mode. #define SCHED_USER_PROCESS \ diff --git a/kernel/src/sys/acpi.c b/kernel/src/sys/acpi.c index aee1d31..f284c67 100644 --- a/kernel/src/sys/acpi.c +++ b/kernel/src/sys/acpi.c @@ -42,7 +42,7 @@ void *acpi_find_table(const char *name) { } void acpi_init() { - acpi_rsdp *rsdp = (acpi_rsdp *)rsdp_req.response->address; + acpi_rsdp *rsdp = (acpi_rsdp *)HIGHER_HALF(rsdp_req.response->address); if (memcmp(rsdp->sign, "RSD PTR", 7)) panic("acpi: Invalid RSDP signature!"); @@ -50,9 +50,9 @@ void acpi_init() { if (rsdp->revision != 0) { __acpi_uses_xsdt = 1; acpi_xsdp *xsdp = (acpi_xsdp *)rsdp; - __acpi_rsdt_ptr = (acpi_xsdt *)HIGHER_HALF((uint64_t)xsdp->xsdt_addr); + __acpi_rsdt_ptr = (void *)HIGHER_HALF(xsdp->xsdt_addr); return; } - __acpi_rsdt_ptr = (acpi_rsdt *)HIGHER_HALF((uint64_t)rsdp->rsdt_addr); + __acpi_rsdt_ptr = (void *)HIGHER_HALF(rsdp->rsdt_addr); } \ No newline at end of file diff --git a/kernel/src/sys/acpi/madt.c b/kernel/src/sys/acpi/madt.c index f41dc04..e73b668 100644 --- a/kernel/src/sys/acpi/madt.c +++ b/kernel/src/sys/acpi/madt.c @@ -4,39 +4,39 @@ #include #include -madt_ioapic* acpi_madt_ioapic_list[256] = {0}; -madt_iso* acpi_madt_iso_list[256] = {0}; +madt_ioapic *acpi_madt_ioapic_list[256] = {0}; +madt_iso *acpi_madt_iso_list[256] = {0}; uint32_t acpi_madt_ioapic_length = 0; uint32_t acpi_madt_iso_length = 0; -uint64_t* acpi_lapic_addr = 0; +uint64_t *acpi_lapic_addr = 0; void madt_init() { - void *addr = acpi_find_table("APIC"); - if (!addr) - panic("madt: Failed to find MADT table!"); + void *addr = acpi_find_table("APIC"); + if (!addr) + panic("madt: Failed to find MADT table!"); - acpi_madt *madt = (acpi_madt *)addr; + acpi_madt *madt = (acpi_madt *)addr; - uint64_t offset = 0; - int i = 0; + uint64_t offset = 0; + int i = 0; - while (1) { - if (offset > madt->sdt.len - sizeof(acpi_madt)) - break; + while (1) { + if (offset > madt->sdt.len - sizeof(acpi_madt)) + break; - madt_entry* entry = (madt_entry*)(madt->table + offset); + madt_entry *entry = (madt_entry *)(madt->table + offset); - if (entry->type == 0) - i++; - else if (entry->type == 1) - acpi_madt_ioapic_list[acpi_madt_ioapic_length++] = (madt_ioapic*)entry; - else if (entry->type == 2) - acpi_madt_iso_list[acpi_madt_iso_length++] = (madt_iso*)entry; - else if (entry->type == 5) - acpi_lapic_addr = (uint64_t*)((madt_lapic_addr*)entry)->phys_lapic; + if (entry->type == 0) + i++; + else if (entry->type == 1) + acpi_madt_ioapic_list[acpi_madt_ioapic_length++] = (madt_ioapic *)entry; + else if (entry->type == 2) + acpi_madt_iso_list[acpi_madt_iso_length++] = (madt_iso *)entry; + else if (entry->type == 5) + acpi_lapic_addr = (uint64_t *)((madt_lapic_addr *)entry)->phys_lapic; - offset += entry->length; - } + offset += entry->length; + } } \ No newline at end of file diff --git a/kernel/src/sys/acpi/madt.h b/kernel/src/sys/acpi/madt.h index 1ce1138..444c3fd 100644 --- a/kernel/src/sys/acpi/madt.h +++ b/kernel/src/sys/acpi/madt.h @@ -45,12 +45,12 @@ typedef struct { uint64_t phys_lapic; } madt_lapic_addr; -extern madt_ioapic* acpi_madt_ioapic_list[256]; -extern madt_iso* acpi_madt_iso_list[256]; +extern madt_ioapic *acpi_madt_ioapic_list[256]; +extern madt_iso *acpi_madt_iso_list[256]; extern uint32_t acpi_madt_ioapic_length; extern uint32_t acpi_madt_iso_length; -extern uint64_t* acpi_lapic_addr; +extern uint64_t *acpi_lapic_addr; void madt_init(); \ No newline at end of file diff --git a/kernel/src/sys/errhnd/panic.c b/kernel/src/sys/errhnd/panic.c index dd71a1b..b4d8274 100644 --- a/kernel/src/sys/errhnd/panic.c +++ b/kernel/src/sys/errhnd/panic.c @@ -1,8 +1,10 @@ -#include "arch//x86_64/idt.h" +#include "arch/x86_64/idt.h" #include "lib/spinlock.h" #include #include +#include "sched/sched.h" + static registers_t __panic_regdump; static void __panic_dump_regs() { @@ -51,53 +53,50 @@ static void __panic_dump_regs() { } static void __panic_display_page_fault(registers_t *regs) { - if (regs->int_no != 14) // 14 is the page fault interrupt number - return; + if (regs->int_no != 14) // 14 is the page fault interrupt number + return; - uint64_t cr2; - asm volatile("mov %%cr2, %0" : "=r"(cr2)); - - log("Page Fault Details:\n"); - log("Faulting Address (CR2): 0x%lx\n", cr2); - log("Error Code: %d\n", regs->err_code); - log("Flags:\n"); - if (!(regs->err_code & (1 << 0))) - log(" - Page Not Present\n"); - else - log(" - Protection Violation\n"); - - if (regs->err_code & (1 << 1)) - log(" - Write Access\n"); - else - log(" - Read Access\n"); - - if (regs->err_code & (1 << 2)) - log(" - User-Mode Access\n"); - else - log(" - Kernel-Mode Access\n"); - - if (regs->err_code & (1 << 3)) - log(" - Reserved Bits Set\n"); - - if (regs->err_code & (1 << 4)) - log(" - Instruction Fetch\n"); + uint64_t cr2; + asm volatile("mov %%cr2, %0" : "=r"(cr2)); + + log("Page Fault Details:\n"); + log("Faulting Address (CR2): 0x%lx\n", cr2); + log("Error Code: %d\n", regs->err_code); + log("Flags:\n"); + if (!(regs->err_code & (1 << 0))) + log(" - Page Not Present\n"); + else + log(" - Protection Violation\n"); + + if (regs->err_code & (1 << 1)) + log(" - Write Access\n"); + else + log(" - Read Access\n"); + + if (regs->err_code & (1 << 2)) + log(" - User-Mode Access\n"); + else + log(" - Kernel-Mode Access\n"); + + if (regs->err_code & (1 << 3)) + log(" - Reserved Bits Set\n"); + + if (regs->err_code & (1 << 4)) + log(" - Instruction Fetch\n"); } static void __panic_display_regs(registers_t *regs) { log("-- REGISTER DUMP --\n"); - log("RDI: %p, RSI: %p, RDX: %p, RCX: %p, R8: %p, R9: %p\n", - regs->rdi, regs->rsi, regs->rdx, - regs->rcx, regs->r8, regs->r9); - log("RAX: %p, RBP: %p, RBX: %p, R10: %p, R11: %p, R12: %p\n", - regs->rax, regs->rbp, regs->rbx, - regs->r10, regs->r11, regs->r12); - log("R13: %p, R14: %p, R15: %p\n", regs->r13, regs->r14, - regs->r15); + log("RDI: %p, RSI: %p, RDX: %p, RCX: %p, R8: %p, R9: %p\n", regs->rdi, + regs->rsi, regs->rdx, regs->rcx, regs->r8, regs->r9); + log("RAX: %p, RBP: %p, RBX: %p, R10: %p, R11: %p, R12: %p\n", regs->rax, + regs->rbp, regs->rbx, regs->r10, regs->r11, regs->r12); + log("R13: %p, R14: %p, R15: %p\n", regs->r13, regs->r14, regs->r15); log("RIP: %p, CS: %x, SS: %x, RFLAGS: %d, INTERRUPT: %d, ERROR CODE: %d\n", - regs->rip, regs->cs, regs->ss, - regs->rflags, regs->int_no, regs->err_code); + regs->rip, regs->cs, regs->ss, regs->rflags, regs->int_no, + regs->err_code); log("RSP: %p\n", regs->rsp); - + if (regs->int_no == 14) // If it's a page fault __panic_display_page_fault(regs); } @@ -135,14 +134,17 @@ void panic_ctx(char *msg, registers_t *regs) { log("\n"); log("%s\n", msg); log("\n"); + + if (curr_proc) { + log("Current process: %s (PID: %d)\n", curr_proc->name, curr_proc->pid); + log("\n"); + } if (regs) __panic_display_regs(regs); else log("No register context provided.\n"); - - log("System halted: Please restart your computer manually.\n"); asm("cli"); diff --git a/kernel/src/sys/log.c b/kernel/src/sys/log.c index e6f3988..4f3c313 100644 --- a/kernel/src/sys/log.c +++ b/kernel/src/sys/log.c @@ -1,4 +1,4 @@ -#include "arch//x86_64/io.h" +#include "arch/x86_64/io.h" #include "sys/gfx/flanterm/flanterm.h" #include #include @@ -12,8 +12,8 @@ static spinlock_t log_lock = {0}; void log(char *format, ...) { // TODO: replace this call with a call to printf() when the RTC is // implemented. - - //spinlock_acquire(&log_lock); + + // spinlock_acquire(&log_lock); char *date = "1970-01-01 00:00:00 | "; if (ft_ctx) @@ -41,6 +41,6 @@ void log(char *format, ...) { outb(0xE9, buf[i]); } - - //spinlock_release(&log_lock); + + // spinlock_release(&log_lock); } \ No newline at end of file diff --git a/kernel/src/sys/syscall.c b/kernel/src/sys/syscall.c index c132998..9340143 100644 --- a/kernel/src/sys/syscall.c +++ b/kernel/src/sys/syscall.c @@ -52,7 +52,7 @@ void syscall_register(int id, syscall handler) { extern void syscall_exit(int exit_code); -void syscall_init() { +void syscall_init() { for (int i = 0; i < 1024; i++) syscall_table[i] = (syscall)__syscall_undefined; diff --git a/kernel/src/sys/syscall.h b/kernel/src/sys/syscall.h index 1d0f3f0..d428af6 100644 --- a/kernel/src/sys/syscall.h +++ b/kernel/src/sys/syscall.h @@ -1,6 +1,6 @@ #pragma once -#include "arch//x86_64/idt.h" +#include "arch/x86_64/idt.h" #include /// A function that defines a system call. diff --git a/testing/sk-hello.elf b/testing/sk-hello.elf index 257f986d7fe37189320b805fea11bfba94db923b..f22be1c771bdd953f1f38c7cde5b0e4d328a78c7 100755 GIT binary patch delta 56 zcmcbi_&{-j2BX46O><681_<5b1_)r;m^qz)GOIwu3-5F8U}Rxn;AegPZ*nJNJ0tsKK_-6yx&{h( delta 31 lcmaFB@_=Q+0!EgJ3-5FCv%dbv00NUc8QU3|CJQq80|2#X39$eG