diff options
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/arch/amd64/cpu/gdt.S | 35 | ||||
| -rw-r--r-- | sys/arch/amd64/cpu/mmu.c | 5 | ||||
| -rw-r--r-- | sys/arch/amd64/os/os_panic.c | 85 | ||||
| -rw-r--r-- | sys/arch/amd64/os/os_process.c | 102 | ||||
| -rw-r--r-- | sys/inc/mu/panic.h | 6 | ||||
| -rw-r--r-- | sys/inc/mu/process.h | 44 | ||||
| -rw-r--r-- | sys/inc/os/process.h | 15 | ||||
| -rw-r--r-- | sys/kern/kern_panic.c | 7 | ||||
| -rw-r--r-- | sys/os/os_process.c | 49 |
9 files changed, 341 insertions, 7 deletions
diff --git a/sys/arch/amd64/cpu/gdt.S b/sys/arch/amd64/cpu/gdt.S index b46f397..1ffe53c 100644 --- a/sys/arch/amd64/cpu/gdt.S +++ b/sys/arch/amd64/cpu/gdt.S @@ -65,11 +65,40 @@ gdt_load: .globl GDT GDT: .NULL: - .quad 0x0000000000000000 + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b00000000 + .byte 0b00000000 + .byte 0x00 .CODE: - .quad 0x00209A0000000000 + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b10011010 + .byte 0b00100000 + .byte 0x00 .DATA: - .quad 0x0000920000000000 + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b10010010 + .byte 0b00000000 + .byte 0x00 +.UCODE: + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b11111010 + .byte 0b10101111 + .byte 0x00 +.UDATA: + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b11110010 + .byte 0b00000000 + .byte 0x00 .globl GDTR GDTR: diff --git a/sys/arch/amd64/cpu/mmu.c b/sys/arch/amd64/cpu/mmu.c index ec6d071..b709ee1 100644 --- a/sys/arch/amd64/cpu/mmu.c +++ b/sys/arch/amd64/cpu/mmu.c @@ -143,7 +143,9 @@ pmap_get_level(struct mmu_vas *vas, uintptr_t va, bool en_alloc, pagelevel_t lvl while ((curlvl--) > lvl) { index = pmap_get_index(va, curlvl); if (ISSET(pmap[index], PTE_P)) { - return PHYS_TO_VIRT(pmap[index] & PTE_ADDR_MASK); + pmap = PHYS_TO_VIRT(pmap[index] & PTE_ADDR_MASK); + --curlvl; + continue; } if (!en_alloc) { @@ -239,6 +241,7 @@ mu_pmap_forkvas(struct mmu_vas *result) } } + result->cr3 = paddr; return 0; } diff --git a/sys/arch/amd64/os/os_panic.c b/sys/arch/amd64/os/os_panic.c index ecad944..2215ec6 100644 --- a/sys/arch/amd64/os/os_panic.c +++ b/sys/arch/amd64/os/os_panic.c @@ -28,8 +28,93 @@ */ #include <sys/types.h> +#include <sys/cdefs.h> +#include <os/trace.h> #include <mu/panic.h> +/* + * XXX: We could implement panic() as an assembly stub + * that takes a register snapshot and passes it to + * an MI routine which calls into the MD side using + * it as an argument, that could be better... + */ +void +mu_panic_dump(void) +{ + static uint64_t cr4, cr3, cr2, cr0; + static uint64_t rax, rbx, rcx, rdx; + static uint64_t r[16], rbp, rsp; + + __asmv( + "mov %%cr4, %0\n\t" + "mov %%cr3, %1\n\t" + "mov %%cr2, %2\n\t" + "mov %%cr0, %3" + : "=r" (cr4), + "=r" (cr3), + "=r" (cr2), + "=r" (cr0) + : + : "memory" + ); + + __asmv( + "mov %%r8, %0\n\t" + "mov %%r9, %1\n\t" + "mov %%r10, %2\n\t" + "mov %%r11, %3\n\t" + "mov %%r12, %4\n\t" + "mov %%r13, %5\n\t" + "mov %%r14, %6\n\t" + "mov %%r15, %7\n\t" + "mov %%rax, %8\n\t" + "mov %%rbx, %8\n\t" + "mov %%rcx, %9\n\t" + "mov %%rdx, %10\n\t" + "mov %%rbp, %11\n\t" + "mov %%rsp, %12" + : "=r" (r[0]), + "=r" (r[1]), + "=r" (r[2]), + "=r" (r[3]), + "=r" (r[4]), + "=r" (r[5]), + "=r" (r[6]), + "=r" (r[7]), + "=r" (rax), + "=r" (rbx), + "=r" (rcx), + "=r" (rdx), + "=r" (rbp), + "=r" (rsp) + : + : "memory" + ); + + trace( + "CR0=%p CR2=%p\nCR3=%p CR4=%p\n", + cr0, cr2, cr3, cr4 + ); + + trace( + "---------------------------------------------\n" + "RAX=%p RBX=%p\nRCX=%p RDX=%p\n" + "RBP=%p RSP=%p\n", + rax, rbx, rcx, rdx, + rbp, rsp + ); + + trace( + "---------------------------------------------\n" + "R15=%p R14=%p\nR13=%p R12=%p\nR11=%p R10=%p\n" + "R9=%p R8=%p", + r[7], r[6], r[5], + r[4], r[3], r[2], + r[1], r[0] + ); + +} + void mu_panic_hcf(void) { diff --git a/sys/arch/amd64/os/os_process.c b/sys/arch/amd64/os/os_process.c new file mode 100644 index 0000000..2a1d09a --- /dev/null +++ b/sys/arch/amd64/os/os_process.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/errno.h> +#include <mu/process.h> +#include <mu/mmu.h> +#include <vm/phys.h> +#include <lib/string.h> + +#define STACK_TOP 0xBFFFFFFF +#define GDT_KERNCODE 0x08 +#define GDT_KERNDATA 0x10 +#define GDT_USERCODE 0x18 +#define GDT_USERDATA 0x20 + +int +mu_process_init(struct process *process, uintptr_t ip, int flags) +{ + struct trapframe *tf; + struct pcb *pcb; + uintptr_t stack_base; + uint8_t cs, ds; + int error; + + if (process == NULL) { + return -EINVAL; + } + + pcb = &process->pcb; + tf = &pcb->tf; + + error = mu_pmap_forkvas(&pcb->vas); + if (error < 0) { + return error; + } + + /* Allocate a new stack */ + stack_base = vm_phys_alloc(1); + if (stack_base == 0) { + vm_phys_free(pcb->vas.cr3, 1); + return -ENOMEM; + } + + /* Get the segment selectors based on mode */ + if (ISSET(flags, PROC_KERN)) { + cs = GDT_KERNCODE; + ds = GDT_KERNDATA; + } else { + cs = GDT_USERCODE | 3; + ds = GDT_USERDATA | 3; + } + + memset(tf, 0, sizeof(*tf)); + tf->rip = ip; + tf->rflags = 0x202; + tf->cs = cs; + tf->ss = ds; + + /* Map out the stack */ + error = mu_pmap_map( + &pcb->vas, + stack_base, + STACK_TOP, + PROT_READ | PROT_WRITE, + PAGESIZE_4K + ); + + if (error < 0) { + vm_phys_free(stack_base, 1); + vm_phys_free(pcb->vas.cr3, 1); + return error; + } + + tf->rsp = ALIGN_DOWN(STACK_TOP + (PAGESIZE - 1), 16); + return 0; +} diff --git a/sys/inc/mu/panic.h b/sys/inc/mu/panic.h index 310e657..c96e844 100644 --- a/sys/inc/mu/panic.h +++ b/sys/inc/mu/panic.h @@ -33,6 +33,12 @@ #include <sys/types.h> /* + * Used internally by the panic function to dump + * internal machine state. + */ +void mu_panic_dump(void); + +/* * Used internally by the panic function and implemented * per architecture to bring the system to a halt. */ diff --git a/sys/inc/mu/process.h b/sys/inc/mu/process.h new file mode 100644 index 0000000..2e69140 --- /dev/null +++ b/sys/inc/mu/process.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MU_PROCESS_H_ +#define _MU_PROCESS_H_ + +#include <sys/types.h> +#include <os/process.h> + +/* + * Initialize machine specific process fields + * + * @process: Process to initialize + * @ip: Instruction pointer + */ +int mu_process_init(struct process *process, uintptr_t ip, int flags); + +#endif /* !_MU_PROCESS_H_ */ diff --git a/sys/inc/os/process.h b/sys/inc/os/process.h index 753779a..a2e3fdd 100644 --- a/sys/inc/os/process.h +++ b/sys/inc/os/process.h @@ -31,9 +31,13 @@ #define _OS_PROCESS_H_ 1 #include <sys/types.h> +#include <sys/param.h> #include <sys/queue.h> #include <md/pcb.h> /* shared */ +/* Flags for proc_init() */ +#define PROC_KERN BIT(0) /* Kernel thread */ + /* * Represents a running process on the * system @@ -48,4 +52,15 @@ struct process { TAILQ_ENTRY(process) link; }; +/* + * Initialize a process to a known state + * + * @process: Process to initialize + * @ip: Instruction pointer to jump to + * @flags: Optional flags + * + * Returns zero on success + */ +int process_init(struct process *process, uintptr_t ip, int flags); + #endif /* !_OS_PROCESS_H_ */ diff --git a/sys/kern/kern_panic.c b/sys/kern/kern_panic.c index af30e7b..64660e8 100644 --- a/sys/kern/kern_panic.c +++ b/sys/kern/kern_panic.c @@ -28,9 +28,9 @@ */ #include <kern/panic.h> -#include <kern/serial.h> #include <mu/panic.h> #include <mu/spinlock.h> +#include <os/trace.h> #include <lib/string.h> #include <lib/stdarg.h> #include <lib/stdbool.h> @@ -48,9 +48,10 @@ panic(const char *fmt, ...) va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); - serial_write("panic: ", 7); - serial_write(buf, strlen(buf)); + trace("panic: "); + trace(buf); + mu_panic_dump(); mu_panic_hcf(); __builtin_unreachable(); } diff --git a/sys/os/os_process.c b/sys/os/os_process.c new file mode 100644 index 0000000..6bfa220 --- /dev/null +++ b/sys/os/os_process.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <sys/atomic.h> +#include <sys/errno.h> +#include <os/process.h> +#include <mu/process.h> + +static size_t next_pid = 0; + +int +process_init(struct process *process, uintptr_t ip, int flags) +{ + if (process == NULL) { + return -EINVAL; + } + + process->pid = next_pid; + atomic_inc_64(&next_pid); + mu_process_init(process, ip, flags); + return 0; +} |
