From f27e0a240c498035205fe82b875b33ba6cc2fe5a Mon Sep 17 00:00:00 2001 From: RaphProductions <81994075+RaphProductions@users.noreply.github.com> Date: Fri, 9 May 2025 16:01:25 +0200 Subject: [PATCH] fixing pf, again --- README.md | 2 +- kernel/src/main.c | 1 + kernel/src/mm/vmm.c | 5 ++--- kernel/src/sched/sched.c | 6 ++++-- kernel/src/sys/log.c | 7 +++++++ kernel/src/sys/syscall.c | 8 ++++++-- kernel/src/sys/syscall.h | 2 +- kernel/src/sys/syscalls/syscalls_proc.c | 6 ++++++ testing/sk-hello.elf | Bin 4320 -> 4328 bytes testing/test.asm | 10 +++++++--- testing/test.o | Bin 576 -> 608 bytes 11 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 kernel/src/sys/syscalls/syscalls_proc.c diff --git a/README.md b/README.md index 3338e73..6928242 100755 --- a/README.md +++ b/README.md @@ -15,4 +15,4 @@ The Soaplin kernel is a new Unix-like operating system kernel. * FAT32 driver * CPIO-based init ram disk * Video driver for Bochs graphics adapter, and the VMware display adapter. -* FPU support \ No newline at end of file +* FPU support diff --git a/kernel/src/main.c b/kernel/src/main.c index 440a3e3..a833e13 100755 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -139,6 +139,7 @@ void kmain(void) { log("kmain - %s\n", f->path); program_t *prog = elf_load((char*)f->address); + sched_create("Init", prog->entry, prog->pm, SCHED_USER_PROCESS); log("kernel - Soaplin initialized sucessfully.\n"); diff --git a/kernel/src/mm/vmm.c b/kernel/src/mm/vmm.c index 1593903..d67de3a 100755 --- a/kernel/src/mm/vmm.c +++ b/kernel/src/mm/vmm.c @@ -149,12 +149,11 @@ void vmm_load_pagemap(pagemap_t *pm) { } static uint64_t *__vmm_get_next_lvl(uint64_t *level, uint64_t entry, uint64_t flags) { + (void)flags; if (!(level[entry] & 1)){ uint64_t *pml = HIGHER_HALF(pmm_request_page()); memset(pml, 0, PMM_PAGE_SIZE); - level[entry] = ((uint64_t)PHYSICAL(pml) & 0x000FFFFFFFFFF000ULL) | flags; - } else { - level[entry] |= (flags & ~VMM_NX) & 0xFF; + level[entry] = ((uint64_t)PHYSICAL(pml) & 0x000FFFFFFFFFF000ULL) | 0b111; } return HIGHER_HALF(PTE_GET_ADDR(level[entry])); } diff --git a/kernel/src/sched/sched.c b/kernel/src/sched/sched.c index a2c6dda..cf1c400 100755 --- a/kernel/src/sched/sched.c +++ b/kernel/src/sched/sched.c @@ -122,6 +122,8 @@ void schedule(registers_t *regs) return; } + memcpy(&curr_proc->regs, regs, sizeof(registers_t)); + if (curr_proc->type == SCHED_DIED) { sched_process *prev_proc = proc_list; while (prev_proc->next != curr_proc) { @@ -136,9 +138,9 @@ void schedule(registers_t *regs) // R.I.P. process pmm_free_page(curr_proc); - } - memcpy(&curr_proc->regs, regs, sizeof(registers_t)); + return; + } curr_proc = curr_proc->next; if (curr_proc == NULL) diff --git a/kernel/src/sys/log.c b/kernel/src/sys/log.c index 292a3a9..d458fba 100755 --- a/kernel/src/sys/log.c +++ b/kernel/src/sys/log.c @@ -2,10 +2,15 @@ #include "sys/gfx/flanterm/flanterm.h" #include #include +#include extern struct flanterm_context *ft_ctx; +static spinlock_t log_lock = {0}; + void log(char *format, ...) { + //spinlock_acquire(&log_lock); + // TODO: replace this call with a call to printf() when the RTC is implemented. char *date = "1970-01-01 00:00:00 | "; int i2 = 0; for (i2; date[i2] != 0; i2++);; @@ -35,4 +40,6 @@ void log(char *format, ...) { outb(0xE9, buf[i]); } + + //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 80f280f..16c479a 100644 --- a/kernel/src/sys/syscall.c +++ b/kernel/src/sys/syscall.c @@ -27,7 +27,7 @@ void syscall_handle(registers_t *regs) { return; } - regs->rax = syscall_table[regs->rax](regs->rsp, regs->rbp, regs->r12, regs->r13, regs->r14, regs->r15); + regs->rax = syscall_table[regs->rax](regs->rdi, regs->rsi, regs->rdx, regs->rcx, regs->r8, regs->r9); return; } @@ -39,10 +39,14 @@ void syscall_register(int id, syscall handler) { } syscall_table[id] = handler; - log("syscall - System call %d has been set to %p", handler); + log("syscall - System call %d has been set to %p", id, handler); } +extern void syscall_exit(int exit_code); + void syscall_init() { for (int i = 0; i < 1024; i++) syscall_table[i] = (syscall)__syscall_undefined; + + syscall_register(0, (syscall)syscall_exit); } \ No newline at end of file diff --git a/kernel/src/sys/syscall.h b/kernel/src/sys/syscall.h index 5896352..7dc962c 100644 --- a/kernel/src/sys/syscall.h +++ b/kernel/src/sys/syscall.h @@ -5,7 +5,7 @@ /// A function that defines a system call. /// NOTE: Arguments are defined as uint64_t, but you can simply put your own type, and then cast your function to syscall. -typedef uint64_t(*syscall)(uint64_t rsp, uint64_t rbp, uint64_t r12, uint64_t r13, uint64_t r14, uint64_t r15); +typedef uint64_t(*syscall)(uint64_t rdi, uint64_t rsi, uint64_t rdx, uint64_t rcx, uint64_t r8, uint64_t r9); /// Registers a system call. /// NOTE: an existing system call cannot be replaced by another. diff --git a/kernel/src/sys/syscalls/syscalls_proc.c b/kernel/src/sys/syscalls/syscalls_proc.c new file mode 100644 index 0000000..fc23e56 --- /dev/null +++ b/kernel/src/sys/syscalls/syscalls_proc.c @@ -0,0 +1,6 @@ +#include + +int syscall_exit(int exit_code) { + //sched_exit(exit_code); + return 0; +} \ No newline at end of file diff --git a/testing/sk-hello.elf b/testing/sk-hello.elf index e970bd304d321e8469868bacc36586a24293504e..02ba99caf270dae56247ab78c51cb06771516d74 100755 GIT binary patch delta 60 zcmaE$_(E}l2BXGAO><5G1_%(?m^qW5?`#7CzWz6vOCW4=oPZLez~n{&b0E1>Kpg;N C3>32f delta 63 zcmaE%_&{-j2BX46O><5z1_Y;uNx0wdSt MP62Zuc~C$d04P}zjsO4v diff --git a/testing/test.asm b/testing/test.asm index 0fbea26..a40f2e3 100644 --- a/testing/test.asm +++ b/testing/test.asm @@ -4,7 +4,11 @@ section .text _start: int 0x80 - ; tell the kernel to exit the process. - mov rax, 10 int 0x80 - ret \ No newline at end of file + int 0x80 + int 0x80 + int 0x80 + int 0x80 + int 0x80 +.hey: + jmp .hey \ No newline at end of file diff --git a/testing/test.o b/testing/test.o index 8eb605d015a826faafd65a6d57f537dafb8ffeb6..dac71eb80f2bb401d39a484d2fae2ae1c220ac27 100644 GIT binary patch delta 110 zcmX@W@_=Q+0!D#}3+s6+7$ATJNU==TWz^<$V1kIqOipA}bVo?c17C{04+5Hl1