diff options
author | Danny Holman <dholman@gymli.org> | 2025-01-12 01:17:36 -0600 |
---|---|---|
committer | Danny Holman <dholman@gymli.org> | 2025-01-12 01:19:11 -0600 |
commit | 95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf (patch) | |
tree | c8c35347b50477929727fa5be9f5d0f55cbe18fd /kernel | |
parent | arch: i386: kmalloc: fix last element being ignored (diff) | |
download | box-95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf.tar.gz box-95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf.tar.zst box-95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf.zip |
PROJECT RESTRUCTURING
Move the entire kernel into its own directory. Create new directories
for system commands, libraries and other required essentials for a
complete Unix-like operating system.
Signed-off-by: Danny Holman <dholman@gymli.org>
Diffstat (limited to '')
-rw-r--r-- | kernel/arch/x86/include/kernel/asm.h (renamed from arch/i386/include/kernel/asm.h) | 15 | ||||
-rw-r--r-- | kernel/arch/x86/include/kernel/gdt.h (renamed from arch/i386/include/kernel/gdt.h) | 2 | ||||
-rw-r--r-- | kernel/arch/x86/include/kernel/idt.h (renamed from arch/i386/include/kernel/idt.h) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/include/kernel/paging.h (renamed from arch/i386/include/kernel/paging.h) | 1 | ||||
-rw-r--r-- | kernel/arch/x86/include/kernel/pic.h (renamed from arch/i386/include/kernel/pic.h) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/include/kernel/pmem.h (renamed from arch/i386/include/kernel/pmem.h) | 4 | ||||
-rw-r--r-- | kernel/arch/x86/include/kernel/syscall.h (renamed from arch/i386/include/kernel/syscall.h) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/include/kernel/timer.h (renamed from arch/i386/include/kernel/timer.h) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/include/kernel/vmem.h (renamed from arch/i386/include/kernel/vmem.h) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/gdt.c (renamed from arch/i386/kernel/gdt.c) | 14 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/idt.c (renamed from arch/i386/kernel/idt.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/kmalloc.c (renamed from arch/i386/kernel/kmalloc.c) | 2 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/multiboot.c (renamed from arch/i386/kernel/multiboot.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/paging.c (renamed from arch/i386/kernel/paging.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/pic.c (renamed from arch/i386/kernel/pic.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/pmem.c (renamed from arch/i386/kernel/pmem.c) | 21 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/serial.c (renamed from arch/i386/kernel/serial.c) | 0 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/syscall.c (renamed from arch/i386/kernel/syscall.c) | 4 | ||||
-rw-r--r-- | kernel/arch/x86/kernel/timer.c (renamed from arch/i386/kernel/timer.c) | 5 | ||||
-rw-r--r-- | kernel/core/interrupt.c (renamed from kernel/interrupt.c) | 1 | ||||
-rw-r--r-- | kernel/core/panic.c (renamed from kernel/panic.c) | 7 | ||||
-rw-r--r-- | kernel/core/sched.c (renamed from kernel/sched.c) | 0 | ||||
-rw-r--r-- | kernel/drivers/input/keyboard.c (renamed from drivers/input/keyboard.c) | 0 | ||||
-rw-r--r-- | kernel/drivers/video/framebuffer.c (renamed from drivers/video/framebuffer.c) | 0 | ||||
-rw-r--r-- | kernel/init.c | 35 | ||||
-rw-r--r-- | kernel/libk/io.c (renamed from libk/io.c) | 0 | ||||
-rw-r--r-- | kernel/libk/string.c (renamed from libk/string.c) | 0 |
27 files changed, 56 insertions, 55 deletions
diff --git a/arch/i386/include/kernel/asm.h b/kernel/arch/x86/include/kernel/asm.h index cc570c5..18f53c4 100644 --- a/arch/i386/include/kernel/asm.h +++ b/kernel/arch/x86/include/kernel/asm.h @@ -3,6 +3,7 @@ #include <kernel/gdt.h> #include <stdint.h> +#include <cpuid.h> #define PCI_CONFIG_ADDR 0xCF8 #define PCI_CONFIG_DATA 0xCFC @@ -47,6 +48,12 @@ struct isr_frame { uint32_t eflags; } __attribute__((packed)); +struct cpuid_info { + char vendorID[12]; + uint32_t feat_ecx; + uint32_t feat_edx; +}; + void isr_stub_0(void); void isr_stub_1(void); void isr_stub_2(void); @@ -99,12 +106,14 @@ void irq_stub_15(void); void isr_stub_128(void); -void aquire_lock(int *lock); -void release_lock(int *lock); - void enable_paging(uint32_t new_cr3); +int cpuid_check(void); void flush_gdt(void); +static inline void cpuid(int code, uint32_t *ecx, uint32_t *ebx) { + __asm__ volatile("cpuid" : "=a"(*ecx), "=d"(*ebx) : "a"(code) : "ecx","ebx"); +} + static inline void outb(uint16_t port, uint8_t value) { __asm__ volatile("outb %0, %1" : : "a"(value), "Nd"(port)); } diff --git a/arch/i386/include/kernel/gdt.h b/kernel/arch/x86/include/kernel/gdt.h index ec02719..aa05408 100644 --- a/arch/i386/include/kernel/gdt.h +++ b/kernel/arch/x86/include/kernel/gdt.h @@ -14,7 +14,7 @@ struct gdt_entry { struct gdt_ptr { uint16_t limit; - uint32_t base; + uint64_t base; } __attribute__((packed)); struct tss_entry { diff --git a/arch/i386/include/kernel/idt.h b/kernel/arch/x86/include/kernel/idt.h index 29ec39f..29ec39f 100644 --- a/arch/i386/include/kernel/idt.h +++ b/kernel/arch/x86/include/kernel/idt.h diff --git a/arch/i386/include/kernel/paging.h b/kernel/arch/x86/include/kernel/paging.h index d8bb8f3..3a3c298 100644 --- a/arch/i386/include/kernel/paging.h +++ b/kernel/arch/x86/include/kernel/paging.h @@ -2,7 +2,6 @@ #define I386_PAGING_H #include <kernel/asm.h> -#include <kernel/multiboot.h> #include <stdint.h> #define PAGE_SIZE 4096 diff --git a/arch/i386/include/kernel/pic.h b/kernel/arch/x86/include/kernel/pic.h index 187d553..187d553 100644 --- a/arch/i386/include/kernel/pic.h +++ b/kernel/arch/x86/include/kernel/pic.h diff --git a/arch/i386/include/kernel/pmem.h b/kernel/arch/x86/include/kernel/pmem.h index e6e4f57..ea4fe29 100644 --- a/arch/i386/include/kernel/pmem.h +++ b/kernel/arch/x86/include/kernel/pmem.h @@ -1,7 +1,6 @@ #ifndef I386_PMEM_H #define I386_PMEM_H -#include <kernel/multiboot.h> #include <stdint.h> #include <stddef.h> @@ -11,6 +10,9 @@ struct pfa_page { void pfa_init(struct mboot_info *header); +uintptr_t pfa_alloc_dma(size_t num_pages); +uintptr_t pfa_alloc(size_t num_pages); + void pfa_free_dma(uintptr_t paddr, size_t num_pages); void pfa_free(uintptr_t paddr, size_t num_pages); diff --git a/arch/i386/include/kernel/syscall.h b/kernel/arch/x86/include/kernel/syscall.h index a657527..a657527 100644 --- a/arch/i386/include/kernel/syscall.h +++ b/kernel/arch/x86/include/kernel/syscall.h diff --git a/arch/i386/include/kernel/timer.h b/kernel/arch/x86/include/kernel/timer.h index c0b3a73..c0b3a73 100644 --- a/arch/i386/include/kernel/timer.h +++ b/kernel/arch/x86/include/kernel/timer.h diff --git a/arch/i386/include/kernel/vmem.h b/kernel/arch/x86/include/kernel/vmem.h index 94aa32d..94aa32d 100644 --- a/arch/i386/include/kernel/vmem.h +++ b/kernel/arch/x86/include/kernel/vmem.h diff --git a/arch/i386/kernel/gdt.c b/kernel/arch/x86/kernel/gdt.c index 0d9e1d2..57424aa 100644 --- a/arch/i386/kernel/gdt.c +++ b/kernel/arch/x86/kernel/gdt.c @@ -18,7 +18,7 @@ void gdt_set_gate(int num, uint32_t base, uint32_t limit, uint8_t access, uint8_ } void write_tss(int num, uint32_t ss0, uint32_t esp0) { - uint32_t base = (uint32_t)&tss_entry; + uint64_t base = (uint64_t)&tss_entry; uint32_t limit = base + sizeof(struct tss_entry); gdt_set_gate(num, base, limit, 0x89, 0x00); @@ -35,13 +35,9 @@ void write_tss(int num, uint32_t ss0, uint32_t esp0) { tss_entry.iomap_base = sizeof(tss_entry); } -void set_kernel_esp(uint32_t esp) { - tss_entry.esp0 = esp; -} - void gdt_install(void) { gp.limit = (sizeof(struct gdt_entry) * 6) - 1; - gp.base = (uint32_t)&desc; + gp.base = (uint64_t)&desc; gdt_set_gate(0, 0, 0, 0, 0); gdt_set_gate(1, 0, 0xFFFFF, 0x9A, 0xCF); @@ -49,9 +45,9 @@ void gdt_install(void) { gdt_set_gate(3, 0, 0xFFFFF, 0xFA, 0xCF); gdt_set_gate(4, 0, 0xFFFFF, 0xF2, 0xCF); - uint32_t esp; - __asm__ volatile("movl %%esp, %0" : "=r"(esp)); - write_tss(5, 0x10, esp); + uint64_t rsp; + __asm__ volatile("movq %%rsp, %0" : "=r"(rsp)); + write_tss(5, 0x10, rsp); flush_gdt(); flush_tss(); diff --git a/arch/i386/kernel/idt.c b/kernel/arch/x86/kernel/idt.c index a178801..a178801 100644 --- a/arch/i386/kernel/idt.c +++ b/kernel/arch/x86/kernel/idt.c diff --git a/arch/i386/kernel/kmalloc.c b/kernel/arch/x86/kernel/kmalloc.c index ea77428..9e5254c 100644 --- a/arch/i386/kernel/kmalloc.c +++ b/kernel/arch/x86/kernel/kmalloc.c @@ -56,6 +56,8 @@ void* kmalloc(size_t sz) { } void kfree(void *ptr) { + if (ptr == NULL) + return; struct mem_block *temp = first; while (temp != NULL) { if (temp->start == (uintptr_t)ptr) { diff --git a/arch/i386/kernel/multiboot.c b/kernel/arch/x86/kernel/multiboot.c index dedf163..dedf163 100644 --- a/arch/i386/kernel/multiboot.c +++ b/kernel/arch/x86/kernel/multiboot.c diff --git a/arch/i386/kernel/paging.c b/kernel/arch/x86/kernel/paging.c index a0bbb92..a0bbb92 100644 --- a/arch/i386/kernel/paging.c +++ b/kernel/arch/x86/kernel/paging.c diff --git a/arch/i386/kernel/pic.c b/kernel/arch/x86/kernel/pic.c index 0d29473..0d29473 100644 --- a/arch/i386/kernel/pic.c +++ b/kernel/arch/x86/kernel/pic.c diff --git a/arch/i386/kernel/pmem.c b/kernel/arch/x86/kernel/pmem.c index 40e3400..edf71d9 100644 --- a/arch/i386/kernel/pmem.c +++ b/kernel/arch/x86/kernel/pmem.c @@ -6,6 +6,7 @@ #include <libk/io.h> #include <libk/string.h> +static uintptr_t bitmap[5]; static struct pfa_page freelist; void pfa_init(struct mboot_info *header) { @@ -17,6 +18,9 @@ void pfa_init(struct mboot_info *header) { } } +uintptr_t pfa_alloc_dma(size_t num_pages) { +} + uintptr_t pfa_alloc(size_t num_pages) { struct pfa_page *temp = (struct pfa_page*)PAGE_TMP_MAP; map_page(freelist.next, PAGE_TMP_MAP, PD_PRES | PD_RW); @@ -27,6 +31,23 @@ uintptr_t pfa_alloc(size_t num_pages) { return ret; } +void pfa_free_dma(uintptr_t paddr, size_t num_pages) { + if (paddr % PAGE_SIZE != 0) + panic("Task attempted to free non-aligned memory"); + if (paddr >= KSTART && paddr < KEND) + return; + if (paddr >= 0x00080000 && paddr < 0x00100000) + return; + + int index = 0; + int bit = 0; + for (uintptr_t i = paddr; i < paddr + (num_pages * PAGE_SIZE); i += PAGE_SIZE) { + index = i / PAGE_SIZE / 32; + bit = i / PAGE_SIZE % 32; + bitmap[index] |= 1 << bit; + } +} + void pfa_free(uintptr_t paddr, size_t num_pages) { uintptr_t addr; struct pfa_page *temp = (struct pfa_page*)PAGE_TMP_MAP; diff --git a/arch/i386/kernel/serial.c b/kernel/arch/x86/kernel/serial.c index dc2a8bd..dc2a8bd 100644 --- a/arch/i386/kernel/serial.c +++ b/kernel/arch/x86/kernel/serial.c diff --git a/arch/i386/kernel/syscall.c b/kernel/arch/x86/kernel/syscall.c index 200af4f..1fa73e9 100644 --- a/arch/i386/kernel/syscall.c +++ b/kernel/arch/x86/kernel/syscall.c @@ -19,7 +19,7 @@ void handle_syscall(struct isr_frame *frame) { sys_write(frame); break; default: - panic("Invalid system call number"); + kprintf("Invalid system call number %d\n", frame->eax); + break; } - return 0; } diff --git a/arch/i386/kernel/timer.c b/kernel/arch/x86/kernel/timer.c index a7d88dd..bd57cc2 100644 --- a/arch/i386/kernel/timer.c +++ b/kernel/arch/x86/kernel/timer.c @@ -8,8 +8,9 @@ void timer_handler(struct isr_frame *frame) { num_ticks++; if (num_ticks == 3) { num_ticks = 0; - schedule_next(); + //schedule_next(); } + pic_eoi(frame->isr_vector-32); } void timer_init(void) { @@ -20,5 +21,5 @@ void timer_init(void) { outb(0x40, divisor && 0xFF00 >> 8); enable_ints(); - register_irq_handler(0, timer_handler); + //register_isr_handler(32, timer_handler); } diff --git a/kernel/interrupt.c b/kernel/core/interrupt.c index 9639aea..6d9e69d 100644 --- a/kernel/interrupt.c +++ b/kernel/core/interrupt.c @@ -1,4 +1,5 @@ #include <kernel/interrupt.h> +#include <kernel/panic.h> #include <kernel/asm.h> static void (*isr_handlers[MAX_ISR])(struct isr_frame *frame); diff --git a/kernel/panic.c b/kernel/core/panic.c index 65279f0..a44a73c 100644 --- a/kernel/panic.c +++ b/kernel/core/panic.c @@ -1,8 +1,10 @@ #include <kernel/panic.h> +#include <kernel/spinlock.h> #include <libk/io.h> #include <stdint.h> #include <stddef.h> +static struct spinlock panic_lock = {0}; static int panicked = 0; void walk_stack(uintptr_t *addrs, size_t n); @@ -19,8 +21,11 @@ void stack_trace(void) { } void panic(const char *str) { + disable_ints(); + spin_lock(&panic_lock); panicked = 1; - kprintf("KERNEL PANIC: %s\n", str); + spin_unlock(&panic_lock); + kprintf("KERNEL PANIC - NOT SYNCING: %s\n", str); stack_trace(); while (1); } diff --git a/kernel/sched.c b/kernel/core/sched.c index b6096da..b6096da 100644 --- a/kernel/sched.c +++ b/kernel/core/sched.c diff --git a/drivers/input/keyboard.c b/kernel/drivers/input/keyboard.c index f2a8eba..f2a8eba 100644 --- a/drivers/input/keyboard.c +++ b/kernel/drivers/input/keyboard.c diff --git a/drivers/video/framebuffer.c b/kernel/drivers/video/framebuffer.c index 3df3df4..3df3df4 100644 --- a/drivers/video/framebuffer.c +++ b/kernel/drivers/video/framebuffer.c diff --git a/kernel/init.c b/kernel/init.c deleted file mode 100644 index d4a3638..0000000 --- a/kernel/init.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <libk/io.h> -#include <libk/string.h> -#include <libk/kmalloc.h> -#include <kernel/sched.h> -#include <kernel/kthread.h> -#include <kernel/pci.h> -#include <kernel/serial.h> - -void jump_userspace(void); - -char rootfs[1024]; -char init_bin[1024]; -int gdbstub = 0; - -void process_cmd(char *cmdline) { - char *token = strtok(cmdline, " "); - while (token != NULL) { - if (strncmp(token, "root=", 5) == 0) - strcpy(rootfs, &token[5]); - if (strncmp(token, "init=", 5) == 0) - strcpy(init_bin, &token[5]); - if (strncmp(token, "gdb", 3) == 0) - gdbstub = 1; - token = strtok(NULL, " "); - } -} - -void kernel_main(char *cmdline) { - kprintf("Box kernel version %s\n", VERSION); - process_cmd(cmdline); - - serial_init(); - sched_init(); - //pci_check_buses(); -} diff --git a/libk/io.c b/kernel/libk/io.c index eedc171..eedc171 100644 --- a/libk/io.c +++ b/kernel/libk/io.c diff --git a/libk/string.c b/kernel/libk/string.c index be59397..be59397 100644 --- a/libk/string.c +++ b/kernel/libk/string.c |