From a783cc865f1f261c20f6ef55cb37d4839f519865 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Tue, 15 Sep 2026 10:03:20 -0400 Subject: move constants to api. centralize interrupts. fix rootdir lock hang --- Makefile | 9 +- api/init.h | 18 +++ api/obj.h | 3 +- arch/x86_64/hal/idt.c | 20 ++- arch/x86_64/hal/idt.h | 7 + arch/x86_64/hal/idt_entries.s | 9 +- arch/x86_64/hal/obj.c | 1 + arch/x86_64/hal/obj.h | 36 ----- arch/x86_64/hal/paging.c | 4 +- arch/x86_64/hal/process.c | 4 +- arch/x86_64/main.c | 15 +- arch/x86_64/sys/init.c | 1 + compile_commands.json | 314 ++++++++++++++++++++++++++++++++++++++++++ hal/memory.h | 2 +- hal/obj.h | 37 +++++ hal/uacpi.c | 33 +++++ hal/uacpi.h | 6 + init.h | 14 +- sys/syscall.c | 3 +- 19 files changed, 465 insertions(+), 71 deletions(-) create mode 100644 api/init.h create mode 100644 hal/uacpi.h diff --git a/Makefile b/Makefile index 33af30f..237843f 100644 --- a/Makefile +++ b/Makefile @@ -26,12 +26,13 @@ INCDIR := $(OUT)/usr/include/kernel all: $(BIN) -headers: +headers: $(INCDIR) + -$(foreach dir,$(CDIRS),cp -p $(dir)/*.h $(INCDIR)/$(dir)/;) + -$(foreach dir,$(CDIRS),cp -p arch/$(TARGET_MACHINE)/$(dir)/*.h $(INCDIR)/arch/$(dir)/;) + +$(INCDIR): mkdir -p $(INCDIR) -$(foreach dir,$(CDIRS),mkdir -p $(INCDIR)/$(dir) $(INCDIR)/arch/$(dir)/;) - -cp *.h $(INCDIR)/ - -$(foreach dir,$(CDIRS),cp $(dir)/*.h $(INCDIR)/$(dir)/;) - -$(foreach dir,$(CDIRS),cp arch/$(TARGET_MACHINE)/$(dir)/*.h $(INCDIR)/arch/$(dir)/;) $(BIN): ${OBJFILES} $(LD) $(LDFLAGS) ${OBJFILES} -o $(BIN) diff --git a/api/init.h b/api/init.h new file mode 100644 index 0000000..a7de43f --- /dev/null +++ b/api/init.h @@ -0,0 +1,18 @@ +#ifndef _JOVE_API_INIT_H +#define _JOVE_API_INIT_H 1 + +#define ROOTDIR_PROCESSORS_I 0x0 +#define ROOTDIR_PAGEDIR_I 0x01 +#define ROOTDIR_UNTYPED_I 0x02 +#define ROOTDIR_PCB_I 0x03 +#define ROOTDIR_IOPB_I 0x04 +#define ROOTDIR_ACPI_I 0x05 +#define ROOTDIR_INTERRUPTS_I 0x06 +#define ROOTDIR_INITRD_I 0x07 +#define ROOTDIR_MESSAGE_I 0x08 + +#define ROOTDIR_SERIAL_COM_I 0x80 +#define ROOTDIR_FRAMEBUFFER_I 0x81 +#define ROOTDIR_VIRTTERM_I 0x82 + +#endif diff --git a/api/obj.h b/api/obj.h index 64171a2..10f7b65 100644 --- a/api/obj.h +++ b/api/obj.h @@ -10,8 +10,9 @@ enum JOVE_OBJ_OBJDIR, JOVE_OBJ_PAGEDIR, JOVE_OBJ_PROCESSOR, + JOVE_OBJ_ACPI_TABLE, + JOVE_OBJ_INT_HANDLE, JOVE_OBJ_PROCESS, - JOVE_OBJ_PAGEFRAME, JOVE_OBJ_INITRD_FILE, JOVE_OBJ_FRAMEBUFFER, JOVE_OBJ_VIRTTERM, diff --git a/arch/x86_64/hal/idt.c b/arch/x86_64/hal/idt.c index b2251bd..235d8c6 100644 --- a/arch/x86_64/hal/idt.c +++ b/arch/x86_64/hal/idt.c @@ -3,6 +3,7 @@ #include "gdt.h" #include "jove.h" #include "lib/printf.h" +#include "lib/string.h" ALIGN(8) static struct idt_entry s_idt[IDT_ENTRIES]; @@ -11,7 +12,9 @@ typedef void (*isr_t)(void); extern isr_t __isrs[IDT_ENTRIES]; typedef struct int_stackframe *(*int_handler_t)(struct int_stackframe*); -int_handler_t __int_handles[IDT_ENTRIES]; +int_handler_t __int_kernel_handles[IDT_ENTRIES]; + +struct int_user_handle __int_user_handles[IDT_ENTRIES]; static struct int_stackframe* s_int_handle_stub(struct int_stackframe* frame) @@ -20,9 +23,22 @@ s_int_handle_stub(struct int_stackframe* frame) hcf(); } +struct int_stackframe* +__int_handle_body(struct int_stackframe *frame) +{ + frame = __int_kernel_handles[frame->int_num](frame); + + struct int_user_handle *usr_handle = &__int_user_handles[frame->int_num]; + if(usr_handle->pid == 0) return frame; + + kprintf("TODO: Handle user interrupt switching\n"); + return frame; +} + void idt_init(void) { + memset(__int_user_handles, 0, sizeof(struct int_user_handle) * IDT_ENTRIES); for(size_t i = 0; i < IDT_ENTRIES; i++) { uintptr_t isr = (uintptr_t)(__isrs[i]); @@ -37,7 +53,7 @@ idt_init(void) .offset_32_63 = (uint32_t)(isr >> 32) }; - __int_handles[i] = s_int_handle_stub; + __int_kernel_handles[i] = s_int_handle_stub; } } diff --git a/arch/x86_64/hal/idt.h b/arch/x86_64/hal/idt.h index 961e720..2aa759b 100644 --- a/arch/x86_64/hal/idt.h +++ b/arch/x86_64/hal/idt.h @@ -63,4 +63,11 @@ struct int_stackframe #define IDT_EXCEPT_VE 20 #define IDT_EXCEPT_CP 21 +struct int_user_handle +{ + uintmax_t pid; + void *handle; +}; +extern struct int_user_handle __int_user_handles[IDT_ENTRIES]; + #endif diff --git a/arch/x86_64/hal/idt_entries.s b/arch/x86_64/hal/idt_entries.s index 204fa93..0bed23d 100644 --- a/arch/x86_64/hal/idt_entries.s +++ b/arch/x86_64/hal/idt_entries.s @@ -42,18 +42,15 @@ 1: .endm -.extern __int_handles +.extern __int_handle_body .type __isr_header @function __isr_header: push_state cld movq %rsp, %rdi - -isr_break: - movq 0x78(%rdi), %rax - movq __int_handles(,%rax,8), %rbx - call %rbx + call __int_handle_body + movq %rax, %rsp pop_state addq $16, %rsp diff --git a/arch/x86_64/hal/obj.c b/arch/x86_64/hal/obj.c index b8924a6..af0491a 100644 --- a/arch/x86_64/hal/obj.c +++ b/arch/x86_64/hal/obj.c @@ -1,5 +1,6 @@ #include "obj.h" #include "arch/x86_64/lock.h" +#include "lib/printf.h" #include "paging.h" #include "hal/obj.h" #include "jove.h" diff --git a/arch/x86_64/hal/obj.h b/arch/x86_64/hal/obj.h index 8955a55..deea2be 100644 --- a/arch/x86_64/hal/obj.h +++ b/arch/x86_64/hal/obj.h @@ -36,40 +36,4 @@ typedef struct jove_locked_obj #define JOVE_OBJDIR_SIZE 0x1000 #define JOVE_OBJDIR_ENTRIES (JOVE_OBJDIR_SIZE / sizeof(jove_obj_t)) -typedef struct jove_objdir -{ - jove_obj_t entries[JOVE_OBJDIR_ENTRIES]; -} jove_objdir_t; -/*Locks the mutex of the kernel object provided. Returns the locked version. */ -jove_owned_obj_t *obj_take(jove_obj_t *obj); -/*Unlocks the mutex of the kernel object provided. Returns the unlocked version. */ -jove_obj_t *obj_release(jove_owned_obj_t *obj); - -/*Converts the value pointer of the object into a pointer to kernel memory.*/ -void *obj_deref(jove_owned_obj_t *obj); - -/*Getters and setters for accessing the type field of the kernel object. */ -uint8_t obj_gettype(jove_owned_obj_t *obj); -uint8_t obj_peektype(jove_obj_t obj); -void obj_settype(jove_owned_obj_t *obj, uint8_t type); - -/*Getters and setters for accessing the value field of the kernel object. */ -uintmax_t obj_getvalue(jove_owned_obj_t *obj); -void obj_setvalue(jove_owned_obj_t *obj, uintmax_t value); - -/*Returns the n'th entry of the object directory passed. - * If the passed object is not an objdir, returns NULL and sets errno to EBADOBJ. - * If the passed entry index is out of bounds, returns NULL and sets errno to EOOB.*/ -jove_owned_obj_t *objdir_getlocal(jove_owned_obj_t *objdir_obj, uint16_t entry); -jove_obj_t objdir_peeklocal(jove_owned_obj_t *objdir_obj, uint16_t entry); - -/*Recursively seeks through an object directory for an object following the passed - * path variable. - * If the path length is zero, returns the passed object. - * If the passed object is not an objdir, returns NULL and sets errno to EBADOBJ. - * If any object excluding the object at the end of the path is not an objdir, - * returns NULL and sets errno to EBADOBJ. - * If any entry in the path is out of bounds, returns NULL and sets errno to EBADOBJ.*/ -jove_owned_obj_t *objdir_getobj(jove_owned_obj_t *objdir_obj, const uint16_t *path, size_t path_len); - #endif diff --git a/arch/x86_64/hal/paging.c b/arch/x86_64/hal/paging.c index 507dfce..7b45005 100644 --- a/arch/x86_64/hal/paging.c +++ b/arch/x86_64/hal/paging.c @@ -251,6 +251,6 @@ paging_pml4_init(void) /*Before tasking, if the kernel has a bug and crashes we need some * information about what happened.*/ - extern struct int_stackframe *(*__int_handles[])(struct int_stackframe*); - __int_handles[IDT_EXCEPT_PF] = s_int_handle_pf_early; + extern struct int_stackframe *(*__int_kernel_handles[])(struct int_stackframe*); + __int_kernel_handles[IDT_EXCEPT_PF] = s_int_handle_pf_early; } diff --git a/arch/x86_64/hal/process.c b/arch/x86_64/hal/process.c index c766a28..0155919 100644 --- a/arch/x86_64/hal/process.c +++ b/arch/x86_64/hal/process.c @@ -49,15 +49,15 @@ processing_setup(void (*process_main)) s_init_pcb->pid = 1; s_init_pcb->ksp = (void*)ksp; s_init_pcb->pml4 = paging_get_pml4(); - s_init_pcb->rootdir = obj_take(_rootdir_obj); + s_init_pcb->rootdir = _rootdir_obj; jove_owned_obj_t *iopb_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_IOPB_I); obj_settype(iopb_obj, JOVE_OBJ_IOPB); obj_setvalue(iopb_obj, (uintptr_t)s_init_iopb); + s_init_pcb->iopb = iopb_obj; processor_t *proc = processor_current(); proc->tss.rsp[0] = (uintptr_t)s_init_pcb->ksp; - memcpy(proc->iopb, s_init_iopb, 0x2000); { diff --git a/arch/x86_64/main.c b/arch/x86_64/main.c index d688fa0..7266155 100644 --- a/arch/x86_64/main.c +++ b/arch/x86_64/main.c @@ -1,5 +1,6 @@ #include "jove.h" #include "init.h" +#include "lib/string.h" #include "lib/printf.h" #include "lib/virtterm.h" #include "lib/panic.h" @@ -10,21 +11,28 @@ #include "hal/memory.h" #include "hal/framebuffer.h" #include "hal/process.h" +#include "hal/uacpi.h" #include "boot/initrd.h" #include "boot/cmdline.h" #include "uacpi/uacpi.h" int errno = 0; -PAGEALIGN jove_objdir_t _rootdir = { 0 }; +PAGEALIGN jove_objdir_t _rootdir; -void *_rootdir_obj = &_rootdir; +jove_owned_obj_t s_rootdir_obj; +void *_rootdir_obj = &s_rootdir_obj; static void kernel_process_entry(void); void kernel_entry(void) { + memset(&_rootdir, 0, 0x1000); + obj_take(_rootdir_obj); + obj_settype(_rootdir_obj, JOVE_OBJ_OBJDIR); + obj_setvalue(_rootdir_obj, (uintptr_t)&_rootdir); + msr_enable_sse(); obj_settype(_rootdir_obj, JOVE_OBJ_OBJDIR); @@ -49,8 +57,7 @@ kernel_entry(void) static void kernel_process_entry(void) { - uint8_t uacpi_buffer[1024]; - uacpi_setup_early_table_access(uacpi_buffer, 1024); + uacpi_kernel_init(); init_setup(); kpanic("Reached the end of kernel main!\n"); diff --git a/arch/x86_64/sys/init.c b/arch/x86_64/sys/init.c index 681ba09..8823df2 100644 --- a/arch/x86_64/sys/init.c +++ b/arch/x86_64/sys/init.c @@ -154,6 +154,7 @@ init_setup(void) uintptr_t message_pptr = init_program_pml0_pptr + (last_page << 12); s_init_program_pml1[last_page].value = message_pptr | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_USER | PAGE_XD; + jove_owned_obj_t *message_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_MESSAGE_I); obj_settype(message_obj, JOVE_OBJ_MESSAGE); obj_setvalue(message_obj, (message_pptr & ~0xFFF) | 1); diff --git a/compile_commands.json b/compile_commands.json index 38155e3..e401f56 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -12,10 +12,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "main.c", @@ -38,10 +42,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/lock.c", @@ -64,10 +72,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/main.c", @@ -90,10 +102,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/x86_64.c", @@ -116,10 +132,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "boot/cmdline.c", @@ -142,10 +162,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "boot/initrd.c", @@ -168,10 +192,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "lib/panic.c", @@ -194,10 +222,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "lib/printf.c", @@ -220,10 +252,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "lib/psf.c", @@ -246,10 +282,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "lib/string.c", @@ -272,10 +312,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "lib/tar.c", @@ -298,10 +342,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "lib/virtterm.c", @@ -324,10 +372,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "hal/uacpi.c", @@ -350,10 +402,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "hal/untyped.c", @@ -376,10 +432,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "sys/link.c", @@ -402,10 +462,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "sys/message.c", @@ -428,10 +492,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "sys/syscall.c", @@ -454,10 +522,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "sys/syscall_objdir.c", @@ -467,6 +539,36 @@ "directory": "/home/jon/prg/jove/kernel", "output": "sys/syscall_objdir.o" }, + { + "file": "sys/syscall_pagedir.c", + "arguments": [ + "x86_64-elf-gcc", + "-ffreestanding", + "-fno-pie", + "-fno-pic", + "-g", + "-MD", + "-D__x86_64__", + "-D__limine__", + "-Iinclude", + "-I.", + "-march=x86-64", + "-m64", + "-mno-red-zone", + "-mno-mmx", + "-mcmodel=kernel", + "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", + "-Iuacpi/include", + "-c", + "sys/syscall_pagedir.c", + "-o", + "sys/syscall_pagedir.o" + ], + "directory": "/home/jon/prg/jove/kernel", + "output": "sys/syscall_pagedir.o" + }, { "file": "sys/syscall_untyped.c", "arguments": [ @@ -480,10 +582,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "sys/syscall_untyped.c", @@ -506,10 +612,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "sys/syscall_vtt.c", @@ -532,10 +642,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "boot/limine/framebuffer.c", @@ -558,10 +672,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "boot/limine/memorymap.c", @@ -584,10 +702,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "boot/limine/start.c", @@ -597,6 +719,36 @@ "directory": "/home/jon/prg/jove/kernel", "output": "boot/limine/start.o" }, + { + "file": "boot/limine/uacpi.c", + "arguments": [ + "x86_64-elf-gcc", + "-ffreestanding", + "-fno-pie", + "-fno-pic", + "-g", + "-MD", + "-D__x86_64__", + "-D__limine__", + "-Iinclude", + "-I.", + "-march=x86-64", + "-m64", + "-mno-red-zone", + "-mno-mmx", + "-mcmodel=kernel", + "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", + "-Iuacpi/include", + "-c", + "boot/limine/uacpi.c", + "-o", + "boot/limine/uacpi.o" + ], + "directory": "/home/jon/prg/jove/kernel", + "output": "boot/limine/uacpi.o" + }, { "file": "arch/x86_64/lib/printf.c", "arguments": [ @@ -610,10 +762,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/lib/printf.c", @@ -636,10 +792,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/hal/gdt.c", @@ -662,10 +822,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/hal/idt.c", @@ -688,10 +852,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/hal/msr.c", @@ -714,10 +882,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/hal/obj.c", @@ -740,10 +912,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/hal/paging.c", @@ -766,10 +942,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/hal/process.c", @@ -792,10 +972,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/hal/serial_com.c", @@ -818,10 +1002,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/hal/smp.c", @@ -831,6 +1019,36 @@ "directory": "/home/jon/prg/jove/kernel", "output": "arch/x86_64/hal/smp.o" }, + { + "file": "arch/x86_64/hal/uacpi.c", + "arguments": [ + "x86_64-elf-gcc", + "-ffreestanding", + "-fno-pie", + "-fno-pic", + "-g", + "-MD", + "-D__x86_64__", + "-D__limine__", + "-Iinclude", + "-I.", + "-march=x86-64", + "-m64", + "-mno-red-zone", + "-mno-mmx", + "-mcmodel=kernel", + "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", + "-Iuacpi/include", + "-c", + "arch/x86_64/hal/uacpi.c", + "-o", + "arch/x86_64/hal/uacpi.o" + ], + "directory": "/home/jon/prg/jove/kernel", + "output": "arch/x86_64/hal/uacpi.o" + }, { "file": "arch/x86_64/sys/init.c", "arguments": [ @@ -844,10 +1062,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/sys/init.c", @@ -870,10 +1092,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/sys/link.c", @@ -896,10 +1122,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/sys/serial.c", @@ -922,10 +1152,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/sys/syscall.c", @@ -948,10 +1182,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "arch/x86_64/boot/limine/framebuffer.c", @@ -974,10 +1212,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/default_handlers.c", @@ -1000,10 +1242,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/event.c", @@ -1026,10 +1272,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/interpreter.c", @@ -1052,10 +1302,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/io.c", @@ -1078,10 +1332,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/mutex.c", @@ -1104,10 +1362,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/namespace.c", @@ -1130,10 +1392,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/notify.c", @@ -1156,10 +1422,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/opcodes.c", @@ -1182,10 +1452,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/opregion.c", @@ -1208,10 +1482,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/osi.c", @@ -1234,10 +1512,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/registers.c", @@ -1260,10 +1542,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/resources.c", @@ -1286,10 +1572,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/shareable.c", @@ -1312,10 +1602,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/sleep.c", @@ -1338,10 +1632,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/stdlib.c", @@ -1364,10 +1662,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/tables.c", @@ -1390,10 +1692,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/types.c", @@ -1416,10 +1722,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/uacpi.c", @@ -1442,10 +1752,14 @@ "-D__limine__", "-Iinclude", "-I.", + "-march=x86-64", "-m64", "-mno-red-zone", + "-mno-mmx", "-mcmodel=kernel", "-mfsgsbase", + "-DUACPI_BAREBONES_MODE", + "-DUACPI_FORMATTED_LOGGING", "-Iuacpi/include", "-c", "uacpi/source/utilities.c", diff --git a/hal/memory.h b/hal/memory.h index ca021ef..f1cf9db 100644 --- a/hal/memory.h +++ b/hal/memory.h @@ -1,7 +1,7 @@ #ifndef _JOVE_HAL_MEMORY_H #define _JOVE_HAL_MEMORY_H 1 -#include "obj.h" +#include "hal/obj.h" #include "api/syscall.h" typedef struct jove_obj_untyped diff --git a/hal/obj.h b/hal/obj.h index 7a6ab76..151f4eb 100644 --- a/hal/obj.h +++ b/hal/obj.h @@ -9,4 +9,41 @@ #include "arch/x86_64/hal/obj.h" #endif +typedef struct jove_objdir +{ + jove_obj_t entries[JOVE_OBJDIR_ENTRIES]; +} jove_objdir_t; + +/*Locks the mutex of the kernel object provided. Returns the locked version. */ +jove_owned_obj_t *obj_take(jove_obj_t *obj); +/*Unlocks the mutex of the kernel object provided. Returns the unlocked version. */ +jove_obj_t *obj_release(jove_owned_obj_t *obj); + +/*Converts the value pointer of the object into a pointer to kernel memory.*/ +void *obj_deref(jove_owned_obj_t *obj); + +/*Getters and setters for accessing the type field of the kernel object. */ +uint8_t obj_gettype(jove_owned_obj_t *obj); +uint8_t obj_peektype(jove_obj_t obj); +void obj_settype(jove_owned_obj_t *obj, uint8_t type); + +/*Getters and setters for accessing the value field of the kernel object. */ +uintmax_t obj_getvalue(jove_owned_obj_t *obj); +void obj_setvalue(jove_owned_obj_t *obj, uintmax_t value); + +/*Returns the n'th entry of the object directory passed. + * If the passed object is not an objdir, returns NULL and sets errno to EBADOBJ. + * If the passed entry index is out of bounds, returns NULL and sets errno to EOOB.*/ +jove_owned_obj_t *objdir_getlocal(jove_owned_obj_t *objdir_obj, uint16_t entry); +jove_obj_t objdir_peeklocal(jove_owned_obj_t *objdir_obj, uint16_t entry); + +/*Recursively seeks through an object directory for an object following the passed + * path variable. + * If the path length is zero, returns the passed object. + * If the passed object is not an objdir, returns NULL and sets errno to EBADOBJ. + * If any object excluding the object at the end of the path is not an objdir, + * returns NULL and sets errno to EBADOBJ. + * If any entry in the path is out of bounds, returns NULL and sets errno to EBADOBJ.*/ +jove_owned_obj_t *objdir_getobj(jove_owned_obj_t *objdir_obj, const uint16_t *path, size_t path_len); + #endif diff --git a/hal/uacpi.c b/hal/uacpi.c index 0af50b2..5aea792 100644 --- a/hal/uacpi.c +++ b/hal/uacpi.c @@ -1,5 +1,11 @@ +#include "arch/x86_64/hal/obj.h" +#include "init.h" #include "uacpi/uacpi.h" #include "lib/printf.h" +#include "uacpi/tables.h" +#include + +jove_objdir_t s_acpi_objdir = { 0 }; void uacpi_kernel_log(uacpi_log_level lvl, const uacpi_char* fmt, ...) { @@ -11,3 +17,30 @@ void uacpi_kernel_log(uacpi_log_level lvl, const uacpi_char* fmt, ...) va_end(ap); } +void +uacpi_kernel_init(void) +{ + uint8_t uacpi_buffer[1024]; + uacpi_setup_early_table_access(uacpi_buffer, 1024); + + jove_owned_obj_t *acpi_objdir_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_ACPI_I); + obj_settype(acpi_objdir_obj, JOVE_OBJ_OBJDIR); + obj_setvalue(acpi_objdir_obj, (uintptr_t)&s_acpi_objdir); + + size_t num_tables = uacpi_table_count(); + for(size_t i = 0; i < num_tables; i++) { + uacpi_table table; + uacpi_status get_res = uacpi_table_get_by_index(i, &table); + + if(get_res != UACPI_STATUS_OK) { + kprintf("uacpi: Failed to get table %i with code %s\n", i, uacpi_status_to_string(get_res)); + continue; + } + + jove_owned_obj_t *table_obj = objdir_getlocal(acpi_objdir_obj, i); + obj_settype(table_obj, JOVE_OBJ_ACPI_TABLE); + obj_setvalue(table_obj, table.virt_addr); + obj_release(table_obj); + } + obj_release(acpi_objdir_obj); +} diff --git a/hal/uacpi.h b/hal/uacpi.h new file mode 100644 index 0000000..a3790c0 --- /dev/null +++ b/hal/uacpi.h @@ -0,0 +1,6 @@ +#ifndef _JOVE_UACPI_H +#define _JOVE_UACPI_H 1 + +void uacpi_kernel_init(void); + +#endif diff --git a/init.h b/init.h index db8a4a6..b80d1fa 100644 --- a/init.h +++ b/init.h @@ -1,19 +1,9 @@ #ifndef _JOVE_INIT_H #define _JOVE_INIT_H 1 -extern void *_rootdir_obj; - -#define ROOTDIR_PROCESSORS_I 0x0 -#define ROOTDIR_PAGEDIR_I 0x01 -#define ROOTDIR_UNTYPED_I 0x02 -#define ROOTDIR_PCB_I 0x03 -#define ROOTDIR_IOPB_I 0x04 -#define ROOTDIR_INITRD_I 0x05 -#define ROOTDIR_MESSAGE_I 0x06 +#include "api/init.h" -#define ROOTDIR_SERIAL_COM_I 0x80 -#define ROOTDIR_FRAMEBUFFER_I 0x81 -#define ROOTDIR_VIRTTERM_I 0x82 +extern void *_rootdir_obj; void init_setup(void); diff --git a/sys/syscall.c b/sys/syscall.c index eb2874d..0351c95 100644 --- a/sys/syscall.c +++ b/sys/syscall.c @@ -45,7 +45,8 @@ static const syscall_handle_t s_syscall_handles[128] = { [JOVE_OBJ_PAGEDIR] = _syscall_handle_generic, [JOVE_OBJ_PROCESSOR] = _syscall_handle_generic, [JOVE_OBJ_PROCESS] = _syscall_handle_generic, - [JOVE_OBJ_PAGEFRAME] = _syscall_handle_generic, + [JOVE_OBJ_ACPI_TABLE] = _syscall_handle_generic, + [JOVE_OBJ_INT_HANDLE] = _syscall_handle_generic, [JOVE_OBJ_INITRD_FILE] = _syscall_handle_generic, [JOVE_OBJ_FRAMEBUFFER] = _syscall_handle_generic, [JOVE_OBJ_VIRTTERM] = _syscall_handle_vtt, -- cgit v1.2.3