From 236963e7563be3e3f8220dac7bb4af446928e194 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Mon, 24 Jun 2024 22:55:29 -0400 Subject: Clean out for expt Signed-off-by: Ian Moffett --- sys/arch/amd64/amd64/bus_machdep.c | 83 --- sys/arch/amd64/amd64/cpu.c | 40 - sys/arch/amd64/amd64/cpu_mp.c | 142 ---- sys/arch/amd64/amd64/gdt.c | 85 --- sys/arch/amd64/amd64/hpet.c | 208 ------ sys/arch/amd64/amd64/idt.c | 66 -- sys/arch/amd64/amd64/ioapic.c | 200 ----- sys/arch/amd64/amd64/lapic.c | 435 ----------- sys/arch/amd64/amd64/local_intr.S | 47 -- sys/arch/amd64/amd64/machdep.c | 401 ---------- sys/arch/amd64/amd64/pmap.c | 389 ---------- sys/arch/amd64/amd64/spectre.S | 54 -- sys/arch/amd64/amd64/spectre.c | 85 --- sys/arch/amd64/amd64/syscall.S | 43 -- sys/arch/amd64/amd64/syscall.c | 54 -- sys/arch/amd64/amd64/trap.S | 155 ---- sys/arch/amd64/amd64/trap.c | 269 ------- sys/arch/amd64/amd64/tss.S | 41 -- sys/arch/amd64/amd64/tss.c | 174 ----- sys/arch/amd64/amd64/uart.c | 98 --- sys/arch/amd64/conf/GENERIC | 9 - sys/arch/amd64/isa/i8042.c | 297 -------- sys/arch/amd64/isa/i8254.c | 75 -- sys/arch/amd64/isa/spkr.c | 68 -- sys/dev/ic/ahci.c | 771 ------------------- sys/dev/ic/nvme.c | 614 ---------------- sys/dev/pci/pci.c | 344 --------- sys/dev/usb/xhci.c | 463 ------------ sys/dev/vcons/vcons.c | 227 ------ sys/dev/vcons/vcons_io.c | 84 --- sys/dev/video/fbdev.c | 120 --- sys/firmware/acpi/acpi_init.c | 111 --- sys/firmware/acpi/acpi_madt.c | 150 ---- sys/firmware/acpi/acpi_subr.c | 81 -- sys/fs/devfs.c | 295 -------- sys/fs/initramfs.c | 262 ------- sys/fs/procfs.c | 206 ------ sys/fs/procfs_subr.c | 114 --- sys/include/arch/amd64/bus.h | 39 - sys/include/arch/amd64/cpu.h | 158 ---- sys/include/arch/amd64/cpu_mp.h | 40 - sys/include/arch/amd64/cpuid.h | 40 - sys/include/arch/amd64/frame.h | 82 --- sys/include/arch/amd64/frameasm.h | 103 --- sys/include/arch/amd64/gdt.h | 79 -- sys/include/arch/amd64/hpet.h | 40 - sys/include/arch/amd64/idt.h | 70 -- sys/include/arch/amd64/intr.h | 37 - sys/include/arch/amd64/io.h | 78 -- sys/include/arch/amd64/ioapic.h | 43 -- sys/include/arch/amd64/ioapicvar.h | 57 -- sys/include/arch/amd64/isa/i8042regs.h | 69 -- sys/include/arch/amd64/isa/i8254.h | 44 -- sys/include/arch/amd64/isa/spkr.h | 37 - sys/include/arch/amd64/lapic.h | 59 -- sys/include/arch/amd64/lapicvar.h | 102 --- sys/include/arch/amd64/msr.h | 66 -- sys/include/arch/amd64/pcb.h | 39 - sys/include/arch/amd64/spectre.h | 38 - sys/include/arch/amd64/sysvec.h | 55 -- sys/include/arch/amd64/tlb.h | 42 -- sys/include/arch/amd64/trap.h | 78 -- sys/include/arch/amd64/tss.h | 120 --- sys/include/arch/amd64/uart.h | 40 - sys/include/arch/amd64/vas.h | 54 -- sys/include/dev/ic/ahciregs.h | 142 ---- sys/include/dev/ic/ahcivar.h | 146 ---- sys/include/dev/ic/nvmevar.h | 280 ------- sys/include/dev/pci/pci.h | 83 --- sys/include/dev/pci/pciregs.h | 66 -- sys/include/dev/pci/pcivar.h | 40 - sys/include/dev/usb/xhciregs.h | 110 --- sys/include/dev/usb/xhcivar.h | 113 --- sys/include/dev/vcons/vcons.h | 72 -- sys/include/dev/vcons/vcons_io.h | 37 - sys/include/dev/video/fbdev.h | 51 -- sys/include/firmware/acpi/acpi.h | 46 -- sys/include/firmware/acpi/tables.h | 130 ---- sys/include/fs/devfs.h | 42 -- sys/include/fs/initramfs.h | 41 -- sys/include/fs/procfs.h | 51 -- sys/include/lib/assert.h | 42 -- sys/include/lib/bitmap.h | 56 -- sys/include/lib/logo.h | 39 - sys/include/lib/stdarg.h | 44 -- sys/include/lib/string.h | 48 -- sys/include/lib/sysfont.h | 40 - sys/include/sys/ascii.h | 45 -- sys/include/sys/cdefs.h | 182 ----- sys/include/sys/cpu.h | 41 -- sys/include/sys/device.h | 68 -- sys/include/sys/driver.h | 57 -- sys/include/sys/elf.h | 499 ------------- sys/include/sys/errno.h | 159 ---- sys/include/sys/exec.h | 37 - sys/include/sys/fbdev.h | 48 -- sys/include/sys/filedesc.h | 72 -- sys/include/sys/intr.h | 55 -- sys/include/sys/ksyms.h | 44 -- sys/include/sys/limine.h | 495 ------------- sys/include/sys/loader.h | 77 -- sys/include/sys/machdep.h | 56 -- sys/include/sys/mmio.h | 112 --- sys/include/sys/mount.h | 80 -- sys/include/sys/mutex.h | 42 -- sys/include/sys/panic.h | 41 -- sys/include/sys/proc.h | 91 --- sys/include/sys/queue.h | 173 ----- sys/include/sys/reboot.h | 45 -- sys/include/sys/sched.h | 53 -- sys/include/sys/sched_state.h | 42 -- sys/include/sys/schedvar.h | 61 -- sys/include/sys/signal.h | 46 -- sys/include/sys/sio.h | 57 -- sys/include/sys/spinlock.h | 51 -- sys/include/sys/syscall.h | 68 -- sys/include/sys/syslog.h | 55 -- sys/include/sys/system.h | 43 -- sys/include/sys/termios.h | 69 -- sys/include/sys/timer.h | 91 --- sys/include/sys/tty.h | 74 -- sys/include/sys/types.h | 77 -- sys/include/sys/vfs.h | 67 -- sys/include/sys/vnode.h | 79 -- sys/include/vm/dynalloc.h | 44 -- sys/include/vm/fault.h | 38 - sys/include/vm/map.h | 84 --- sys/include/vm/obj.h | 61 -- sys/include/vm/page.h | 41 -- sys/include/vm/pager.h | 51 -- sys/include/vm/physseg.h | 48 -- sys/include/vm/pmap.h | 117 --- sys/include/vm/tlsf.h | 90 --- sys/include/vm/vm.h | 78 -- sys/kern/init_main.c | 113 --- sys/kern/kern_cpu.c | 76 -- sys/kern/kern_device.c | 84 --- sys/kern/kern_exec.c | 240 ------ sys/kern/kern_filedesc.c | 494 ------------- sys/kern/kern_intr.c | 127 ---- sys/kern/kern_ioctl.c | 72 -- sys/kern/kern_loader.c | 220 ------ sys/kern/kern_mutex.c | 52 -- sys/kern/kern_panic.c | 63 -- sys/kern/kern_reboot.c | 51 -- sys/kern/kern_sched.c | 490 ------------- sys/kern/kern_signal.c | 102 --- sys/kern/kern_subr.c | 134 ---- sys/kern/kern_syscall.c | 54 -- sys/kern/kern_syslog.c | 168 ----- sys/kern/kern_timer.c | 112 --- sys/kern/kern_tty.c | 304 -------- sys/kern/vfs_init.c | 89 --- sys/kern/vfs_lookup.c | 182 ----- sys/kern/vfs_mount.c | 217 ------ sys/kern/vfs_subr.c | 258 ------- sys/lib/logo.c | 90 --- sys/lib/string/itoa.c | 134 ---- sys/lib/string/memcmp.c | 46 -- sys/lib/string/memcpy.c | 50 -- sys/lib/string/memmove.c | 49 -- sys/lib/string/memset.c | 50 -- sys/lib/string/strcmp.c | 39 - sys/lib/string/strlen.c | 40 - sys/lib/string/vsnprintf.c | 139 ---- sys/lib/sysfont.c | 376 ---------- sys/vm/tlsf.c | 1264 -------------------------------- sys/vm/vm_device.c | 119 --- sys/vm/vm_dynalloc.c | 93 --- sys/vm/vm_fault.c | 132 ---- sys/vm/vm_init.c | 91 --- sys/vm/vm_map.c | 540 -------------- sys/vm/vm_obj.c | 93 --- sys/vm/vm_page.c | 73 -- sys/vm/vm_pager.c | 68 -- sys/vm/vm_physseg.c | 272 ------- sys/vm/vm_stat.c | 42 -- sys/vm/vm_vnode.c | 114 --- 178 files changed, 22508 deletions(-) delete mode 100644 sys/arch/amd64/amd64/bus_machdep.c delete mode 100644 sys/arch/amd64/amd64/cpu.c delete mode 100644 sys/arch/amd64/amd64/cpu_mp.c delete mode 100644 sys/arch/amd64/amd64/gdt.c delete mode 100644 sys/arch/amd64/amd64/hpet.c delete mode 100644 sys/arch/amd64/amd64/idt.c delete mode 100644 sys/arch/amd64/amd64/ioapic.c delete mode 100644 sys/arch/amd64/amd64/lapic.c delete mode 100644 sys/arch/amd64/amd64/local_intr.S delete mode 100644 sys/arch/amd64/amd64/machdep.c delete mode 100644 sys/arch/amd64/amd64/pmap.c delete mode 100644 sys/arch/amd64/amd64/spectre.S delete mode 100644 sys/arch/amd64/amd64/spectre.c delete mode 100644 sys/arch/amd64/amd64/syscall.S delete mode 100644 sys/arch/amd64/amd64/syscall.c delete mode 100644 sys/arch/amd64/amd64/trap.S delete mode 100644 sys/arch/amd64/amd64/trap.c delete mode 100644 sys/arch/amd64/amd64/tss.S delete mode 100644 sys/arch/amd64/amd64/tss.c delete mode 100644 sys/arch/amd64/amd64/uart.c delete mode 100644 sys/arch/amd64/conf/GENERIC delete mode 100644 sys/arch/amd64/isa/i8042.c delete mode 100644 sys/arch/amd64/isa/i8254.c delete mode 100644 sys/arch/amd64/isa/spkr.c delete mode 100644 sys/dev/ic/ahci.c delete mode 100644 sys/dev/ic/nvme.c delete mode 100644 sys/dev/pci/pci.c delete mode 100644 sys/dev/usb/xhci.c delete mode 100644 sys/dev/vcons/vcons.c delete mode 100644 sys/dev/vcons/vcons_io.c delete mode 100644 sys/dev/video/fbdev.c delete mode 100644 sys/firmware/acpi/acpi_init.c delete mode 100644 sys/firmware/acpi/acpi_madt.c delete mode 100644 sys/firmware/acpi/acpi_subr.c delete mode 100644 sys/fs/devfs.c delete mode 100644 sys/fs/initramfs.c delete mode 100644 sys/fs/procfs.c delete mode 100644 sys/fs/procfs_subr.c delete mode 100644 sys/include/arch/amd64/bus.h delete mode 100644 sys/include/arch/amd64/cpu.h delete mode 100644 sys/include/arch/amd64/cpu_mp.h delete mode 100644 sys/include/arch/amd64/cpuid.h delete mode 100644 sys/include/arch/amd64/frame.h delete mode 100644 sys/include/arch/amd64/frameasm.h delete mode 100644 sys/include/arch/amd64/gdt.h delete mode 100644 sys/include/arch/amd64/hpet.h delete mode 100644 sys/include/arch/amd64/idt.h delete mode 100644 sys/include/arch/amd64/intr.h delete mode 100644 sys/include/arch/amd64/io.h delete mode 100644 sys/include/arch/amd64/ioapic.h delete mode 100644 sys/include/arch/amd64/ioapicvar.h delete mode 100644 sys/include/arch/amd64/isa/i8042regs.h delete mode 100644 sys/include/arch/amd64/isa/i8254.h delete mode 100644 sys/include/arch/amd64/isa/spkr.h delete mode 100644 sys/include/arch/amd64/lapic.h delete mode 100644 sys/include/arch/amd64/lapicvar.h delete mode 100644 sys/include/arch/amd64/msr.h delete mode 100644 sys/include/arch/amd64/pcb.h delete mode 100644 sys/include/arch/amd64/spectre.h delete mode 100644 sys/include/arch/amd64/sysvec.h delete mode 100644 sys/include/arch/amd64/tlb.h delete mode 100644 sys/include/arch/amd64/trap.h delete mode 100644 sys/include/arch/amd64/tss.h delete mode 100644 sys/include/arch/amd64/uart.h delete mode 100644 sys/include/arch/amd64/vas.h delete mode 100644 sys/include/dev/ic/ahciregs.h delete mode 100644 sys/include/dev/ic/ahcivar.h delete mode 100644 sys/include/dev/ic/nvmevar.h delete mode 100644 sys/include/dev/pci/pci.h delete mode 100644 sys/include/dev/pci/pciregs.h delete mode 100644 sys/include/dev/pci/pcivar.h delete mode 100644 sys/include/dev/usb/xhciregs.h delete mode 100644 sys/include/dev/usb/xhcivar.h delete mode 100644 sys/include/dev/vcons/vcons.h delete mode 100644 sys/include/dev/vcons/vcons_io.h delete mode 100644 sys/include/dev/video/fbdev.h delete mode 100644 sys/include/firmware/acpi/acpi.h delete mode 100644 sys/include/firmware/acpi/tables.h delete mode 100644 sys/include/fs/devfs.h delete mode 100644 sys/include/fs/initramfs.h delete mode 100644 sys/include/fs/procfs.h delete mode 100644 sys/include/lib/assert.h delete mode 100644 sys/include/lib/bitmap.h delete mode 100644 sys/include/lib/logo.h delete mode 100644 sys/include/lib/stdarg.h delete mode 100644 sys/include/lib/string.h delete mode 100644 sys/include/lib/sysfont.h delete mode 100644 sys/include/sys/ascii.h delete mode 100644 sys/include/sys/cdefs.h delete mode 100644 sys/include/sys/cpu.h delete mode 100644 sys/include/sys/device.h delete mode 100644 sys/include/sys/driver.h delete mode 100644 sys/include/sys/elf.h delete mode 100644 sys/include/sys/errno.h delete mode 100644 sys/include/sys/exec.h delete mode 100644 sys/include/sys/fbdev.h delete mode 100644 sys/include/sys/filedesc.h delete mode 100644 sys/include/sys/intr.h delete mode 100644 sys/include/sys/ksyms.h delete mode 100644 sys/include/sys/limine.h delete mode 100644 sys/include/sys/loader.h delete mode 100644 sys/include/sys/machdep.h delete mode 100644 sys/include/sys/mmio.h delete mode 100644 sys/include/sys/mount.h delete mode 100644 sys/include/sys/mutex.h delete mode 100644 sys/include/sys/panic.h delete mode 100644 sys/include/sys/proc.h delete mode 100644 sys/include/sys/queue.h delete mode 100644 sys/include/sys/reboot.h delete mode 100644 sys/include/sys/sched.h delete mode 100644 sys/include/sys/sched_state.h delete mode 100644 sys/include/sys/schedvar.h delete mode 100644 sys/include/sys/signal.h delete mode 100644 sys/include/sys/sio.h delete mode 100644 sys/include/sys/spinlock.h delete mode 100644 sys/include/sys/syscall.h delete mode 100644 sys/include/sys/syslog.h delete mode 100644 sys/include/sys/system.h delete mode 100644 sys/include/sys/termios.h delete mode 100644 sys/include/sys/timer.h delete mode 100644 sys/include/sys/tty.h delete mode 100644 sys/include/sys/types.h delete mode 100644 sys/include/sys/vfs.h delete mode 100644 sys/include/sys/vnode.h delete mode 100644 sys/include/vm/dynalloc.h delete mode 100644 sys/include/vm/fault.h delete mode 100644 sys/include/vm/map.h delete mode 100644 sys/include/vm/obj.h delete mode 100644 sys/include/vm/page.h delete mode 100644 sys/include/vm/pager.h delete mode 100644 sys/include/vm/physseg.h delete mode 100644 sys/include/vm/pmap.h delete mode 100644 sys/include/vm/tlsf.h delete mode 100644 sys/include/vm/vm.h delete mode 100644 sys/kern/init_main.c delete mode 100644 sys/kern/kern_cpu.c delete mode 100644 sys/kern/kern_device.c delete mode 100644 sys/kern/kern_exec.c delete mode 100644 sys/kern/kern_filedesc.c delete mode 100644 sys/kern/kern_intr.c delete mode 100644 sys/kern/kern_ioctl.c delete mode 100644 sys/kern/kern_loader.c delete mode 100644 sys/kern/kern_mutex.c delete mode 100644 sys/kern/kern_panic.c delete mode 100644 sys/kern/kern_reboot.c delete mode 100644 sys/kern/kern_sched.c delete mode 100644 sys/kern/kern_signal.c delete mode 100644 sys/kern/kern_subr.c delete mode 100644 sys/kern/kern_syscall.c delete mode 100644 sys/kern/kern_syslog.c delete mode 100644 sys/kern/kern_timer.c delete mode 100644 sys/kern/kern_tty.c delete mode 100644 sys/kern/vfs_init.c delete mode 100644 sys/kern/vfs_lookup.c delete mode 100644 sys/kern/vfs_mount.c delete mode 100644 sys/kern/vfs_subr.c delete mode 100644 sys/lib/logo.c delete mode 100644 sys/lib/string/itoa.c delete mode 100644 sys/lib/string/memcmp.c delete mode 100644 sys/lib/string/memcpy.c delete mode 100644 sys/lib/string/memmove.c delete mode 100644 sys/lib/string/memset.c delete mode 100644 sys/lib/string/strcmp.c delete mode 100644 sys/lib/string/strlen.c delete mode 100644 sys/lib/string/vsnprintf.c delete mode 100644 sys/lib/sysfont.c delete mode 100644 sys/vm/tlsf.c delete mode 100644 sys/vm/vm_device.c delete mode 100644 sys/vm/vm_dynalloc.c delete mode 100644 sys/vm/vm_fault.c delete mode 100644 sys/vm/vm_init.c delete mode 100644 sys/vm/vm_map.c delete mode 100644 sys/vm/vm_obj.c delete mode 100644 sys/vm/vm_page.c delete mode 100644 sys/vm/vm_pager.c delete mode 100644 sys/vm/vm_physseg.c delete mode 100644 sys/vm/vm_stat.c delete mode 100644 sys/vm/vm_vnode.c (limited to 'sys') diff --git a/sys/arch/amd64/amd64/bus_machdep.c b/sys/arch/amd64/amd64/bus_machdep.c deleted file mode 100644 index 91e7963..0000000 --- a/sys/arch/amd64/amd64/bus_machdep.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include - -/* - * Map a physical device address into the kernel address - * space. - * - * @addr: Physical address to map. - * @size: Size to map. - * @flags: Mapping flags. - * @vap: Resulting virtual address. - */ -int -bus_map(bus_addr_t addr, size_t size, int flags, void **vap) -{ - struct vm_ctx *vmctx = vm_get_ctx(); - struct vas vas; - size_t pagesize; - vaddr_t va; - int status; - - pagesize = vm_get_page_size(); - size = __ALIGN_UP(size, pagesize); - - va = (vaddr_t)PHYS_TO_VIRT(addr); - vas = pmap_read_vas(); - - /* Ensure the size is valid */ - if (size == 0) { - return -EINVAL; - } - - /* Map the device address to our new VA */ - if ((status = vm_map_create(vas, va, addr, PROT_WRITE, size)) != 0) { - return status; - } - - /* - * Mark the memory as uncachable because this is - * for device I/O - */ - if ((status = pmap_set_cache(vmctx, vas, va, VM_CACHE_UC)) != 0) { - return status; - } - - *vap = (void *)va; - return 0; -} diff --git a/sys/arch/amd64/amd64/cpu.c b/sys/arch/amd64/amd64/cpu.c deleted file mode 100644 index e608535..0000000 --- a/sys/arch/amd64/amd64/cpu.c +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include - -__KERNEL_META("$Hyra$: cpu.c, Ian Marco Moffett, " - "AMD64 CPU abstraction module"); - -struct cpu_info * -amd64_this_cpu(void) -{ - return (void *)amd64_read_gs_base(); -} diff --git a/sys/arch/amd64/amd64/cpu_mp.c b/sys/arch/amd64/amd64/cpu_mp.c deleted file mode 100644 index b9de227..0000000 --- a/sys/arch/amd64/amd64/cpu_mp.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("cpu_mp"); -__KERNEL_META("$Hyra$: cpu_mp.c, Ian Marco Moffett, " - "SMP related code"); - -#define pr_trace(fmt, ...) kprintf("cpu_mp: " fmt, ##__VA_ARGS__) - -static volatile struct limine_smp_request g_smp_req = { - .id = LIMINE_SMP_REQUEST, - .revision = 0 -}; - -static bool is_mp_supported = false; -static struct intr_info *tmr_irqlist[MAXCPUS]; - -void handle_local_tmr(void); - -/* - * Add local timer IRQ stat - */ -static inline void -tmr_irqstat_add(struct cpu_info *ci) -{ - tmr_irqlist[ci->idx] = intr_info_alloc("LAPIC", "LAPIC-TMR"); - tmr_irqlist[ci->idx]->affinity = ci->idx; - intr_register(tmr_irqlist[ci->idx]); -} - -/* - * Update local timer IRQ stats from - * interrupt. - */ -void -handle_local_tmr(void) -{ - struct cpu_info *ci = this_cpu(); - - ++tmr_irqlist[ci->idx]->count; -} - -static void -ap_trampoline(struct limine_smp_info *si) -{ - static struct spinlock lock = {0}; - struct cpu_info *ci; - - spinlock_acquire(&lock); - - pre_init(); - processor_init(); - - ci = this_cpu(); - cpu_attach(ci); - tmr_irqstat_add(ci); - - spinlock_release(&lock); - sched_enter(); - - /* Should not be reached */ - __assert(0); - __builtin_unreachable(); -} - -/* - * Returns true if SMP is supported. - */ -bool -mp_supported(void) -{ - return is_mp_supported; -} - -void -ap_bootstrap(struct cpu_info *ci) -{ - struct limine_smp_response *resp = g_smp_req.response; - struct limine_smp_info **cpus; - size_t cpu_init_counter; - - /* Should not happen */ - __assert(resp != NULL); - - cpus = resp->cpus; - cpu_init_counter = resp->cpu_count - 1; - - cpu_attach(ci); - tmr_irqstat_add(ci); - - if (resp->cpu_count == 1) { - pr_trace("CPU has 1 core, no APs to bootstrap...\n"); - return; - } - - pr_trace("Bootstrapping %d cores...\n", cpu_init_counter); - for (size_t i = 0; i < resp->cpu_count; ++i) { - if (ci->id == cpus[i]->lapic_id) { - pr_trace("Skip %d (BSP)... continue\n", ci->id); - continue; - } - - cpus[i]->goto_address = ap_trampoline; - } -} diff --git a/sys/arch/amd64/amd64/gdt.c b/sys/arch/amd64/amd64/gdt.c deleted file mode 100644 index f48e27a..0000000 --- a/sys/arch/amd64/amd64/gdt.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -struct gdt_entry g_gdt[256] = { - /* Null */ - {0}, - - /* Kernel code (0x8) */ - { - .limit = 0x0000, - .base_low = 0x0000, - .base_mid = 0x00, - .access = 0x9A, - .granularity = 0x20, - .base_hi = 0x00 - }, - - /* Kernel data (0x10) */ - { - .limit = 0x0000, - .base_low = 0x0000, - .base_mid = 0x00, - .access = 0x92, - .granularity = 0x00, - .base_hi = 0x00 - }, - - /* User code (0x18) */ - { - .limit = 0x0000, - .base_low = 0x0000, - .base_mid = 0x00, - .access = 0xFA, - .granularity = 0xAF, - .base_hi = 0x00 - }, - - /* User data (0x20) */ - { - .limit = 0x0000, - .base_low = 0x0000, - .base_mid = 0x00, - .access = 0xF2, - .granularity = 0x00, - .base_hi = 0x00 - }, - - /* TSS segment (0x28) */ - {0} -}; - -struct gdt_entry *g_gdt_tss = &g_gdt[GDT_TSS]; - -struct gdtr g_gdtr = { - .limit = sizeof(struct gdt_entry) * 256 - 1, - .offset = (uintptr_t)&g_gdt[0] -}; diff --git a/sys/arch/amd64/amd64/hpet.c b/sys/arch/amd64/amd64/hpet.c deleted file mode 100644 index 69dc0dd..0000000 --- a/sys/arch/amd64/amd64/hpet.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("hpet"); -__KERNEL_META("$Hyra$: hpet.c, Ian Marco Moffett, " - "HPET driver"); - -#define pr_trace(fmt, ...) kprintf("hpet: " fmt, ##__VA_ARGS__) -#define pr_error(...) pr_trace(__VA_ARGS__) - -#define HPET_REG_CAPS 0x00 -#define HPET_GENERAL_CONFIG 0x10 -#define HPET_REG_MAIN_COUNTER 0xF0 - -#define CAP_REV_ID(caps) __SHIFTOUT(caps, 0xFF) -#define CAP_NUM_TIM(caps) __SHIFTOUT(caps, 0x1F << 8) -#define CAP_COUNT_SIZE(caps) __SHIFTOUT(caps, __BIT(13)) -#define CAP_VENDOR_ID(caps) __SHIFTOUT(caps, 0xFFFF << 16) -#define CAP_CLK_PERIOD(caps) (caps >> 32) - -#define FSEC_PER_SECOND 1000000000000000ULL -#define USEC_PER_SECOND 1000000ULL - -static struct timer timer = { 0 }; -static struct hpet *acpi_hpet = NULL; -static void *hpet_base = NULL; -static bool is_faulty = false; - -/* - * Read from HPET register space. - * - * @reg: Register to read from. - */ -static inline uint64_t -hpet_read(uint32_t reg) -{ - void *addr; - - addr = (void *)((uintptr_t)hpet_base + reg); - return mmio_read64(addr); -} - -/* - * Write to HPET register space. - * - * @reg: Register to write to. - * @val: Value to write. - */ -static inline void -hpet_write(uint32_t reg, uint64_t val) -{ - void *addr; - - addr = (void *)((uintptr_t)hpet_base + reg); - mmio_write64(addr, val); -} - -static int -hpet_sleep(uint64_t n, uint64_t units) -{ - uint64_t caps; - uint32_t period; - uint64_t counter_val; - volatile size_t ticks; - - /* Don't even try if faulty, would probably cause deadlock */ - if (is_faulty) { - return EXIT_FAILURE; - } - - caps = hpet_read(HPET_REG_CAPS); - period = CAP_CLK_PERIOD(caps); - counter_val = hpet_read(HPET_REG_MAIN_COUNTER); - - ticks = counter_val + (n * (units / period)); - - while (hpet_read(HPET_REG_MAIN_COUNTER) < ticks) { - hint_spinwait(); - } - - return EXIT_SUCCESS; -} - -int -hpet_msleep(size_t ms) -{ - return hpet_sleep(ms, 1000000000000); -} - -int -hpet_usleep(size_t us) -{ - return hpet_sleep(us, 1000000000); -} - -int -hpet_nsleep(size_t ns) -{ - return hpet_sleep(ns, 1000000); -} - -static size_t -hpet_time_usec(void) -{ - uint64_t period, freq, caps; - uint64_t counter; - - caps = hpet_read(HPET_REG_CAPS); - period = CAP_CLK_PERIOD(caps); - freq = FSEC_PER_SECOND / period; - - counter = hpet_read(HPET_REG_MAIN_COUNTER); - return (counter * USEC_PER_SECOND) / freq; -} - -static size_t -hpet_time_sec(void) -{ - return hpet_time_usec() / USEC_PER_SECOND; -} - -int -hpet_init(void) -{ - struct acpi_gas *gas; - uint64_t caps; - - acpi_hpet = acpi_query("HPET"); - if (acpi_hpet == NULL) - return 1; /* Not found */ - - gas = &acpi_hpet->gas; - hpet_base = (void *)gas->address; - caps = hpet_read(HPET_REG_CAPS); - - /* Ensure caps aren't bogus */ - if (CAP_REV_ID(caps) == 0) { - pr_error("Found bogus revision, assuming faulty\n"); - is_faulty = true; - return 1; - } - if (CAP_CLK_PERIOD(caps) > 0x05F5E100) { - /* - * The spec states this counter clk period - * must be <= 0x05F5E100. So we'll consider it - * as bogus if it exceeds this value - */ - pr_error("Found bogus COUNTER_CLK_PERIOD, assuming faulty\n"); - pr_trace("HPET REV - 0x%x\n", CAP_REV_ID(caps)); - pr_trace("COUNTER_CLK_PERIOD - 0x%x\n", CAP_CLK_PERIOD(caps)); - is_faulty = true; - return 1; - } - - pr_trace("HPET integrity verified\n"); - - hpet_write(HPET_REG_MAIN_COUNTER, 0); - hpet_write(HPET_GENERAL_CONFIG, 1); - - /* Setup the timer descriptor */ - timer.name = "HIGH_PRECISION_EVENT_TIMER"; - timer.msleep = hpet_msleep; - timer.usleep = hpet_usleep; - timer.nsleep = hpet_nsleep; - timer.get_time_usec = hpet_time_usec; - timer.get_time_sec = hpet_time_sec; - register_timer(TIMER_GP, &timer); - - /* Not faulty */ - is_faulty = false; - return 0; -} diff --git a/sys/arch/amd64/amd64/idt.c b/sys/arch/amd64/amd64/idt.c deleted file mode 100644 index 03a2af0..0000000 --- a/sys/arch/amd64/amd64/idt.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -static struct idt_entry idt[256]; -static struct idtr idtr = { - .limit = sizeof(struct idt_entry) * 256 - 1, - .offset = (uintptr_t)&idt[0] -}; - -void -idt_load(void) -{ - LIDT(idtr); -} - -void -idt_set_desc(uint8_t vec, uint8_t type, uintptr_t isr, uint8_t ist) -{ - struct idt_entry *desc; - - if (vec >= 255) { - /* Invalid vector */ - return; - } - - desc = &idt[vec]; - desc->off_lo = __SHIFTOUT(isr, __MASK(16)); - desc->off_mid = __SHIFTOUT(isr, __MASK(16) << 16); - desc->off_hi = __SHIFTOUT(isr, __MASK(32) << 32); - desc->segsel = 0x8; /* Kernel CS */ - desc->type = type; - desc->dpl = 3; - desc->p = 1; - desc->zero = 0; - desc->zero1 = 0; - desc->reserved = 0; - desc->ist = ist; -} diff --git a/sys/arch/amd64/amd64/ioapic.c b/sys/arch/amd64/amd64/ioapic.c deleted file mode 100644 index 5dfdfa8..0000000 --- a/sys/arch/amd64/amd64/ioapic.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("ioapic"); -__KERNEL_META("$Hyra$: ioapic.c, Ian Marco Moffett, " - "I/O APIC driver"); - -#define pr_trace(fmt, ...) kprintf("ioapic: " fmt, ##__VA_ARGS__) -#define IOAPIC_BASE_OFF(off) ((void *)((uintptr_t)ioapic_base + off)) - -static void *ioapic_base = NULL; - -/* - * Reads a 32 bit value from the IOAPIC - * register space. - * - * @reg: Register to read from. - */ -static uint32_t -ioapic_readl(uint16_t reg) -{ - mmio_write32(IOAPIC_BASE_OFF(IOREGSEL), reg); - return mmio_read32(IOAPIC_BASE_OFF(IOWIN)); -} - -/* - * Writes a 32 bit value to the IOAPIC - * register space. - * - * @reg: Register to write to. - * @val: Value to write. - */ -static void -ioapic_writel(uint16_t reg, uint32_t val) -{ - mmio_write32(IOAPIC_BASE_OFF(IOREGSEL), reg); - mmio_write32(IOAPIC_BASE_OFF(IOWIN), val); -} - -/* - * Reads an I/O APIC redirection entry. - * - * @entry: Entry variable to read into. - * @index: Index to read. - */ -static void -ioapic_read_redentry(union ioapic_redentry *entry, uint8_t index) -{ - uint32_t lo, hi; - - lo = ioapic_readl(IOREDTBL + index * 2); - hi = ioapic_readl(IOREDTBL + index * 2 + 1); - - entry->value = ((uint64_t)hi << 32) | lo; -} - -/* - * Writes an I/O APIC redirection entry. - * - * @entry: Entry variable to write. - * @index: Index to write to. - */ -static void -ioapic_write_redentry(const union ioapic_redentry *entry, uint8_t index) -{ - ioapic_writel(IOREDTBL + index * 2, (uint32_t)entry->value); - ioapic_writel(IOREDTBL + index * 2 + 1, (uint32_t)(entry->value >> 32)); -} - -/* - * Mask I/O APIC pin with "raw" pin number - * (Global System Interrupt) - * - * @gsi: Global System Interrupt number - */ -void -ioapic_gsi_mask(uint8_t gsi) -{ - union ioapic_redentry redentry; - - ioapic_read_redentry(&redentry, gsi); - redentry.interrupt_mask = 1; - ioapic_write_redentry(&redentry, gsi); -} - -/* - * Unmask I/O APIC pin with "raw" pin number - * (Global System Interrupt) - * - * @gsi: Global System Interrupt number - */ -void -ioapic_gsi_unmask(uint8_t gsi) -{ - union ioapic_redentry redentry; - - ioapic_read_redentry(&redentry, gsi); - redentry.interrupt_mask = 0; - ioapic_write_redentry(&redentry, gsi); -} - -/* - * Masks I/O APIC pin via IRQ number - * - * @irq: Interrupt Request number - */ -void -ioapic_irq_mask(uint8_t irq) -{ - uint8_t gsi; - - gsi = irq_to_gsi(irq); - ioapic_gsi_mask(gsi); -} - -/* - * Unmasks I/O APIC pin via IRQ number - * - * @irq: Interrupt Request number - */ -void -ioapic_irq_unmask(uint8_t irq) -{ - uint8_t gsi; - - gsi = irq_to_gsi(irq); - ioapic_gsi_unmask(gsi); -} - -void -ioapic_set_base(void *mmio_base) -{ - if (ioapic_base == NULL) - ioapic_base = mmio_base; -} - -void -ioapic_set_vec(uint8_t irq, uint8_t vector) -{ - union ioapic_redentry redentry; - uint8_t gsi = irq_to_gsi(irq); - - ioapic_read_redentry(&redentry, gsi); - redentry.vector = vector; - ioapic_write_redentry(&redentry, gsi); -} - -void -ioapic_init(void) -{ - size_t tmp; - uint8_t redir_entry_cnt; - - /* Sanity check */ - if (ioapic_base == NULL) - panic("ioapic base not set!\n"); - - tmp = ioapic_readl(IOAPICVER); - redir_entry_cnt = __SHIFTOUT(tmp, 0xFF << 16) + 1; - - pr_trace("Masking %d GSIs...\n", redir_entry_cnt); - - for (uint8_t i = 0; i < redir_entry_cnt; ++i) { - ioapic_gsi_mask(i); - } -} diff --git a/sys/arch/amd64/amd64/lapic.c b/sys/arch/amd64/amd64/lapic.c deleted file mode 100644 index 81432dd..0000000 --- a/sys/arch/amd64/amd64/lapic.c +++ /dev/null @@ -1,435 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("lapic"); -__KERNEL_META("$Hyra$: lapic.c, Ian Marco Moffett, " - "Local APIC driver"); - -#define pr_trace(fmt, ...) kprintf("lapic: " fmt, ##__VA_ARGS__) -#define pr_error(...) pr_trace(__VA_ARGS__) - -/* - * Only calls pr_trace if we are the BSP. - */ -#define BSP_TRACE(...) do { \ - uint64_t msr_val; \ - \ - msr_val = rdmsr(IA32_APIC_BASE_MSR); \ - if (__TEST(msr_val, 1 << 8)) { \ - pr_trace(__VA_ARGS__); \ - } \ - } while (0); - -static struct timer lapic_timer = { 0 }; - -__naked void lapic_tmr_isr(void); - -/* - * Returns true if LAPIC is supported. - * - * LAPIC is supported if CPUID.(EAX=1H):EDX[9] == 1 - */ -static inline bool -lapic_check_support(void) -{ - uint32_t eax, edx, tmp; - - __CPUID(0x00000001, eax, tmp, tmp, edx); - return __TEST(edx, 1 << 9); -} - -/* - * Reads a 32 bit value from Local APIC - * register space. - * - * @reg: Register to read from. - */ -static inline uint64_t -lapic_readl(uint32_t reg) -{ - void *addr; - const struct cpu_info *ci = this_cpu(); - - if (!ci->has_x2apic) { - addr = (void *)((uintptr_t)ci->lapic_base + reg); - return mmio_read32(addr); - } else { - reg >>= 4; - return rdmsr(x2APIC_MSR_BASE + reg); - } -} - -/* - * Writes a 32 bit value to Local APIC - * register space. - * - * @reg: Register to write to. - */ -static inline void -lapic_writel(uint32_t reg, uint64_t val) -{ - void *addr; - const struct cpu_info *ci = this_cpu(); - - if (!ci->has_x2apic) { - addr = (void *)((uintptr_t)ci->lapic_base + reg); - mmio_write32(addr, val); - } else { - reg >>= 4; - wrmsr(x2APIC_MSR_BASE + reg, val); - } -} - -/* - * Calibrates the Local APIC timer - Timer abstraction - */ -static size_t -lapic_timer_calibrate(void) -{ - size_t freq; - - lapic_timer_init(&freq); - return freq; -} - -/* - * Stops the Local APIC timer - Timer abstraction - */ -static void -lapic_timer_stop(void) -{ - lapic_writel(LAPIC_INIT_CNT, 0); - lapic_writel(LAPIC_LVT_TMR, LAPIC_LVT_MASK); -} - -/* - * Set bits within a LAPIC register - * without overwriting the whole thing. - * - * @reg: Reg with bits to be set. - * @value: Value in reg will be ORd with this. - */ -static inline void -lapic_reg_set(uint32_t reg, uint32_t value) -{ - uint32_t old; - - old = lapic_readl(reg); - lapic_writel(reg, old | value); -} - -/* - * Clear bits within a LAPIC register - * without overwriting the whole thing. - * - * @reg: Reg with bits to be cleared. - * @value: Value in reg will be cleared by this value. - */ -static inline void -lapic_reg_clear(uint32_t reg, uint32_t value) -{ - uint32_t old; - - old = lapic_readl(reg); - lapic_writel(reg, old & ~(value)); -} - -/* - * Reads the Local APIC ID of the - * current processor. - */ -static inline uint32_t -lapic_get_id(const struct cpu_info *ci) -{ - if (!ci->has_x2apic) { - return (lapic_readl(LAPIC_ID) >> 24) & 0xF; - } else { - return lapic_readl(LAPIC_ID); - } -} - -/* - * Checks if the processor supports x2APIC - * mode. Returns true if so. - */ -static inline bool -has_x2apic(void) -{ - uint32_t ecx, tmp; - - __CPUID(0x00000001, tmp, tmp, ecx, tmp); - return __TEST(ecx, 1 << 21); -} - -/* - * Updates LDR to LAPIC_STARTUP_LID. - * - * XXX: This does *not* happen with x2APIC - * as the LDR register in x2APIC mode - * is readonly. - */ -static inline void -lapic_set_ldr(struct cpu_info *ci) -{ - if (!ci->has_x2apic) - lapic_writel(LAPIC_LDR, LAPIC_STARTUP_LID); -} - -/* - * Starts the Local APIC countdown timer... - * - * @mask: True to mask timer. - * @mode: Timer mode. - * @count: Count to start at. - */ -static inline void -lapic_timer_start(bool mask, uint8_t mode, uint32_t count) -{ - uint32_t tmp; - - tmp = (mode << 17) | (mask << 16) | SYSVEC_LAPIC_TIMER; - lapic_writel(LAPIC_LVT_TMR, tmp); - lapic_writel(LAPIC_DCR, 0); - lapic_writel(LAPIC_INIT_CNT, count); -} - -/* - * Start Local APIC timer oneshot with number - * of ticks to count down from. - * - * @mask: If `true', timer will be masked, `count' should be 0. - * @count: Number of ticks. - */ -void -lapic_timer_oneshot(bool mask, uint32_t count) -{ - lapic_timer_start(mask, LVT_TMR_ONESHOT, count); -} - -/* - * Start Local APIC timer oneshot in microseconds. - * - * @us: Microseconds. - */ -void -lapic_timer_oneshot_us(size_t us) -{ - uint64_t ticks; - struct cpu_info *ci = this_cpu(); - - ticks = us * (ci->lapic_tmr_freq / 1000000); - lapic_timer_oneshot(false, ticks); -} - -/* - * Send an Interprocessor interrupt. - * - * @id: Target LAPIC ID - * @shorthand: Dest shorthand - * @vector: Interrupt vector - */ -void -lapic_send_ipi(uint8_t id, uint8_t shorthand, uint8_t vector) -{ - const uint32_t x2APIC_IPI_SELF = 0x3F0; - uint64_t icr_lo = vector | IPI_DEST_PHYSICAL; - bool x2apic_supported = has_x2apic(); - - if (x2apic_supported && shorthand == IPI_SHORTHAND_SELF) { - lapic_writel(x2APIC_IPI_SELF, vector); - return; - } - - switch (shorthand) { - case IPI_SHORTHAND_SELF: - icr_lo |= (1 << 18); - break; - case IPI_SHORTHAND_ALL: - icr_lo |= (2 << 18); - break; - case IPI_SHORTHAND_OTHERS: - icr_lo |= (3 << 18); - break; - } - - /* - * In contrast to xAPICs two 32-bit ICR registers, the x2APIC - * ICR register is one big 64-bit register, thus requiring only - * a single write. In xAPIC mode, the Delivery Status bit (bit 12) - * must be polled until clear. However, in x2APIC mode, this bit - * does not exist meaning we do not need to worry about it. - */ - if (x2apic_supported) { - lapic_writel(LAPIC_ICRLO, ((uint64_t)id << 32) | icr_lo); - } else { - lapic_writel(LAPIC_ICRHI, ((uint32_t)id << 24)); - lapic_writel(LAPIC_ICRLO, icr_lo); - while (__TEST(lapic_readl(LAPIC_ICRLO), __BIT(12))); - } -} - -void -lapic_send_eoi(void) -{ - lapic_writel(LAPIC_EOI, 0); -} - -/* - * Calibrates the Local APIC timer - * - * TODO: Disable interrupts and put them back in - * old state. - * - * XXX: Will unmask IRQs if masked; will restore - * IRQ mask state after. - */ -void -lapic_timer_init(size_t *freq_out) -{ - struct cpu_info *ci; - bool irq_mask = is_intr_mask(); - uint16_t init_tick, final_tick; - size_t total_ticks; - const uint16_t SAMPLES = 0xFFFF; - - ci = this_cpu(); - - if (irq_mask) { - __ASMV("sti"); - } - - /* Stop the timer */ - lapic_timer_oneshot(true, 0); - - i8254_set_reload(SAMPLES); - init_tick = i8254_get_count(); - - lapic_writel(LAPIC_INIT_CNT, SAMPLES); - while (lapic_readl(LAPIC_CUR_CNT) != 0); - - final_tick = i8254_get_count(); - total_ticks = init_tick - final_tick; - - /* Calculate the frequency */ - CPU_INFO_LOCK(ci); - ci->lapic_tmr_freq = (SAMPLES / total_ticks) * i8254_DIVIDEND; - if (freq_out != NULL) *freq_out = ci->lapic_tmr_freq; - CPU_INFO_UNLOCK(ci); - - /* Stop timer again */ - lapic_timer_oneshot(true, 0); - - if (irq_mask) { - __ASMV("cli"); - } -} - -void -lapic_init(void) -{ - struct cpu_info *ci; - union tss_stack tmr_stack; - uint64_t tmp; - - if (!lapic_check_support()) { - /* - * Hyra currently depends on the existance - * of a Local APIC. - */ - panic("This machine does not support LAPIC!\n"); - } - - /* Get the current processor, and lock its structure */ - ci = this_cpu(); - CPU_INFO_LOCK(ci); - - ci->has_x2apic = has_x2apic(); - - /* Sanity check */ - if (ci->lapic_base == NULL) { - panic("LAPIC base not set!\n"); - } - - /* Hardware enable the Local APIC */ - tmp = rdmsr(IA32_APIC_BASE_MSR); - tmp |= ci->has_x2apic << x2APIC_ENABLE_SHIFT; - wrmsr(IA32_APIC_BASE_MSR, tmp | LAPIC_HW_ENABLE); - - /* Software enable the Local APIC via SVR */ - lapic_reg_set(LAPIC_SVR, LAPIC_SW_ENABLE); - - BSP_TRACE("Enabled Local APIC for BSP\n"); - lapic_set_ldr(ci); - - /* Setup the timer descriptor */ - lapic_timer.name = "LAPIC_INTEGRATED_TIMER"; - lapic_timer.calibrate = lapic_timer_calibrate; - lapic_timer.stop = lapic_timer_stop; - lapic_timer.oneshot_us = lapic_timer_oneshot_us; - - /* Register the timer for scheduler usage */ - register_timer(TIMER_SCHED, &lapic_timer); - - /* Set the Local APIC ID */ - ci->id = lapic_get_id(ci); - BSP_TRACE("BSP Local APIC ID: %d\n", ci->id); - - /* Setup LAPIC Timer TSS stack */ - if (tss_alloc_stack(&tmr_stack, vm_get_page_size()) != 0) { - panic("Failed to allocate LAPIC TMR stack! (1 page of mem)\n"); - } - tss_update_ist(ci, tmr_stack, IST_SCHED); - CPU_INFO_UNLOCK(ci); - - /* Calibrate timer */ - lapic_timer_init(NULL); - - /* Setup LAPIC Timer ISR */ - idt_set_desc(SYSVEC_LAPIC_TIMER, IDT_INT_GATE_FLAGS, - (uintptr_t)lapic_tmr_isr, IST_SCHED); - - BSP_TRACE("LAPIC Timer on Interrupt Stack %d (IST_SCHED) with vector 0x%x\n", - IST_SCHED, SYSVEC_LAPIC_TIMER); -} diff --git a/sys/arch/amd64/amd64/local_intr.S b/sys/arch/amd64/amd64/local_intr.S deleted file mode 100644 index c2d53e9..0000000 --- a/sys/arch/amd64/amd64/local_intr.S +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include - -__KERNEL_META "$Hyra$: local_intr.S, Ian Marco Moffett, \ - Routines for handling Local Interrupts" - -.text - .globl lapic_tmr_isr - -lapic_tmr_isr: - push_trapframe $0 - mov %rsp, %rdi - call sched_context_switch - call handle_local_tmr - call lapic_send_eoi - pop_trapframe - iretq diff --git a/sys/arch/amd64/amd64/machdep.c b/sys/arch/amd64/amd64/machdep.c deleted file mode 100644 index 0c2718a..0000000 --- a/sys/arch/amd64/amd64/machdep.c +++ /dev/null @@ -1,401 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("machdep"); -__KERNEL_META("$Hyra$: machdep.c, Ian Marco Moffett, " - "Core machine dependent code"); - -#define ISR(func) ((uintptr_t)func) -#define INIT_FLAG_IOAPIC 0x00000001U -#define INIT_FLAG_ACPI 0x00000002U - -/* Set by kconf(1) */ -#define PANIC_BEEP_HZ __PANIC_BEEP_HZ -#define PANIC_BEEP __PANIC_BEEP - -void syscall_isr(void); - -__attr(interrupt) -static void -halt_isr(void *sf) -{ - processor_halt(); -} - -static inline void -init_tss(struct cpu_info *cur_cpu) -{ - struct tss_desc *desc; - - desc = (struct tss_desc *)g_gdt_tss; - write_tss(cur_cpu, desc); - tss_load(); -} - -static void -interrupts_init(void) -{ - idt_set_desc(0x0, IDT_TRAP_GATE_FLAGS, ISR(arith_err), 0); - idt_set_desc(0x2, IDT_TRAP_GATE_FLAGS, ISR(nmi), 0); - idt_set_desc(0x3, IDT_TRAP_GATE_FLAGS, ISR(breakpoint_handler), 0); - idt_set_desc(0x4, IDT_TRAP_GATE_FLAGS, ISR(overflow), 0); - idt_set_desc(0x5, IDT_TRAP_GATE_FLAGS, ISR(bound_range), 0); - idt_set_desc(0x6, IDT_TRAP_GATE_FLAGS, ISR(invl_op), 0); - idt_set_desc(0x8, IDT_TRAP_GATE_FLAGS, ISR(double_fault), 0); - idt_set_desc(0xA, IDT_TRAP_GATE_FLAGS, ISR(invl_tss), 0); - idt_set_desc(0xB, IDT_TRAP_GATE_FLAGS, ISR(segnp), 0); - idt_set_desc(0xC, IDT_TRAP_GATE_FLAGS, ISR(ss_fault), 0); - idt_set_desc(0xD, IDT_TRAP_GATE_FLAGS, ISR(general_prot), 0); - idt_set_desc(0xE, IDT_TRAP_GATE_FLAGS, ISR(page_fault), 0); - idt_set_desc(0x80, IDT_INT_GATE_USER, ISR(syscall_isr), 0); - idt_set_desc(SYSVEC_HLT, IDT_INT_GATE_FLAGS, ISR(halt_isr), 0); - idt_load(); -} - -static bool -is_sse_supported(void) -{ - uint32_t edx, unused; - - __CPUID(0x00000001, unused, unused, unused, edx); - return __TEST(edx, __BIT(25)) && __TEST(edx, __BIT(26)); -} - -static const char* -backtrace_addr_to_name(uintptr_t addr, off_t *off) -{ - uintptr_t prev_addr = 0; - const char *name = NULL; - - for (size_t i = 0;;) { - if (g_ksym_table[i].addr > addr) { - *off = addr - prev_addr; - return name; - } - - prev_addr = g_ksym_table[i].addr; - name = g_ksym_table[i].name; - if (g_ksym_table[i++].addr == (uint64_t)-1) - break; - } - - return NULL; -} - -static void -backtrace(void) -{ - uintptr_t *rbp; - uintptr_t rip; - - off_t off; - const char *name; - - kprintf(OMIT_TIMESTAMP "** Backtrace **\n"); - __ASMV("mov %%rbp, %0" : "=r" (rbp) :: "memory"); - - while (1) { - rip = rbp[1]; - rbp = (uintptr_t *)rbp[0]; - name = backtrace_addr_to_name(rip, &off); - - if (rbp == NULL) - break; - if (name == NULL) - name = "???"; - - kprintf(OMIT_TIMESTAMP "[0x%p] <%s+0x%x>\n", rip, name, off); - } -} - -static void -panic_beep(void) -{ - struct timer tmr = {0}; - bool has_timer = true; - - if (req_timer(TIMER_GP, &tmr) != TMRR_SUCCESS) - has_timer = false; - if (tmr.msleep == NULL) - has_timer = false; - - /* - * If we can use the timer, beep twice to - * alert the user. - */ - if (has_timer) { - for (int i = 0; i < 2; ++i) { - pcspkr_tone(PANIC_BEEP_HZ, 200); - tmr.msleep(100); - } - } -} - -void -processor_halt(void) -{ - __ASMV("cli; hlt"); -} - -/* - * Send char to serial for debugging purposes. - */ -void -serial_dbgch(char c) -{ - uart8250_write(c); -} - -void -chips_init(void) -{ - /* Hyra requires HPET on x86_64 */ - if (hpet_init() != 0) - panic("Machine does not support HPET!\n"); - - pci_init(); -} - -/* - * These are critical things that need to be set up as soon as possible - * way before the processor_init() call. - */ -void -pre_init(void) -{ - static bool is_bsp = true; - - /* - * Certain things like serial ports, virtual memory, - * etc, need to be set up only once! These things - * are to be done on the BSP only... - */ - if (is_bsp) { - is_bsp = false; - - uart8250_try_init(); - vm_physseg_init(); - vm_init(); - } - interrupts_init(); - gdt_load(&g_gdtr); -} - -void -intr_mask(void) -{ - __ASMV("cli"); -} - -void -intr_unmask(void) -{ - __ASMV("sti"); -} - -/* - * Called last within panic() - */ -void -machine_panic(void) -{ - backtrace(); - - if (PANIC_BEEP) - panic_beep(); - - processor_halt(); -} - -void -cpu_halt_others(void) -{ - struct cpu_info *ci = this_cpu(); - - /* Is the current CPU structure even valid? */ - if (ci == NULL) - return; - - /* - * If the Local APIC base address is NULL, we can't - * use lapic_send_ipi() but we we can assume the APs - * are still parked. - */ - if (ci->lapic_base != NULL) - lapic_send_ipi(0, IPI_SHORTHAND_OTHERS, SYSVEC_HLT); -} - -int -processor_init_pcb(struct proc *proc) -{ - struct pcb *pcb = &proc->pcb; - const uint16_t FPU_FCW = 0x33F; - const uint32_t SSE_MXCSR = 0x1F80; - - /* Allocate FPU save area, aligned on a 16 byte boundary */ - pcb->fpu_state = PHYS_TO_VIRT(vm_alloc_pageframe(1)); - if (pcb->fpu_state == NULL) { - return -1; - } - - /* - * Setup x87 FPU control word and SSE MXCSR bits - * as per the sysv ABI - */ - __ASMV("fldcw %0\n" - "ldmxcsr %1" - :: "m" (FPU_FCW), - "m" (SSE_MXCSR) : "memory"); - - amd64_fxsave(pcb->fpu_state); - return 0; -} - -int -processor_free_pcb(struct proc *proc) -{ - struct pcb *pcb = &proc->pcb; - - if (pcb->fpu_state == NULL) { - return -1; - } - - vm_free_pageframe(VIRT_TO_PHYS(pcb->fpu_state), 1); - return 0; -} - -void -processor_switch_to(struct proc *old_td, struct proc *new_td) -{ - struct pcb *old_pcb = (old_td != NULL) ? &old_td->pcb : NULL; - struct pcb *new_pcb = &new_td->pcb; - - if (old_pcb != NULL) { - amd64_fxsave(old_pcb->fpu_state); - } - amd64_fxrstor(new_pcb->fpu_state); -} - -void -cpu_reset(void) -{ - for (;;) { - /* Pulse the reset line */ - outb(0x64, 0xFE); - } -} - -void -processor_init(void) -{ - /* Indicates what doesn't need to be init anymore */ - static uint8_t init_flags = 0; - static uint64_t reg_tmp; - struct cpu_info *cur_cpu; - - /* Create our cpu_info structure */ - cur_cpu = dynalloc(sizeof(struct cpu_info)); - __assert(cur_cpu != NULL); - memset(cur_cpu, 0, sizeof(struct cpu_info)); - - /* Set %GS to cpu_info */ - amd64_write_gs_base((uintptr_t)cur_cpu); - - /* Try to enable SSE/SSE2 */ - if (is_sse_supported()) { - reg_tmp = amd64_read_cr0(); - reg_tmp &= ~(__BIT(2)); - reg_tmp |= __BIT(1); - amd64_write_cr0(reg_tmp); - - /* Enable FXSAVE/FXRSTOR */ - reg_tmp = amd64_read_cr4(); - reg_tmp |= 3 << 9; - amd64_write_cr4(reg_tmp); - } else { - panic("SSE/SSE2 not supported!\n"); - } - - CPU_INFO_LOCK(cur_cpu); - init_tss(cur_cpu); - - /* Set up some ACPI things */ - if (!__TEST(init_flags, INIT_FLAG_ACPI)) { - /* - * Parse the MADT... This is needed to fetch required information - * to set up the Local APIC(s) and I/O APIC(s)... - */ - init_flags |= INIT_FLAG_ACPI; - acpi_parse_madt(cur_cpu); - } - - /* Setup I/O APIC */ - if (!__TEST(init_flags, INIT_FLAG_IOAPIC)) { - init_flags |= INIT_FLAG_IOAPIC; - ioapic_init(); - } - - cur_cpu->lapic_base = acpi_get_lapic_base(); - CPU_INFO_UNLOCK(cur_cpu); - lapic_init(); - - /* Use spectre mitigation if enabled */ - if (try_spectre_mitigate != NULL) - try_spectre_mitigate(); - - __ASMV("sti"); -} diff --git a/sys/arch/amd64/amd64/pmap.c b/sys/arch/amd64/amd64/pmap.c deleted file mode 100644 index 9443727..0000000 --- a/sys/arch/amd64/amd64/pmap.c +++ /dev/null @@ -1,389 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Page-Table Entry (PTE) flags - * - * See Intel SDM Vol 3A, Section 4.5, Table 4-19 - */ -#define PTE_ADDR_MASK 0x000FFFFFFFFFF000 -#define PTE_P __BIT(0) /* Present */ -#define PTE_RW __BIT(1) /* Writable */ -#define PTE_US __BIT(2) /* User r/w allowed */ -#define PTE_PWT __BIT(3) /* Page-level write-through */ -#define PTE_PCD __BIT(4) /* Page-level cache disable */ -#define PTE_ACC __BIT(5) /* Accessed */ -#define PTE_DIRTY __BIT(6) /* Dirty (written-to page) */ -#define PTE_PAT __BIT(7) -#define PTE_GLOBAL __BIT(8) -#define PTE_NX __BIT(63) /* Execute-disable */ - -__attr(interrupt) static void -tlb_shootdown_isr(void *sf) -{ - struct cpu_info *ci = this_cpu(); - struct intr_info *intr_info = ci->tlb_shootdown; - - /* Setup interrupt information if needed */ - if (ci->tlb_shootdown == NULL) { - intr_info = intr_info_alloc("TLB-Shootdown", "LAPIC-IPI"); - intr_info->affinity = ci->id; - - ci->tlb_shootdown = intr_info; - intr_register(intr_info); - } - - ++intr_info->count; - tlb_flush(ci->tlb_flush_ptr); - - ci->tlb_flush_ptr = 0; - lapic_send_eoi(); -} - -static void -tlb_shootdown(vaddr_t flush_va) -{ - struct cpu_info *curcpu, *ci = NULL; - size_t idx = 0; - - curcpu = this_cpu(); - while ((ci = cpu_get(idx++)) != NULL) { - if (ci->id == curcpu->id) - continue; - - ci->tlb_flush_ptr = flush_va; - } - - lapic_send_ipi(0, IPI_SHORTHAND_OTHERS, SYSVEC_TLB); -} - -/* - * Convert pmap prot flags to PTE flags. - */ -static uint64_t -pmap_prot_to_pte(vm_prot_t prot) -{ - uint64_t pte_flags = PTE_P | PTE_NX; - - if (__TEST(prot, PROT_WRITE)) - pte_flags |= PTE_RW; - if (__TEST(prot, PROT_EXEC)) - pte_flags &= ~(PTE_NX); - if (__TEST(prot, PROT_USER)) - pte_flags |= PTE_US; - - return pte_flags; -} - -/* - * Returns index for a specific pagemap level. - * - * @level: Requested level. - * @va: Virtual address. - */ -static size_t -pmap_get_level_index(uint8_t level, vaddr_t va) -{ - /* TODO: Make this bullshit assertion better */ - __assert(level <= 4 && level != 0); - - switch (level) { - case 4: - return (va >> 39) & 0x1FF; - case 3: - return (va >> 30) & 0x1FF; - case 2: - return (va >> 21) & 0x1FF; - case 1: - return (va >> 12) & 0x1FF; - default: /* Should not be reachable */ - return 0; - } -} - -static inline uintptr_t * -pmap_extract(uint8_t level, vaddr_t va, uintptr_t *pmap, bool allocate) -{ - uintptr_t next; - uintptr_t level_alloc; - size_t idx; - - idx = pmap_get_level_index(level, va); - - if (__TEST(pmap[idx], PTE_P)) { - next = pmap[idx] & PTE_ADDR_MASK; - return PHYS_TO_VIRT(next); - } - - if (!allocate) { - return 0; - } - - /* - * TODO: If we are out of pageframes here, we don't want to panic - * here. We need to have some sort of clean error reporting. - */ - level_alloc = vm_alloc_pageframe(1); - __assert(level_alloc != 0); - - /* Zero the memory */ - memset(PHYS_TO_VIRT(level_alloc), 0, vm_get_page_size()); - - pmap[idx] = level_alloc | (PTE_P | PTE_RW | PTE_US); - return PHYS_TO_VIRT(level_alloc); -} - -/* - * Modify a page table by writing `val' to it. - * - * @ctx: Virtual memory context. - * @vas: Virtual address space. - * @va: Virtual address. - * @alloc: True to alloc new entries. - * @res: Result - */ -static int -pmap_get_tbl(struct vm_ctx *ctx, struct vas vas, vaddr_t va, bool alloc, - uintptr_t **res) -{ - uintptr_t *pml4 = PHYS_TO_VIRT(vas.top_level); - uintptr_t *pdpt, *pd, *tbl; - int status = 0; - - pdpt = pmap_extract(4, va, pml4, alloc); - if (pdpt == NULL) { - status = 1; - goto done; - } - - pd = pmap_extract(3, va, pdpt, alloc); - if (pd == NULL) { - status = 1; - goto done; - } - - tbl = pmap_extract(2, va, pd, alloc); - if (tbl == NULL) { - status = 1; - goto done; - } - - *res = tbl; -done: - return status; -} - -/* - * Flush a virtual address. - * - * @va: VA to flush from TLB. - */ -static void -pmap_flush(vaddr_t va) -{ - /* - * Do TLB shootdown if multiple CPUs are listed. - * - * XXX: Some might not be listed during early - * startup. - */ - if (cpu_count() > 1) { - tlb_shootdown(va); - } - - tlb_flush(va); -} - -/* - * Modify a page table by writing `val' to it. - * - * TODO: Ensure operations here are serialized. - */ -static int -pmap_modify_tbl(struct vm_ctx *ctx, struct vas vas, vaddr_t va, size_t val) -{ - uintptr_t *tbl; - int status; - - if ((status = pmap_get_tbl(ctx, vas, va, true, &tbl) != 0)) { - return status; - } - - /* Map our page */ - tbl[pmap_get_level_index(1, va)] = val; - pmap_flush(va); - return 0; -} - -int -pmap_set_cache(struct vm_ctx *ctx, struct vas vas, vaddr_t va, int type) -{ - uintptr_t *tbl; - int status; - size_t idx; - - if ((status = pmap_get_tbl(ctx, vas, va, false, &tbl)) != 0) { - return status; - } - - idx = pmap_get_level_index(1, va); - - /* Set the policy based on the type */ - switch (type) { - case VM_CACHE_UC: - tbl[idx] |= PTE_PCD; - tbl[idx] &= ~(PTE_PWT); - break; - case VM_CACHE_WT: - tbl[idx] &= ~(PTE_PCD); - tbl[idx] |= PTE_PWT; - break; - default: - /* Invalid type */ - return 1; - } - - pmap_flush(va); - return 0; -} - -int -pmap_map(struct vm_ctx *ctx, struct vas vas, vaddr_t va, paddr_t pa, - vm_prot_t prot) -{ - uint32_t flags = pmap_prot_to_pte(prot); - - return pmap_modify_tbl(ctx, vas, va, (pa | flags)); -} - -int -pmap_unmap(struct vm_ctx *ctx, struct vas vas, vaddr_t va) -{ - return pmap_modify_tbl(ctx, vas, va, 0); -} - -int -pmap_create_vas(struct vm_ctx *ctx, struct vas *res) -{ - struct vas current_vas = pmap_read_vas(); - struct vas new_vas = {0}; - uint64_t *src, *dest; - - /* - * We want to allocate a zeroed pageframe - * and copy the higher half to it. The lower - * half can remain zero for userland. - */ - new_vas.top_level = vm_alloc_pageframe(1); - - if (new_vas.top_level == 0) { - return -1; - } - - src = PHYS_TO_VIRT(current_vas.top_level); - dest = PHYS_TO_VIRT(new_vas.top_level); - - /* - * Copy the top half and zero the bottom - * half. - */ - for (size_t i = 0; i < 512; ++i) { - if (i < 256) { - dest[i] = 0; - continue; - } - dest[i] = src[i]; - } - - *res = new_vas; - return 0; -} - -void -pmap_switch_vas(struct vm_ctx *ctx, struct vas vas) -{ - uintptr_t cr3_val = vas.cr3_flags | vas.top_level; - - __ASMV("mov %0, %%cr3" - : - : "r" (cr3_val) - : "memory"); -} - -/* - * TODO: During the mapping of a virtual address, a level - * may be allocated. This function does not handle the - * freeing of allocated levels. We should keep track - * of levels allocated and free them here. - */ -int -pmap_free_vas(struct vm_ctx *ctx, struct vas vas) -{ - vm_free_pageframe(vas.top_level, 1); - return 0; -} - -struct vas -pmap_read_vas(void) -{ - struct vas vas; - uintptr_t cr3_raw; - - __ASMV("mov %%cr3, %0" - : "=r" (cr3_raw) - ); - - vas.cr3_flags = cr3_raw & ~PTE_ADDR_MASK; - vas.top_level = cr3_raw & PTE_ADDR_MASK; - vas.use_l5_paging = false; /* TODO: Check for support */ - vas.lock.lock = 0; - return vas; -} - -int -pmap_init(struct vm_ctx *ctx) -{ - idt_set_desc(SYSVEC_TLB, IDT_INT_GATE_FLAGS, - (uintptr_t)tlb_shootdown_isr, 0); - - return 0; -} diff --git a/sys/arch/amd64/amd64/spectre.S b/sys/arch/amd64/amd64/spectre.S deleted file mode 100644 index 08ff9f8..0000000 --- a/sys/arch/amd64/amd64/spectre.S +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -__KERNEL_META "$Hyra$: spectre.S, Ian Marco Moffett, \ - Spectre mitigation detection" - -.text -.globl __can_mitigate_spectre - -__can_mitigate_spectre: - xor %ecx, %ecx // NULL out ECX - mov $0x7, %eax // 0x7 (Check IBRS) - cpuid - - /* Check if supported (if EDX[26] == 1) */ - mov $1, %ebx - shl $26, %ebx - test %ebx, %edx - jnz supported -not_supported: - xor %rax, %rax - jmp 1f -supported: - mov $1, %rax -1: - ret diff --git a/sys/arch/amd64/amd64/spectre.c b/sys/arch/amd64/amd64/spectre.c deleted file mode 100644 index 05aa557..0000000 --- a/sys/arch/amd64/amd64/spectre.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include - -__MODULE_NAME("spectre"); -__KERNEL_META("$Hyra$: spectre.c, Ian Marco Moffett, " - "Spectre mitigation support"); - -#if __SPECTRE_MITIGATION == 1 - -/* - * Returns true if Indirect Branch Restricted Speculation (IBRS) - * is supported. - */ -__naked bool -__can_mitigate_spectre(void); - -/* - * Returns EXIT_FAILURE if not supported, returns - * EXIT_SUCCESS if mitigation is now active. - * - * This function will be NULL if spectre mitigation isn't enabled; - * therefore it is wise to verify to prevent access violations and - * undefined behaviour. - * - * This behaviour is governed by the __SPECTRE_MITIGATION define - * - * TODO: Try to enable others, not just IBRS - */ -__weak int -try_spectre_mitigate(void) -{ - uint64_t tmp; - static bool should_log = true; - - if (!__can_mitigate_spectre()) { - KINFO("IBRS not supported; spectre mitigation NOT enabled\n"); - return EXIT_FAILURE; - } - - /* This is called per processor, only log once */ - if (should_log) { - KINFO("IBRS supported; spectre mitigation enabled\n"); - should_log = false; - } - - tmp = rdmsr(IA32_SPEC_CTL); - tmp |= __BIT(0); /* IBRS */ - wrmsr(IA32_SPEC_CTL, tmp); - - return EXIT_SUCCESS; -} - -#endif /* __SPECTRE_MITIGATION == 1 */ diff --git a/sys/arch/amd64/amd64/syscall.S b/sys/arch/amd64/amd64/syscall.S deleted file mode 100644 index fe70523..0000000 --- a/sys/arch/amd64/amd64/syscall.S +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - #include - -__KERNEL_META "$Hyra$: syscall.S, Ian Marco Moffett, \ - Syscall ISR code" - -.text -.globl syscall_isr -syscall_isr: - push_trapframe $0 - mov %rsp, %rdi - call __syscall - pop_trapframe - iretq diff --git a/sys/arch/amd64/amd64/syscall.c b/sys/arch/amd64/amd64/syscall.c deleted file mode 100644 index 264c8df..0000000 --- a/sys/arch/amd64/amd64/syscall.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -void -__syscall(struct trapframe *tf) -{ - struct syscall_args args = { - .code = tf->rax, - .arg0 = tf->rdi, - .arg1 = tf->rsi, - .arg2 = tf->rdx, - .arg3 = tf->r10, - .arg4 = tf->r9, - .arg5 = tf->r8, - .sp = tf->rsp, - .ip = tf->rip - }; - - if (args.code < __MAX_SYSCALLS && args.code > 0) { - args.code -= 1; - tf->rax = g_syscall_table[args.code](&args); - } - - tf->rip = args.ip; - tf->rsp = args.sp; -} diff --git a/sys/arch/amd64/amd64/trap.S b/sys/arch/amd64/amd64/trap.S deleted file mode 100644 index 3cf6888..0000000 --- a/sys/arch/amd64/amd64/trap.S +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include - -__KERNEL_META "$Hyra$: trap.S, Ian Marco Moffett, \ - Trap handling routines" - -.text -.globl breakpoint_handler -breakpoint_handler: - push_trapframe_ec $TRAP_BREAKPOINT - - handle_trap - - /* TODO */ - cli - hlt - -.globl arith_err -arith_err: - push_trapframe_ec $TRAP_ARITH_ERR - - handle_trap - - /* TODO */ - cli - hlt - -.globl overflow -overflow: - push_trapframe_ec $TRAP_OVERFLOW - - handle_trap - - /* TODO */ - cli - hlt - -.globl bound_range -bound_range: - push_trapframe_ec $TRAP_BOUND_RANGE - - handle_trap - - /* TODO */ - cli - hlt - -.globl invl_op -invl_op: - push_trapframe_ec $TRAP_INVLOP - - handle_trap - - /* TODO */ - cli - hlt - -.globl double_fault -double_fault: - push_trapframe_ec $TRAP_DOUBLE_FAULT - - handle_trap - - /* TODO */ - cli - hlt - -.globl invl_tss -invl_tss: - push_trapframe_ec $TRAP_INVLTSS - - handle_trap - - /* TODO */ - cli - hlt - -.globl segnp -segnp: - push_trapframe_ec $TRAP_SEGNP - - handle_trap - - /* TODO */ - cli - hlt - -.globl general_prot -general_prot: - push_trapframe_ec $TRAP_PROTFLT - - handle_trap - - /* TODO */ - cli - hlt - -.globl page_fault -page_fault: - push_trapframe_ec $TRAP_PAGEFLT - - handle_trap - - pop_trapframe - iretq - -.globl nmi -nmi: - push_trapframe_ec $TRAP_NMI - - handle_trap - - /* TODO */ - cli - hlt - -.globl ss_fault -ss_fault: - push_trapframe_ec $TRAP_SS - - handle_trap - - /* TODO */ - cli - hlt diff --git a/sys/arch/amd64/amd64/trap.c b/sys/arch/amd64/amd64/trap.c deleted file mode 100644 index 531f2f5..0000000 --- a/sys/arch/amd64/amd64/trap.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("trap"); -__KERNEL_META("$Hyra$: trap.c, Ian Marco Moffett, " - "Trap handling"); - -#define pr_error(fmt, ...) kprintf("trap: " fmt, ##__VA_ARGS__) - -static const char *trap_type[] = { - [TRAP_BREAKPOINT] = "breakpoint", - [TRAP_ARITH_ERR] = "arithmetic error", - [TRAP_OVERFLOW] = "overflow", - [TRAP_BOUND_RANGE] = "bound range exceeded", - [TRAP_INVLOP] = "invalid opcode", - [TRAP_DOUBLE_FAULT] = "double fault", - [TRAP_INVLTSS] = "invalid TSS", - [TRAP_SEGNP] = "segment not present", - [TRAP_PROTFLT] = "general protection", - [TRAP_PAGEFLT] = "page fault", - [TRAP_NMI] = "non-maskable interrupt", - [TRAP_SS] = "stack-segment fault" -}; - -static const int TRAP_COUNT = __ARRAY_COUNT(trap_type); - -static inline vaddr_t -pf_faultaddr(void) -{ - uintptr_t cr2; - __ASMV("mov %%cr2, %0\n" : "=r" (cr2) :: "memory"); - return cr2; -} - -static inline vm_prot_t -pf_accesstype(struct trapframe *tf) -{ - vm_prot_t prot = 0; - uint64_t ec = tf->error_code; - - if (__TEST(ec, __BIT(1))) - prot |= PROT_WRITE; - if (__TEST(ec, __BIT(2))) - prot |= PROT_USER; - if (__TEST(ec, __BIT(4))) - prot |= PROT_EXEC; - - return prot; -} - -static void -dbg_errcode(struct trapframe *tf) -{ - uint64_t ec = tf->error_code; - - switch (tf->trapno) { - case TRAP_PAGEFLT: - kprintf(OMIT_TIMESTAMP - "bits (pwui): %c%c%c%c\n", - __TEST(ec, __BIT(0)) ? 'p' : '-', - __TEST(ec, __BIT(1)) ? 'w' : '-', - __TEST(ec, __BIT(2)) ? 'u' : '-', - __TEST(ec, __BIT(4)) ? 'i' : '-'); - break; - case TRAP_SS: - kprintf(OMIT_TIMESTAMP "ss: 0x%x\n", ec); - break; - } -} - -static void -trap_print(struct trapframe *tf) -{ - if (tf->trapno < TRAP_COUNT) { - kprintf(OMIT_TIMESTAMP "** Fatal %s **\n", trap_type[tf->trapno]); - } else { - kprintf(OMIT_TIMESTAMP "** Unknown trap %d **\n", tf->trapno); - } - - dbg_errcode(tf); -} - -static void -regdump(struct trapframe *tf) -{ - uintptr_t cr3, cr2 = pf_faultaddr(); - - __ASMV("mov %%cr3, %0\n" - : "=r" (cr3) - : - : "memory" - ); - - kprintf(OMIT_TIMESTAMP - "RAX=%p RCX=%p RDX=%p\n" - "RBX=%p RSI=%p RDI=%p\n" - "RFL=%p CR2=%p CR3=%p\n" - "RBP=%p RSP=%p RIP=%p\n", - tf->rax, tf->rcx, tf->rdx, - tf->rbx, tf->rsi, tf->rdi, - tf->rflags, cr2, cr3, - tf->rbp, tf->rsp, tf->rip); -} - -static inline void -handle_fatal(struct trapframe *tf) -{ - trap_print(tf); - regdump(tf); - panic("Halted\n"); -} - -/* - * Raise a fatal signal. - * - * @curtd: Current thread. - * @sched_tmr: Scheduler timer. - * @sig: Signal to raise. - */ -static void -raise_fatal(struct proc *curtd, struct timer *sched_tmr, int sig) -{ - /* - * trap_handler() disables interrupts. We will be - * killing the current process but before we do that - * we need to make sure interrupts are running and the - * scheduler timer is still going... - */ - intr_unmask(); - sched_tmr->oneshot_us(DEFAULT_TIMESLICE_USEC); - signal_raise(curtd, sig); -} - -/* - * Handle a pagefault occuring in the userland - * - * @curtd: Current thread. - * @tf: Trapframe. - * @sched_tmr: Scheduler timer. - */ -static void -handle_user_pf(struct proc *curtd, struct trapframe *tf, - struct timer *sched_tmr) -{ - uintptr_t fault_addr; - vm_prot_t access_type; - int s; - - fault_addr = pf_faultaddr(); - access_type = pf_accesstype(tf); - s = vm_fault(fault_addr, access_type); - - if (s != 0) { - pr_error("Got page fault @ 0x%p\n", fault_addr); - pr_error("Fault access mask: 0x%x\n", access_type); - pr_error("Raising SIGSEGV to PID %d...\n", curtd->pid); - regdump(tf); - raise_fatal(curtd, sched_tmr, SIGSEGV); - } -} - -/* - * Handles traps. - */ -void -trap_handler(struct trapframe *tf) -{ - struct proc *curtd = this_td(); - struct timer sched_tmr; - tmrr_status_t tmrr_s; - - /* - * Mask interrupts so we don't get put in a funky - * state as we are dealing with this trap. Then the next - * thing we want to do is fetch the sched timer so we can - * ensure it is running after we unmask the interrupts. - */ - intr_mask(); - tmrr_s = req_timer(TIMER_SCHED, &sched_tmr); - if (__unlikely(tmrr_s != TMRR_SUCCESS)) { - trap_print(tf); - panic("Could not fetch TIMER_SCHED (tmrr_s=0x%x)\n", tmrr_s); - } - - /* - * We should be able to perform a usec oneshot but - * make sure just in case. - */ - if (__unlikely(sched_tmr.oneshot_us == NULL)) { - trap_print(tf); - panic("Timer oneshot_us is NULL!\n"); - } - - /* - * XXX: Handle NMIs better. For now we just - * panic. - */ - if (tf->trapno == TRAP_NMI) { - trap_print(tf); - kprintf(OMIT_TIMESTAMP "Possible hardware failure?\n"); - panic(OMIT_TIMESTAMP "Caught NMI; bailing out\n"); - } - - if (curtd == NULL) { - handle_fatal(tf); - } else if (!curtd->is_user) { - handle_fatal(tf); - } - - switch (tf->trapno) { - case TRAP_ARITH_ERR: - pr_error("Got arithmetic error - raising SIGFPE...\n"); - pr_error("SIGFPE -> PID %d\n", curtd->pid); - raise_fatal(curtd, &sched_tmr, SIGFPE); - break; - case TRAP_PAGEFLT: - handle_user_pf(curtd, tf, &sched_tmr); - break; - default: - pr_error("Got %s - raising SIGSEGV...\n", trap_type[tf->trapno]); - pr_error("SIGSEGV -> PID %d\n", curtd->pid); - regdump(tf); - raise_fatal(curtd, &sched_tmr, SIGSEGV); - break; - } - - /* All good, unmask and start sched timer */ - intr_unmask(); - sched_tmr.oneshot_us(DEFAULT_TIMESLICE_USEC); -} diff --git a/sys/arch/amd64/amd64/tss.S b/sys/arch/amd64/amd64/tss.S deleted file mode 100644 index 8cff06b..0000000 --- a/sys/arch/amd64/amd64/tss.S +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -__KERNEL_META "$Hyra$: tss.S, Ian Marco Moffett, \ - Low level TSS code" - -.globl tss_load -tss_load: - str %ax /* Store task register value into AX */ - mov $0x28, %ax /* Store TSS GDT selector into AX */ - or $3, %ax - ltr %ax /* Load the task register */ - retq diff --git a/sys/arch/amd64/amd64/tss.c b/sys/arch/amd64/amd64/tss.c deleted file mode 100644 index c9fc3bb..0000000 --- a/sys/arch/amd64/amd64/tss.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("TSS"); -__KERNEL_META("$Hyra$: tss.c, Ian Marco Moffett, " - "AMD64 Task state segment code"); - -static void -alloc_resources(struct cpu_info *cpu) -{ - struct tss_entry *tss; - const size_t STACK_SIZE = 0x1000; - static uintptr_t rsp0_base = 0, rsp0 = 0; - - /* - * Allocate TSS entries for this CPU - */ - if (cpu->tss == NULL) { - /* Allocate a TSS for this CPU */ - tss = dynalloc(sizeof(*tss)); - - if (tss == NULL) - panic("Failed to alloc %d bytes for TSS\n", sizeof(*tss)); - - memset(tss, 0, sizeof(*tss)); - rsp0_base = (uintptr_t)dynalloc_memalign(STACK_SIZE, 16); - - if (rsp0_base == 0) - panic("Could not allocate rsp0 base\n"); - - rsp0 = rsp0_base + STACK_SIZE; - tss->rsp0_lo = __SHIFTOUT(rsp0, __MASK(32)); - tss->rsp0_hi = __SHIFTOUT(rsp0, __MASK(32) << 32); - cpu->tss = tss; - } -} - -/* - * Update interrupt stack table entry `istno' with `stack' - * - * @stack: Interrupt stack. - * @istno: IST number, must be 1-based. - * - * Returns 0 on success. - */ -int -tss_update_ist(struct cpu_info *ci, union tss_stack stack, uint8_t istno) -{ - volatile struct tss_entry *tss = ci->tss; - - __assert(tss != NULL); - - switch (istno) { - case 1: - tss->ist1_lo = stack.top_lo; - tss->ist1_hi = stack.top_hi; - break; - case 2: - tss->ist2_lo = stack.top_lo; - tss->ist2_hi = stack.top_hi; - break; - case 3: - tss->ist3_lo = stack.top_lo; - tss->ist3_hi = stack.top_hi; - break; - case 4: - tss->ist4_lo = stack.top_lo; - tss->ist4_hi = stack.top_hi; - break; - case 5: - tss->ist5_lo = stack.top_lo; - tss->ist5_hi = stack.top_hi; - break; - case 6: - tss->ist6_lo = stack.top_lo; - tss->ist6_hi = stack.top_hi; - break; - case 7: - tss->ist7_lo = stack.top_lo; - tss->ist7_hi = stack.top_hi; - break; - default: - return -EXIT_FAILURE; - }; - - return 0; -} - -/* - * Allocates TSS stack. - * - * Returns 0 on success. - * - * @entry_out: Pointer to location where allocated entry - * will be sent. - */ -int -tss_alloc_stack(union tss_stack *entry_out, size_t size) -{ - uintptr_t base = (uintptr_t)dynalloc_memalign(size, 16); - - if (base == 0) { - return -EXIT_FAILURE; - } - - entry_out->top = base + size; - return 0; -} - -void -write_tss(struct cpu_info *cpu, struct tss_desc *desc) -{ - volatile struct tss_entry *tss; - uintptr_t tss_base; - - alloc_resources(cpu); - - tss_base = (uintptr_t)cpu->tss; - - /* - * XXX: The AVL (Available for use by system software) - * bit is ignored by hardware and it is up to us - * to decide how to use it... As of now, it is useless - * to us and shall remain 0. - */ - desc->seglimit = sizeof(struct tss_entry); - desc->p = 1; /* Must be present to be valid! */ - desc->g = 0; /* Granularity -> 0 */ - desc->avl = 0; /* Not used */ - desc->dpl = 0; /* Descriptor Privilege Level -> 0 */ - desc->type = 0x9; /* For TSS -> 0x9 (0b1001) */ - - desc->base_lo16 = __SHIFTOUT(tss_base, __MASK(16)); - desc->base_mid8 = __SHIFTOUT(tss_base, __MASK(8) << 16); - desc->base_hi_mid8 = __SHIFTOUT(tss_base, __MASK(8) << 24); - desc->base_hi32 = __SHIFTOUT(tss_base, __MASK(32) << 32); - - tss = cpu->tss; - tss->io_base = 0xFF; /* Disallow ring 3 port I/O */ -} diff --git a/sys/arch/amd64/amd64/uart.c b/sys/arch/amd64/amd64/uart.c deleted file mode 100644 index 0bf0236..0000000 --- a/sys/arch/amd64/amd64/uart.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include - -#define UART_COM1 0x3F8 - -#define UART_PORTNO(OFFSET) (UART_COM1 + 1) - -static bool -uart8250_transmit_empty(void) -{ - return __TEST(UART_PORTNO(5), __BIT(5)); -} - -void -uart8250_write(char byte) -{ - while (!uart8250_transmit_empty()); - outb(UART_COM1, byte); -} - -int -uart8250_try_init(void) -{ - /* Disable interrutps */ - outb(UART_PORTNO(1), 0x00); - - /* Enable DLAB to set divisor latches */ - outb(UART_PORTNO(3), 0x80); - - /* Set to 38400 baud via divisor latches (DLL and DLH)*/ - outb(UART_PORTNO(0), 0x03); - outb(UART_PORTNO(1), 0x00); - - /* - * Set Data Word Length to 8 bits... - * - * XXX: Our write does not preserve the DLAB bit... - * We want to clear it to make the baud latches - * readonly - */ - outb(UART_PORTNO(3), 0x03); - - /* - * We want FIFO to be enabled, and want to clear the - * TX/RX queues. We also want to set the interrupt - * watermark at 14 bytes. - */ - outb(UART_PORTNO(2), 0xC7); - - /* - * Enable auxiliary output 2 (used as interrupt line) and - * mark data terminal ready. - */ - outb(UART_PORTNO(4), 0x0B); - - /* Enable interrupts */ - outb(UART_PORTNO(1), 0x01); - - /* Put chip in loopback mode... test chip w/ test byte */ - outb(UART_PORTNO(4), 0x1E); - outb(UART_PORTNO(0), 0xAE); - if (inb(UART_PORTNO(0) != 0xAE)) { - /* Not the same byte, something is wrong */ - return 1; - } - return 0; -} diff --git a/sys/arch/amd64/conf/GENERIC b/sys/arch/amd64/conf/GENERIC deleted file mode 100644 index 032519d..0000000 --- a/sys/arch/amd64/conf/GENERIC +++ /dev/null @@ -1,9 +0,0 @@ -// Kernel options -option SPECTRE_MITIGATION no -option SERIAL_DEBUG yes -option PANIC_BEEP yes - -// Kernel constants -setval PANIC_BEEP_HZ 1050 -setval SCHED_NQUEUE 4 -setval KMSG_BUF_SHIFT 16 diff --git a/sys/arch/amd64/isa/i8042.c b/sys/arch/amd64/isa/i8042.c deleted file mode 100644 index 8c790ec..0000000 --- a/sys/arch/amd64/isa/i8042.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("i8042"); -__KERNEL_META("$Hyra$: i8042.c, Ian Marco Moffett, " - "i8042 PS/2 driver"); - -static struct spinlock data_lock; -static bool shift_key = false; -static bool capslock = false; -static bool capslock_released = true; -static struct intr_info *irq_info; - -static int dev_send(bool aux, uint8_t data); - -static char keytab[] = { - '\0', '\0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', - '-', '=', '\b', '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', - 'o', 'p', '[', ']', '\n', '\0', 'a', 's', 'd', 'f', 'g', 'h', - 'j', 'k', 'l', ';', '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v', - 'b', 'n', 'm', ',', '.', '/', '\0', '\0', '\0', ' ' -}; - -static char keytab_shift[] = { - '\0', '\0', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', - '_', '+', '\b', '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', - 'O', 'P', '{', '}', '\n', '\0', 'A', 'S', 'D', 'F', 'G', 'H', - 'J', 'K', 'L', ':', '\"', '~', '\0', '|', 'Z', 'X', 'C', 'V', - 'B', 'N', 'M', '<', '>', '?', '\0', '\0', '\0', ' ' -}; - -static char keytab_caps[] = { - '\0', '\0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', - '-','=', '\b', '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', - 'O', 'P', '[', ']', '\n', '\0', 'A', 'S', 'D', 'F', 'G', 'H', - 'J', 'K', 'L', ';', '\'', '`', '\0', '\\', 'Z', 'X', 'C', 'V', - 'B', 'N', 'M', ',', '.', '/', '\0', '\0', '\0', ' ' -}; - -static void -kbd_set_leds(uint8_t mask) -{ - dev_send(false, 0xED); - dev_send(false, mask); -} - -/* - * Convert scancode to character - * - * @sc: Scancode - * @chr: Character output - * - * Returns 0 when a char is given back. - */ -static int -scancode_to_chr(uint8_t sc, char *chr) -{ - bool release = __TEST(sc, __BIT(7)); - - switch (sc) { - /* Capslock pressed */ - case 0x3A: - /* - * If we are holding down caps-lock, we do not - * want a stream of presses that constantly cause - * it to toggle, only toggle if released then pushed - * again. - */ - if (!capslock_released) - return -EAGAIN; - - capslock_released = false; - capslock = !capslock; - - if (!capslock) { - kbd_set_leds(0); - } else { - kbd_set_leds(I8042_LED_CAPS); - } - return -EAGAIN; - /* Capslock released */ - case 0xBA: - capslock_released = true; - return -EAGAIN; - /* Shift */ - case 0x36: - case 0xAA: - case 0x2A: - case 0xB6: - if (!release) { - shift_key = true; - } else { - shift_key = false; - } - return -EAGAIN; - } - - if (release) { - return -EAGAIN; - } - - if (capslock) { - *chr = keytab_caps[sc]; - return 0; - } - - if (shift_key) { - *chr = keytab_shift[sc]; - return 0; - } - - *chr = keytab[sc]; - return 0; -} - -/* - * Write to an i8042 register. - * - * @port: I/O port - * @val: Value to write - */ -static void -i8042_write(uint16_t port, uint8_t val) -{ - while (__TEST(I8042_STATUS, I8042_IBUF_FULL)); - outb(port, val); -} - -/* - * Read the i8042 config register - */ -static uint8_t -i8042_read_conf(void) -{ - i8042_write(I8042_COMMAND, I8042_GET_CONFB); - return inb(I8042_DATA); -} - -/* - * Write the i8042 config register - */ -static void -i8042_write_conf(uint8_t value) -{ - i8042_write(I8042_COMMAND, I8042_SET_CONFB); - i8042_write(I8042_DATA, value); -} - -/* - * Flush the data register until it is empty. - */ -static void -i8042_drain(void) -{ - spinlock_acquire(&data_lock); - while (__TEST(inb(I8042_STATUS), I8042_OBUF_FULL)) { - inb(I8042_DATA); - } - - spinlock_release(&data_lock); -} - -/* - * Send a data to a device - * - * @aux: If true, send to aux device (mouse) - * @data: Data to send. - */ -static int -dev_send(bool aux, uint8_t data) -{ - if (aux) { - i8042_write(I8042_COMMAND, I8042_PORT1_SEND); - } - - for (;;) { - if (!__TEST(inb(I8042_STATUS), I8042_IBUF_FULL)) { - break; - } - } - - i8042_write(I8042_DATA, data); - inb(0x80); /* Waste a cycle */ - return inb(I8042_DATA); -} - -__attr(interrupt) -static void -kb_isr(void *sf) -{ - uint8_t data; - char c; - - spinlock_acquire(&irq_info->lock); - ++irq_info->count; - spinlock_release(&irq_info->lock); - - spinlock_acquire(&data_lock); - while (__TEST(inb(I8042_STATUS), I8042_OBUF_FULL)) { - data = inb(I8042_DATA); - if (scancode_to_chr(data, &c) == 0) { - tty_putc(&g_root_tty, c, TTY_SOURCE_DEV); - } - } - spinlock_release(&data_lock); - lapic_send_eoi(); -} - -static int -i8042_init(void) -{ - uint8_t conf; - - /* - * Disable the ports and drain the output buffer - * to avoid interferance with the initialization - * process. - */ - i8042_write(I8042_COMMAND, I8042_DISABLE_PORT0); - i8042_write(I8042_COMMAND, I8042_DISABLE_PORT1); - i8042_drain(); - - /* Disable aux data streaming */ - dev_send(true, I8042_AUX_DISABLE); - i8042_drain(); - - /* Setup kbd interrupts */ - idt_set_desc(SYSVEC_PCKBD, IDT_INT_GATE_FLAGS, (uintptr_t)kb_isr, 0); - ioapic_set_vec(1, SYSVEC_PCKBD); - ioapic_irq_unmask(1); - - /* Register the interrupt */ - irq_info = intr_info_alloc("IOAPIC", "i8042"); - irq_info->affinity = 0; - intr_register(irq_info); - - /* Setup config bits */ - conf = i8042_read_conf(); - conf |= I8042_PORT0_INTR; - conf &= ~I8042_PORT1_INTR; - i8042_write_conf(conf); - - /* Enable the keyboard */ - i8042_write(I8042_COMMAND, I8042_ENABLE_PORT0); - - /* - * It seems one I/O bus cycle isn't enough to wait for data - * to accumulate on some machines... Give it around 50ms then - * drain the output buffer. - */ - hpet_msleep(50); - i8042_drain(); - return 0; -} - -DRIVER_EXPORT(i8042_init); diff --git a/sys/arch/amd64/isa/i8254.c b/sys/arch/amd64/isa/i8254.c deleted file mode 100644 index f19fb6b..0000000 --- a/sys/arch/amd64/isa/i8254.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include - -/* - * Fetches the current count. - */ -uint16_t -i8254_get_count(void) -{ - uint8_t lo, hi; - - outb(i8254_COMMAND, 0x00); - lo = inb(0x40); - hi = inb(0x40); - return __COMBINE8(hi, lo); -} - -/* - * Set the reload value - * - * The reload value is where the i8254's counter - * starts... - */ -void -i8254_set_reload(uint16_t val) -{ - /* Channel 0, lo/hi access, rate generator */ - outb(i8254_COMMAND, 0x34); - - outb(0x40, (val & 0xFF)); - outb(0x40, (val >> 8) & 0xFF); -} - -void -i8254_set_frequency(uint64_t freq_hz) -{ - uint64_t divisor = i8254_DIVIDEND / freq_hz; - - if ((i8254_DIVIDEND % freq_hz) > (freq_hz / 2)) { - ++divisor; - } - - i8254_set_reload(freq_hz); -} diff --git a/sys/arch/amd64/isa/spkr.c b/sys/arch/amd64/isa/spkr.c deleted file mode 100644 index 109054e..0000000 --- a/sys/arch/amd64/isa/spkr.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include - -#define DIVIDEND 1193180 -#define CTRL_PORT 0x61 - -int -pcspkr_tone(uint16_t freq, uint32_t msec) -{ - uint32_t divisor; - uint8_t tmp; - struct timer tmr; - - if (req_timer(TIMER_GP, &tmr) != TMRR_SUCCESS) - return -ENOTSUP; - if (__unlikely(tmr.msleep == NULL)) - return -ENOTSUP; - - divisor = DIVIDEND / freq; - outb(i8254_COMMAND, 0xB6); - outb(i8254_CHANNEL_2, divisor & 0xFF); - outb(i8254_CHANNEL_2, (divisor >> 8) & 0xFF); - - /* Oscillate the speaker */ - tmp = inb(CTRL_PORT); - if (!__TEST(tmp, 3)) { - tmp |= 3; - outb(CTRL_PORT, tmp); - } - - /* Sleep then turn off the speaker */ - tmr.msleep(msec); - outb(CTRL_PORT, tmp & ~3); - return 0; -} diff --git a/sys/dev/ic/ahci.c b/sys/dev/ic/ahci.c deleted file mode 100644 index 257fd00..0000000 --- a/sys/dev/ic/ahci.c +++ /dev/null @@ -1,771 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__KERNEL_META("$Hyra$: ahci.c, Ian Marco Moffett, " - "AHCI driver"); - -#define pr_trace(fmt, ...) kprintf("ahci: " fmt, ##__VA_ARGS__) -#define pr_error(...) pr_trace(__VA_ARGS__) - -static TAILQ_HEAD(, ahci_device) sata_devs; - -static struct pci_device *dev; -static struct timer driver_tmr; -static struct mutex io_lock; -static size_t dev_count = 0; - -static bool -is_word_aligned(void *ptr) -{ - return (((uintptr_t)ptr) & 1) == 0; -} - -/* - * Fetch a SATA device with a SATA device - * minor. - * - * @dev_minor: SATA device minor. - */ -static struct ahci_device * -ahci_get_sata(dev_t dev_minor) -{ - struct ahci_device *dev; - - TAILQ_FOREACH(dev, &sata_devs, link) { - if (dev->minor == dev_minor) { - return dev; - } - } - - return NULL; -} - -/* - * Poll register to have `bits' set/unset. - * - * @reg: Register to poll. - * @bits: Bits expected to be set/unset. - * @pollset: True to poll as set. - */ -static int -ahci_poll_reg32(volatile uint32_t *reg, uint32_t bits, bool pollset) -{ - uint32_t time_waited = 0; - uint32_t val; - bool tmp; - - for (;;) { - val = mmio_read32(reg); - tmp = (pollset) ? __TEST(val, bits) : !__TEST(val, bits); - if (tmp) - break; - if (time_waited >= AHCI_TIMEOUT) - /* Timeout */ - return -1; - - driver_tmr.msleep(10); - time_waited += 10; - } - - return 0; -} - -/* - * Put the HBA in AHCI mode. - */ -static inline void -ahci_set_ahci(struct ahci_hba *hba) -{ - struct hba_memspace *abar = hba->abar; - uint32_t ghc; - - /* Enable AHCI mode */ - ghc = mmio_read32(&abar->ghc); - ghc |= AHCI_GHC_AE; - mmio_write32(&abar->ghc, ghc); -} - -/* - * Reset the HBA with GHC.HR - * - * XXX: The spec states that all port registers *except* - * PxFB, PxFBU, PxCLB, PxCLBU are reset. - */ -static int -ahci_hba_reset(struct ahci_hba *hba) -{ - struct hba_memspace *abar = hba->abar; - uint32_t ghc; - uint8_t attempts = 0; - int status; - - ghc = mmio_read32(&abar->ghc); - ghc |= AHCI_GHC_HR; - mmio_write32(&abar->ghc, ghc); - - /* - * Poll the GHC.HR bit. The HBA is supposed to flip - * it back to zero once the reset is complete. If - * the HBA does not do this, something is screwed - * up. - * - * XXX: We do this twice in case of slow hardware... - */ - while ((attempts++) < 2) { - status = ahci_poll_reg32(&abar->ghc, AHCI_GHC_HR, false); - if (status == 0) { - break; - } - } - - /* We hope this doesn't happen */ - if (status != 0) { - pr_error("HBA reset failure: GHC.HR stuck (HBA hung)\n"); - return status; - } - - ahci_set_ahci(hba); - return 0; -} - -/* - * Stop port and put it in an idle state. - */ -static int -ahci_stop_port(struct hba_port *port) -{ - const uint32_t RUN_MASK = (AHCI_PXCMD_FR | AHCI_PXCMD_CR); - uint32_t cmd = mmio_read32(&port->cmd); - - /* Check if it is already stopped */ - if (!__TEST(cmd, RUN_MASK)) - return 0; - - /* - * Stop the FIS receive and disable proessing - * of the command list. - */ - cmd &= ~(AHCI_PXCMD_ST | AHCI_PXCMD_FRE); - mmio_write32(&port->cmd, cmd); - return ahci_poll_reg32(&port->cmd, RUN_MASK, false); -} - -/* - * Put a port in a running state. - */ -static int -ahci_start_port(struct hba_port *port) -{ - const uint32_t RUN_MASK = (AHCI_PXCMD_FR | AHCI_PXCMD_CR); - uint32_t cmd = mmio_read32(&port->cmd); - - /* Check if it is already running */ - if (__TEST(cmd, RUN_MASK)) - return 0; - - /* Start everything up */ - cmd |= (AHCI_PXCMD_ST | AHCI_PXCMD_FRE); - mmio_write32(&port->cmd, cmd); - return ahci_poll_reg32(&port->cmd, RUN_MASK, true); -} - -/* - * Check if a port is active. - * - * @port: Port to check. - */ -static bool -ahci_port_active(struct hba_port *port) -{ - uint32_t ssts; - uint8_t det, ipm; - - ssts = mmio_read32(&port->ssts); - det = AHCI_PXSSTS_DET(ssts); - ipm = AHCI_PXSSTS_IPM(ssts); - return (det == AHCI_DET_COMM && ipm == AHCI_IPM_ACTIVE); -} - -/* - * Dump identify structure for debugging - * purposes. - */ -static void -ahci_dump_identity(struct ata_identity *identity) -{ - char serial_number[20]; - char model_number[40]; - char tmp; - - memcpy(serial_number, identity->serial_number, sizeof(serial_number)); - memcpy(model_number, identity->model_number, sizeof(model_number)); - - serial_number[sizeof(serial_number) - 1] = '\0'; - model_number[sizeof(model_number) - 1] = '\0'; - - /* Fixup endianess for serial number */ - for (size_t i = 0; i < sizeof(serial_number); i += 2) { - tmp = serial_number[i]; - serial_number[i] = serial_number[i + 1]; - serial_number[i + 1] = tmp; - } - - /* Fixup endianess for model number */ - for (size_t i = 0; i < sizeof(model_number); i += 2) { - tmp = model_number[i]; - model_number[i] = model_number[i + 1]; - model_number[i + 1] = tmp; - } - - pr_trace("DRIVE MODEL NUMBER: %s\n", model_number); - pr_trace("DRIVE SERIAL NUMBER: %s\n", serial_number); -} - -/* - * Allocate a command slot. - */ -static int -ahci_alloc_cmdslot(struct ahci_hba *hba, struct hba_port *port) -{ - uint32_t slotlist = (port->ci | port->sact); - - for (uint16_t i = 0; i < hba->ncmdslots; ++i) { - if (!__TEST(slotlist, i)) - return i; - } - - return -1; -} - -/* - * Submit a command to a device - * - * @port: Port of device to submit command to - * @cmdslot: Command slot. - */ -static int -ahci_submit_cmd(struct ahci_hba *hba, struct hba_port *port, uint8_t cmdslot) -{ - const uint32_t BUSY_BITS = (AHCI_PXTFD_BSY | AHCI_PXTFD_DRQ); - const uint8_t MAX_ATTEMPTS = 3; - uint8_t attempts = 0; - int status = 0; - - /* - * Ensure the port isn't busy before we try to send - * any commands. Spin on BSY and DRQ bits until they - * become unset or we timeout. - */ - if (ahci_poll_reg32(&port->tfd, BUSY_BITS, false) < 0) { - pr_error("Command failed: Port is busy! (slot=%d)\n", cmdslot); - return -EBUSY; - } - - /* Activate the command slot */ - mutex_acquire(&io_lock); - mmio_write32(&port->ci, __BIT(cmdslot)); - - /* - * Wait for completion. since this might take a bit, we - * give it a few attempts in case it doesn't finish - * right away. - */ - while ((attempts++) < MAX_ATTEMPTS) { - status = ahci_poll_reg32(&port->ci, __BIT(cmdslot), false); - if (status == 0) { - break; - } - } - - /* Did we timeout? */ - if (status != 0) { - pr_error("IDENTIFY timeout: slot %d still set!\n", cmdslot); - } - - mutex_release(&io_lock); - return status; -} - -static int -ahci_sata_rw(struct ahci_hba *hba, struct hba_port *port, struct sio_txn *sio, - bool write) -{ - paddr_t buf_phys; - struct ahci_cmd_hdr *cmdhdr; - struct ahci_cmdtab *cmdtbl; - struct ahci_fis_h2d *fis; - int cmdslot, status; - - if (sio->buf == NULL || !is_word_aligned(sio->buf)) - return -EINVAL; - if (sio->len == 0) - return -EINVAL; - - buf_phys = VIRT_TO_PHYS(sio->buf); - cmdslot = ahci_alloc_cmdslot(hba, port); - - /* Setup command header */ - cmdhdr = PHYS_TO_VIRT(port->clb + cmdslot * sizeof(struct ahci_cmd_hdr)); - cmdhdr->w = 0; - cmdhdr->cfl = sizeof(struct ahci_fis_h2d) / 4; - cmdhdr->prdtl = 1; - - /* Setup physical region descriptor */ - cmdtbl = PHYS_TO_VIRT(cmdhdr->ctba); - cmdtbl->prdt[0].dba = buf_phys; - cmdtbl->prdt[0].dbc = (sio->len << 9) - 1; - cmdtbl->prdt[0].i = 0; - - /* Setup command FIS */ - fis = (void *)&cmdtbl->cfis; - fis->type = FIS_TYPE_H2D; - fis->command = write ? ATA_CMD_WRITE_DMA : ATA_CMD_READ_DMA; - fis->c = 1; - fis->device = (1 << 6); - - /* Setup LBA */ - fis->lba0 = sio->offset & 0xFF; - fis->lba1 = (sio->offset >> 8) & 0xFF; - fis->lba2 = (sio->offset >> 16) & 0xFF; - fis->lba3 = (sio->offset >> 24) & 0xFF; - fis->lba4 = (sio->offset >> 32) & 0xFF; - fis->lba5 = (sio->offset >> 40) & 0xFF; - - /* Setup count */ - fis->countl = sio->len & 0xFF; - fis->counth = (sio->len >> 8) & 0xFF; - - if ((status = ahci_submit_cmd(hba, port, cmdslot)) != 0) { - return status; - } - - return 0; -} - -/* - * Send the IDENTIFY command to a device and - * log info for debugging purposes. - */ -static int -ahci_identify(struct ahci_hba *hba, struct hba_port *port) -{ - paddr_t buf_phys; - struct ahci_cmd_hdr *cmdhdr; - struct ahci_cmdtab *cmdtbl; - struct ahci_fis_h2d *fis; - int cmdslot; - void *buf; - int status = 0; - - cmdslot = ahci_alloc_cmdslot(hba, port); - buf_phys = vm_alloc_pageframe(1); - buf = PHYS_TO_VIRT(buf_phys); - - if (buf_phys == 0) { - status = -ENOMEM; - goto done; - } - - if (cmdslot < 0) { - status = cmdslot; - goto done; - } - - memset(buf, 0, vm_get_page_size()); - cmdhdr = PHYS_TO_VIRT(port->clb + cmdslot * sizeof(struct ahci_cmd_hdr)); - cmdhdr->w = 0; - cmdhdr->cfl = sizeof(struct ahci_fis_h2d) / 4; - cmdhdr->prdtl = 1; - - cmdtbl = PHYS_TO_VIRT(cmdhdr->ctba); - cmdtbl->prdt[0].dba = VIRT_TO_PHYS(buf); - cmdtbl->prdt[0].dbc = 511; - cmdtbl->prdt[0].i = 0; - - fis = (void *)&cmdtbl->cfis; - fis->command = ATA_CMD_IDENTIFY; - fis->c = 1; - fis->type = FIS_TYPE_H2D; - - if ((status = ahci_submit_cmd(hba, port, cmdslot)) != 0) { - goto done; - } - - ahci_dump_identity(buf); -done: - vm_free_pageframe(VIRT_TO_PHYS(buf), 1); - return status; -} - -/* - * Device interface read/write helper - */ -static int -sata_dev_rw(struct device *dev, struct sio_txn *sio, bool write) -{ - struct ahci_device *sata; - - if (sio == NULL) - return -1; - if (sio->buf == NULL) - return -1; - - sata = ahci_get_sata(dev->minor); - - if (sata == NULL) - return -1; - - return ahci_sata_rw(sata->hba, sata->port, sio, write); -} - -/* - * Device interface read - */ -static int -sata_dev_read(struct device *dev, struct sio_txn *sio) -{ - return sata_dev_rw(dev, sio, false); -} - -/* - * Device interface write - */ -static int -sata_dev_write(struct device *dev, struct sio_txn *sio) -{ - return sata_dev_rw(dev, sio, true); -} - -/* - * Device interface open - */ -static int -sata_dev_open(struct device *dev) -{ - return 0; -} - -/* - * Device interface close - */ -static int -sata_dev_close(struct device *dev) -{ - return 0; -} - -/* - * Register a SATA device to the rest of the system - * and expose to userland as a device file. - */ -static int -ahci_sata_register(struct ahci_hba *hba, struct hba_port *port) -{ - char devname[128]; - struct device *dev = NULL; - struct ahci_device *sata = NULL; - dev_t dev_id; - dev_t major; - - sata = dynalloc(sizeof(struct ahci_device)); - if (sata == NULL) { - return -ENOMEM; - } - - dev_id = ++dev_count; - major = device_alloc_major(); - - dev = device_alloc(); - dev->open = sata_dev_open; - dev->close = sata_dev_close; - dev->read = sata_dev_read; - dev->write = sata_dev_write; - dev->blocksize = 512; - device_create(dev, dev_id, major); - - sata->port = port; - sata->hba = hba; - sata->minor = dev->minor; - - snprintf(devname, sizeof(devname), "sd%d", dev_id); - devfs_add_dev(devname, dev); - TAILQ_INSERT_TAIL(&sata_devs, sata, link); - return 0; -} - -/* - * Init a single port. - * - * @port: Port to init. - */ -static int -ahci_init_port(struct ahci_hba *hba, struct hba_port *port, size_t portno) -{ - paddr_t tmp; - struct ahci_cmd_hdr *cmdlist; - void *fis; - size_t cmdlist_size, pagesize; - uint32_t sig; - uint8_t ncmdslots; - int status = 0; - - sig = mmio_read32(&port->sig); - status = ahci_stop_port(port); - if (status != 0) { - pr_trace("Failed to stop port %d\n", portno); - return status; - } - - /* Try to report device type based on signature */ - switch (sig) { - case AHCI_SIG_PM: - pr_trace("Port %d has port multiplier signature\n", portno); - return 0; /* TODO */ - case AHCI_SIG_ATA: - pr_trace("Port %d has ATA signature (SATA drive)\n", portno); - break; - default: - return 0; /* TODO */ - } - - ncmdslots = hba->ncmdslots; - pagesize = vm_get_page_size(); - - /* Allocate our command list */ - cmdlist_size = __ALIGN_UP(ncmdslots * AHCI_CMDENTRY_SIZE, pagesize); - tmp = vm_alloc_pageframe(cmdlist_size / pagesize); - cmdlist = PHYS_TO_VIRT(tmp); - if (tmp == 0) { - pr_trace("Failed to allocate cmdlist\n"); - status = -ENOMEM; - goto done; - } - - tmp = vm_alloc_pageframe(1); - fis = PHYS_TO_VIRT(tmp); - if (tmp == 0) { - pr_trace("Failed to allocate FIS\n"); - status = -ENOMEM; - goto done; - } - - memset(cmdlist, 0, cmdlist_size); - memset(fis, 0, AHCI_FIS_SIZE); - hba->cmdlist = cmdlist; - - /* Set the registers */ - port->clb = VIRT_TO_PHYS(cmdlist); - port->fb = VIRT_TO_PHYS(fis); - - for (int i = 0; i < ncmdslots; ++i) { - cmdlist[i].prdtl = 1; - cmdlist[i].ctba = vm_alloc_pageframe(1); - } - - /* Now try to start up the port */ - if ((status = ahci_start_port(port)) != 0) { - pr_trace("Failed to start port %d\n", portno); - goto done; - } - - ahci_identify(hba, port); - ahci_sata_register(hba, port); -done: - if (status != 0 && cmdlist != NULL) - vm_free_pageframe(port->clb, cmdlist_size / pagesize); - if (status != 0 && fis != NULL) - vm_free_pageframe(port->fb, 1); - - return status; -} - -/* - * Hard reset port and reinitialize - * link. - */ -static int -ahci_reset_port(struct hba_port *port) -{ - uint32_t sctl, ssts; - - /* - * Some odd behaviour may occur if a COMRESET is sent - * to the port while it is in an idle state... - * A workaround to this is to bring the port up - * then immediately transmit the COMRESET to the device. - */ - ahci_start_port(port); - sctl = mmio_read32(&port->sctl); - - /* Transmit COMRESET for ~2ms */ - sctl = (sctl & ~0xF) | AHCI_DET_COMRESET; - mmio_write32(&port->sctl, sctl); - driver_tmr.msleep(2); - - /* Stop transmission of COMRESET */ - sctl &= ~AHCI_DET_COMRESET; - mmio_write32(&port->sctl, sctl); - - /* - * Give around ~150ms for the link to become - * reestablished. Then make sure that it is - * actually established by checking PxSSTS.DET - */ - driver_tmr.msleep(150); - ssts = mmio_read32(&port->ssts); - if (AHCI_PXSSTS_DET(ssts) != AHCI_DET_COMM) { - return -1; - } - - return 0; -} - -/* - * Sets up devices connected to the physical ports - * on the HBA. - * - * XXX: Since this is called after ahci_init_hba() which also - * resets the HBA, we'll need to reestablish the link - * between the devices and the HBA. - */ -static int -ahci_init_ports(struct ahci_hba *hba) -{ - struct hba_memspace *abar = hba->abar; - uint32_t ports_impl; - struct hba_port *port; - - pr_trace("HBA supports max %d port(s)\n", hba->nports); - ports_impl = mmio_read32(&abar->pi); - - /* Initialize active ports */ - for (size_t i = 0; i < sizeof(abar->pi) * 8; ++i) { - if (!__TEST(ports_impl, __BIT(i))) { - continue; - } - - port = &abar->ports[i]; - if (ahci_reset_port(port) != 0) { - continue; - } - - if (ahci_port_active(port)) { - ahci_init_port(hba, port, i); - } - } - - return 0; -} - -/* - * Sets up the HBA - */ -static int -ahci_init_hba(struct ahci_hba *hba) -{ - struct hba_memspace *abar = hba->abar; - uint32_t cap; - - /* Reset the HBA to ensure it is a known state */ - ahci_hba_reset(hba); - - /* Setup HBA structure and save some state */ - cap = mmio_read32(&abar->cap); - hba->ncmdslots = AHCI_CAP_NCS(cap) + 1; - hba->nports = AHCI_CAP_NP(cap) + 1; - - ahci_init_ports(hba); - return 0; -} - -static int -ahci_init(void) -{ - int status; - uint16_t cmdreg_bits; - uint32_t bar_size; - struct ahci_hba hba = {0}; - struct pci_lookup ahci_lookup = { - .pci_class = 0x01, - .pci_subclass = 0x06 - }; - - dev = pci_get_device(ahci_lookup, PCI_CLASS | PCI_SUBCLASS); - - if (dev == NULL) { - return -1; - } - - cmdreg_bits = PCI_BUS_MASTERING | PCI_MEM_SPACE; - pci_set_cmdreg(dev, cmdreg_bits); - - if (req_timer(TIMER_GP, &driver_tmr) != TMRR_SUCCESS) { - pr_error("Failed to fetch general purpose timer\n"); - return -1; - } - - if (driver_tmr.msleep == NULL) { - pr_error("Timer does not have msleep()\n"); - return -1; - } - - if ((bar_size = pci_bar_size(dev, 5)) == 0) { - pr_error("Failed to fetch BAR size\n"); - return -1; - } - - status = bus_map(dev->bar[5], bar_size, 0, (void *)&hba.abar); - if (status != 0) { - pr_error("Failed to map BAR into higher half\n"); - return -1; - } - - pr_trace("AHCI HBA memspace @ 0x%p\n", hba.abar); - TAILQ_INIT(&sata_devs); - ahci_init_hba(&hba); - return 0; -} - -DRIVER_EXPORT(ahci_init); diff --git a/sys/dev/ic/nvme.c b/sys/dev/ic/nvme.c deleted file mode 100644 index df533a3..0000000 --- a/sys/dev/ic/nvme.c +++ /dev/null @@ -1,614 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("nvme"); -__KERNEL_META("$Hyra$: nvme.c, Ian Marco Moffett, " - "NVMe driver"); - -#define pr_trace(fmt, ...) kprintf("nvme: " fmt, ##__VA_ARGS__) -#define pr_error(...) pr_trace(__VA_ARGS__) - -static struct pci_device *nvme_dev; -static struct timer driver_tmr; -static TAILQ_HEAD(,nvme_ns) namespaces; - -static inline int -is_4k_aligned(void *ptr) -{ - return ((uintptr_t)ptr & (0x1000 - 1)) == 0; -} - -/* - * Poll CSTS.RDY to equal `val' - * - * Returns `val' on success, returns < 0 value - * upon failure. - */ -static int -nvme_poll_ready(struct nvme_bar *bar, uint8_t val) -{ - uint8_t timeout = CAP_TIMEOUT(bar->caps); - uint8_t time_waited = 0; - - do { - if (STATUS_READY(bar->status) == val) { - /* Done waiting */ - break; - } - - /* - * If CSTS.RDY hasn't changed, we can try to wait a - * little longer. - * - * XXX: The spec states that CAP.TO (Timeout) is in 500 - * millisecond units. - */ - if (time_waited < timeout) { - driver_tmr.msleep(500); - ++time_waited; - } else { - return -1; - } - } while (1); - - return val; -} - -/* - * Create an NVMe queue. - */ -static int -nvme_create_queue(struct nvme_state *s, struct nvme_queue *queue, size_t id) -{ - struct nvme_bar *bar = s->bar; - const size_t PAGESZ = vm_get_page_size(); - const uint8_t DBSTRIDE = CAP_STRIDE(bar->caps); - const uint16_t SLOTS = CAP_MQES(bar->caps); - - queue->sq = dynalloc_memalign(sizeof(void *) * SLOTS, 0x1000); - queue->cq = dynalloc_memalign(sizeof(void *) * SLOTS, 0x1000); - - if (queue->sq == NULL) { - return -1; - } - if (queue->cq == NULL) { - dynfree(queue->sq); - return -1; - } - - memset(queue->sq, 0, sizeof(void *) * SLOTS); - memset(queue->cq, 0, sizeof(void *) * SLOTS); - - queue->sq_head = 0; - queue->sq_tail = 0; - queue->size = SLOTS; - queue->sq_db = PHYS_TO_VIRT((uintptr_t)bar + PAGESZ + (2 * id * (4 << DBSTRIDE))); - queue->cq_db = PHYS_TO_VIRT((uintptr_t)bar + PAGESZ + ((2 * id + 1) * (4 << DBSTRIDE))); - queue->cq_phase = 1; - return 0; -} - -/* - * Submit a command - * - * @queue: Target queue. - * @cmd: Command to submit - */ -static void -nvme_submit_cmd(struct nvme_queue *queue, struct nvme_cmd cmd) -{ - /* Submit the command to the queue */ - queue->sq[queue->sq_tail++] = cmd; - if (queue->sq_tail >= queue->size) { - queue->sq_tail = 0; - } - *(queue->sq_db) = queue->sq_tail; -} - -/* - * Submit a command and poll for completion - * - * @queue: Target queue. - * @cmd: Command to submit - */ -static int -nvme_poll_submit_cmd(struct nvme_queue *queue, struct nvme_cmd cmd) -{ - uint16_t status; - size_t spins = 0; - - nvme_submit_cmd(queue, cmd); - - /* - * Wait for the current command to complete by - * polling the phase bit. - */ - while (1) { - status = queue->cq[queue->cq_head].status; - if ((status & 1) == queue->cq_phase) { - /* - * The phase bit matches the phase for the most - * recently submitted command, the command has completed. - */ - break; - } - if ((status & ~1) != 0) { - pr_trace("NVMe cmd error (bits=0x%x)\n", status >> 1); - break; - } - if (spins > 5) { - /* Attempts exhausted */ - pr_error("Hang on phase bit poll, giving up (cmd error)\n"); - break; - } - - /* Not done, give it some more time */ - driver_tmr.msleep(150); - ++spins; - } - - ++queue->cq_head; - if (queue->cq_head >= queue->size) { - queue->cq_head = 0; - queue->cq_phase = !queue->cq_phase; - } - - /* Tell the controller that `head' updated */ - *(queue->cq_db) = queue->cq_head; - return 0; -} - -/* - * Create an I/O queue for a specific namespace. - * - * @ns: Namespace - * @id: I/O queue ID - */ -static int -nvme_create_ioq(struct nvme_ns *ns, size_t id) -{ - struct nvme_queue *ioq = &ns->ioq; - struct nvme_state *cntl = ns->cntl; - - struct nvme_bar *bar = cntl->bar; - struct nvme_cmd cmd = {0}; - size_t mqes = CAP_MQES(bar->caps); - - struct nvme_create_iocq_cmd *create_iocq; - struct nvme_create_iosq_cmd *create_iosq; - int status; - - if ((status = nvme_create_queue(ns->cntl, ioq, id)) != 0) { - return status; - } - - create_iocq = &cmd.create_iocq; - create_iocq->opcode = NVME_OP_CREATE_IOCQ; - create_iocq->qflags |= __BIT(0); /* Physically contiguous */ - create_iocq->qsize = mqes; - create_iocq->qid = id; - create_iocq->prp1 = VIRT_TO_PHYS(ns->ioq.cq); - - if ((status = nvme_poll_submit_cmd(&cntl->adminq, cmd)) != 0) { - return status; - } - - create_iosq = &cmd.create_iosq; - create_iosq->opcode = NVME_OP_CREATE_IOSQ; - create_iosq->qflags |= __BIT(0); /* Physically contiguous */ - create_iosq->qsize = mqes; - create_iosq->cqid = id; - create_iosq->sqid = id; - create_iosq->prp1 = VIRT_TO_PHYS(ns->ioq.sq); - return nvme_poll_submit_cmd(&cntl->adminq, cmd); -} - -/* - * Issue an identify command for the current - * controller. - * - * XXX: `id' must be aligned on a 4k byte boundary to avoid - * crossing a page boundary. This keeps the implementation - * as simple as possible here. - */ -static int -nvme_identify(struct nvme_state *state, struct nvme_id *id) -{ - struct nvme_cmd cmd = {0}; - struct nvme_identify_cmd *identify = &cmd.identify; - - /* Ensure `id' is aligned on a 4k byte boundary */ - if (!is_4k_aligned(id)) { - return -1; - } - - identify->opcode = NVME_OP_IDENTIFY; - identify->nsid = 0; - identify->cns = 1; /* Identify controller */ - identify->prp1 = VIRT_TO_PHYS(id); - identify->prp2 = 0; /* No need, data address is 4k aligned */ - return nvme_poll_submit_cmd(&state->adminq, cmd); -} - -/* - * Issue a read/write command for a specific - * namespace. - * - * `buf' must be 4k aligned. - */ -static int -nvme_rw(struct nvme_ns *ns, char *buf, off_t slba, size_t count, bool write) -{ - struct nvme_cmd cmd = {0}; - struct nvme_rw_cmd *rw = &cmd.rw; - - if (!is_4k_aligned(buf)) { - return -1; - } - - rw->opcode = write ? NVME_OP_WRITE : NVME_OP_READ; - rw->nsid = ns->nsid; - rw->slba = slba; - rw->len = count - 1; - rw->prp1 = VIRT_TO_PHYS(buf); - return nvme_poll_submit_cmd(&ns->ioq, cmd); -} - -/* - * Fetch a namespace from its ID - * - * @nsid: Namespace ID of namespace to fetch - */ -static struct nvme_ns * -nvme_get_ns(size_t nsid) -{ - struct nvme_ns *ns; - - TAILQ_FOREACH(ns, &namespaces, link) { - if (ns->nsid == nsid) { - return ns; - } - } - - return NULL; -} - -/* - * Device interface read/write helper - */ -static int -nvme_dev_rw(struct device *dev, struct sio_txn *sio, bool write) -{ - struct nvme_ns *ns; - - if (sio == NULL) { - return -1; - } - - ns = nvme_get_ns(dev->minor); - if (ns == NULL || sio->buf == NULL) { - return -1; - } - - return nvme_rw(ns, sio->buf, sio->offset, sio->len, write); -} - -/* - * Device interface read - */ -static int -nvme_dev_read(struct device *dev, struct sio_txn *sio) -{ - return nvme_dev_rw(dev, sio, false); -} - -/* - * Device interface write - */ -static int -nvme_dev_write(struct device *dev, struct sio_txn *sio) -{ - return nvme_dev_rw(dev, sio, true); -} - -static int -nvme_dev_open(struct device *dev) -{ - return 0; -} - -/* - * Get identify data for namespace - * - * @id_ns: Data will be written to this pointer via DMA. - * @nsid: Namespace ID. - * - * XXX: `id_ns' must be 4k aligned. - */ -static int -nvme_id_ns(struct nvme_state *s, struct nvme_id_ns *id_ns, uint16_t nsid) -{ - struct nvme_cmd cmd = {0}; - struct nvme_identify_cmd *identify = &cmd.identify; - - if (!is_4k_aligned(id_ns)) { - return -1; - } - - identify->opcode = NVME_OP_IDENTIFY; - identify->nsid = nsid; - identify->cns = 0; - identify->prp1 = VIRT_TO_PHYS(id_ns); - return nvme_poll_submit_cmd(&s->adminq, cmd); -} - -/* - * Init a namespace. - * - * @nsid: Namespace ID - */ -static int -nvme_init_ns(struct nvme_state *state, uint16_t nsid) -{ - char devname[128]; - struct nvme_ns *ns = NULL; - struct nvme_id_ns *id_ns = NULL; - struct device *dev; - uint8_t lba_format; - int status = 0; - - ns = dynalloc(sizeof(struct nvme_ns)); - if (ns == NULL) { - status = -1; - goto done; - } - - id_ns = dynalloc_memalign(sizeof(struct nvme_id_ns), 0x1000); - if ((status = nvme_id_ns(state, id_ns, nsid)) != 0) { - dynfree(ns); - goto done; - } - - lba_format = id_ns->flbas & 0xF; - ns->lba_fmt = id_ns->lbaf[lba_format]; - ns->nsid = nsid; - ns->lba_bsize = 1 << ns->lba_fmt.ds; - ns->size = id_ns->size; - ns->cntl = state; - nvme_create_ioq(ns, ns->nsid); - - dev = device_alloc(); - dev->read = nvme_dev_read; - dev->write = nvme_dev_write; - dev->open = nvme_dev_open; - dev->blocksize = ns->lba_bsize; - dev->mmap = NULL; - ns->dev_id = device_create(dev, state->major, nsid); - - snprintf(devname, sizeof(devname), "nvme0n%d", nsid); - if (devfs_add_dev(devname, dev) != 0) { - pr_error("Failed to create /dev/%s\n", devname); - } - - TAILQ_INSERT_TAIL(&namespaces, ns, link); -done: - if (id_ns != NULL) - dynfree(id_ns); - - return status; -} - -static int -nvme_disable_controller(struct nvme_state *state) -{ - struct nvme_bar *bar = state->bar; - - if (__TEST(bar->config, CONFIG_EN)) { - bar->config &= ~CONFIG_EN; - } - - if (nvme_poll_ready(bar, 0) < 0) { - pr_error("Failed to disable controller\n"); - return -1; - } - - return 0; -} - -/* - * For debugging purposes, logs some information - * found within the controller identify data structure. - */ -static void -nvme_log_ctrl_id(struct nvme_id *id) -{ - char mn[41] = {0}; - char fr[9] = {0}; - - for (size_t i = 0; i < sizeof(id->mn); ++i) { - mn[i] = id->mn[i]; - } - for (size_t i = 0; i < sizeof(id->fr); ++i) { - fr[i] = id->fr[i]; - } - - pr_trace("NVMe model: %s\n", mn); - pr_trace("NVMe firmware revision: %s\n", fr); -} - -/* - * Fetch the list of namespace IDs - * - * @nsids_out: NSIDs will be written here via DMA. - * - * XXX: `nsids_out' must be 4k aligned. - */ -static int -nvme_get_nsids(struct nvme_state *state, uint32_t *nsids_out) -{ - struct nvme_cmd cmd = {0}; - struct nvme_identify_cmd *identify = &cmd.identify; - - if (!is_4k_aligned(nsids_out)) { - return -1; - } - - identify->opcode = NVME_OP_IDENTIFY; - identify->cns = 2; /* Active NSID list */ - identify->prp1 = VIRT_TO_PHYS(nsids_out); - return nvme_poll_submit_cmd(&state->adminq, cmd); -} - -static int -nvme_enable_controller(struct nvme_state *state) -{ - struct nvme_bar *bar = state->bar; - struct nvme_id *id; - - uint32_t *nsids; - uint8_t max_sqes, max_cqes; - - if (!__TEST(bar->config, CONFIG_EN)) { - bar->config |= CONFIG_EN; - } - - if (nvme_poll_ready(bar, 1) < 0) { - pr_error("Failed to enable controller\n"); - return -1; - } - - id = dynalloc_memalign(sizeof(struct nvme_id), 0x1000); - if (id == NULL) { - return -1; - } - - nsids = dynalloc_memalign(0x1000, 0x1000); - if (nsids == NULL) { - return -1; - } - - nvme_identify(state, id); - nvme_log_ctrl_id(id); - nvme_get_nsids(state, nsids); - - /* - * Before creating any I/O queues we need to set CC.IOCQES - * and CC.IOSQES... Bits 3:0 is the minimum and bits 7:4 - * is the maximum. We'll choose the maximum. - */ - max_sqes = id->sqes >> 4; - max_cqes = id->cqes >> 4; - bar->config |= (max_sqes << CONFIG_IOSQES_SHIFT); - bar->config |= (max_cqes << CONFIG_IOCQES_SHIFT); - - /* Init NVMe namespaces */ - for (size_t i = 0; i < id->nn; ++i) { - if (nsids[i] != 0) { - pr_trace("Found NVMe namespace (id=%d)\n", nsids[i]); - nvme_init_ns(state, nsids[i]); - } - } - - dynfree(nsids); - dynfree(id); - return 0; -} - -static int -nvme_init_controller(struct nvme_bar *bar) -{ - struct nvme_state state = { . bar = bar }; - struct nvme_queue *adminq = &state.adminq; - - uint16_t mqes = CAP_MQES(bar->caps); - uint16_t cmdreg_bits = PCI_BUS_MASTERING | - PCI_MEM_SPACE; - - pci_set_cmdreg(nvme_dev, cmdreg_bits); - nvme_disable_controller(&state); - - nvme_create_queue(&state, adminq, 0); - - /* Setup admin submission and admin completion queues */ - bar->aqa = (mqes | mqes << 16); - bar->asq = VIRT_TO_PHYS(adminq->sq); - bar->acq = VIRT_TO_PHYS(adminq->cq); - - state.major = device_alloc_major(); - return nvme_enable_controller(&state); -} - -static int -nvme_init(void) -{ - struct nvme_bar *bar; - struct pci_lookup nvme_lookup = { - .pci_class = 1, - .pci_subclass = 8 - }; - - if (req_timer(TIMER_GP, &driver_tmr) != 0) { - pr_error("Failed to fetch general purpose timer\n"); - return -1; - } - - if (driver_tmr.msleep == NULL) { - pr_error("Timer does not have msleep()\n"); - return -1; - } - - nvme_dev = pci_get_device(nvme_lookup, PCI_CLASS | PCI_SUBCLASS); - if (nvme_dev == NULL) { - return -1; - } - - bar = PCI_BAR_MEMBASE(nvme_dev->bar[0]); - pr_trace("NVMe BAR0 @ 0x%p\n", bar); - TAILQ_INIT(&namespaces); - - if (nvme_init_controller(bar) < 0) { - return -1; - } - - return 0; -} - -DRIVER_EXPORT(nvme_init); diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c deleted file mode 100644 index 9a8eae4..0000000 --- a/sys/dev/pci/pci.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(__x86_64__) -#include -#endif -#include - -__MODULE_NAME("pci"); -__KERNEL_META("$Hyra$: pci.c, Ian Marco Moffett, " - "PCI driver core"); - -#define pr_trace(fmt, ...) kprintf("pci: " fmt, ##__VA_ARGS__) - -static TAILQ_HEAD(, pci_device) device_list; -static int access_method = PCI_ACCESS_CAM; - -/* - * Read device's legacy PCI CAM space - * - * @dev: Device to read. - * @offset: Offset to read at. - * - * XXX: Do not use directly! - */ -static uint32_t -pci_cam_read(const struct pci_device *dev, uint32_t offset) -{ -#if defined(__x86_64__) - uint32_t address, data; - - address = __BIT(31) | - (offset & ~3) | - (dev->func << 8) | - (dev->slot << 11) | - (dev->bus << 16); - - outl(0xCF8, address); - data = inl(0xCFC) >> ((offset & 3) * 8); - return data; -#else - panic("Invalid arch (%s())\n", __func__); -#endif -} - -/* - * Write to device's legacy PCI CAM space - * - * @dev: Device to write to. - * @offset: Offset to write at. - * - * XXX: Do not use directly! - */ -static void -pci_cam_write(const struct pci_device *dev, uint32_t offset, uint32_t value) -{ -#if defined(__x86_64__) - uint32_t address; - - address = __BIT(31) | - (offset & ~3) | - (dev->func << 8) | - (dev->slot << 11) | - (dev->bus << 16); - - outl(0xCF8, address); - outb(0xCFC, value); -#else - panic("Invalid arch (%s())\n", __func__); -#endif -} - -static bool -pci_device_exists(uint8_t bus, uint8_t slot, uint8_t func) -{ - uint16_t vendor_id; - struct pci_device dev_tmp = { - .bus = bus, - .slot = slot, - .func = func - }; - - vendor_id = pci_cam_read(&dev_tmp, 0x0) & 0xFFFF; - - if (vendor_id == 0xFFFF) { - return false; - } - - return true; -} - -/* - * Sets other device information e.g., device id, vendor id, etc - * - * @dev: Device descriptor to set up. - * - * XXX: Expects device bus, slot and func to be set. - */ -static void -pci_set_device_info(struct pci_device *dev) -{ - uint32_t classrev; - - dev->vendor_id = pci_readl(dev, PCIREG_VENDOR_ID) & __MASK(16); - dev->device_id = pci_readl(dev, PCIREG_DEVICE_ID) & __MASK(16); - classrev = pci_readl(dev, PCIREG_CLASSREV); - - dev->pci_class = PCIREG_CLASS(classrev); - dev->pci_subclass = PCIREG_SUBCLASS(classrev); - dev->prog_if = PCIREG_PROGIF(classrev); - - dev->bar[0] = pci_readl(dev, PCIREG_BAR0); - dev->bar[1] = pci_readl(dev, PCIREG_BAR1); - dev->bar[2] = pci_readl(dev, PCIREG_BAR2); - dev->bar[3] = pci_readl(dev, PCIREG_BAR3); - dev->bar[4] = pci_readl(dev, PCIREG_BAR4); - dev->bar[5] = pci_readl(dev, PCIREG_BAR5); - - dev->irq_line = pci_readl(dev, PCIREG_IRQLINE) & __MASK(8); -} - -static void -pci_register_device(uint8_t bus, uint8_t slot, uint8_t func) -{ - struct pci_device *dev = NULL; - - if (!pci_device_exists(bus, slot, func)) { - return; - } - - dev = dynalloc(sizeof(struct pci_device)); - __assert(dev != NULL); - - dev->bus = bus; - dev->slot = slot; - dev->func = func; - - pci_set_device_info(dev); - TAILQ_INSERT_TAIL(&device_list, dev, link); -} - -static void -pci_scan_bus(uint8_t bus) -{ - for (int slot = 0; slot < 32; ++slot) { - for (int func = 0; func < 8; ++func) { - pci_register_device(bus, slot, func); - } - } -} - -/* - * Convert a BAR number to BAR register offset. - * - * @dev: Device of BAR to check. - * @bar: Bar number. - */ -static uint8_t -pci_get_barreg(struct pci_device *dev, uint8_t bar) -{ - switch (bar) { - case 0: return PCIREG_BAR0; - case 1: return PCIREG_BAR1; - case 2: return PCIREG_BAR2; - case 3: return PCIREG_BAR3; - case 4: return PCIREG_BAR4; - case 5: return PCIREG_BAR5; - default: return 0; - } -} - -/* - * Get size length of memory region that a PCI(e) BAR - * covers. A returned value of zero is invalid and indicates - * an error. - * - * @dev: Device of BAR to get. - * @bar: BAR number. - */ -uint32_t -pci_bar_size(struct pci_device *dev, uint8_t bar) -{ - uint8_t bar_reg = pci_get_barreg(dev, bar); - uint32_t tmp, size; - - if (bar_reg == 0) { - return 0; - } - - /* - * Get the length of the region this BAR covers by writing a - * mask of 32 bits into the BAR register and seeing how many - * bits are unset. We can use this to compute the size of the - * region. We know that log2(len) bits must be unset. - */ - tmp = pci_readl(dev, bar_reg); - pci_writel(dev, bar_reg, __MASK(32)); - size = pci_readl(dev, bar_reg); - size = ~size + 1; - - /* Now we need to restore the previous value */ - pci_writel(dev, bar_reg, tmp); - return size; -} - -/* - * Read PCI(e) configuration space. - * - * @dev: Device to read from. - * @offset: Offset to read at. - */ -uint32_t -pci_readl(struct pci_device *dev, uint32_t offset) -{ - if (access_method == PCI_ACCESS_CAM) { - return pci_cam_read(dev, offset); - } - - panic("Invalid access method (%s())\n", __func__); - __builtin_unreachable(); -} - -/* - * Write to PCI(e) configuration space. - * - * @dev: Device to write to. - * @offset: Offset to write at. - */ -void -pci_writel(struct pci_device *dev, uint32_t offset, uint32_t val) -{ - if (access_method == PCI_ACCESS_CAM) { - pci_cam_write(dev, offset, val); - return; - } - - panic("Invalid access method (%s())\n", __func__); - __builtin_unreachable(); -} - -/* - * Set command register bits. - * - * @dev: Device whose command register to modify. - * @bits: Bits to set. - */ -void -pci_set_cmdreg(struct pci_device *dev, uint16_t bits) -{ - uint32_t tmp; - - tmp = pci_readl(dev, 0x4) | bits; - pci_writel(dev, 0x4, tmp); -} - -struct pci_device * -pci_get_device(struct pci_lookup lookup, uint16_t lookup_type) -{ - struct pci_device *dev; - uint16_t lookup_matches = 0; - - TAILQ_FOREACH(dev, &device_list, link) { - if (__TEST(lookup_type, PCI_DEVICE_ID)) { - /* Check device ID */ - if (lookup.device_id == dev->device_id) - lookup_matches |= PCI_DEVICE_ID; - } - - if (__TEST(lookup_type, PCI_VENDOR_ID)) { - /* Check vendor ID */ - if (lookup.vendor_id == dev->vendor_id) - lookup_matches |= PCI_VENDOR_ID; - } - - if (__TEST(lookup_type, PCI_CLASS)) { - /* Check PCI class */ - if (lookup.pci_class == dev->pci_class) - lookup_matches |= PCI_CLASS; - } - - if (__TEST(lookup_type, PCI_SUBCLASS)) { - /* Check PCI subclass */ - if (lookup.pci_subclass == dev->pci_subclass) - lookup_matches |= PCI_SUBCLASS; - } - - if (lookup_type == lookup_matches) { - /* We found the device! */ - return dev; - } - lookup_matches = 0; - } - - return NULL; -} - -int -pci_init(void) -{ - TAILQ_INIT(&device_list); - - pr_trace("Scanning each bus...\n"); - - for (uint16_t i = 0; i < 256; ++i) { - pci_scan_bus(i); - } - - return 0; -} diff --git a/sys/dev/usb/xhci.c b/sys/dev/usb/xhci.c deleted file mode 100644 index f221843..0000000 --- a/sys/dev/usb/xhci.c +++ /dev/null @@ -1,463 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("xhci"); -__KERNEL_META("$Hyra$: xhci.c, Ian Marco Moffett, " - "xHCI driver"); - -#define pr_trace(fmt, ...) kprintf("xhci: " fmt, ##__VA_ARGS__) -#define pr_error(...) pr_trace(__VA_ARGS__) - -static struct pci_device *hci_dev; -static struct timer driver_tmr; - -static inline uint32_t * -xhci_get_portsc(struct xhci_hc *hc, uint8_t portno) -{ - if (portno > hc->maxports) { - portno = hc->maxports; - } - return XHCI_BASE_OFF(hc->opregs, 0x400 + (0x10 * (portno - 1))); -} - -/* - * Set event ring segment table base - * address. - * - * @hc: Host controler descriptor. - * @pa: Physical address. - */ -static inline void -xhci_set_erst_base(struct xhci_hc *hc, uintptr_t pa) -{ - struct xhci_caps *caps = XHCI_CAPS(hc->base); - void *runtime_base = XHCI_RTS(hc->base, caps->rtsoff); - uintptr_t *erstba; - - /* - * The spec states that the Event Ring Segment Table - * Base Address register is at 'runtime_base + 0x30 + - * (32 * interrupter)'. See the xHCI spec, section 5.5.2.3.2 - */ - erstba = XHCI_BASE_OFF(runtime_base, 0x30); - *erstba = pa; -} - -/* - * Submit a command by pushing a TRB to the - * command ring. - * - * @hc: Host controller descriptor. - * @trb: Transfer Request Block of command. - */ -static int -xhci_submit_cmd(struct xhci_hc *hc, struct xhci_trb trb) -{ - volatile uint32_t *cmd_db; - struct xhci_caps *caps = XHCI_CAPS(hc->base); - - /* Push the TRB to the command ring */ - hc->cmd_ring[hc->cmd_ptr++] = trb.dword0; - hc->cmd_ring[hc->cmd_ptr++] = trb.dword1; - hc->cmd_ring[hc->cmd_ptr++] = trb.dword2; - hc->cmd_ring[hc->cmd_ptr++] = trb.dword3 | hc->cycle; - hc->cmd_count++; - - /* Ring the command doorbell */ - cmd_db = XHCI_CMD_DB(hc->base, caps->dboff); - *cmd_db = 0; - - if (hc->cmd_count >= XHCI_CMDRING_LEN - 1) { - /* - * Create raw link TRB and ring the doorbell. We want the - * xHC to flip its cycle bit so it doesn't confuse existing - * entries (that we'll overwrite) in the ring with current - * entries, so we set the Toggle Cycle bit. - * - * See the xHCI spec, section 6.4.4.1 for information regarding - * the format of link TRBs. - */ - hc->cmd_ring[hc->cmd_ptr++] = VIRT_TO_PHYS(hc->cmd_ring) & 0xFFFFFFFF; - hc->cmd_ring[hc->cmd_ptr++] = VIRT_TO_PHYS(hc->cmd_ring) >> 32; - hc->cmd_ring[hc->cmd_ptr++] = 0; - hc->cmd_ring[hc->cmd_ptr++] = hc->cycle | (XHCI_LINK << 10) | __BIT(1); - *cmd_db = 0; - - /* Reset command state and flip cycle */ - hc->cmd_ptr = 0; - hc->cmd_count = 0; - hc->cycle = ~hc->cycle; - } - - return 0; -} - -/* - * Parse xHCI extended caps - */ -static int -xhci_parse_ecp(struct xhci_hc *hc) -{ - struct xhci_caps *caps = XHCI_CAPS(hc->base); - struct xhci_proto *proto; - uint32_t *p, val, dword2; - uint32_t cap_ptr = XHCI_ECP(caps->hccparams1); - - p = XHCI_BASE_OFF(hc->base, cap_ptr*4); - while (cap_ptr != 0) { - val = *p; - dword2 = *((uint32_t *)XHCI_BASE_OFF(p, 8)); - - /* Get the next cap */ - p = XHCI_BASE_OFF(p, XHCI_PROTO_NEXT(val) * 4); - cap_ptr = XHCI_PROTO_NEXT(val); - - if (XHCI_PROTO_ID(val) != XHCI_ECAP_PROTO) { - /* Not a Supported Protocol Capability */ - continue; - } - - if (hc->protocnt > XHCI_MAX_PROTOS) { - /* Too many protocols */ - break; - } - - proto = &hc->protos[hc->protocnt++]; - proto->major = XHCI_PROTO_MAJOR(val); - proto->port_count = XHCI_PROTO_PORTCNT(dword2); - proto->port_start = XHCI_PROTO_PORTOFF(dword2); - } - - return 0; -} - -/* - * Set of xHCI scratchpad buffers. - */ -static int -xhci_init_scratchpads(struct xhci_hc *hc) -{ - struct xhci_caps *caps = XHCI_CAPS(hc->base); - uint16_t max_bufs_lo, max_bufs_hi, max_bufs; - uintptr_t *buffer_array, tmp; - - max_bufs_lo = XHCI_MAX_SP_LO(caps->hcsparams2); - max_bufs_hi = XHCI_MAX_SP_HI(caps->hcsparams2); - max_bufs = (max_bufs_hi << 5) | max_bufs_lo; - if (max_bufs == 0) { - /* - * Some emulators like QEMU don't need any - * scratchpad buffers so we can just return - * early. - */ - return 0; - } - - pr_trace("Need %d scratchpad buffers\n", max_bufs); - - /* Allocate buffer array */ - buffer_array = dynalloc_memalign(sizeof(uintptr_t)*max_bufs, 0x1000); - if (buffer_array == NULL) { - pr_error("Failed to allocate scratchpad buffer array\n"); - return -1; - } - - memset(buffer_array, 0, sizeof(uintptr_t)*max_bufs); - - /* Fill the buffer array */ - for (size_t i = 0; i < max_bufs; ++i) { - tmp = vm_alloc_pageframe(1); - - if (tmp == 0) { - /* TODO: Shutdown, free memory */ - pr_error("Failed to fill scratchpad buffer array\n"); - return -1; - } - - buffer_array[i] = tmp; - } - - hc->dcbaap[0] = VIRT_TO_PHYS(buffer_array); - return 0; -} - -/* - * Init USB ports on the root hub. - */ -static int -xhci_init_ports(struct xhci_hc *hc) -{ - struct xhci_caps *caps = XHCI_CAPS(hc->base); - size_t maxports = XHCI_MAXPORTS(caps->hcsparams1); - uint32_t *portsc; - - for (size_t i = 1; i < maxports; ++i) { - portsc = xhci_get_portsc(hc, i); - if (__TEST(*portsc, XHCI_PORTSC_CCS)) { - pr_trace("Device connected on port %d, resetting...\n", i); - *portsc |= XHCI_PORTSC_PR; - } - } - - return 0; -} - -/* - * Poll USBSTS.HCH to be val - * - * Returns 0 on success. Non-zero values returned - * indicate a hang. - */ -static int -xhci_poll_hch(struct xhci_hc *hc, uint8_t val) -{ - struct xhci_opregs *opregs = hc->opregs; - size_t time_waiting = 0; - - while ((opregs->usbsts & USBSTS_HCH) != val) { - if (time_waiting >= XHCI_TIMEOUT) { - /* Hang */ - return -1; - } - - time_waiting += 50; - driver_tmr.msleep(50); - } - - return 0; -} - -/* - * Start up the host controller by setting - * the USBCMD run/stop bit. - */ -static int -xhci_start_hc(struct xhci_hc *hc) -{ - struct xhci_opregs *opregs = hc->opregs; - int status; - - opregs->usbcmd |= USBCMD_RUN; - - if ((status = xhci_poll_hch(hc, 0)) != 0) { - return status; - } - - return 0; -} - -static int -xhci_reset_hc(struct xhci_hc *hc) -{ - struct xhci_opregs *opregs = hc->opregs; - size_t time_waiting = 0; /* In ms */ - - pr_trace("Resetting host controller...\n"); - - /* - * Set USBCMD.HCRST to reset the controller and - * wait for it to become zero. - */ - opregs->usbcmd |= USBCMD_HCRST; - while (1) { - if (!__TEST(opregs->usbcmd, USBCMD_HCRST)) { - /* Reset is complete */ - break; - } - if (time_waiting >= XHCI_TIMEOUT) { - pr_error("Hang while polling USBCMD.HCRST to be zero\n"); - return -1; - } - driver_tmr.msleep(50); - time_waiting += 50; - } - return 0; -} - -/* - * Allocate the Device Context Base Address - * Array. - * - * Returns the physical address and sets - * hc->dcbaap to the virtual address. - */ -static uintptr_t -xhci_alloc_dcbaa(struct xhci_hc *hc) -{ - size_t dcbaa_size; - - dcbaa_size = sizeof(uintptr_t) * hc->maxslots; - hc->dcbaap = dynalloc_memalign(dcbaa_size, 0x1000); - __assert(hc->dcbaap != NULL); - - return VIRT_TO_PHYS(hc->dcbaap); -} - -/* - * Allocates command ring and sets hc->cmd_ring - * to the virtual address. - * - * Returns the physical address. - */ -static uintptr_t -xhci_alloc_cmdring(struct xhci_hc *hc) -{ - size_t cmdring_size; - - cmdring_size = XHCI_TRB_SIZE * XHCI_CMDRING_LEN; - hc->cmd_ring = dynalloc_memalign(cmdring_size, 0x1000); - __assert(hc->cmd_ring != NULL); - - return VIRT_TO_PHYS(hc->cmd_ring); -} - -/* - * Sets up the event ring. - */ -static void -xhci_init_evring(struct xhci_hc *hc) -{ - struct xhci_caps *caps = XHCI_CAPS(hc->base); - struct xhci_evring_segment *seg; - uint64_t *erdp, *erstba; - uint32_t *erst_size; - void *runtime = XHCI_RTS(hc->base, caps->rtsoff); - size_t size; - - size = XHCI_EVRING_LEN * XHCI_TRB_SIZE; - seg = dynalloc_memalign(size, 64); - memset(seg, 0, size); - - /* Set the size of the event ring segment table */ - erst_size = XHCI_BASE_OFF(runtime, 0x28); - *erst_size = 1; - - /* Setup the event ring segment */ - memset(seg, 0, size); - seg->base = VIRT_TO_PHYS(seg); - seg->size = XHCI_EVRING_LEN; - - /* Setup the event ring dequeue pointer */ - erdp = XHCI_BASE_OFF(runtime, 0x38); - *erdp = seg->base; - - /* Point ERSTBA to our event ring segment */ - erstba = XHCI_BASE_OFF(runtime, 0x30); - *erstba = VIRT_TO_PHYS(seg); - - hc->event_ring = PHYS_TO_VIRT(seg->base); -} - -static int -xhci_init_hc(struct xhci_hc *hc) -{ - struct xhci_caps *caps; - struct xhci_opregs *opregs; - - /* Get some information from the controller */ - caps = XHCI_CAPS(hc->base); - hc->caplen = caps->caplength; - hc->maxslots = XHCI_MAXSLOTS(caps->hcsparams1); - hc->maxports = XHCI_MAXSLOTS(caps->hcsparams1); - - opregs->config |= hc->maxslots; - - /* Fetch the opregs */ - opregs = XHCI_OPBASE(hc->base, hc->caplen); - hc->opregs = XHCI_OPBASE(hc->base, hc->caplen); - - if (xhci_reset_hc(hc) != 0) { - return -1; - } - - /* Set cmdring state */ - hc->cycle = 1; - hc->cmd_ptr = 0; - hc->cmd_count = 0; - - /* Allocate resources and tell the HC about them */ - opregs->dcbaa_ptr = xhci_alloc_dcbaa(hc); - xhci_init_scratchpads(hc); - xhci_init_evring(hc); - opregs->cmd_ring = xhci_alloc_cmdring(hc); - - /* We're ready, start up the HC and ports */ - xhci_start_hc(hc); - xhci_parse_ecp(hc); - xhci_init_ports(hc); - return 0; -} - -static int -xhci_init(void) -{ - uintptr_t bar0, bar1, base; - struct xhci_hc hc; - struct pci_lookup hc_lookup = { - .pci_class = 0x0C, - .pci_subclass = 0x03 - }; - - /* Find the host controller on the bus */ - hci_dev = pci_get_device(hc_lookup, PCI_CLASS | PCI_SUBCLASS); - if (hci_dev == NULL) { - return -1; - } - - bar0 = hci_dev->bar[0] & ~7; - bar1 = hci_dev->bar[1] & ~7; - base = __COMBINE32(bar1, bar0); - hc.base = PHYS_TO_VIRT(base); - pr_trace("xHCI HC base @ 0x%p\n", base); - - if (req_timer(TIMER_GP, &driver_tmr) != 0) { - pr_error("Failed to fetch general purpose timer\n"); - return -1; - } - if (driver_tmr.msleep == NULL) { - pr_error("Timer does not have msleep()\n"); - return -1; - } - - return xhci_init_hc(&hc); -} - -DRIVER_EXPORT(xhci_init); diff --git a/sys/dev/vcons/vcons.c b/sys/dev/vcons/vcons.c deleted file mode 100644 index fe1a3f0..0000000 --- a/sys/dev/vcons/vcons.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include - -__MODULE_NAME("kern_vcons"); -__KERNEL_META("$Hyra$: kern_vcons.c, Ian Marco Moffett, " - "Hyra video console code"); - -/* Get x or y values in pixels */ -#define PIX_CPY_X(scrptr) ((scrptr)->cpy_x * FONT_WIDTH) -#define PIX_CPY_Y(scrptr) ((scrptr)->cpy_y * FONT_HEIGHT) - -#define PIX_BOUNDS_MAX_X(scrptr) ((scrptr)->fbdev.width - FONT_WIDTH) -#define PIX_BOUNDS_MAX_Y(scrptr) ((scrptr)->fbdev.height - FONT_HEIGHT) - -static struct vcons_screen *screen = NULL; - -/* - * Draw the console cursor. - * - * @color: Cursor color - */ -static void -vcons_draw_cursor(struct vcons_screen *scr, uint32_t color) -{ - struct vcons_cursor *cursor = &scr->cursor; - struct fbdev fbdev = scr->fbdev; - - uint32_t *fbdev_mem = fbdev.mem; - uint32_t fbdev_idx = 0; - uint32_t cx, cy; - - for (size_t y = VCONS_CURSOR_HEIGHT; y > 0; --y) { - for (size_t x = VCONS_CURSOR_WIDTH; x > 0; --x) { - cx = cursor->old_xpos + x; - cy = cursor->old_ypos + y; - - fbdev_idx = fbdev_get_index(&fbdev, cx, cy); - fbdev_mem[fbdev_idx] = color; - } - } -} - -/* - * Clear everything out of the console. - */ -static void -vcons_clear_scr(struct vcons_screen *scr) -{ - struct fbdev fbdev = scr->fbdev; - - scr->cpy_x = 0, scr->cpy_y = 0; - - memset(scr->fbdev_mem, scr->bg, (fbdev.pitch * fbdev.height)); - vcons_update_cursor(scr); -} - -/* - * Renders a char onto the screen specified by `scr`. - * - * @x,y: In chars - */ -static void -vcons_draw_char(struct vcons_screen *scr, char c, uint32_t x, uint32_t y) -{ - uint32_t *fb_ptr; - size_t idx; - const uint8_t *glyph; - - /* Get a pointer to framebuffer memory */ - fb_ptr = scr->fbdev_mem; - - /* Get the specific glyph of `c` */ - glyph = &DEFAULT_FONT_DATA[(int)c*16]; - - for (uint32_t cy = 0; cy < FONT_HEIGHT; ++cy) { - for (uint32_t cx = 0; cx < FONT_WIDTH; ++cx) { - idx = fbdev_get_index(&scr->fbdev, x+FONT_WIDTH-cx, y+cy); - fb_ptr[idx] = __TEST(glyph[cy], __BIT(cx)) ? scr->fg : scr->bg; - } - } -} - -/* - * Update the cursor position. - * - * XXX: This function also accounts for the old cursor - * and clears it before drawing the new cursor. - */ -void -vcons_update_cursor(struct vcons_screen *scr) -{ - struct vcons_cursor *cursor = &scr->cursor; - - cursor->is_drawing = true; - - if (cursor->is_drawn) { - /* Clear old cursor */ - vcons_draw_cursor(scr, scr->bg); - } - - cursor->old_xpos = cursor->xpos; - cursor->old_ypos = cursor->ypos; - vcons_draw_cursor(scr, scr->fg); - - cursor->is_drawn = true; - cursor->is_drawing = false; -} - -/* - * Write out a character on the console. - * - * @c: Character to write. - */ -int -vcons_putch(struct vcons_screen *scr, char c) -{ - uint32_t x = PIX_CPY_X(scr); - uint32_t y = PIX_CPY_Y(scr); - struct vcons_cursor *cursor = &scr->cursor; - bool cursor_newline = false; - - while (cursor->is_drawing); - - if (scr == NULL) { - return 1; - } - - /* Check cursor bounds */ - if (cursor->xpos >= PIX_BOUNDS_MAX_X(scr)) { - cursor->xpos = FONT_WIDTH; - cursor->ypos += FONT_HEIGHT; - cursor_newline = true; - } - if (cursor->ypos >= PIX_BOUNDS_MAX_Y(scr)) { - cursor->xpos = FONT_WIDTH; - cursor->ypos = 0; - } - - /* Check text bounds */ - if (x >= PIX_BOUNDS_MAX_X(scr)) { - /* Wrap to the next row */ - ++scr->cpy_y, scr->cpy_x = 0; - x = PIX_CPY_X(scr), y = PIX_CPY_Y(scr); - } - if (y >= PIX_BOUNDS_MAX_Y(scr)) { - scr->cpy_y = 0; - scr->cpy_x = 0; - vcons_clear_scr(scr); - x = PIX_CPY_X(scr), y = PIX_CPY_Y(scr); - } - - if (!cursor_newline) { - cursor->xpos += FONT_WIDTH; - } - - vcons_update_cursor(scr); - vcons_draw_char(scr, c, x, y); - ++scr->cpy_x; - return 0; -} - -/* - * Write out a string on the console. - * - * @s: String to write. - */ -int -vcons_putstr(struct vcons_screen *scr, const char *s, size_t len) -{ - int status; - - for (size_t i = 0; i < len; ++i) { - if (vcons_process_output(scr, s[i]) > 0) - continue; - if ((status = vcons_putch(scr, s[i])) != 0) { - return status; - } - } - - return 0; -} - -void -vcons_attach(struct vcons_screen *scr) -{ - scr->fbdev = fbdev_get_front(); - scr->fbdev_mem = scr->fbdev.mem; - - scr->nrows = scr->fbdev.height; - scr->ncols = scr->fbdev.width; - - screen = scr; - vcons_clear_scr(scr); -} diff --git a/sys/dev/vcons/vcons_io.c b/sys/dev/vcons/vcons_io.c deleted file mode 100644 index f4e693e..0000000 --- a/sys/dev/vcons/vcons_io.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include - -static void -vcons_expand_tab(struct vcons_screen *scr) -{ - for (size_t i = 0; i < VCONS_TAB_WIDTH; ++i) { - vcons_putch(scr, ' '); - } -} - -/* - * This routine tries to process the output `c'. - * - * Returns < 0 value on failure. Values >= 0 - * is `c' which may differ from the original. - * - * This routine also may modify the screen state - * if `c' is a control character. - */ -int -vcons_process_output(struct vcons_screen *scr, int c) -{ - struct vcons_cursor *cursor = &scr->cursor; - - switch (c) { - case ASCII_LF: - scr->cpy_y++; - cursor->ypos += FONT_HEIGHT; - - scr->cpy_x = 0; - cursor->xpos = 0; - break; - case ASCII_CR: - scr->cpy_x = 0; - cursor->xpos = 0; - break; - case ASCII_HT: - vcons_expand_tab(scr); - break; - case ASCII_BS: - if (cursor->xpos > 0) { - scr->cpy_x--; - cursor->xpos -= FONT_WIDTH; - } - break; - default: - return -1; - } - - vcons_update_cursor(scr); - return c; -} diff --git a/sys/dev/video/fbdev.c b/sys/dev/video/fbdev.c deleted file mode 100644 index d9b680f..0000000 --- a/sys/dev/video/fbdev.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#define FRAMEBUFFER \ - framebuffer_req.response->framebuffers[0] - -static volatile struct limine_framebuffer_request framebuffer_req = { - .id = LIMINE_FRAMEBUFFER_REQUEST, - .revision = 0 -}; - -static struct device *dev; - -static int -fbdev_ioctl(struct device *dev, uint32_t cmd, uintptr_t arg) -{ - struct fbdev_info info = { - .width = FRAMEBUFFER->width, - .height = FRAMEBUFFER->height, - .pitch = FRAMEBUFFER->pitch, - .bits_per_pixel = FRAMEBUFFER->bpp - }; - - switch (cmd) { - case FBIOCTL_INFO: - copyout(&info, arg, sizeof(info)); - break; - default: - return -EINVAL; - } - - return 0; -} - -static paddr_t -fbdev_mmap(struct device *dev, off_t off, vm_prot_t prot) -{ - struct fbdev fbdev = fbdev_get_front(); - paddr_t len = fbdev.width * fbdev.pitch; - paddr_t base = VIRT_TO_PHYS(fbdev.mem); - paddr_t max_paddr = base + len; - - if (base + off > max_paddr) { - return 0; - } - - return base + off; -} - -static int -fbdev_open(struct device *dev) -{ - return 0; -} - -struct fbdev -fbdev_get_front(void) -{ - struct fbdev ret; - - ret.mem = FRAMEBUFFER->address; - ret.width = FRAMEBUFFER->width; - ret.height = FRAMEBUFFER->height; - ret.pitch = FRAMEBUFFER->pitch; - return ret; -} - -static int -fbdev_init(void) -{ - dev = device_alloc(); - dev->blocksize = 1; - dev->read = NULL; - dev->write = NULL; - dev->mmap = fbdev_mmap; - dev->ioctl = fbdev_ioctl; - dev->open = fbdev_open; - - device_create(dev, device_alloc_major(), 1); - devfs_add_dev("fb", dev); - return 0; -} - -DRIVER_EXPORT(fbdev_init); diff --git a/sys/firmware/acpi/acpi_init.c b/sys/firmware/acpi/acpi_init.c deleted file mode 100644 index a98e429..0000000 --- a/sys/firmware/acpi/acpi_init.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("acpi"); -__KERNEL_META("$Hyra$: acpi_init.c, Ian Marco Moffett, " - "ACPI init logic"); - -#define pr_trace(fmt, ...) kprintf("acpi: " fmt, ##__VA_ARGS__) - -static volatile struct limine_rsdp_request rsdp_req = { - .id = LIMINE_RSDP_REQUEST, - .revision = 0 -}; - -static size_t root_sdt_entries = 0; -static bool using_xsdt = false; -static struct acpi_root_sdt *root_sdt = NULL; - -/* - * Writes out OEMID of ACPI header. - * - * @type: Type of structure (e.g RSDP) - * @hdr: Header of structure. - */ -static void -acpi_print_oemid(const char *type, char oemid[OEMID_SIZE]) -{ - if (type != NULL) { - pr_trace("%s OEMID: ", type); - } - - for (size_t i = 0; i < OEMID_SIZE; ++i) { - kprintf(OMIT_TIMESTAMP "%c", oemid[i]); - } - kprintf(OMIT_TIMESTAMP "\n"); -} - -struct acpi_root_sdt * -acpi_get_root_sdt(void) -{ - return root_sdt; -} - -size_t -acpi_get_root_sdt_len(void) -{ - return root_sdt_entries; -} - -void -acpi_init(void) -{ - struct acpi_rsdp *rsdp; - - /* Can't do anything if we have no response! */ - if (rsdp_req.response == NULL) { - panic("RSDP request has no response affiliated...\n"); - } - - /* Fetch the RSDP */ - rsdp = rsdp_req.response->address; - acpi_print_oemid("RSDP", rsdp->oemid); - - /* Fetch the RSDT/XSDT */ - if (rsdp->revision >= 2) { - using_xsdt = true; - root_sdt = PHYS_TO_VIRT(rsdp->xsdt_addr); - pr_trace("Using XSDT as root SDT\n"); - } else { - root_sdt = PHYS_TO_VIRT(rsdp->rsdt_addr); - pr_trace("Using RSDT as root SDT\n"); - } - if (!acpi_is_checksum_valid(&root_sdt->hdr)) { - panic("Root SDT has an invalid checksum!\n"); - } - root_sdt_entries = (root_sdt->hdr.length - sizeof(root_sdt->hdr)) / 4; -} diff --git a/sys/firmware/acpi/acpi_madt.c b/sys/firmware/acpi/acpi_madt.c deleted file mode 100644 index 0e2b338..0000000 --- a/sys/firmware/acpi/acpi_madt.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include - -#define APIC_TYPE_LOCAL_APIC 0 -#define APIC_TYPE_IO_APIC 1 -#define APIC_TYPE_INTERRUPT_OVERRIDE 2 - -#define pr_trace(fmt, ...) kprintf("acpi: " fmt, ##__VA_ARGS__) - -__MODULE_NAME("acpi"); -__KERNEL_META("$Hyra$: acpi_madt.c, Ian Marco Moffett, " - "ACPI MADT parsing"); - - -static struct acpi_madt *madt = NULL; - -void * -acpi_get_lapic_base(void) -{ - if (madt == NULL) - return NULL; - return (void *)(uint64_t)madt->lapic_addr; -} - -static void -do_parse(struct cpu_info *ci) -{ - uint8_t *cur = NULL; - uint8_t *end = NULL; - - void *ioapic_mmio_base = NULL; - - struct apic_header *hdr = NULL; - struct ioapic *ioapic = NULL; - - cur = (uint8_t *)(madt + 1); - end = (uint8_t *)madt + madt->hdr.length; - - /* Parse the rest of the MADT */ - while (cur < end) { - hdr = (void *)cur; - - switch (hdr->type) { - case APIC_TYPE_IO_APIC: - /* - * TODO: Figure out how to use multiple - * I/O APICs. - */ - if (ioapic != NULL) { - break; - } - - ioapic = (struct ioapic *)cur; - - pr_trace("Detected I/O APIC (id=%d, gsi_base=%d)\n", - ioapic->ioapic_id, ioapic->gsi_base); - - ioapic_mmio_base = (void *)(uintptr_t)ioapic->ioapic_addr; - ioapic_set_base(ioapic_mmio_base); - break; - } - - cur += hdr->length; - } -} - -/* - * Converts IRQ numbers to its corresponding - * Global System Interrupt (GSI) number. - * - * @irq: IRQ number. - */ -uint32_t -irq_to_gsi(uint8_t irq) -{ - struct apic_header *hdr = NULL; - struct interrupt_override *override = NULL; - uint8_t *cur = NULL; - uint8_t *end = NULL; - - cur = (uint8_t *)(madt + 1); - end = (uint8_t *)madt + madt->hdr.length; - - while (cur < end) { - hdr = (void *)cur; - - switch (hdr->type) { - case APIC_TYPE_INTERRUPT_OVERRIDE: - override = (struct interrupt_override *)cur; - if (override->source == irq) { - return override->interrupt; - } - } - - cur += hdr->length; - } - - return irq; -} - -void -acpi_parse_madt(struct cpu_info *ci) -{ - /* Prevent this function from running twice */ - if (madt != NULL) { - return; - } - - madt = acpi_query("APIC"); - if (madt == NULL) { - panic("Failed to query for ACPI MADT\n"); - } - - do_parse(ci); -} diff --git a/sys/firmware/acpi/acpi_subr.c b/sys/firmware/acpi/acpi_subr.c deleted file mode 100644 index 4ca7555..0000000 --- a/sys/firmware/acpi/acpi_subr.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include - -bool -acpi_is_checksum_valid(struct acpi_header *hdr) -{ - uint8_t sum; - - sum = 0; - for (int i = 0; i < hdr->length; ++i) { - sum += ((char *)hdr)[i]; - } - - /* Sum of table (from header to end) must be zero!! */ - return sum == 0; -} - -/* - * Looks up an ACPI table with a specific - * signature e.g "APIC" for MADT (if present). - * - * @query: The specific query to make e.g "APIC" - */ -void * -acpi_query(const char *query) -{ - struct acpi_header *hdr; - struct acpi_root_sdt *root_sdt; - size_t root_sdt_len, signature_len; - - root_sdt = acpi_get_root_sdt(); - root_sdt_len = acpi_get_root_sdt_len(); - - /* - * XXX: Just a reminder, sizeof() is compile time. - * There will be no actual reading, - * so this is safe. - */ - signature_len = sizeof(hdr->signature); - - for (size_t i = 0; i < root_sdt_len; ++i) { - hdr = (struct acpi_header *)PHYS_TO_VIRT(root_sdt->tables[i]); - - if (memcmp(hdr->signature, query, signature_len) == 0) { - return (void *)hdr; - } - } - - return NULL; -} diff --git a/sys/fs/devfs.c b/sys/fs/devfs.c deleted file mode 100644 index 7fcdbad..0000000 --- a/sys/fs/devfs.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct device_node { - struct spinlock lock; - char *name; - uint8_t is_block : 1; - dev_t major, minor; - TAILQ_ENTRY(device_node) link; -}; - -static TAILQ_HEAD(, device_node) nodes; -static bool nodelist_init = false; - -static struct device_node * -node_from_name(const char *name) -{ - struct device_node *n; - - TAILQ_FOREACH(n, &nodes, link) { - if (strcmp(n->name, name) == 0) { - return n; - } - } - - return NULL; -} - -static int -cdev_read(struct device *dev, struct device_node *node, struct sio_txn *sio) -{ - size_t n_bytes; - - spinlock_acquire(&node->lock); - n_bytes = dev->read(dev, sio); - spinlock_release(&node->lock); - return n_bytes; -} - -static int -blkdev_read(struct device *dev, struct device_node *node, struct sio_txn *sio) -{ - char *buf; - struct sio_txn dev_txn = {0}; - size_t n_blocks = __DIV_ROUNDUP(sio->len, dev->blocksize); - size_t n_bytes = n_blocks * dev->blocksize; - size_t cpy_off; - - if (dev->blocksize == 0 || sio->len == 0) { - /* Sizes can't be zero! */ - return -EIO; - } - - spinlock_acquire(&node->lock); - buf = dynalloc_memalign(n_bytes, 0x1000); - - if (buf == NULL) { - spinlock_release(&node->lock); - return -ENOMEM; - } - - dev_txn.len = n_blocks; - dev_txn.buf = buf; - dev_txn.offset = sio->offset / dev->blocksize; - dev->read(dev, &dev_txn); - spinlock_release(&node->lock); - - cpy_off = sio->offset - (dev_txn.offset * dev->blocksize); - for (size_t i = 0; i < sio->len; ++i) { - ((uint8_t *)sio->buf)[i] = buf[i + cpy_off]; - } - - dynfree(buf); - return sio->len; -} - -static int -vop_vget(struct vnode *parent, const char *name, struct vnode **vp) -{ - struct device_node *dev; - struct vnode *vnode; - int status, vtype; - - if (!nodelist_init) { - return -EIO; - } - - if ((dev = node_from_name(name)) == NULL) { - return -ENOENT; - } - - vtype = dev->is_block ? VBLK : VCHR; - if ((status = vfs_alloc_vnode(&vnode, NULL, vtype)) != 0) { - return status; - } - - vnode->parent = parent; - vnode->data = dev; - vnode->vops = &g_devfs_vops; - *vp = vnode; - return 0; -} - -static int -vop_read(struct vnode *vp, struct sio_txn *sio) -{ - struct device_node *node; - struct device *dev; - - if (vp == NULL) { - return -EIO; - } - - node = vp->data; - dev = device_fetch(node->major, node->minor); - - if (dev->blocksize > 1) - return blkdev_read(dev, node, sio); - - return cdev_read(dev, node, sio); -} - -static int -vop_open(struct vnode *vp) -{ - struct device_node *node; - struct device *dev; - - if (vp == NULL) { - return -EIO; - } - - node = vp->data; - dev = device_fetch(node->major, node->minor); - - if (dev->open == NULL) { - return -EIO; - } - - return dev->open(dev); -} - -static int -vop_close(struct vnode *vp) -{ - struct device_node *node; - struct device *dev; - - if (vp == NULL) { - return -EIO; - } - - node = vp->data; - dev = device_fetch(node->major, node->minor); - - if (dev->close == NULL) { - return -EIO; - } - - return dev->close(dev); -} - -static int -devfs_init(struct fs_info *info, struct vnode *source) -{ - if (source != NULL) - return -EINVAL; - - TAILQ_INIT(&nodes); - nodelist_init = true; - return 0; -} - -static int -devfs_make_devicenode(const char *name, struct device_node **node_out) -{ - size_t name_len = 0; - const char *p = name; - struct device_node *node; - - /* - * Only one filename, no paths. - * - * TODO: Do something better here... - */ - for (; *p; ++p, ++name_len) { - if (*p == '/') - return -EINVAL; - } - - /* Ensure this filename has valid chars */ - if (!vfs_is_valid_path(name)) { - return -EINVAL; - } - - node = dynalloc(sizeof(struct device_node)); - if (node == NULL) - return -ENOMEM; - - node->name = dynalloc(sizeof(char) * name_len); - if (node->name == NULL) - return -ENOMEM; - - memcpy(node->name, name, name_len + 1); - *node_out = node; - return 0; -} - -int -devfs_add_dev(const char *name, const struct device *dev) -{ - struct device_node *node; - int status; - - if ((status = devfs_make_devicenode(name, &node)) != 0) { - return status; - } - - node->major = dev->major; - node->minor = dev->minor; - node->is_block = dev->blocksize > 1; - TAILQ_INSERT_HEAD(&nodes, node, link); - return 0; -} - -/* - * Fetch a device descriptor from a vnode. - */ -int -devfs_get_dev(struct vnode *vp, struct device **res) -{ - struct device_node *n; - struct device *dev; - - /* Is this really a device? */ - if (vp->type != VBLK && vp->type != VCHR) { - return -ENODEV; - } - - n = vp->data; - if ((dev = device_fetch(n->major, n->minor)) == NULL) { - return -ENODEV; - } - - *res = dev; - return 0; -} - -struct vfsops g_devfs_ops = { - .init = devfs_init -}; - -struct vops g_devfs_vops = { - .vget = vop_vget, - .read = vop_read, - .open = vop_open, - .close = vop_close -}; diff --git a/sys/fs/initramfs.c b/sys/fs/initramfs.c deleted file mode 100644 index e15c00d..0000000 --- a/sys/fs/initramfs.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("initramfs"); -__KERNEL_META("$Hyra$: initramfs.c, Ian Marco Moffett, " - "Initial ram filesystem"); - -static volatile struct limine_module_request mod_req = { - .id = LIMINE_MODULE_REQUEST, - .revision = 0 -}; - -static const char *initramfs = NULL; -static size_t initramfs_size = 0; - -#define TAR_TYPEFLAG_NORMAL '0' -#define TAR_TYPEFLAG_HARDLINK '1' -#define TAR_TYPEFLAG_DIR '5' - -struct tar_hdr { - char filename[100]; - char mode[8]; - char uid[8]; - char gid[8]; - char size[12]; - char mtime[12]; - char checksum[8]; - char type; - char link_name[100]; - char magic[6]; - char version[2]; - char uname[32]; - char gname[32]; - char dev_major[8]; - char dev_minor[8]; - char prefix[155]; -}; - -static struct tar_hdr *initramfs_from_path(struct tar_hdr *hdr, - const char *path); - -static size_t -getsize(const char *in); - -static inline char * -hdr_to_contents(struct tar_hdr *hdr) -{ - return ((char*)hdr) + 0x200; -} - -static int -vop_vget(struct vnode *parent, const char *name, struct vnode **vp) -{ - struct tar_hdr *hdr; - struct vnode *vnode; - int status; - int vtype = VREG; - - if (initramfs == NULL) { - return -EIO; - } - - hdr = initramfs_from_path((void *)initramfs, name); - - if (hdr == NULL) { - return -ENOENT; - } - - if (hdr->type == TAR_TYPEFLAG_DIR) { - vtype = VDIR; - } - - /* Allocate vnode for this file */ - if ((status = vfs_alloc_vnode(&vnode, NULL, vtype)) != 0) { - return status; - } - - vnode->parent = parent; - vnode->data = hdr; - - vnode->vops = &g_initramfs_vops; - *vp = vnode; - return 0; -} - -static int -vop_read(struct vnode *vp, struct sio_txn *sio) -{ - struct tar_hdr *hdr; - size_t size; - char *contents; - char *buf = sio->buf; - - if (vp->data == NULL) { - return -EIO; - } - - hdr = vp->data; - size = getsize(hdr->size); - contents = hdr_to_contents(hdr); - - for (size_t i = sio->offset; i < sio->len; ++i) { - if (i >= size) { - return i + 1; - } - buf[i - sio->offset] = contents[i]; - } - - return sio->len; -} - -static int -vop_getattr(struct vnode *vp, struct vattr *vattr) -{ - struct tar_hdr *hdr = vp->data; - - if (hdr == NULL) { - return -EIO; - } - - switch (hdr->type) { - case TAR_TYPEFLAG_NORMAL: - vattr->type = VREG; - break; - case TAR_TYPEFLAG_DIR: - vattr->type = VDIR; - break; - } - - vattr->size = getsize(hdr->size); - return 0; -} - -static char * -get_module(const char *path, uint64_t *size) { - for (uint64_t i = 0; i < mod_req.response->module_count; ++i) { - if (strcmp(mod_req.response->modules[i]->path, path) == 0) { - *size = mod_req.response->modules[i]->size; - return mod_req.response->modules[i]->address; - } - } - - return NULL; -} - -static size_t -getsize(const char *in) -{ - size_t size = 0, count = 1; - - for (size_t j = 11; j > 0; --j, count *= 8) { - size += (in[j-1]-'0')*count; - } - - return size; -} - -static int -initramfs_init(struct fs_info *info, struct vnode *source) -{ - if (source != NULL) - return -EINVAL; - - initramfs = get_module("/boot/initramfs.tar", &initramfs_size); - info->caps = FSCAP_FULLPATH; - - if (initramfs == NULL) { - panic("Failed to load initramfs\n"); - } - - return 0; -} - -static struct tar_hdr * -initramfs_from_path(struct tar_hdr *hdr, const char *path) -{ - - uintptr_t addr = (uintptr_t)hdr; - size_t size; - - if (*path != '/') { - return NULL; - } - ++path; - - while (strcmp(hdr->magic, "ustar") == 0) { - size = getsize(hdr->size); - - if (strcmp(hdr->filename, path) == 0) { - return hdr; - } - - addr += 512 + __ALIGN_UP(size, 512); - hdr = (struct tar_hdr *)addr; - } - - return NULL; -} - -const char * -initramfs_open(const char *path) -{ - struct tar_hdr *hdr; - - if (initramfs == NULL) { - return NULL; - } - - if (strlen(path) > 99) { - return NULL; - } - - hdr = initramfs_from_path((void *)initramfs, path); - return (hdr == NULL) ? NULL : hdr_to_contents(hdr); -} - -struct vfsops g_initramfs_ops = { - .init = initramfs_init, -}; - -struct vops g_initramfs_vops = { - .vget = vop_vget, - .read = vop_read, - .getattr = vop_getattr -}; diff --git a/sys/fs/procfs.c b/sys/fs/procfs.c deleted file mode 100644 index 3a0e2d3..0000000 --- a/sys/fs/procfs.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include - -struct proc_node { - struct spinlock lock; - struct proc_entry *entry; - char *name; - TAILQ_ENTRY(proc_node) link; -}; - -static TAILQ_HEAD(, proc_node) proc_nodes; -static bool nodelist_init = false; - -static struct proc_node * -name_to_node(const char *name) -{ - struct proc_node *n; - - TAILQ_FOREACH(n, &proc_nodes, link) { - if (strcmp(n->name, name) == 0) { - return n; - } - } - - return NULL; -} - -static int -procfs_make_node(const char *name, struct proc_node **res) -{ - size_t name_len = 0; - const char *p = name; - struct proc_node *n; - - /* Disallow paths */ - for (; *p; ++p, ++name_len) { - if (*p == '/') { - return -EINVAL; - } - } - - if (!vfs_is_valid_path(name)) - return -EINVAL; - - n = dynalloc(sizeof(struct proc_node)); - if (n == NULL) - return -ENOMEM; - - n->name = dynalloc(sizeof(char) * name_len); - if (n->name == NULL) - return -ENOMEM; - - memcpy(n->name, name, name_len + 1); - *res = n; - return 0; -} - -struct proc_entry * -procfs_alloc_entry(void) -{ - struct proc_entry *entry; - - entry = dynalloc(sizeof(*entry)); - if (entry == NULL) - return NULL; - - memset(entry, 0, sizeof(*entry)); - return entry; -} - -int -procfs_add_entry(const char *name, struct proc_entry *entry) -{ - struct proc_node *proc; - int status; - - if (name == NULL || entry == NULL) - return -EINVAL; - if ((status = procfs_make_node(name, &proc)) != 0) - return status; - - proc->entry = entry; - TAILQ_INSERT_HEAD(&proc_nodes, proc, link); - return 0; -} - -static int -procfs_init(struct fs_info *info, struct vnode *source) -{ - if (source != NULL) - return -EINVAL; - - - TAILQ_INIT(&proc_nodes); - nodelist_init = true; - procfs_populate(); - return 0; -} - -static int -procfs_rw_vnode(struct vnode *vp, struct sio_txn *sio, bool write) -{ - struct proc_node *proc; - struct proc_entry *entry; - - if (vp == NULL) - return -EIO; - - proc = vp->data; - entry = proc->entry; - - return write ? entry->write(entry, sio) - : entry->read(entry, sio); -} - -static int -vop_write(struct vnode *vp, struct sio_txn *sio) -{ - return procfs_rw_vnode(vp, sio, true); -} - -static int -vop_read(struct vnode *vp, struct sio_txn *sio) -{ - return procfs_rw_vnode(vp, sio, false); -} - -static int -vop_open(struct vnode *vp) -{ - return 0; -} - -static int -vop_close(struct vnode *vp) -{ - return 0; -} - -static int -vop_vget(struct vnode *parent, const char *name, struct vnode **vp) -{ - struct proc_node *proc; - struct vnode *vnode; - int status; - - if (!nodelist_init) - return -EIO; - if ((proc = name_to_node(name)) == NULL) - return -ENOENT; - if ((status = vfs_alloc_vnode(&vnode, NULL, VREG)) != 0) - return status; - - vnode->parent = parent; - vnode->data = proc; - vnode->vops = &g_procfs_vops; - *vp = vnode; - return 0; -} - -struct vfsops g_procfs_ops = { - .init = procfs_init -}; - -struct vops g_procfs_vops = { - .vget = vop_vget, - .read = vop_read, - .write = vop_write, - .open = vop_open, - .close = vop_close -}; diff --git a/sys/fs/procfs_subr.c b/sys/fs/procfs_subr.c deleted file mode 100644 index 8b95919..0000000 --- a/sys/fs/procfs_subr.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include - -static bool populated = false; - -static int -procfs_ver_read(struct proc_entry *p, struct sio_txn *sio) -{ - char buf[1024]; - size_t len; - - len = snprintf(buf, sizeof(buf), "Hyra/%s v%s: %s (%s)\n", - HYRA_ARCH, HYRA_VERSION, - HYRA_BUILDDATE, HYRA_BUILDBRANCH); - - /* Truncate if needed */ - if (len > sio->len) - len = sio->len; - - memcpy(sio->buf, buf, len); - return len; -} - -static int -procfs_memstat_read(struct proc_entry *p, struct sio_txn *sio) -{ - struct vm_memstat stat; - struct physmem_stat *pstat; - char buf[1024]; - size_t len; - - stat = vm_memstat(); - pstat = &stat.pmem_stat; - len = snprintf(buf, sizeof(buf), - "TotalMem: %d KiB\n" - "ReservedMem: %d KiB\n" - "AvailableMem: %d KiB\n" - "AllocatedMem: %d KiB\n" - "VMemObjCount: %d\n", - pstat->total_kib, - pstat->reserved_kib, - pstat->avl_kib, - pstat->alloc_kib, - stat.vmobj_cnt); - - /* Truncate if needed */ - if (len > sio->len) - len = sio->len; - - memcpy(sio->buf, buf, len); - return len; -} - -/* - * Populate procfs with basic misc entries - */ -void -procfs_populate(void) -{ - struct proc_entry *version; - struct proc_entry *memstat; - - if (populated) - return; - - populated = true; - - /* Kernel version */ - version = procfs_alloc_entry(); - version->read = procfs_ver_read; - procfs_add_entry("version", version); - - /* Memstat */ - memstat = procfs_alloc_entry(); - memstat->read = procfs_memstat_read; - procfs_add_entry("memstat", memstat); - - intr_init_proc(); - syslog_init_proc(); -} diff --git a/sys/include/arch/amd64/bus.h b/sys/include/arch/amd64/bus.h deleted file mode 100644 index 53d1fe2..0000000 --- a/sys/include/arch/amd64/bus.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_BUS_H_ -#define _AMD64_BUS_H_ - -#include - -typedef uint64_t bus_addr_t; - -int bus_map(bus_addr_t addr, size_t size, int flags, void **vap); - -#endif /* !_AMD64_BUS_H_ */ diff --git a/sys/include/arch/amd64/cpu.h b/sys/include/arch/amd64/cpu.h deleted file mode 100644 index 3febf5a..0000000 --- a/sys/include/arch/amd64/cpu.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_CPU_H_ -#define _AMD64_CPU_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -/* - * XXX: We are not using the PAUSE instruction for the sake of - * ensuring compatibility... PAUSE is F3 90, REP NOP is - * F3 90... REP NOP will be read as a PAUSE on processors - * that support it. - */ -#define hint_spinwait() __ASMV("rep; nop") - -#define this_cpu() amd64_this_cpu() -#define get_bsp() amd64_get_bsp() -#define is_intr_mask() amd64_is_intr_mask() -#define CPU_INFO_LOCK(info) spinlock_acquire(&(info->lock)) -#define CPU_INFO_UNLOCK(info) spinlock_release(&(info->lock)) - -/* - * Info about a specific processor. - * - * XXX: Spinlock must be acquired outside of this module! - * None of these module's internal functions should - * acquire the spinlock themselves! - */ -struct cpu_info { - /* Per-arch fields */ - void *pmap; /* Current pmap */ - uint32_t id; - uint32_t idx; - struct spinlock lock; - struct sched_state sched_state; - TAILQ_ENTRY(cpu_info) link; - - /* AMD64 */ - volatile size_t lapic_tmr_freq; - volatile void *lapic_base; - volatile bool has_x2apic; - volatile struct tss_entry *tss; - volatile uintptr_t tlb_flush_ptr; /* Address to flush */ - struct intr_info *tlb_shootdown; /* Shootdown interrupt info */ -}; - -/* - * Contains information for the current - * core. Stored in %GS. - * - * MUST REMAIN IN ORDER!!! - */ -struct cpu_ctx { - struct cpu_info *ci; -}; - -/* - * Returns true for this core if maskable - * interrupts are masked (CLI) and false if - * they aren't (STI). - */ -static inline bool -amd64_is_intr_mask(void) -{ - uint64_t flags; - - __ASMV("pushfq; pop %0" : "=rm" (flags) :: "memory"); - return !__TEST(flags, 1 << 9); -} - -static inline void -amd64_write_gs_base(uintptr_t val) -{ - wrmsr(IA32_KERNEL_GS_BASE, val); -} - -static inline uintptr_t -amd64_read_gs_base(void) -{ - return rdmsr(IA32_KERNEL_GS_BASE); -} - -static inline uint64_t -amd64_read_cr0(void) -{ - uint64_t cr0; - __ASMV("mov %%cr0, %0" : "=r" (cr0) :: "memory"); - return cr0; -} - -static inline void -amd64_write_cr0(uint64_t val) -{ - __ASMV("mov %0, %%cr0" :: "r" (val) : "memory"); -} - -static inline uint64_t -amd64_read_cr4(void) -{ - uint64_t cr4; - __ASMV("mov %%cr4, %0" : "=r" (cr4) :: "memory"); - return cr4; -} - -static inline void -amd64_write_cr4(uint64_t val) -{ - __ASMV("mov %0, %%cr4" :: "r" (val) : "memory"); -} - -static inline void -amd64_fxsave(void *area) -{ - __ASMV("fxsave (%0)" :: "r" (area) : "memory"); -} - -static inline void -amd64_fxrstor(void *area) -{ - __ASMV("fxrstor (%0)" :: "r" (area) : "memory"); -} - -struct cpu_info *amd64_this_cpu(void); - -#endif /* !_AMD64_CPU_H_ */ diff --git a/sys/include/arch/amd64/cpu_mp.h b/sys/include/arch/amd64/cpu_mp.h deleted file mode 100644 index 4047f3b..0000000 --- a/sys/include/arch/amd64/cpu_mp.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_CPU_AP_H_ -#define _SYS_CPU_AP_H_ - -#include -#include -#include - -__weak void ap_bootstrap(struct cpu_info *ci); -__weak bool mp_supported(void); - -#endif /* !_SYS_CPU_AP_H_ */ diff --git a/sys/include/arch/amd64/cpuid.h b/sys/include/arch/amd64/cpuid.h deleted file mode 100644 index b193d60..0000000 --- a/sys/include/arch/amd64/cpuid.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_CPUID_H_ -#define _AMD64_CPUID_H_ - -#include - -#define __CPUID(level, a, b, c, d) \ - __ASMV("cpuid\n\t" \ - : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \ - : "0" (level)) - -#endif /* !_AMD64_CPUID_H_ */ diff --git a/sys/include/arch/amd64/frame.h b/sys/include/arch/amd64/frame.h deleted file mode 100644 index 85edea9..0000000 --- a/sys/include/arch/amd64/frame.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_FRAME_H_ -#define _AMD64_FRAME_H_ - -#if !defined(__ASSEMBLER__) - -#include - -struct trapframe { - uint64_t trapno; - uint64_t rax; - uint64_t rcx; - uint64_t rdx; - uint64_t rbx; - uint64_t rsi; - uint64_t rdi; - uint64_t rbp; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - /* Pushed by hardware */ - uint64_t error_code; - uint64_t rip; - uint64_t cs; - uint64_t rflags; - uint64_t rsp; - uint64_t ss; -}; - -#define init_frame(FRAME, IP, SP) \ - (FRAME)->rip = IP; \ - (FRAME)->cs = 0x08; \ - (FRAME)->rflags = 0x202; \ - (FRAME)->rsp = SP; \ - (FRAME)->ss = 0x10; \ - -#define init_frame_user(FRAME, IP, SP) \ - (FRAME)->rip = IP; \ - (FRAME)->cs = 0x18 | 3; \ - (FRAME)->rflags = 0x202; \ - (FRAME)->rsp = SP; \ - (FRAME)->ss = 0x20 | 3; \ - -#define set_frame_sp(FRAME, SP) (FRAME)->rsp = SP -#define set_frame_ip(FRAME, IP) (FRAME)->rip = IP -#define get_frame_ip(FRAME) (FRAME)->rip - -#endif /* !defined(__ASSEMBLER__) */ -#endif /* !_AMD64_FRAME_H_ */ diff --git a/sys/include/arch/amd64/frameasm.h b/sys/include/arch/amd64/frameasm.h deleted file mode 100644 index cdcdd20..0000000 --- a/sys/include/arch/amd64/frameasm.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_FRAMEASM_H_ -#define _AMD64_FRAMEASM_H_ - -/* - * If the interrupt has an error code, this macro shall - * be used to create the trapframe. - * - * XXX: A trapframe created with this must be popped with - * pop_trapframe_ec - */ -.macro push_trapframe_ec trapno - push %r15 - push %r14 - push %r13 - push %r12 - push %r11 - push %r10 - push %r9 - push %r8 - push %rbp - push %rdi - push %rsi - push %rbx - push %rdx - push %rcx - push %rax - push \trapno -.endm - -/* - * If the interrupt has an error code, this macro shall - * be used to cleanup the trapframe. - */ -.macro pop_trapframe_ec - add $8, %rsp /* Trapno */ - pop %rax - pop %rcx - pop %rdx - pop %rbx - pop %rsi - pop %rdi - pop %rbp - pop %r8 - pop %r9 - pop %r10 - pop %r11 - pop %r12 - pop %r13 - pop %r14 - pop %r15 -.endm - -/* - * If the interrupt has no error code, this macro - * shall be used to create the trapframe. - * - * XXX: A trapframe created with this must be popped - * with pop_trapframe - */ -.macro push_trapframe trapno - push $0 - push_trapframe_ec \trapno -.endm - - -/* - * If the interrupt has no error code, this macro shall - * be used to cleanup the trapframe. - */ -.macro pop_trapframe - pop_trapframe_ec - add $8, %rsp /* Pop error code */ -.endm -#endif /* !_AMD64_FRAMEASM_H_ */ diff --git a/sys/include/arch/amd64/gdt.h b/sys/include/arch/amd64/gdt.h deleted file mode 100644 index c3ea8e8..0000000 --- a/sys/include/arch/amd64/gdt.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 AMD64_GDT_H_ -#define AMD64_GDT_H_ - -#include -#include - -#define GDT_TSS 5 -#define KERNEL_CS 0x8 -#define KERNEL_DS 0x10 - -struct __packed gdt_entry { - uint16_t limit; - uint16_t base_low; - uint8_t base_mid; - uint8_t access; - uint8_t granularity; - uint8_t base_hi; -}; - -struct __packed gdtr { - uint16_t limit; - uintptr_t offset; -}; - -static inline void -gdt_load(struct gdtr *gdtr) -{ - __asm("lgdt %0\n" - "push $8\n" /* Push CS */ - "lea 1f(%%rip), %%rax\n" /* Load 1 label address into RAX */ - "push %%rax\n" /* Push the return address (label 1) */ - "lretq\n" /* Far return to update CS */ - "1:\n" - " mov $0x10, %%eax\n" - " mov %%eax, %%ds\n" - " mov %%eax, %%es\n" - " mov %%eax, %%fs\n" - " mov %%eax, %%gs\n" - " mov %%eax, %%ss\n" - : - : "m" (*gdtr) - : "rax", "memory" - ); -} - -extern struct gdt_entry g_gdt[256]; -extern struct gdt_entry *g_gdt_tss; -extern struct gdtr g_gdtr; - -#endif /* !AMD64_GDT_H_ */ diff --git a/sys/include/arch/amd64/hpet.h b/sys/include/arch/amd64/hpet.h deleted file mode 100644 index dc4366c..0000000 --- a/sys/include/arch/amd64/hpet.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _TIMER_HPET_H_ -#define _TIMER_HPET_H_ - -#include - -int hpet_init(void); -int hpet_msleep(size_t ms); -int hpet_usleep(size_t us); -int hpet_nsleep(size_t ns); - -#endif /* !_TIMER_HPET_H_ */ diff --git a/sys/include/arch/amd64/idt.h b/sys/include/arch/amd64/idt.h deleted file mode 100644 index 36ce44e..0000000 --- a/sys/include/arch/amd64/idt.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_IDT_H_ -#define _AMD64_IDT_H_ - -#include -#include - -#define LIDT(idtr) __ASMV("lidt %0" \ - :: "m" (idtr)) - -#define IDT_TRAP_GATE_FLAGS 0x8F -#define IDT_INT_GATE_FLAGS 0x8E -#define IDT_INT_GATE_USER 0xEE - -/* - * AMD64 Interrupt Gate Descriptor. - */ -struct idt_entry { - uint16_t off_lo; /* Low 16 bits of ISR offset */ - uint16_t segsel; /* Segment selector, hardcode to kernel CS */ - uint8_t ist : 2; /* Interrupt stack table */ - uint8_t zero : 1; /* Unused: keep zero */ - uint8_t zero1 : 4; /* Unused: keep zero */ - uint8_t type : 4; /* Gate type */ - uint8_t zero2 : 1; /* Unused: keep zero */ - uint8_t dpl : 2; /* Descriptor privilege level */ - uint8_t p : 1; /* Present (keep 1 to mark as valid) */ - uint16_t off_mid; /* Middle 16 bits of ISR offset */ - uint32_t off_hi; /* High 32-bits of ISR offset */ - uint32_t reserved; /* Reserved: keep zero */ -}; - -struct __packed idtr { - uint16_t limit; - uintptr_t offset; -}; - - -void idt_set_desc(uint8_t vec, uint8_t type, uintptr_t isr, uint8_t ist); -void idt_load(void); - -#endif /* !_AMD64_IDT_H_ */ diff --git a/sys/include/arch/amd64/intr.h b/sys/include/arch/amd64/intr.h deleted file mode 100644 index d48a573..0000000 --- a/sys/include/arch/amd64/intr.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_INTR_H_ -#define _AMD64_INTR_H_ - -#define IST_SCHED 1U -#define IST_HW_IRQ 2U -#define IST_SW_INT 3U - -#endif /* !_AMD64_INTR_H_ */ diff --git a/sys/include/arch/amd64/io.h b/sys/include/arch/amd64/io.h deleted file mode 100644 index c24c08d..0000000 --- a/sys/include/arch/amd64/io.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_IO_H_ -#define _AMD64_IO_H_ - -#include -#include - -static inline uint8_t -inb(uint16_t port) -{ - uint8_t result; - __asm__("in %%dx, %%al" : "=a" (result) : "d" (port)); - return result; -} - -static inline void -outb(uint16_t port, uint8_t data) -{ - __asm__("out %%al, %%dx" : :"a" (data), "d" (port)); -} - -static inline void -outw(uint16_t port, uint16_t data) -{ - __ASMV("outw %w0, %w1" : : "a" (data), "Nd" (port)); -} - -static inline uint16_t -inw(uint16_t port) -{ - uint16_t data; - __ASMV("inw %w1, %w0" : "=a" (data) : "Nd" (port)); - return data; -} - -static inline void -outl(uint16_t port, uint32_t data) -{ - __ASMV("outl %0, %w1" : : "a" (data), "Nd" (port)); -} - -static inline uint32_t -inl(uint16_t port) -{ - uint32_t data; - __ASMV("inl %w1, %0" : "=a" (data) : "Nd" (port)); - return data; -} - -#endif /* !_AMD64_IO_H_ */ diff --git a/sys/include/arch/amd64/ioapic.h b/sys/include/arch/amd64/ioapic.h deleted file mode 100644 index 0d86441..0000000 --- a/sys/include/arch/amd64/ioapic.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_IOAPIC_H_ -#define _AMD64_IOAPIC_H_ - -#include - -void ioapic_irq_mask(uint8_t irq); -void ioapic_irq_unmask(uint8_t irq); -void ioapic_gsi_mask(uint8_t gsi); -void ioapic_gsi_unmask(uint8_t gsi); -void ioapic_set_base(void *mmio_base); -void ioapic_set_vec(uint8_t irq, uint8_t vector); -void ioapic_init(void); - -#endif /* !_AMD64_IOAPIC_H_ */ diff --git a/sys/include/arch/amd64/ioapicvar.h b/sys/include/arch/amd64/ioapicvar.h deleted file mode 100644 index 5128bc8..0000000 --- a/sys/include/arch/amd64/ioapicvar.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_IOAPICVAR_H_ -#define _AMD64_IOAPICVAR_H_ - -#include - -/* Register offsets */ -#define IOREGSEL 0x00 -#define IOWIN 0x10 -#define IOAPICVER 0x01 -#define IOREDTBL 0x10 - -union ioapic_redentry { - struct { - uint8_t vector; - uint8_t delmod : 3; - uint8_t destmod : 1; - uint8_t delivs : 1; - uint8_t intpol : 1; - uint8_t remote_irr : 1; - uint8_t trigger_mode : 1; - uint8_t interrupt_mask : 1; - uint64_t reserved : 39; - uint8_t dest_field; - }; - uint64_t value; -}; - -#endif /* !_AMD64_IOAPICVAR_H_ */ diff --git a/sys/include/arch/amd64/isa/i8042regs.h b/sys/include/arch/amd64/isa/i8042regs.h deleted file mode 100644 index edef2ee..0000000 --- a/sys/include/arch/amd64/isa/i8042regs.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_I8042REG_H_ -#define _AMD64_I8042REG_H_ - -#include - -#define I8042_DATA 0x60 -#define I8042_STATUS 0x64 -#define I8042_COMMAND 0x64 - -/* Status register bits */ -#define I8042_OBUF_FULL __BIT(0) /* Output buffer full */ -#define I8042_IBUF_FULL __BIT(1) /* Input buffer full */ - -/* Commands */ -#define I8042_DISABLE_PORT0 0xAD -#define I8042_DISABLE_PORT1 0xA7 -#define I8042_ENABLE_PORT0 0xAE -#define I8042_ENABLE_PORT1 0xA8 -#define I8042_GET_CONFB 0x20 -#define I8042_SET_CONFB 0x60 -#define I8042_PORT1_SEND 0xD4 - -/* Controller config bits */ -#define I8042_PORT0_INTR __BIT(0) -#define I8042_PORT1_INTR __BIT(1) -#define I8042_PORT0_CLK __BIT(4) -#define I8042_PORT1_CLK __BIT(5) - -/* Aux commands */ -#define I8042_AUX_DEFAULTS 0xF5 -#define I8042_AUX_ENABLE 0xF4 -#define I8042_AUX_DISABLE 0xF5 -#define I8042_AUX_RESET 0xFF - -/* LED bits */ -#define I8042_LED_SCROLL __BIT(0) -#define I8042_LED_NUM __BIT(1) -#define I8042_LED_CAPS __BIT(2) - -#endif /* !_AMD64_I8042REG_H_ */ diff --git a/sys/include/arch/amd64/isa/i8254.h b/sys/include/arch/amd64/isa/i8254.h deleted file mode 100644 index 8215bf4..0000000 --- a/sys/include/arch/amd64/isa/i8254.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_ISA_i8254_H_ -#define _AMD64_ISA_i8254_H_ - -#include - -#define i8254_COMMAND 0x43 -#define i8254_CHANNEL_0 0x40 -#define i8254_CHANNEL_2 0x42 -#define i8254_DIVIDEND 1193182ULL - -uint16_t i8254_get_count(void); -void i8254_set_reload(uint16_t val); -void i8254_set_frequency(uint64_t frequency_hz); - -#endif /* !_AMD64_ISA_i8254_H_ */ diff --git a/sys/include/arch/amd64/isa/spkr.h b/sys/include/arch/amd64/isa/spkr.h deleted file mode 100644 index 2691721..0000000 --- a/sys/include/arch/amd64/isa/spkr.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _ISA_SPKR_H_ -#define _ISA_SPKR_H_ - -#include - -int pcspkr_tone(uint16_t freq, uint32_t msec); - -#endif diff --git a/sys/include/arch/amd64/lapic.h b/sys/include/arch/amd64/lapic.h deleted file mode 100644 index c8a4de4..0000000 --- a/sys/include/arch/amd64/lapic.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_LAPIC_H_ -#define _AMD64_LAPIC_H_ - -#include - -#define LAPIC_TMR_ONESHOT 0x00 -#define LAPIC_TMR_PERIODIC 0x01 - -/* IPI Destination Shorthands */ -enum { - IPI_SHORTHAND_NONE, - IPI_SHORTHAND_SELF, - IPI_SHORTHAND_ALL, - IPI_SHORTHAND_OTHERS -}; - -/* IPI Destination Modes */ -enum { - IPI_DEST_PHYSICAL, - IPI_DEST_LOGICAL -}; - -void lapic_timer_init(size_t *freq_out); -void lapic_timer_oneshot(bool mask, uint32_t count); -void lapic_timer_oneshot_us(size_t us); -void lapic_send_ipi(uint8_t id, uint8_t shorthand, uint8_t vector); -void lapic_send_eoi(void); -void lapic_init(void); - -#endif /* !_AMD64_LAPIC_H_ */ diff --git a/sys/include/arch/amd64/lapicvar.h b/sys/include/arch/amd64/lapicvar.h deleted file mode 100644 index 84f73d2..0000000 --- a/sys/include/arch/amd64/lapicvar.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_LAPICVAR_H_ -#define _AMD64_LAPICVAR_H_ - -#include - -/* LAPIC register offsets */ -#define LAPIC_ID 0x0020U /* ID Register */ -#define LAPIC_VERSION 0x0030U /* Version Register */ -#define LAPIC_TPR 0x0080U /* Task Priority Register */ -#define LAPIC_APR 0x0090U /* Arbitration Priority Register */ -#define LAPIC_PPR 0x00A0U /* Processor Priority Register */ -#define LAPIC_EOI 0x00B0U /* End Of Interrupt Register */ -#define LAPIC_RRD 0x00C0U /* Remote Read Register */ -#define LAPIC_LDR 0x00D0U /* Logical Destination Register */ -#define LAPIC_DFR 0x00E0U /* Destination Format Register */ -#define LAPIC_SVR 0x00F0U /* Spurious Vector Register */ -#define LAPIC_ISR 0x0100U /* In service register (max=0x0220) */ -#define LAPIC_TMR 0x0180U /* Trigger Mode Register (max=0x0220) */ -#define LAPIC_IRR 0x0200U /* Interrupt Request Register (max=0x0270) */ -#define LAPIC_ERR 0x0280U /* Error Status Register */ -#define LAPIC_ICRLO 0x0300U /* Interrupt Command Low Register */ -#define LAPIC_ICRHI 0x0310U /* Interrupt Command High Register */ -#define LAPIC_LVT_TMR 0x0320U /* LVT Timer Register */ -#define LAPIC_DCR 0x03E0U /* Divide Configuration Register (for timer) */ -#define LAPIC_INIT_CNT 0x0380U /* Initial Count Register (for timer) */ -#define LAPIC_CUR_CNT 0x0390U /* Current Count Register (for timer) */ - -#define IA32_APIC_BASE_MSR 0x1B - -/* - * The x2APIC register space is accessed via - * RDMSR/WRMSR instructions. The below defines - * the base MSR address for the register space. - */ -#define x2APIC_MSR_BASE 0x00000800 - -/* - * To hardware enable, OR the value - * of the IA32_APIC_BASE MSR with - * LAPIC_HW_ENABLE and rewrite it. - * - * To software enable, OR the value - * of the SVR with LAPIC_SW_ENABLE - * and rewrite it. - * - * LAPIC_SW_ENABLE has the low 8 bits set - * as some hardware requires the spurious - * vector to be hardwired to 1s so we'll - * go with that to be safe. - */ -#define LAPIC_HW_ENABLE __BIT(11) -#define LAPIC_SW_ENABLE (__BIT(8) | 0xFF) -#define x2APIC_ENABLE_SHIFT 10 - -/* - * The initial logical APIC ID to be set - * - * XXX: This value does *not* apply to processors - * that support x2APIC mode. In x2APIC mode - * the LDR register is readonly to system software. - */ -#define LAPIC_STARTUP_LID 0x1 - -/* LVT bits */ -#define LAPIC_LVT_MASK __BIT(16) -#define LVT_TMR_ONESHOT 0x00 -#define LVT_TMR_PERIODIC 0x01 -#define LVT_TMR_TSC_DEADLINE 0x02 - -/* LAPIC timer interrupt stack size in bytes */ -#define LAPIC_TMR_STACKSZ 4096 - -#endif /* !_AMD64_LAPICVAR_H_ */ diff --git a/sys/include/arch/amd64/msr.h b/sys/include/arch/amd64/msr.h deleted file mode 100644 index d36548b..0000000 --- a/sys/include/arch/amd64/msr.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_MSR_H_ -#define _AMD64_MSR_H_ - -#include -#include - -#define IA32_SPEC_CTL 0x00000048 -#define IA32_KERNEL_GS_BASE 0xC0000102 - -static inline uint64_t -rdmsr(uint32_t msr_addr) -{ - uint32_t lo, hi; - - __ASMV("rdmsr" - : "=a" (lo), "=d" (hi) - : "c" (msr_addr) - ); - return ((uint64_t)hi << 32) | lo; -} - -static inline void -wrmsr(uint32_t msr_addr, uint64_t value) -{ - uint32_t lo, hi; - - lo = (uint32_t)value; - hi = (uint32_t)(value >> 32); - - __ASMV("wrmsr" - : /* No outputs */ - : "a" (lo), "d" (hi), - "c" (msr_addr) - ); -} - -#endif /* !_AMD64_MSR_H_ */ diff --git a/sys/include/arch/amd64/pcb.h b/sys/include/arch/amd64/pcb.h deleted file mode 100644 index 0e0aab8..0000000 --- a/sys/include/arch/amd64/pcb.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_PCB_H_ -#define _AMD64_PCB_H_ - -#include - -struct pcb { - uint8_t *fpu_state; -}; - -#endif /* !_AMD64_PCB_H_ */ diff --git a/sys/include/arch/amd64/spectre.h b/sys/include/arch/amd64/spectre.h deleted file mode 100644 index d12df21..0000000 --- a/sys/include/arch/amd64/spectre.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_SPECTRE_H_ -#define _AMD64_SPECTRE_H_ - -#include -#include - -__weak int try_spectre_mitigate(void); - -#endif diff --git a/sys/include/arch/amd64/sysvec.h b/sys/include/arch/amd64/sysvec.h deleted file mode 100644 index 99a84c0..0000000 --- a/sys/include/arch/amd64/sysvec.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_SYSVEC_H_ -#define _AMD64_SYSVEC_H_ - -#include - -/* - * Interrupt vectors reserved - * to core system usage excluding - * device IRQs routed by 8259 PIC, - * I/O APIC, etc. - */ -typedef enum { - SYSVEC_LAPIC_TIMER = 0x21, /* Local APIC timer */ - SYSVEC_IPI, /* IPI vector */ - SYSVEC_HLT, /* Halt vector */ - SYSVEC_PCKBD, /* Keyboard vector */ - SYSVEC_TLB, /* TLB shootdown */ - - /* -- XXX: New vectors go above -- */ - NSYSVEC_BASE, /* Non-system vector base */ -} sysvec_t; - -/* Unlikely, but just in case */ -__STATIC_ASSERT(NSYSVEC_BASE <= 0xFF, "VECTOR OVERFLOW CAUGHT"); - -#endif /* !_AMD64_SYSVEC_H_ */ diff --git a/sys/include/arch/amd64/tlb.h b/sys/include/arch/amd64/tlb.h deleted file mode 100644 index c85e0e1..0000000 --- a/sys/include/arch/amd64/tlb.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _ASM_TLB_H_ -#define _ASM_TLB_H_ - -#include - -#define tlb_flush(va) \ - __ASMV("invlpg (%0)" \ - : \ - : "r" (va) \ - : "memory" \ - ) - -#endif /* !_ASM_TLB_H_ */ diff --git a/sys/include/arch/amd64/trap.h b/sys/include/arch/amd64/trap.h deleted file mode 100644 index c75fa28..0000000 --- a/sys/include/arch/amd64/trap.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_TRAP_H_ -#define _AMD64_TRAP_H_ - -#if !defined(__ASSEMBLER__) -#include -#include -#endif /* !defined(__ASSEMBLER__) */ - -#define TRAP_NONE 0 /* Used for general interrupts */ -#define TRAP_BREAKPOINT 1 /* Breakpoint */ -#define TRAP_ARITH_ERR 2 /* Arithmetic error (e.g division by 0) */ -#define TRAP_OVERFLOW 3 /* Overflow */ -#define TRAP_BOUND_RANGE 4 /* BOUND range exceeded */ -#define TRAP_INVLOP 5 /* Invalid opcode */ -#define TRAP_DOUBLE_FAULT 6 /* Double fault */ -#define TRAP_INVLTSS 7 /* Invalid TSS */ -#define TRAP_SEGNP 8 /* Segment not present */ -#define TRAP_PROTFLT 9 /* General protection */ -#define TRAP_PAGEFLT 10 /* Page fault */ -#define TRAP_NMI 11 /* Non-maskable interrupt */ -#define TRAP_SS 12 /* Stack-segment fault */ - -/* Trap is coming from user mode */ -#define TRAP_USER 0x100 - -#if !defined(__ASSEMBLER__) -typedef void(*ftrap_handler_t)(void); - -void breakpoint_handler(void *sf); -void arith_err(void *sf); -void overflow(void *sf); -void bound_range(void *sf); -void invl_op(void *sf); -void double_fault(void *sf); -void invl_tss(void *sf); -void segnp(void *sf); -void general_prot(void *sf); -void page_fault(void *sf); -void nmi(void *sf); -void ss_fault(void *sf); -void trap_handler(struct trapframe *tf); -#else -.macro handle_trap - mov %rsp, %rdi - call trap_handler -.endm -#endif /* !defined(__ASSEMBLER__) */ - -#endif /* !_AMD64_TRAP_H_ */ diff --git a/sys/include/arch/amd64/tss.h b/sys/include/arch/amd64/tss.h deleted file mode 100644 index ca0ba57..0000000 --- a/sys/include/arch/amd64/tss.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_TSS_H_ -#define _AMD64_TSS_H_ - -#include -#include - -/* - * cpu_info is from machine/cpu.h - * - * XXX: machine/cpu.h includes this header - * so we must create this as including - * machine/cpu.h will not do anything... - */ -struct cpu_info; - -/* - * A TSS entry (64-bit) - * - * See Intel SDM Section 8.2.1 - Task-State Segment (TSS) - */ -struct __packed tss_entry { - uint32_t reserved1; - uint32_t rsp0_lo; - uint32_t rsp0_hi; - uint32_t rsp1_lo; - uint32_t rsp1_hi; - uint32_t rsp2_lo; - uint32_t rsp2_hi; - uint64_t reserved2; - uint32_t ist1_lo; - uint32_t ist1_hi; - uint32_t ist2_lo; - uint32_t ist2_hi; - uint32_t ist3_lo; - uint32_t ist3_hi; - uint32_t ist4_lo; - uint32_t ist4_hi; - uint32_t ist5_lo; - uint32_t ist5_hi; - uint32_t ist6_lo; - uint32_t ist6_hi; - uint32_t ist7_lo; - uint32_t ist7_hi; - uint64_t reserved3; - uint16_t reserved4; - uint16_t io_base; -}; - -/* - * TSS descriptor (64-bit) - * - * The TSS descriptor describes the location - * of the TSS segments among other things... - * - * See Intel SDM Section 8.2.3 - TSS Descriptor in 64-bit mode - */ -struct __packed tss_desc { - uint16_t seglimit; - uint16_t base_lo16; - uint8_t base_mid8; - uint8_t type : 4; - uint8_t zero : 1; - uint8_t dpl : 2; - uint8_t p : 1; - uint8_t seglimit_hi : 4; - uint8_t avl : 1; - uint8_t unused : 2; - uint8_t g : 1; - uint8_t base_hi_mid8; - uint32_t base_hi32; - uint32_t reserved; -}; - -/* - * Holds the address of the address pointing - * to the top of an interrupt stack. - */ -union tss_stack { - struct { - uint32_t top_lo; - uint32_t top_hi; - }; - uint64_t top; -}; - -int tss_alloc_stack(union tss_stack *entry_out, size_t size); -int tss_update_ist(struct cpu_info *ci, union tss_stack stack, uint8_t istno); -void write_tss(struct cpu_info *cpu, struct tss_desc *desc); -void tss_load(void); /* In tss.S */ - -#endif /* _!_AMD64_TSS_H_ */ diff --git a/sys/include/arch/amd64/uart.h b/sys/include/arch/amd64/uart.h deleted file mode 100644 index a49e626..0000000 --- a/sys/include/arch/amd64/uart.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2023-2024 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. - */ - -/* UART 8250 init logic */ - -#ifndef _UART_H_ -#define _UART_H_ - -#include - -int uart8250_try_init(void); -void uart8250_write(char byte); - -#endif diff --git a/sys/include/arch/amd64/vas.h b/sys/include/arch/amd64/vas.h deleted file mode 100644 index b8eef89..0000000 --- a/sys/include/arch/amd64/vas.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AMD64_PMAP_H_ -#define _AMD64_PMAP_H_ - -#include -#include - -/* - * VAS structure - describes a virtual address space - * - * XXX: This structure shall exist per-process. - * - * TODO: As of now, VAS operations are *not* serialized!!! - * This must change once Hyra becomes multi-threaded - * or things will go wrong *very* quickly. Ensure of - * this or you will suffer the consequences of undefined - * behavior and you will not like it! - */ -struct vas { - size_t cr3_flags; /* CR3 flags */ - uintptr_t top_level; /* PML5 if `use_l5_paging' true, otherwise PML4 */ - bool use_l5_paging; /* True if 5-level paging is supported */ - struct spinlock lock; -}; - -#endif /* !_AMD64_PMAP_H_ */ diff --git a/sys/include/dev/ic/ahciregs.h b/sys/include/dev/ic/ahciregs.h deleted file mode 100644 index b2da5b7..0000000 --- a/sys/include/dev/ic/ahciregs.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AHCIREGS_H_ -#define _AHCIREGS_H_ - -#include -#include - -struct hba_port { - volatile uint64_t clb; /* Command list base (1k-byte aligned) */ - volatile uint64_t fb; /* FIS base (256-byte aligned) */ - volatile uint32_t is; /* Interrupt status */ - volatile uint32_t ie; /* Interrupt enable */ - volatile uint32_t cmd; /* Command and status */ - volatile uint32_t rsvd0; /* Reserved */ - volatile uint32_t tfd; /* Task file data */ - volatile uint32_t sig; /* Signature */ - volatile uint32_t ssts; /* SATA status */ - volatile uint32_t sctl; /* SATA control */ - volatile uint32_t serr; /* SATA error */ - volatile uint32_t sact; /* SATA active */ - volatile uint32_t ci; /* Command issue */ - volatile uint32_t sntf; /* SATA notification */ - volatile uint32_t fbs; /* FIS-based switch control */ - volatile uint32_t rsvd1[11]; - volatile uint32_t vendor[4]; -}; - -struct hba_memspace { - volatile uint32_t cap; /* Host Capabilities */ - volatile uint32_t ghc; /* Global host control */ - volatile uint32_t is; /* Interrupt status */ - volatile uint32_t pi; /* Ports implemented */ - volatile uint32_t vs; /* Version */ - volatile uint32_t ccc_ctl; /* Command completion coalescing control */ - volatile uint32_t ccc_pts; /* Command completion coalescing ports */ - volatile uint32_t em_loc; /* Enclosure management location */ - volatile uint32_t em_ctl; /* Enclosure management control */ - volatile uint32_t cap2; /* Host capabilities extended */ - volatile uint32_t bohc; /* BIOS/OS Handoff Control and Status */ - volatile uint8_t rsvd[0x74]; /* Reserved */ - volatile uint8_t vendor[0x60]; /* Vendor specific */ - struct hba_port ports[1]; -}; - -/* Global host control bits */ -#define AHCI_GHC_AE __BIT(31) /* AHCI enable */ -#define AHCI_GHC_IE __BIT(1) /* Interrupt enable */ -#define AHCI_GHC_HR __BIT(0) /* HBA reset */ - -/* AHCI port signatures */ -#define AHCI_SIG_ATA 0x00000101 -#define AHCI_SIG_SEMB 0xC33C0101 -#define AHCI_SIG_PM 0x96690101 - -/* - * Port SATA status - * See section 3.3.10 of the AHCI spec. - */ -#define AHCI_PXSSTS_DET(SSTS) (SSTS & 0xF) -#define AHCI_PXSSTS_IPM(SSTS) ((SSTS >> 8) & 0xF) - -/* - * Port SATA control bits - * See section 3.3.11 of the AHCI spec. - */ -#define AHCI_PXSCTL_DET(SCTL) (SCTL & 0xF) - -/* - * Port command and status bits - * See section 3.3.7 of the AHCI spec. - */ -#define AHCI_PXCMD_ST __BIT(0) /* Start */ -#define AHCI_PXCMD_FRE __BIT(4) /* FIS Receive Enable */ -#define AHCI_PXCMD_FR __BIT(14) /* FIS Receive Running */ -#define AHCI_PXCMD_CR __BIT(15) /* Command List Running */ - -/* - * Interrupt status bits - * See section 3.3.5 of the AHCI spec. - */ -#define AHCI_PXIS_TFES __BIT(31) - -/* - * Task file data bits - * See section 3.3.8 of the AHCI spec. - */ -#define AHCI_PXTFD_ERR __BIT(0) -#define AHCI_PXTFD_DRQ __BIT(3) -#define AHCI_PXTFD_BSY __BIT(7) - -/* - * Capability bits - * See section 3.1.1 of the AHCI spec. - */ -#define AHCI_CAP_NP(CAP) (CAP & 0x1F) /* Number of ports */ -#define AHCI_CAP_NCS(CAP) ((CAP >> 8) & 0x1F) /* Number of command slots */ - -/* - * Device detection (DET) and Interface power - * management (IPM) values - * See section 3.3.10 of the AHCI spec. - */ -#define AHCI_DET_NULL 0 /* No device detected */ -#define AHCI_DET_PRESENT 1 /* Device present (no PHY comm) */ -#define AHCI_DET_COMM 3 /* Device present and phy comm established */ -#define AHCI_IPM_ACTIVE 1 - -/* - * Device detection initialization values - * See section 3.3.11 of the AHCI spec. - */ -#define AHCI_DET_COMRESET 1 - -#endif /* !_AHCIREGS_H_ */ diff --git a/sys/include/dev/ic/ahcivar.h b/sys/include/dev/ic/ahcivar.h deleted file mode 100644 index edef4f6..0000000 --- a/sys/include/dev/ic/ahcivar.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _AHCIVAR_H_ -#define _AHCIVAR_H_ - -#include -#include -#include -#include -#include - -struct ata_identity { - uint16_t rsvd0 : 1; - uint16_t unused0 : 1; - uint16_t incomplete : 1; - uint16_t unused1 : 3; - uint16_t fixed_dev : 1; - uint16_t removable : 1; - uint16_t unused2 : 7; - uint16_t device_type : 1; - uint16_t ncylinders; - uint16_t specific_config; - uint16_t nheads; - uint16_t unused3[2]; - uint16_t sectors_per_track; - uint16_t vendor[3]; - char serial_number[20]; - uint16_t unused4[2]; - uint16_t unused5; - char firmware_rev[8]; - char model_number[40]; - char pad[256]; -}; - -/* Physical region descriptor table entry */ -struct ahci_prdt_entry { - uintptr_t dba; /* Data base address */ - uint32_t rsvd0; /* Reserved */ - uint32_t dbc : 22; /* Count */ - uint16_t rsvd1 : 9; /* Reserved */ - uint8_t i : 1; /* Interrupt on completion */ -}; - -/* Command header */ -struct ahci_cmd_hdr { - uint8_t cfl : 5; /* Command FIS length */ - uint8_t a : 1; /* ATAPI */ - uint8_t w : 1; /* Write */ - uint8_t p : 1; /* Prefetchable */ - uint8_t r : 1; /* Reset */ - uint8_t c : 1; /* Clear busy upon R_OK */ - uint8_t rsvd0 : 1; /* Reserved */ - uint8_t pmp : 4; /* Port multiplier port */ - uint16_t prdtl; /* PRDT length (in entries) */ - volatile uint32_t prdbc; /* PRDT bytes transferred count */ - uintptr_t ctba; /* Command table descriptor base addr */ - uint32_t rsvd1[4]; /* Reserved */ -}; - -/* Command table */ -struct ahci_cmdtab { - uint8_t cfis[64]; - uint8_t acmd[16]; - uint8_t rsvd[48]; - struct ahci_prdt_entry prdt[1]; -}; - -struct ahci_fis_h2d { - uint8_t type; - uint8_t pmp : 4; - uint8_t rsvd0 : 3; - uint8_t c : 1; - uint8_t command; - uint8_t featurel; - uint8_t lba0; - uint8_t lba1; - uint8_t lba2; - uint8_t device; - uint8_t lba3; - uint8_t lba4; - uint8_t lba5; - uint8_t featureh; - uint8_t countl; - uint8_t counth; - uint8_t icc; - uint8_t control; - uint8_t rsvd1[4]; -}; - -struct ahci_device { - struct ahci_hba *hba; - struct hba_port *port; - dev_t minor; - TAILQ_ENTRY(ahci_device) link; -}; - -struct ahci_hba { - struct hba_memspace *abar; - struct ahci_cmd_hdr *cmdlist; - uint32_t ncmdslots; - uint32_t nports; -}; - -/* Commands */ -#define ATA_CMD_NOP 0x00 -#define ATA_CMD_IDENTIFY 0xEC -#define ATA_CMD_READ_DMA 0x25 -#define ATA_CMD_WRITE_DMA 0x35 - -/* FIS types */ -#define FIS_TYPE_H2D 0x27 -#define FIS_TYPE_D2H 0x34 - -#define AHCI_TIMEOUT 500 -#define AHCI_FIS_SIZE 256 -#define AHCI_CMDTAB_SIZE 256 -#define AHCI_CMDENTRY_SIZE 32 - -#endif /* !_AHCIVAR_H_ */ diff --git a/sys/include/dev/ic/nvmevar.h b/sys/include/dev/ic/nvmevar.h deleted file mode 100644 index 4a40071..0000000 --- a/sys/include/dev/ic/nvmevar.h +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _IC_NVMEVAR_H_ -#define _IC_NVMEVAR_H_ - -#include - -/* Admin commands */ -#define NVME_OP_CREATE_IOSQ 0x01 -#define NVME_OP_CREATE_IOCQ 0x05 -#define NVME_OP_IDENTIFY 0x06 - -/* I/O commands */ -#define NVME_OP_WRITE 0x01 -#define NVME_OP_READ 0x02 - -/* Controller Capabilities */ -#define CAP_MPSMIN(caps) ((caps >> 48) & 0xF) -#define CAP_MPSMAX(caps) ((caps >> 52) & 0xF) -#define CAP_TIMEOUT(caps) ((caps >> 24) & 0xFF) -#define CAP_STRIDE(caps) ((caps >> 32) & 0xF) -#define CAP_MQES(caps) (caps & 0xFFFF) -#define CAP_CSS(caps) (caps & 0xFF) - -/* Controller Configuration */ -#define CONFIG_EN __BIT(0) -#define CONFIG_CSS_SHIFT 4 -#define CONFIG_IOSQES_SHIFT 16 -#define CONFIG_IOCQES_SHIFT 20 - -#define COMMAND_SIZE 64 /* In bytes (defined by spec) */ -#define STATUS_READY(status) (status & 1) - -struct nvme_common_cmd { - uint8_t opcode; - uint8_t flags; - uint16_t cid; - uint32_t nsid; - uint32_t cdw1[2]; - uint64_t metadata; - uint64_t prp1; - uint64_t prp2; - uint32_t cdw2[6]; -}; - -struct nvme_identify_cmd { - uint8_t opcode; - uint8_t flags; - uint16_t cid; - uint32_t nsid; - uint64_t unused1; - uint64_t unused2; - uint64_t prp1; - uint64_t prp2; - uint32_t cns; - uint32_t unused3[5]; -}; - -/* Read/write */ -struct nvme_rw_cmd { - uint8_t opcode; - uint8_t flags; - uint16_t cid; - uint32_t nsid; - uint64_t unused; - uint64_t metadata; - uint64_t prp1; - uint64_t prp2; - uint64_t slba; - uint16_t len; - uint16_t control; - uint32_t dsmgmt; - uint32_t ref; - uint16_t apptag; - uint16_t appmask; -}; - -/* Create I/O completion queue */ -struct nvme_create_iocq_cmd { - uint8_t opcode; - uint8_t flags; - uint16_t cid; - uint32_t unused1[5]; - uint64_t prp1; - uint64_t unused2; - uint16_t qid; - uint16_t qsize; - uint16_t qflags; - uint16_t irqvec; - uint64_t unused3[2]; -}; - -struct nvme_create_iosq_cmd { - uint8_t opcode; - uint8_t flags; - uint16_t cid; - uint32_t unused1[5]; - uint64_t prp1; - uint64_t unused2; - uint16_t sqid; - uint16_t qsize; - uint16_t qflags; - uint16_t cqid; - uint64_t unused3[2]; -}; - -struct nvme_cmd { - union { - struct nvme_identify_cmd identify; - struct nvme_common_cmd common; - struct nvme_create_iocq_cmd create_iocq; - struct nvme_create_iosq_cmd create_iosq; - struct nvme_rw_cmd rw; - }; -}; - -struct nvme_id { - uint16_t vid; - uint16_t ssvid; - char sn[20]; - char mn[40]; - char fr[8]; - uint8_t rab; - uint8_t ieee[3]; - uint8_t mic; - uint8_t mdts; - uint16_t ctrlid; - uint32_t version; - uint32_t unused1[43]; - uint16_t oacs; - uint8_t acl; - uint8_t aerl; - uint8_t fw; - uint8_t lpa; - uint8_t elpe; - uint8_t npss; - uint8_t avscc; - uint8_t apsta; - uint16_t wctemp; - uint16_t cctemp; - uint16_t unused2[121]; - uint8_t sqes; - uint8_t cqes; - uint16_t unused3; - uint32_t nn; - uint16_t oncs; - uint16_t fuses; - uint8_t fna; - uint8_t vwc; - uint16_t awun; - uint16_t awupf; - uint8_t nvscc; - uint8_t unused4; - uint16_t acwu; - uint16_t unused5; - uint32_t sgls; - uint32_t unused6[1401]; - uint8_t vs[1024]; -}; - -/* Command completion queue entry */ -struct nvme_cq_entry { - uint32_t res; - uint32_t unused; - uint16_t sqhead; - uint16_t sqid; - uint16_t cid; - uint16_t status; -}; - -/* NVMe controller */ -struct __packed nvme_bar { - uint64_t caps; - uint32_t version; - uint32_t intms; /* Interrupt mask set */ - uint32_t intmc; /* Interrupt mask clear */ - uint32_t config; - uint32_t unused1; - uint32_t status; - uint32_t unused2; - uint32_t aqa; /* Admin queue attributes */ - uint64_t asq; /* Admin submission queue */ - uint64_t acq; /* Admin completion queue */ -}; - -struct nvme_lbaf { - uint16_t ms; /* Number of metadata bytes per LBA */ - uint8_t ds; /* Data size */ - uint8_t rp; -}; - -/* Identify namespace data */ -struct nvme_id_ns { - uint64_t size; - uint64_t capabilities; - uint64_t nuse; - uint8_t features; - uint8_t nlbaf; - uint8_t flbas; - uint8_t mc; - uint8_t dpc; - uint8_t dps; - uint8_t nmic; - uint8_t rescap; - uint8_t fpi; - uint8_t unused1; - uint16_t nawun; - uint16_t nawupf; - uint16_t nacwu; - uint16_t nabsn; - uint16_t nabo; - uint16_t nabspf; - uint16_t unused2; - uint64_t nvmcap[2]; - uint64_t unusued3[5]; - uint8_t nguid[16]; - uint8_t eui64[8]; - struct nvme_lbaf lbaf[16]; - uint64_t unused3[24]; - uint8_t vs[3712]; -}; - -struct nvme_queue { - struct nvme_cmd *sq; /* Submission queue */ - struct nvme_cq_entry *cq; /* Completion queue */ - uint16_t sq_head; /* Submission queue head */ - uint16_t sq_tail; /* Submission queue tail */ - uint16_t cq_head; /* Completion queue head */ - uint8_t cq_phase : 1; /* Completion queue phase bit */ - uint16_t size; /* Size in elements */ - volatile uint32_t *sq_db; /* Submission doorbell */ - volatile uint32_t *cq_db; /* Completion doorbell */ -}; - -struct nvme_state { - struct nvme_queue adminq; - struct nvme_bar *bar; - dev_t major; -}; - -/* NVMe namespace */ -struct nvme_ns { - size_t nsid; /* Namespace ID */ - size_t lba_bsize; /* LBA block size */ - size_t size; /* Size in logical blocks */ - struct nvme_queue ioq; /* I/O queue */ - struct nvme_lbaf lba_fmt; /* LBA format */ - struct nvme_state *cntl; /* NVMe controller */ - dev_t dev_id; - TAILQ_ENTRY(nvme_ns) link; -}; - -#endif diff --git a/sys/include/dev/pci/pci.h b/sys/include/dev/pci/pci.h deleted file mode 100644 index d6edf3b..0000000 --- a/sys/include/dev/pci/pci.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _DEV_PCI_H_ -#define _DEV_PCI_H_ - -#include -#include -#include -#include -#include - -/* Lookup bits */ -#define PCI_DEVICE_ID __BIT(0) -#define PCI_VENDOR_ID __BIT(1) -#define PCI_CLASS __BIT(2) -#define PCI_SUBCLASS __BIT(3) - -/* Base address masks for BARs */ -#define PCI_BAR_MEMMASK ~7 -#define PCI_BAR_IOMASK ~3 - -/* Macros to fetch base address from BAR */ -#define PCI_BAR_MEMBASE(BAR) PHYS_TO_VIRT(BAR & PCI_BAR_MEMMASK) -#define PCI_BAR_IOBASE(BAR) PHYS_TO_VIRT(BAR & PCI_BAR_IOMASK) - -/* For PCI lookups */ -struct pci_lookup { - uint16_t device_id; - uint16_t vendor_id; - uint8_t pci_class; - uint8_t pci_subclass; -}; - -struct pci_device { - uint8_t bus; - uint8_t slot; - uint8_t func; - - uint16_t device_id; - uint16_t vendor_id; - uint8_t pci_class; - uint8_t pci_subclass; - uint8_t prog_if; - uintptr_t bar[6]; - uint8_t irq_line; - TAILQ_ENTRY(pci_device) link; -}; - -int pci_init(void); -uint32_t pci_readl(struct pci_device *dev, uint32_t offset); -uint32_t pci_bar_size(struct pci_device *dev, uint8_t bar); -void pci_writel(struct pci_device *dev, uint32_t offset, uint32_t val); -void pci_set_cmdreg(struct pci_device *dev, uint16_t bits); -struct pci_device *pci_get_device(struct pci_lookup lookup, uint16_t lookup_type); - -#endif /* !_DEV_PCI_H_ */ diff --git a/sys/include/dev/pci/pciregs.h b/sys/include/dev/pci/pciregs.h deleted file mode 100644 index 13a9fc0..0000000 --- a/sys/include/dev/pci/pciregs.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _PCIREGS_H_ -#define _PCIREGS_H_ - -#include - -#define PCIREG_VENDOR_ID 0x00 /* 16 bits */ -#define PCIREG_DEVICE_ID 0x02 /* 16 bits */ -#define PCIREG_CLASSREV 0x08 /* 32 bits */ -#define PCIREG_BAR0 0x10 /* 32 bits */ -#define PCIREG_BAR1 0x14 /* 32 bits */ -#define PCIREG_BAR2 0x18 /* 32 bits */ -#define PCIREG_BAR3 0x1C /* 32 bits */ -#define PCIREG_BAR4 0x20 /* 32 bits */ -#define PCIREG_BAR5 0x24 /* 32 bits */ -#define PCIREG_IRQLINE 0x3C /* 8 bits */ -#define PCIREG_CMDSTATUS 0x04 /* command (15:0), status (31:16) */ - -/* Macros to extract PCIREG_CLASSREV bits */ -#define PCIREG_CLASS(CLASSREV) (CLASSREV >> 24) -#define PCIREG_SUBCLASS(CLASSREV) ((CLASSREV >> 16) & 0xFF) -#define PCIREG_REVID(CLASSREV) (CLASSREV & 0xFF) -#define PCIREG_PROGIF(CLASSREV) ((CLASSREV >> 8) & 0xFF) - -/* Macros to extract PCIREG_CMDSTATUS bits */ -#define PCIREG_COMMAND(CMDSTATUS) (CMDSTATUS & 0xFFFF) -#define PCIREG_STATUS(CMDSTATUS) (CMDSTATUS >> 16) - -/* PCI command register bits */ -#define PCI_IO_SPACE __BIT(0) /* Respond to I/O space accesses */ -#define PCI_MEM_SPACE __BIT(1) /* Respond to mem space accesses */ -#define PCI_BUS_MASTERING __BIT(2) /* Enable bus mastering */ - -/* PCI status register bits */ -#define PCI_STATUS_CAPLIST __BIT(4) -#define PCI_STATUS_66MHZ __BIT(5) - -#endif /* !_PCIREGS_H_ */ diff --git a/sys/include/dev/pci/pcivar.h b/sys/include/dev/pci/pcivar.h deleted file mode 100644 index ba45a53..0000000 --- a/sys/include/dev/pci/pcivar.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _DEV_PCIVAR_H_ -#define _DEV_PCIVAR_H_ - -#include - -enum { - PCI_ACCESS_CAM, - PCI_ACCESS_ECAM -}; - -#endif /* !_DEV_PCIVAR_H_ */ diff --git a/sys/include/dev/usb/xhciregs.h b/sys/include/dev/usb/xhciregs.h deleted file mode 100644 index 0b07524..0000000 --- a/sys/include/dev/usb/xhciregs.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _USB_XHCIREGS_H_ -#define _USB_XHCIREGS_H_ - -#include -#include - -/* - * Host Controller Capability Registers - * - * See xHCI spec, section 5.3, table 5-9 - */ -struct __packed xhci_caps { - volatile uint8_t caplength; - volatile uint8_t reserved; - volatile uint16_t hciversion; - volatile uint32_t hcsparams1; - volatile uint32_t hcsparams2; - volatile uint32_t hcsparams3; - volatile uint32_t hccparams1; - volatile uint32_t dboff; - volatile uint32_t rtsoff; - volatile uint32_t hccparams2; -}; - -/* - * Host Controller Operational Registers - * - * See xHCI spec, section 5.4, table 5-18 - */ -struct __packed xhci_opregs { - volatile uint32_t usbcmd; - volatile uint32_t usbsts; - volatile uint32_t pagesize; - volatile uint32_t reserved; - volatile uint32_t reserved1; - volatile uint32_t dnctrl; - volatile uint64_t cmd_ring; - volatile uint32_t reserved2[4]; - volatile uint64_t dcbaa_ptr; - volatile uint32_t config; -}; - -/* USBCMD bits */ -#define USBCMD_RUN __BIT(0) /* Run/stop */ -#define USBCMD_HCRST __BIT(1) /* xHC reset */ - -/* USBSTS bits */ -#define USBSTS_HCH __BIT(0) /* HC halted */ - -/* CAPS.HCSPARAMS1 fields */ -#define XHCI_MAXSLOTS(HCSPARAMS1) (HCSPARAMS1 & 0xFF) -#define XHCI_MAXPORTS(HCSPARAMS1) ((HCSPARAMS1 >> 24) & 0xFF) -#define XHCI_ECP(HCCPARAMS1) ((HCCPARAMS1 >> 16) & 0xFFFF) - -/* CAPS.HCSPARAMS2 fields */ -#define XHCI_MAX_SP_HI(HCSPARAMS2) ((HCSPARAMS2 >> 25) & 0x1F) -#define XHCI_MAX_SP_LO(HCSPARAMS2) ((HCSPARAMS2 >> 31) & 0x1F) - -/* PORTSC bits */ -#define XHCI_PORTSC_CCS __BIT(0) /* Current connect status */ -#define XHCI_PORTSC_PR __BIT(4) /* Port reset */ - -/* Registers */ -#define XHCI_BASE_OFF(BASE, OFF) (void *)((uintptr_t)BASE + OFF) -#define XHCI_CAPS(BASE) XHCI_BASE_OFF(BASE, 0) -#define XHCI_OPBASE(BASE, CAP_LEN) XHCI_BASE_OFF(BASE, CAP_LEN) -#define XHCI_RTS(BASE, RTSOFF) XHCI_BASE_OFF(BASE, RTSOFF) -#define XHCI_CMD_DB(BASE, DBOFF) XHCI_BASE_OFF(BASE, DBOFF) - -/* Support protocol cap fields */ -#define XHCI_PROTO_ID(PROTO) (PROTO & 0xFF) -#define XHCI_PROTO_MINOR(PROTO) ((PROTO >> 16) & 0xFF) -#define XHCI_PROTO_MAJOR(PROTO) ((PROTO >> 24) & 0xFF) -#define XHCI_PROTO_NEXT(PROTO) ((PROTO >> 8) & 0xFF) -#define XHCI_PROTO_PORTOFF(PROTO2) (PROTO2 & 0xFF) -#define XHCI_PROTO_PORTCNT(PROTO2) ((PROTO2 >> 8) & 0xFF) - -/* Extended cap IDs */ -#define XHCI_ECAP_PROTO 2 - -#endif /* !_USB_XHCIREGS_H_ */ diff --git a/sys/include/dev/usb/xhcivar.h b/sys/include/dev/usb/xhcivar.h deleted file mode 100644 index 71c1f20..0000000 --- a/sys/include/dev/usb/xhcivar.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _USB_XHCIVAR_H_ -#define _USB_XHCIVAR_H_ - -#include -#include -#include - -#define XHCI_TIMEOUT 500 /* In ms */ -#define XHCI_CMDRING_LEN 16 -#define XHCI_EVRING_LEN 16 -#define XHCI_TRB_SIZE 16 /* In bytes */ -#define XHCI_EVENTRING_LEN XHCI_CMDRING_LEN -#define XHCI_MAX_PROTOS 4 - -struct xhci_nop_trb { - uint32_t reserved; - uint32_t reserved1; - uint32_t reserved2; - uint8_t cycle : 1; - uint16_t reserved3 : 9; - uint8_t type : 6; - uint16_t reserved4; -}; - -/* - * xHCI Transfer Request Block - */ -struct xhci_trb { - union { - struct xhci_nop_trb nop; - struct { - uint32_t dword0; - uint32_t dword1; - uint32_t dword2; - uint32_t dword3; - }; - }; -}; - -/* - * USB proto (USB 2.0 or 3.0) - */ -struct xhci_proto { - uint8_t major; /* Revision major */ - uint8_t port_start; /* Port offset start */ - uint8_t port_count; /* Number of ports */ -}; - -/* - * xHCI event ring segment - * - * See xHCI spec, section 6.5, table 6-40 - */ -struct __packed xhci_evring_segment { - uint64_t base; - uint32_t size; - uint32_t reserved; -}; - -/* - * Host controller. - */ -struct xhci_hc { - void *base; - uint8_t caplen; - uint8_t maxslots; - size_t maxports; - size_t protocnt; - uintptr_t *dcbaap; - uint8_t cycle : 1; - uint16_t cmd_ptr; /* Command ring index */ - uint16_t cmd_count; /* Command ring entry count */ - uint32_t *cmd_ring; - uint32_t *event_ring; - struct xhci_opregs *opregs; - struct xhci_proto protos[XHCI_MAX_PROTOS]; - struct xhci_evring_segment *evring_seg; -}; - -/* TRB types */ -#define XHCI_ENABLE_SLOT 9 -#define XHCI_LINK 6 - -#endif /* !_USB_XHCIVAR_H_ */ diff --git a/sys/include/dev/vcons/vcons.h b/sys/include/dev/vcons/vcons.h deleted file mode 100644 index 492940f..0000000 --- a/sys/include/dev/vcons/vcons.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _DEV_VCONS_H_ -#define _DEV_VCONS_H_ - -#include -#include -#include -#include - -#define VCONS_TAB_WIDTH 4 -#define VCONS_CURSOR_WIDTH FONT_WIDTH -#define VCONS_CURSOR_HEIGHT FONT_HEIGHT - -struct vcons_cursor { - size_t xpos, ypos; - uint32_t rgb; - - /* Internal */ - uint32_t old_xpos, old_ypos; - volatile bool is_drawing; - volatile bool is_drawn; /* If it has been drawn before */ -}; - -struct vcons_screen { - size_t nrows, ncols; - size_t cpy_x, cpy_y; /* In chars */ - size_t cpy_len; - - uint32_t bg; - uint32_t fg; - void *fbdev_mem; - - struct fbdev fbdev; - struct vcons_cursor cursor; -}; - -#define is_cursor_drawing(screenptr) (screenptr)->cursor.is_drawing - -void vcons_attach(struct vcons_screen *scr); -int vcons_putch(struct vcons_screen *scr, char c); -int vcons_putstr(struct vcons_screen *scr, const char *s, size_t len); -void vcons_update_cursor(struct vcons_screen *scr); - -#endif /* !_DEV_VCONS_H_ */ diff --git a/sys/include/dev/vcons/vcons_io.h b/sys/include/dev/vcons/vcons_io.h deleted file mode 100644 index a75d811..0000000 --- a/sys/include/dev/vcons/vcons_io.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _VCONS_IO_H_ -#define _VCONS_IO_H_ - -#include - -int vcons_process_output(struct vcons_screen *scr, int c); - -#endif /* !_VCONS_IO_H_ */ diff --git a/sys/include/dev/video/fbdev.h b/sys/include/dev/video/fbdev.h deleted file mode 100644 index 5ad6bf6..0000000 --- a/sys/include/dev/video/fbdev.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _FBDEV_H_ -#define _FBDEV_H_ - -#include -#include - -struct fbdev { - void *mem; - uint32_t width; - uint32_t height; - uint32_t pitch; -}; - -static inline size_t -fbdev_get_index(const struct fbdev *fbdev, uint32_t x, uint32_t y) -{ - return x + y * (fbdev->pitch/4); -} - -struct fbdev fbdev_get_front(void); - -#endif /* !_FBDEV_H_ */ diff --git a/sys/include/firmware/acpi/acpi.h b/sys/include/firmware/acpi/acpi.h deleted file mode 100644 index 66a955f..0000000 --- a/sys/include/firmware/acpi/acpi.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _ACPI_ACPI_H_ -#define _ACPI_ACPI_H_ - -#include -#include -#include - -void acpi_init(void); -uint32_t irq_to_gsi(uint8_t irq); -void *acpi_query(const char *query); -bool acpi_is_checksum_valid(struct acpi_header *hdr); -struct acpi_root_sdt *acpi_get_root_sdt(void); -size_t acpi_get_root_sdt_len(void); -void acpi_parse_madt(struct cpu_info *ci); -void *acpi_get_lapic_base(void); - -#endif /* !_ACPI_ACPI_H_ */ diff --git a/sys/include/firmware/acpi/tables.h b/sys/include/firmware/acpi/tables.h deleted file mode 100644 index 32fef09..0000000 --- a/sys/include/firmware/acpi/tables.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _ACPI_TABLES_H_ -#define _ACPI_TABLES_H_ - -#include -#include - -#define OEMID_SIZE 6 - -struct __packed acpi_header { - char signature[4]; /* ASCII signature string */ - uint32_t length; /* Length of table in bytes */ - uint8_t revision; /* Revision of the structure */ - uint8_t checksum; /* Checksum of the header */ - char oemid[OEMID_SIZE]; /* OEM-supplied string that IDs the OEM */ - char oem_table_id[8]; /* OEM-supplied string (used by OEM) */ - uint32_t oem_revision; /* OEM-supplied revision number */ - uint32_t creator_id; /* Vendor ID of creator utility */ - uint32_t creator_revision; /* Revision of creator utility */ -}; - -struct __packed acpi_rsdp { - uint64_t signature; /* RSD PTR */ - uint8_t checksum; /* Structure checksum */ - char oemid[OEMID_SIZE]; /* OEM-supplied string that IDs the OEM */ - uint8_t revision; /* Revision of the structure */ - uint32_t rsdt_addr; /* RSDT physical address */ - - /* Reserved if revision < 2 */ - uint32_t length; /* Length of table in bytes */ - uint64_t xsdt_addr; /* XSDT physical address */ - uint8_t ext_checksum; /* Extended checksum */ - uint8_t reserved[3]; -}; - -/* - * XSDT or RSDT depending - * on what revision the header - * says. - */ -struct __packed acpi_root_sdt { - struct acpi_header hdr; - uint32_t tables[]; -}; - -struct __packed acpi_madt { - struct acpi_header hdr; - uint32_t lapic_addr; - uint32_t flags; -}; - -struct __packed apic_header { - uint8_t type; - uint8_t length; -}; - -struct __packed local_apic { - struct apic_header hdr; - uint8_t processor_id; - uint8_t apic_id; - uint32_t flags; -}; - -struct __packed ioapic { - struct apic_header hdr; - uint8_t ioapic_id; - uint8_t reserved; - uint32_t ioapic_addr; - uint32_t gsi_base; -}; - -struct __packed interrupt_override { - struct apic_header hdr; - uint8_t bus; - uint8_t source; /* IRQ */ - uint32_t interrupt; /* GSI */ - uint16_t flags; -}; - -struct __packed acpi_gas { - uint8_t address_space_id; - uint8_t register_bit_width; - uint8_t register_bit_offset; - uint8_t reserved; - uint64_t address; -}; - -struct __packed hpet { - struct acpi_header hdr; - uint8_t hardware_rev_id; - uint8_t comparator_count : 5; - uint8_t counter_size : 1; - uint8_t reserved : 1; - uint8_t legacy_replacement : 1; - uint16_t pci_vendor_id; - struct acpi_gas gas; - uint8_t hpet_number; - uint16_t minimum_tick; - uint8_t page_protection; -}; - -#endif /* !_ACPI_TABLES_H_ */ diff --git a/sys/include/fs/devfs.h b/sys/include/fs/devfs.h deleted file mode 100644 index 66128ef..0000000 --- a/sys/include/fs/devfs.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _FS_DEVFS_H_ -#define _FS_DEVFS_H_ - -#include -#include - -extern struct vfsops g_devfs_ops; -extern struct vops g_devfs_vops; - -int devfs_add_dev(const char *name, const struct device *dev); -int devfs_get_dev(struct vnode *vp, struct device **res); - -#endif diff --git a/sys/include/fs/initramfs.h b/sys/include/fs/initramfs.h deleted file mode 100644 index 223e962..0000000 --- a/sys/include/fs/initramfs.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _FS_INITRAMFS_H_ -#define _FS_INITRAMFS_H_ - -#include -#include - -extern struct vfsops g_initramfs_ops; -extern struct vops g_initramfs_vops; - -const char *initramfs_open(const char *path); - -#endif /* !_FS_INITRAMFS_H_ */ diff --git a/sys/include/fs/procfs.h b/sys/include/fs/procfs.h deleted file mode 100644 index ed3a19f..0000000 --- a/sys/include/fs/procfs.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _PROCFS_H_ -#define _PROCFS_H_ - -#include -#include -#include - -struct proc_entry { - int(*read)(struct proc_entry *p, struct sio_txn *sio); - int(*write)(struct proc_entry *p, struct sio_txn *sio); -}; - -extern struct vfsops g_procfs_ops; -extern struct vops g_procfs_vops; - -int procfs_add_entry(const char *name, struct proc_entry *entry); -struct proc_entry *procfs_alloc_entry(void); - -/* procfs_subr.c */ -void procfs_populate(void); - -#endif /* !_PROCFS_H_ */ diff --git a/sys/include/lib/assert.h b/sys/include/lib/assert.h deleted file mode 100644 index 78ebe05..0000000 --- a/sys/include/lib/assert.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _LIB_ASSERT_H_ -#define _LIB_ASSERT_H_ - -#include -#include - -#define __assert(condition) \ - if ((uintptr_t)(condition) == 0) { \ - panic("Assert \"%s\" failed (%s() at %s:%d)\n", #condition, \ - __func__, __FILE__, __LINE__); \ - } - -#endif /* !_LIB_ASSERT_H_ */ diff --git a/sys/include/lib/bitmap.h b/sys/include/lib/bitmap.h deleted file mode 100644 index da900a2..0000000 --- a/sys/include/lib/bitmap.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _LIB_BITMAP_H_ -#define _LIB_BITMAP_H_ - -#include -#include - -typedef uint8_t *bitmap_t; - -static inline void -bitmap_set_bit(bitmap_t bitmap, size_t bit) -{ - bitmap[bit / 8] |= __BIT(bit % 8); -} - -static inline void -bitmap_unset_bit(bitmap_t bitmap, size_t bit) -{ - bitmap[bit / 8] &= ~(__BIT(bit % 8)); -} - -static inline bool -bitmap_test_bit(bitmap_t bitmap, size_t bit) -{ - return __TEST(bitmap[bit / 8], __BIT(bit % 8)); -} - -#endif /* !_LIB_BITMAP_H_ */ diff --git a/sys/include/lib/logo.h b/sys/include/lib/logo.h deleted file mode 100644 index c33d3d2..0000000 --- a/sys/include/lib/logo.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include - -#define COPYRIGHT "Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team." - -#define PRINT_LOGO() \ - kprintf(OMIT_TIMESTAMP "%s v%s\n\n", g_logo, HYRA_VERSION); \ - kprintf(OMIT_TIMESTAMP "\t%s\n\n", COPYRIGHT); - -extern uint8_t g_logo[]; diff --git a/sys/include/lib/stdarg.h b/sys/include/lib/stdarg.h deleted file mode 100644 index 5a3d67d..0000000 --- a/sys/include/lib/stdarg.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _LIB_STDARG_H_ -#define _LIB_STDARG_H_ - -#ifndef __GNUC_VA_LIST -#define __GNUC_VA_LIST -typedef __builtin_va_list __gnuc_va_list; -#endif /* __GNUC_VA_LIST */ - -typedef __gnuc_va_list va_list; - -#define va_start(ap, last) __builtin_va_start((ap), last) -#define va_end(ap) __builtin_va_end((ap)) -#define va_arg(ap, type) __builtin_va_arg((ap), type) - -#endif /* !_LIB_STDARG_H_ */ diff --git a/sys/include/lib/string.h b/sys/include/lib/string.h deleted file mode 100644 index f4ee93d..0000000 --- a/sys/include/lib/string.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _LIB_STRING_H_ -#define _LIB_STRING_H_ - -#include -#include - -size_t strlen(const char *s); -char *itoa(int64_t value, char *buf, int base); -void *memmove(void *s1, const void *s2, size_t n); -void *memcpy(void *dest, const void *src, size_t n); -void *memcpy32(void *dest, const void *src, size_t n); -void *memset(void *s, int c, size_t n); -void *memset64(void *s, int c, size_t n); -int memcmp(const void *s1, const void *s2, size_t n); -int strcmp(const char *s1, const char *s2); -int vsnprintf(char *s, size_t size, const char *fmt, va_list ap); -int snprintf(char *s, size_t size, const char *fmt, ...); - -#endif /* !_LIB_STRING_H_ */ diff --git a/sys/include/lib/sysfont.h b/sys/include/lib/sysfont.h deleted file mode 100644 index 62b4ec0..0000000 --- a/sys/include/lib/sysfont.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _LIB_TTY_FONT_H_ -#define _LIB_TTY_FONT_H_ - -#include - -#define FONT_WIDTH 8 -#define FONT_HEIGHT 16 - -extern const uint8_t DEFAULT_FONT_DATA[]; - -#endif /* !_LIB_TTY_FONT_H_ */ diff --git a/sys/include/sys/ascii.h b/sys/include/sys/ascii.h deleted file mode 100644 index 2421c8c..0000000 --- a/sys/include/sys/ascii.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_ASCII_H_ -#define _SYS_ASCII_H_ - -#define ASCII_NUL 0x00 /* Nul */ -#define ASCII_BEL 0x07 /* Bell */ -#define ASCII_BS 0x08 /* Backspace */ -#define ASCII_HT 0x09 /* Horizontal tab */ -#define ASCII_LF 0x0A /* Line feed */ -#define ASCII_VT 0x0B /* Vertical tab */ -#define ASCII_FF 0x0C /* Form feed */ -#define ASCII_CR 0x0D /* Carriage return */ -#define ASCII_SO 0x0E /* Shift out */ -#define ASCII_SI 0x0F /* Shift in */ -#define ASCII_ESC 0x1B /* Escape */ - -#endif diff --git a/sys/include/sys/cdefs.h b/sys/include/sys/cdefs.h deleted file mode 100644 index 110205b..0000000 --- a/sys/include/sys/cdefs.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_CDEFS_H_ -#define _SYS_CDEFS_H_ - -#if !defined(__ASSEMBLER__) - -/* Misc helpers */ -#define __attr(x) __attribute__((x)) -#define __weak __attr(weak) -#define __used __attr(used) -#define __naked __attr(naked) -#define __noreturn __attr(noreturn) - -#define __likely(x) __builtin_expect(!!(x), 1) -#define __unlikely(x) __builtin_expect(!!(x), 0) - -/* Wrapper for inline asm */ -#define __ASMV __asm__ __volatile__ - -/* Pack a structure */ -#define __packed __attribute__((__packed__)) - -/* Align by `n` */ -#define __aligned(n) __attribute__((__aligned__(n))) - -/* - * Align to a cacheline-boundary which is - * typically 64 bytes. - * - * XXX: Should probably deal with the case of the - * cacheline alignment boundary not being 64 bytes. - */ -#define __cacheline_aligned __aligned(64) - -/* - * Memory barrier, ensure compiler doesn't reorder - * memory accesses. - */ -#define __mem_barrier() __ASMV("" ::: "memory") - -/* - * To be used when an empty body is required like: - * - * #ifdef DEBUG - * #define dprintf(a) printf(a) - * #else - * #define dprintf(a) __nothing - * #endif - */ -#define __nothing ((void)0) - -/* __BIT(n): Set nth bit, where __BIT(0) == 0x1 */ -#define __BIT(n) (1ULL << n) - -/* MASK(n): Sets first n bits, where __MASK(2) == 0b11 */ -#define __MASK(n) (__BIT(n) - 1) - -/* Max/min helpers */ -#define __MIN(a, b) ((a <= b) ? (a) : (b)) -#define __MAX(a, b) ((a >= b) ? (a) : (b)) - -/* Aligns up/down a value */ -#define __ALIGN_DOWN(value, align) ((value) & ~((align)-1)) -#define __ALIGN_UP(value, align) (((value) + (align)-1) & ~((align)-1)) - -/* Rounds up and divides */ -#define __DIV_ROUNDUP(value, div) __extension__ ({ \ - __auto_type __val = value; \ - __auto_type __div = div; \ - (__val + (__div - 1)) / __div; \ -}) - -/* Find least significant bit that is set */ -#define __LOWEST_SET_BIT(mask) ((((mask) - 1) & (mask)) ^ (mask)) - -/* Extract value with `mask` from `x` */ -#define __SHIFTOUT(x, mask) (((x) & (mask)) / __LOWEST_SET_BIT(mask)) - -/* Test if bits are set, where __TEST(0b1111, 0xF) == 1 */ -#define __TEST(a, mask) (__SHIFTOUT(a, mask) != 0) - -/* Return the number of elements within an array */ -#define __ARRAY_COUNT(x) (sizeof(x) / sizeof(x[0])) - -/* Suppress `variable set but not used' warnings */ -#define __USE(x) ((void)(x)) - -/* A cleaner wrapper over _Static_assert() */ -#define __STATIC_ASSERT _Static_assert - -/* Computes 2^x i.e 2 to the power of 'x' */ -#define __POW2(x) (1ULL << x) - -/* Combine two 8-bit values into a 16-bit value */ -#define __COMBINE8(HI, LO) ((uint16_t)((uint16_t)HI << 8) | LO) - -/* Combine two 16-bit values into a 32-bit value */ -#define __COMBINE16(HI, LO) ((uint32_t)((uint32_t)HI << 16) | LO) - -/* Combine two 32-bit values into a 64-bit value */ -#define __COMBINE32(HI, LO) ((uint64_t)((uint64_t)HI << 32) | LO) - -/* - * Used to give metadata to - * a specific module. Example - * metadata string: - * - * $Hyra$: module.c, Programmer Bob, A module that does stuff and things - * ~~~~~~ ~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Cookie; Module Author of this A short description - * always name module - * first - * - * Example usage: - * - * __KERNEL_META("$Hyra$: module.c, Programmer Bob, " - * "A module that does stuff and things"); - * - * The above is the preferred style for this - * macro. - */ -#define __KERNEL_META(meta_str) \ - __asm__(".section .meta.note\n" \ - ".align 4\n" \ - ".string \"" meta_str "\"\n" \ - ".previous" \ - ) - -#define __MODULE_NAME(name) \ - __used static const char *__THIS_MODULE = name - -/* - * Attempts to call a __weak function. Does nothing - * if routine not implemented. - */ -#define __TRY_CALL(routine, ...) \ - if (routine != NULL) routine(__VA_ARGS__) - -#else - -/* - * XXX: Will work; however, maybe move this?? - */ -#if defined(__x86_64__) -.macro __KERNEL_META meta_str - .section .meta.note - .align 4 - .string "\meta_str" - .previous -.endm -#endif /* defined(__x86_64__) */ - -#endif /* !defined(__ASSEMBLER__) */ -#endif /* !_SYS_CDEFS_H_ */ diff --git a/sys/include/sys/cpu.h b/sys/include/sys/cpu.h deleted file mode 100644 index f22cba4..0000000 --- a/sys/include/sys/cpu.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_CPU_H_ -#define _SYS_CPU_H_ - -#include - -#define cpu_index(ci) ci->idx - -size_t cpu_count(void); -void cpu_attach(struct cpu_info *ci); -struct cpu_info *cpu_get(size_t i); - -#endif /* !_SYS_CPU_H_ */ diff --git a/sys/include/sys/device.h b/sys/include/sys/device.h deleted file mode 100644 index 1bca4a8..0000000 --- a/sys/include/sys/device.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_DEVICE_H_ -#define _SYS_DEVICE_H_ - -#include -#include -#include -#include -#include - -struct device { - dev_t major, minor; - size_t blocksize; - int(*write)(struct device *dev, struct sio_txn *sio); - int(*read)(struct device *dev, struct sio_txn *sio); - int(*ioctl)(struct device *dev, uint32_t cmd, uintptr_t arg); - int(*open)(struct device *dev); - int(*close)(struct device *dev); - paddr_t(*mmap)(struct device *dev, off_t off, vm_prot_t prot); - TAILQ_ENTRY(device) link; -}; - -static inline struct device * -device_alloc(void) -{ - struct device *dev; - - dev = dynalloc(sizeof(struct device)); - if (dev == NULL) - return dev; - - memset(dev, 0, sizeof(struct device)); - return dev; -} - -struct device *device_fetch(dev_t major, dev_t minor); -dev_t device_alloc_major(void); -dev_t device_create(struct device *dev, dev_t major, dev_t minor); - -#endif diff --git a/sys/include/sys/driver.h b/sys/include/sys/driver.h deleted file mode 100644 index 415f4e2..0000000 --- a/sys/include/sys/driver.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_DRIVER_H_ -#define _SYS_DRIVER_H_ - -#include - -#if defined(_KERNEL) - -struct driver { - int(*init)(void); -}; - -extern char __drivers_init_start[]; -extern char __drivers_init_end[]; - -#define DRIVER_EXPORT(INIT) \ - __attribute__((used, section(".drivers"))) \ - static struct driver __driver_desc = { \ - .init = INIT, \ - } - -#define DRIVERS_INIT() \ - for (struct driver *__d = (struct driver *)__drivers_init_start; \ - (uintptr_t)__d < (uintptr_t)__drivers_init_end; ++__d) \ - { \ - __d->init(); \ - } -#endif -#endif /* !_SYS_DRIVER_H_ */ diff --git a/sys/include/sys/elf.h b/sys/include/sys/elf.h deleted file mode 100644 index af2d65a..0000000 --- a/sys/include/sys/elf.h +++ /dev/null @@ -1,499 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_ELF_H_ -#define _SYS_ELF_H_ - -#include - -/* Type for a 16-bit quantity. */ -typedef uint16_t Elf32_Half; -typedef uint16_t Elf64_Half; - -/* Types for signed and unsigned 32-bit quantities. */ -typedef uint32_t Elf32_Word; -typedef int32_t Elf32_Sword; -typedef uint32_t Elf64_Word; -typedef int32_t Elf64_Sword; - -/* Types for signed and unsigned 64-bit quantities. */ -typedef uint64_t Elf32_Xword; -typedef int64_t Elf32_Sxword; -typedef uint64_t Elf64_Xword; -typedef int64_t Elf64_Sxword; - -/* Type of addresses. */ -typedef uint32_t Elf32_Addr; -typedef uint64_t Elf64_Addr; - -/* Type of file offsets. */ -typedef uint32_t Elf32_Off; -typedef uint64_t Elf64_Off; - -/* Type for section indices, which are 16-bit quantities. */ -typedef uint16_t Elf32_Section; -typedef uint16_t Elf64_Section; - -/* Type for version symbol information. */ -typedef Elf32_Half Elf32_Versym; -typedef Elf64_Half Elf64_Versym; - -#define EI_MAG0 0 /* File identification byte 0 index */ -#define ELFMAG0 0x7f /* Magic number byte 0 */ - -#define EI_MAG1 1 /* File identification byte 1 index */ -#define ELFMAG1 'E' /* Magic number byte 1 */ - -#define EI_MAG2 2 /* File identification byte 2 index */ -#define ELFMAG2 'L' /* Magic number byte 2 */ - -#define EI_MAG3 3 /* File identification byte 3 index */ -#define ELFMAG3 'F' /* Magic number byte 3 */ - -/* Conglomeration of the identification bytes, for easy testing as a word. */ -#define ELFMAG "\177ELF" -#define SELFMAG 4 - -#define EI_CLASS 4 /* File class byte index */ -#define ELFCLASSNONE 0 /* Invalid class */ -#define ELFCLASS32 1 /* 32-bit objects */ -#define ELFCLASS64 2 /* 64-bit objects */ -#define ELFCLASSNUM 3 - -#define EI_DATA 5 /* Data encoding byte index */ -#define ELFDATANONE 0 /* Invalid data encoding */ -#define ELFDATA2LSB 1 /* 2's complement, little endian */ -#define ELFDATA2MSB 2 /* 2's complement, big endian */ -#define ELFDATANUM 3 - -#define EI_VERSION 6 /* File version byte index */ - /* Value must be EV_CURRENT */ - -#define EI_OSABI 7 /* OS ABI identification */ -#define ELFOSABI_NONE 0 /* UNIX System V ABI */ -#define ELFOSABI_SYSV 0 /* Alias. */ -#define ELFOSABI_HPUX 1 /* HP-UX */ -#define ELFOSABI_NETBSD 2 /* NetBSD. */ -#define ELFOSABI_GNU 3 /* Object uses GNU ELF extensions. */ -#define ELFOSABI_LINUX ELFOSABI_GNU /* Compatibility alias. */ -#define ELFOSABI_SOLARIS 6 /* Sun Solaris. */ -#define ELFOSABI_AIX 7 /* IBM AIX. */ -#define ELFOSABI_IRIX 8 /* SGI Irix. */ -#define ELFOSABI_FREEBSD 9 /* FreeBSD. */ -#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */ -#define ELFOSABI_MODESTO 11 /* Novell Modesto. */ -#define ELFOSABI_OPENBSD 12 /* OpenBSD. */ -#define ELFOSABI_ARM_AEABI 64 /* ARM EABI */ -#define ELFOSABI_ARM 97 /* ARM */ -#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ - -#define EI_ABIVERSION 8 /* ABI version */ - -#define EI_PAD 9 /* Byte index of padding bytes */ - -/* Legal values for e_type (object file type). */ - -#define ET_NONE 0 /* No file type */ -#define ET_REL 1 /* Relocatable file */ -#define ET_EXEC 2 /* Executable file */ -#define ET_DYN 3 /* Shared object file */ -#define ET_CORE 4 /* Core file */ -#define ET_NUM 5 /* Number of defined types */ -#define ET_LOOS 0xfe00 /* OS-specific range start */ -#define ET_HIOS 0xfeff /* OS-specific range end */ -#define ET_LOPROC 0xff00 /* Processor-specific range start */ -#define ET_HIPROC 0xffff /* Processor-specific range end */ - -/* Legal values for e_machine (architecture). */ - -#define EM_NONE 0 /* No machine */ -#define EM_M32 1 /* AT&T WE 32100 */ -#define EM_SPARC 2 /* SUN SPARC */ -#define EM_386 3 /* Intel 80386 */ -#define EM_68K 4 /* Motorola m68k family */ -#define EM_88K 5 /* Motorola m88k family */ -#define EM_IAMCU 6 /* Intel MCU */ -#define EM_860 7 /* Intel 80860 */ -#define EM_MIPS 8 /* MIPS R3000 big-endian */ -#define EM_S370 9 /* IBM System/370 */ -#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ - /* reserved 11-14 */ -#define EM_PARISC 15 /* HPPA */ - /* reserved 16 */ -#define EM_VPP500 17 /* Fujitsu VPP500 */ -#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ -#define EM_960 19 /* Intel 80960 */ -#define EM_PPC 20 /* PowerPC */ -#define EM_PPC64 21 /* PowerPC 64-bit */ -#define EM_S390 22 /* IBM S390 */ -#define EM_SPU 23 /* IBM SPU/SPC */ - /* reserved 24-35 */ -#define EM_V800 36 /* NEC V800 series */ -#define EM_FR20 37 /* Fujitsu FR20 */ -#define EM_RH32 38 /* TRW RH-32 */ -#define EM_RCE 39 /* Motorola RCE */ -#define EM_ARM 40 /* ARM */ -#define EM_FAKE_ALPHA 41 /* Digital Alpha */ -#define EM_SH 42 /* Hitachi SH */ -#define EM_SPARCV9 43 /* SPARC v9 64-bit */ -#define EM_TRICORE 44 /* Siemens Tricore */ -#define EM_ARC 45 /* Argonaut RISC Core */ -#define EM_H8_300 46 /* Hitachi H8/300 */ -#define EM_H8_300H 47 /* Hitachi H8/300H */ -#define EM_H8S 48 /* Hitachi H8S */ -#define EM_H8_500 49 /* Hitachi H8/500 */ -#define EM_IA_64 50 /* Intel Merced */ -#define EM_MIPS_X 51 /* Stanford MIPS-X */ -#define EM_COLDFIRE 52 /* Motorola Coldfire */ -#define EM_68HC12 53 /* Motorola M68HC12 */ -#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator */ -#define EM_PCP 55 /* Siemens PCP */ -#define EM_NCPU 56 /* Sony nCPU embeeded RISC */ -#define EM_NDR1 57 /* Denso NDR1 microprocessor */ -#define EM_STARCORE 58 /* Motorola Start*Core processor */ -#define EM_ME16 59 /* Toyota ME16 processor */ -#define EM_ST100 60 /* STMicroelectronic ST100 processor */ -#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam */ -#define EM_X86_64 62 /* AMD x86-64 architecture */ -#define EM_PDSP 63 /* Sony DSP Processor */ -#define EM_PDP10 64 /* Digital PDP-10 */ -#define EM_PDP11 65 /* Digital PDP-11 */ -#define EM_FX66 66 /* Siemens FX66 microcontroller */ -#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */ -#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */ -#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */ -#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */ -#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */ -#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */ -#define EM_SVX 73 /* Silicon Graphics SVx */ -#define EM_ST19 74 /* STMicroelectronics ST19 8 bit mc */ -#define EM_VAX 75 /* Digital VAX */ -#define EM_CRIS 76 /* Axis Communications 32-bit emb.proc */ -#define EM_JAVELIN 77 /* Infineon Technologies 32-bit emb.proc */ -#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ -#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ -#define EM_MMIX 80 /* Donald Knuth's educational 64-bit proc */ -#define EM_HUANY 81 /* Harvard University machine-independent object files */ -#define EM_PRISM 82 /* SiTera Prism */ -#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ -#define EM_FR30 84 /* Fujitsu FR30 */ -#define EM_D10V 85 /* Mitsubishi D10V */ -#define EM_D30V 86 /* Mitsubishi D30V */ -#define EM_V850 87 /* NEC v850 */ -#define EM_M32R 88 /* Mitsubishi M32R */ -#define EM_MN10300 89 /* Matsushita MN10300 */ -#define EM_MN10200 90 /* Matsushita MN10200 */ -#define EM_PJ 91 /* picoJava */ -#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ -#define EM_ARC_COMPACT 93 /* ARC International ARCompact */ -#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ -#define EM_VIDEOCORE 95 /* Alphamosaic VideoCore */ -#define EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Proc */ -#define EM_NS32K 97 /* National Semi. 32000 */ -#define EM_TPC 98 /* Tenor Network TPC */ -#define EM_SNP1K 99 /* Trebia SNP 1000 */ -#define EM_ST200 100 /* STMicroelectronics ST200 */ -#define EM_IP2K 101 /* Ubicom IP2xxx */ -#define EM_MAX 102 /* MAX processor */ -#define EM_CR 103 /* National Semi. CompactRISC */ -#define EM_F2MC16 104 /* Fujitsu F2MC16 */ -#define EM_MSP430 105 /* Texas Instruments msp430 */ -#define EM_BLACKFIN 106 /* Analog Devices Blackfin DSP */ -#define EM_SE_C33 107 /* Seiko Epson S1C33 family */ -#define EM_SEP 108 /* Sharp embedded microprocessor */ -#define EM_ARCA 109 /* Arca RISC */ -#define EM_UNICORE 110 /* PKU-Unity & MPRC Peking Uni. mc series */ -#define EM_EXCESS 111 /* eXcess configurable cpu */ -#define EM_DXP 112 /* Icera Semi. Deep Execution Processor */ -#define EM_ALTERA_NIOS2 113 /* Altera Nios II */ -#define EM_CRX 114 /* National Semi. CompactRISC CRX */ -#define EM_XGATE 115 /* Motorola XGATE */ -#define EM_C166 116 /* Infineon C16x/XC16x */ -#define EM_M16C 117 /* Renesas M16C */ -#define EM_DSPIC30F 118 /* Microchip Technology dsPIC30F */ -#define EM_CE 119 /* Freescale Communication Engine RISC */ -#define EM_M32C 120 /* Renesas M32C */ - /* reserved 121-130 */ -#define EM_TSK3000 131 /* Altium TSK3000 */ -#define EM_RS08 132 /* Freescale RS08 */ -#define EM_SHARC 133 /* Analog Devices SHARC family */ -#define EM_ECOG2 134 /* Cyan Technology eCOG2 */ -#define EM_SCORE7 135 /* Sunplus S+core7 RISC */ -#define EM_DSP24 136 /* New Japan Radio (NJR) 24-bit DSP */ -#define EM_VIDEOCORE3 137 /* Broadcom VideoCore III */ -#define EM_LATTICEMICO32 138 /* RISC for Lattice FPGA */ -#define EM_SE_C17 139 /* Seiko Epson C17 */ -#define EM_TI_C6000 140 /* Texas Instruments TMS320C6000 DSP */ -#define EM_TI_C2000 141 /* Texas Instruments TMS320C2000 DSP */ -#define EM_TI_C5500 142 /* Texas Instruments TMS320C55x DSP */ -#define EM_TI_ARP32 143 /* Texas Instruments App. Specific RISC */ -#define EM_TI_PRU 144 /* Texas Instruments Prog. Realtime Unit */ - /* reserved 145-159 */ -#define EM_MMDSP_PLUS 160 /* STMicroelectronics 64bit VLIW DSP */ -#define EM_CYPRESS_M8C 161 /* Cypress M8C */ -#define EM_R32C 162 /* Renesas R32C */ -#define EM_TRIMEDIA 163 /* NXP Semi. TriMedia */ -#define EM_QDSP6 164 /* QUALCOMM DSP6 */ -#define EM_8051 165 /* Intel 8051 and variants */ -#define EM_STXP7X 166 /* STMicroelectronics STxP7x */ -#define EM_NDS32 167 /* Andes Tech. compact code emb. RISC */ -#define EM_ECOG1X 168 /* Cyan Technology eCOG1X */ -#define EM_MAXQ30 169 /* Dallas Semi. MAXQ30 mc */ -#define EM_XIMO16 170 /* New Japan Radio (NJR) 16-bit DSP */ -#define EM_MANIK 171 /* M2000 Reconfigurable RISC */ -#define EM_CRAYNV2 172 /* Cray NV2 vector architecture */ -#define EM_RX 173 /* Renesas RX */ -#define EM_METAG 174 /* Imagination Tech. META */ -#define EM_MCST_ELBRUS 175 /* MCST Elbrus */ -#define EM_ECOG16 176 /* Cyan Technology eCOG16 */ -#define EM_CR16 177 /* National Semi. CompactRISC CR16 */ -#define EM_ETPU 178 /* Freescale Extended Time Processing Unit */ -#define EM_SLE9X 179 /* Infineon Tech. SLE9X */ -#define EM_L10M 180 /* Intel L10M */ -#define EM_K10M 181 /* Intel K10M */ - /* reserved 182 */ -#define EM_AARCH64 183 /* ARM AARCH64 */ - /* reserved 184 */ -#define EM_AVR32 185 /* Amtel 32-bit microprocessor */ -#define EM_STM8 186 /* STMicroelectronics STM8 */ -#define EM_TILE64 187 /* Tileta TILE64 */ -#define EM_TILEPRO 188 /* Tilera TILEPro */ -#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */ -#define EM_CUDA 190 /* NVIDIA CUDA */ -#define EM_TILEGX 191 /* Tilera TILE-Gx */ -#define EM_CLOUDSHIELD 192 /* CloudShield */ -#define EM_COREA_1ST 193 /* KIPO-KAIST Core-A 1st gen. */ -#define EM_COREA_2ND 194 /* KIPO-KAIST Core-A 2nd gen. */ -#define EM_ARC_COMPACT2 195 /* Synopsys ARCompact V2 */ -#define EM_OPEN8 196 /* Open8 RISC */ -#define EM_RL78 197 /* Renesas RL78 */ -#define EM_VIDEOCORE5 198 /* Broadcom VideoCore V */ -#define EM_78KOR 199 /* Renesas 78KOR */ -#define EM_56800EX 200 /* Freescale 56800EX DSC */ -#define EM_BA1 201 /* Beyond BA1 */ -#define EM_BA2 202 /* Beyond BA2 */ -#define EM_XCORE 203 /* XMOS xCORE */ -#define EM_MCHP_PIC 204 /* Microchip 8-bit PIC(r) */ - /* reserved 205-209 */ -#define EM_KM32 210 /* KM211 KM32 */ -#define EM_KMX32 211 /* KM211 KMX32 */ -#define EM_EMX16 212 /* KM211 KMX16 */ -#define EM_EMX8 213 /* KM211 KMX8 */ -#define EM_KVARC 214 /* KM211 KVARC */ -#define EM_CDP 215 /* Paneve CDP */ -#define EM_COGE 216 /* Cognitive Smart Memory Processor */ -#define EM_COOL 217 /* Bluechip CoolEngine */ -#define EM_NORC 218 /* Nanoradio Optimized RISC */ -#define EM_CSR_KALIMBA 219 /* CSR Kalimba */ -#define EM_Z80 220 /* Zilog Z80 */ -#define EM_VISIUM 221 /* Controls and Data Services VISIUMcore */ -#define EM_FT32 222 /* FTDI Chip FT32 */ -#define EM_MOXIE 223 /* Moxie processor */ -#define EM_AMDGPU 224 /* AMD GPU */ - /* reserved 225-242 */ -#define EM_RISCV 243 /* RISC-V */ - -#define EM_BPF 247 /* Linux BPF -- in-kernel virtual machine */ - -#define EM_NUM 248 - -/* Old spellings/synonyms. */ - -#define EM_ARC_A5 EM_ARC_COMPACT - -/* If it is necessary to assign new unofficial EM_* values, please - pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the - chances of collision with official or non-GNU unofficial values. */ - -#define EM_ALPHA 0x9026 - -/* Legal values for e_version (version). */ - -#define EV_NONE 0 /* Invalid ELF version */ -#define EV_CURRENT 1 /* Current version */ -#define EV_NUM 2 - -#define EI_NIDENT (16) - -#define PT_NULL 0 /* Program header table entry unused */ -#define PT_LOAD 1 /* Loadable program segment */ -#define PT_DYNAMIC 2 /* Dynamic linking information */ -#define PT_INTERP 3 /* Program interpreter */ -#define PT_NOTE 4 /* Auxiliary information */ -#define PT_SHLIB 5 /* Reserved */ -#define PT_PHDR 6 /* Entry for header table itself */ -#define PT_TLS 7 /* Thread-local storage segment */ -#define PT_NUM 8 /* Number of defined types */ -#define PT_LOOS 0x60000000 /* Start of OS-specific */ -#define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */ -#define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */ -#define PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */ -#define PT_LOSUNW 0x6ffffffa -#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ -#define PT_SUNWSTACK 0x6ffffffb /* Stack segment */ -#define PT_HISUNW 0x6fffffff -#define PT_HIOS 0x6fffffff /* End of OS-specific */ -#define PT_LOPROC 0x70000000 /* Start of processor-specific */ -#define PT_HIPROC 0x7fffffff /* End of processor-specific */ - -/* Legal values for p_flags (segment flags). */ - -#define PF_X (1 << 0) /* Segment is executable */ -#define PF_W (1 << 1) /* Segment is writable */ -#define PF_R (1 << 2) /* Segment is readable */ -#define PF_MASKOS 0x0ff00000 /* OS-specific */ -#define PF_MASKPROC 0xf0000000 /* Processor-specific */ - -/* Legal values for note segment descriptor types for core files. */ - -#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ -#define NT_PRFPREG 2 /* Contains copy of fpregset - struct. */ -#define NT_FPREGSET 2 /* Contains copy of fpregset struct */ -#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ -#define NT_PRXREG 4 /* Contains copy of prxregset struct */ -#define NT_TASKSTRUCT 4 /* Contains copy of task structure */ -#define NT_PLATFORM 5 /* String from sysinfo(SI_PLATFORM) */ -#define NT_AUXV 6 /* Contains copy of auxv array */ -#define NT_GWINDOWS 7 /* Contains copy of gwindows struct */ -#define NT_ASRS 8 /* Contains copy of asrset struct */ -#define NT_PSTATUS 10 /* Contains copy of pstatus struct */ -#define NT_PSINFO 13 /* Contains copy of psinfo struct */ -#define NT_PRCRED 14 /* Contains copy of prcred struct */ -#define NT_UTSNAME 15 /* Contains copy of utsname struct */ -#define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */ -#define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */ -#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct */ -#define NT_SIGINFO 0x53494749 /* Contains copy of siginfo_t, - size might increase */ -#define NT_FILE 0x46494c45 /* Contains information about mapped - files */ -#define NT_PRXFPREG 0x46e62b7f /* Contains copy of user_fxsr_struct */ -#define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */ -#define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */ -#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ -#define NT_PPC_TAR 0x103 /* Target Address Register */ -#define NT_PPC_PPR 0x104 /* Program Priority Register */ -#define NT_PPC_DSCR 0x105 /* Data Stream Control Register */ -#define NT_PPC_EBB 0x106 /* Event Based Branch Registers */ -#define NT_PPC_PMU 0x107 /* Performance Monitor Registers */ -#define NT_PPC_TM_CGPR 0x108 /* TM checkpointed GPR Registers */ -#define NT_PPC_TM_CFPR 0x109 /* TM checkpointed FPR Registers */ -#define NT_PPC_TM_CVMX 0x10a /* TM checkpointed VMX Registers */ -#define NT_PPC_TM_CVSX 0x10b /* TM checkpointed VSX Registers */ -#define NT_PPC_TM_SPR 0x10c /* TM Special Purpose Registers */ -#define NT_PPC_TM_CTAR 0x10d /* TM checkpointed Target Address - Register */ -#define NT_PPC_TM_CPPR 0x10e /* TM checkpointed Program Priority - Register */ -#define NT_PPC_TM_CDSCR 0x10f /* TM checkpointed Data Stream Control - Register */ -#define NT_PPC_PKEY 0x110 /* Memory Protection Keys - registers. */ -#define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */ -#define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */ -#define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */ -#define NT_S390_HIGH_GPRS 0x300 /* s390 upper register halves */ -#define NT_S390_TIMER 0x301 /* s390 timer register */ -#define NT_S390_TODCMP 0x302 /* s390 TOD clock comparator register */ -#define NT_S390_TODPREG 0x303 /* s390 TOD programmable register */ -#define NT_S390_CTRS 0x304 /* s390 control registers */ -#define NT_S390_PREFIX 0x305 /* s390 prefix register */ -#define NT_S390_LAST_BREAK 0x306 /* s390 breaking event address */ -#define NT_S390_SYSTEM_CALL 0x307 /* s390 system call restart data */ -#define NT_S390_TDB 0x308 /* s390 transaction diagnostic block */ -#define NT_S390_VXRS_LOW 0x309 /* s390 vector registers 0-15 - upper half. */ -#define NT_S390_VXRS_HIGH 0x30a /* s390 vector registers 16-31. */ -#define NT_S390_GS_CB 0x30b /* s390 guarded storage registers. */ -#define NT_S390_GS_BC 0x30c /* s390 guarded storage - broadcast control block. */ -#define NT_S390_RI_CB 0x30d /* s390 runtime instrumentation. */ -#define NT_ARM_VFP 0x400 /* ARM VFP/NEON registers */ -#define NT_ARM_TLS 0x401 /* ARM TLS register */ -#define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */ -#define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */ -#define NT_ARM_SYSTEM_CALL 0x404 /* ARM system call number */ -#define NT_ARM_SVE 0x405 /* ARM Scalable Vector Extension - registers */ -#define NT_VMCOREDD 0x700 /* Vmcore Device Dump Note. */ - -/* Legal values for the note segment descriptor types for object files. */ - -#define NT_VERSION 1 /* Contains a version string. */ - -typedef struct -{ - unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ - Elf64_Half e_type; /* Object file type */ - Elf64_Half e_machine; /* Architecture */ - Elf64_Word e_version; /* Object file version */ - Elf64_Addr e_entry; /* Entry point virtual address */ - Elf64_Off e_phoff; /* Program header table file offset */ - Elf64_Off e_shoff; /* Section header table file offset */ - Elf64_Word e_flags; /* Processor-specific flags */ - Elf64_Half e_ehsize; /* ELF header size in bytes */ - Elf64_Half e_phentsize; /* Program header table entry size */ - Elf64_Half e_phnum; /* Program header table entry count */ - Elf64_Half e_shentsize; /* Section header table entry size */ - Elf64_Half e_shnum; /* Section header table entry count */ - Elf64_Half e_shstrndx; /* Section header string table index */ -} Elf64_Ehdr; - -typedef struct -{ - Elf64_Word p_type; /* Segment type */ - Elf64_Word p_flags; /* Segment flags */ - Elf64_Off p_offset; /* Segment file offset */ - Elf64_Addr p_vaddr; /* Segment virtual address */ - Elf64_Addr p_paddr; /* Segment physical address */ - Elf64_Xword p_filesz; /* Segment size in file */ - Elf64_Xword p_memsz; /* Segment size in memory */ - Elf64_Xword p_align; /* Segment alignment */ -} Elf64_Phdr; - -typedef struct { - Elf64_Addr r_offset; /* Location at which to apply the action */ - Elf64_Xword r_info; /* index and type of relocation */ -} Elf64_Rel; - -typedef struct { - Elf64_Word sh_name; /* Section name, index in string tbl */ - Elf64_Word sh_type; /* Type of section */ - Elf64_Xword sh_flags; /* Miscellaneous section attributes */ - Elf64_Addr sh_addr; /* Section virtual addr at execution */ - Elf64_Off sh_offset; /* Section file offset */ - Elf64_Xword sh_size; /* Size of section in bytes */ - Elf64_Word sh_link; /* Index of another section */ - Elf64_Word sh_info; /* Additional section information */ - Elf64_Xword sh_addralign; /* Section alignment */ - Elf64_Xword sh_entsize; /* Entry size if section holds table */ -} Elf64_Shdr; - -#endif /* _SYS_ELF_H_ */ diff --git a/sys/include/sys/errno.h b/sys/include/sys/errno.h deleted file mode 100644 index a93cf18..0000000 --- a/sys/include/sys/errno.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_ERRNO_H_ -#define _SYS_ERRNO_H_ - -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 - -#define EPERM 1 /* Not super-user */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -#define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* I/O error */ -#define ENXIO 6 /* No such device or address */ -#define E2BIG 7 /* Arg list too long */ -#define ENOEXEC 8 /* Exec format error */ -#define EBADF 9 /* Bad file number */ -#define ECHILD 10 /* No children */ -#define EAGAIN 11 /* No more processes */ -#define ENOMEM 12 /* Not enough core */ -#define EACCES 13 /* Permission denied */ -#define EFAULT 14 /* Bad address */ -#define ENOTBLK 15 /* Block device required */ -#define EBUSY 16 /* Mount device busy */ -#define EEXIST 17 /* File exists */ -#define EXDEV 18 /* Cross-device link */ -#define ENODEV 19 /* No such device */ -#define ENOTDIR 20 /* Not a directory */ -#define EISDIR 21 /* Is a directory */ -#define EINVAL 22 /* Invalid argument */ -#define ENFILE 23 /* Too many open files in system */ -#define EMFILE 24 /* Too many open files */ -#define ENOTTY 25 /* Not a typewriter */ -#define ETXTBSY 26 /* Text file busy */ -#define EFBIG 27 /* File too large */ -#define ENOSPC 28 /* No space left on device */ -#define ESPIPE 29 /* Illegal seek */ -#define EROFS 30 /* Read only file system */ -#define EMLINK 31 /* Too many links */ -#define EPIPE 32 /* Broken pipe */ -#define EDOM 33 /* Math arg out of domain of func */ -#define ERANGE 34 /* Math result not representable */ -#define ENOMSG 35 /* No message of desired type */ -#define EIDRM 36 /* Identifier removed */ -#define ECHRNG 37 /* Channel number out of range */ -#define EL2NSYNC 38 /* Level 2 not synchronized */ -#define EL3HLT 39 /* Level 3 halted */ -#define EL3RST 40 /* Level 3 reset */ -#define ELNRNG 41 /* Link number out of range */ -#define EUNATCH 42 /* Protocol driver not attached */ -#define ENOCSI 43 /* No CSI structure available */ -#define EL2HLT 44 /* Level 2 halted */ -#define EDEADLK 45 /* Deadlock condition */ -#define ENOLCK 46 /* No record locks available */ -#define EBADE 50 /* Invalid exchange */ -#define EBADR 51 /* Invalid request descriptor */ -#define EXFULL 52 /* Exchange full */ -#define ENOANO 53 /* No anode */ -#define EBADRQC 54 /* Invalid request code */ -#define EBADSLT 55 /* Invalid slot */ -#define EDEADLOCK 56 /* File locking deadlock error */ -#define EBFONT 57 /* Bad font file fmt */ -#define ENOSTR 60 /* Device not a stream */ -#define ENODATA 61 /* No data (for no delay io) */ -#define ETIME 62 /* Timer expired */ -#define ENOSR 63 /* Out of streams resources */ -#define ENONET 64 /* Machine is not on the network */ -#define ENOPKG 65 /* Package not installed */ -#define EREMOTE 66 /* The object is remote */ -#define ENOLINK 67 /* The link has been severed */ -#define EADV 68 /* Advertise error */ -#define ESRMNT 69 /* Srmount error */ -#define ECOMM 70 /* Communication error on send */ -#define EPROTO 71 /* Protocol error */ -#define EMULTIHOP 74 /* Multihop attempted */ -#define ELBIN 75 /* Inode is remote (not really error) */ -#define EDOTDOT 76 /* Cross mount point (not really error) */ -#define EBADMSG 77 /* Trying to read unreadable message */ -#define EFTYPE 79 /* Inappropriate file type or format */ -#define ENOTUNIQ 80 /* Given log. name not unique */ -#define EBADFD 81 /* f.d. invalid for this operation */ -#define EREMCHG 82 /* Remote address changed */ -#define ELIBACC 83 /* Can't access a needed shared lib */ -#define ELIBBAD 84 /* Accessing a corrupted shared lib */ -#define ELIBSCN 85 /* .lib section in a.out corrupted */ -#define ELIBMAX 86 /* Attempting to link in too many libs */ -#define ELIBEXEC 87 /* Attempting to exec a shared library */ -#define ENOSYS 88 /* Function not implemented */ -#define ENMFILE 89 /* No more files */ -#define ENOTEMPTY 90 /* Directory not empty */ -#define ENAMETOOLONG 91 /* File or path name too long */ -#define ELOOP 92 /* Too many symbolic links */ -#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ -#define EPFNOSUPPORT 96 /* Protocol family not supported */ -#define ECONNRESET 104 /* Connection reset by peer */ -#define ENOBUFS 105 /* No buffer space available */ -#define EAFNOSUPPORT 106 /* Address family not supported by protocol family */ -#define EPROTOTYPE 107 /* Protocol wrong type for socket */ -#define ENOTSOCK 108 /* Socket operation on non-socket */ -#define ENOPROTOOPT 109 /* Protocol not available */ -#define ESHUTDOWN 110 /* Can't send after socket shutdown */ -#define ECONNREFUSED 111 /* Connection refused */ -#define EADDRINUSE 112 /* Address already in use */ -#define ECONNABORTED 113 /* Connection aborted */ -#define ENETUNREACH 114 /* Network is unreachable */ -#define ENETDOWN 115 /* Network interface is not configured */ -#define ETIMEDOUT 116 /* Connection timed out */ -#define EHOSTDOWN 117 /* Host is down */ -#define EHOSTUNREACH 118 /* Host is unreachable */ -#define EINPROGRESS 119 /* Connection already in progress */ -#define EALREADY 120 /* Socket already connected */ -#define EDESTADDRREQ 121 /* Destination address required */ -#define EMSGSIZE 122 /* Message too long */ -#define EPROTONOSUPPORT 123 /* Unknown protocol */ -#define ESOCKTNOSUPPORT 124 /* Socket type not supported */ -#define EADDRNOTAVAIL 125 /* Address not available */ -#define ENETRESET 126 -#define EISCONN 127 /* Socket is already connected */ -#define ENOTCONN 128 /* Socket is not connected */ -#define ETOOMANYREFS 129 -#define EPROCLIM 130 -#define EUSERS 131 -#define EDQUOT 132 -#define ESTALE 133 -#define ENOTSUP 134 /* Not supported */ -#define ENOMEDIUM 135 /* No medium (in tape drive) */ -#define ENOSHARE 136 /* No such host or network path */ -#define ECASECLASH 137 /* Filename exists with different case */ -#define EILSEQ 138 -#define EOVERFLOW 139 /* Value too large for defined data type */ - -#endif diff --git a/sys/include/sys/exec.h b/sys/include/sys/exec.h deleted file mode 100644 index 5832a3f..0000000 --- a/sys/include/sys/exec.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_EXEC_H_ -#define _SYS_EXEC_H_ - -#include - -uint64_t sys_execv(struct syscall_args *args); - -#endif diff --git a/sys/include/sys/fbdev.h b/sys/include/sys/fbdev.h deleted file mode 100644 index 7308a92..0000000 --- a/sys/include/sys/fbdev.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_FBDEV_H_ -#define _SYS_FBDEV_H_ - -#if defined(_KERNEL) -#include -#else -#include -#endif - -#define FBIOCTL_INFO 0x00000000 - -struct fbdev_info { - uint32_t width; - uint32_t height; - uint32_t pitch; - uint32_t bits_per_pixel; -}; - -#endif diff --git a/sys/include/sys/filedesc.h b/sys/include/sys/filedesc.h deleted file mode 100644 index f2c2778..0000000 --- a/sys/include/sys/filedesc.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_FILEDESC_H_ -#define _SYS_FILEDESC_H_ - -#include -#include -#include -#include - -#define O_RDONLY 0x00000 -#define O_WRONLY 0x00001 -#define O_RDWR 0x00002 - -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 - -struct proc; - -struct filedesc { - int fdno; - int oflag; - off_t offset; - bool is_dir; - struct vnode *vnode; - struct mutex lock; -}; - -#if defined(_KERNEL) -int fd_alloc(struct proc *td, struct filedesc **fd_out); -struct filedesc *fd_from_fdnum(const struct proc *td, int fdno); -void fd_close_fdnum(struct proc *td, int fdno); -ssize_t write(int fd, const void *buf, size_t count); -int open(const char *pathname, int oflag); -int read(int fd, void *buf, size_t count); -off_t lseek(int fd, off_t offset, int whence); - -uint64_t sys_write(struct syscall_args *args); -uint64_t sys_open(struct syscall_args *args); -uint64_t sys_close(struct syscall_args *args); -uint64_t sys_read(struct syscall_args *args); -uint64_t sys_lseek(struct syscall_args *args); -#endif -#endif diff --git a/sys/include/sys/intr.h b/sys/include/sys/intr.h deleted file mode 100644 index 0590f87..0000000 --- a/sys/include/sys/intr.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_INTR_H_ -#define _SYS_INTR_H_ - -#if defined(_KERNEL) -#include -#include -#include - -/* - * Interrupt information - */ -struct intr_info { - struct spinlock lock; - const char *source; - const char *device; - uint8_t affinity; - size_t count; /* Interrupt count */ - TAILQ_ENTRY(intr_info) link; -}; - -struct intr_info *intr_info_alloc(const char *source, const char *dev); -void intr_register(struct intr_info *info); -void intr_init_proc(void); - -#endif /* defined(_KERNEL) */ -#endif /* !_SYS_INTR_H_ */ diff --git a/sys/include/sys/ksyms.h b/sys/include/sys/ksyms.h deleted file mode 100644 index 2862cbc..0000000 --- a/sys/include/sys/ksyms.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_KSYMS_H_ -#define _SYS_KSYMS_H_ - -#include - -#if defined(_KERNEL) -struct kernel_symbol { - uint64_t addr; - char* name; -}; - -__weak extern struct kernel_symbol g_ksym_table[]; - -#endif /* defined(_KERNEL) */ -#endif diff --git a/sys/include/sys/limine.h b/sys/include/sys/limine.h deleted file mode 100644 index f26d8c5..0000000 --- a/sys/include/sys/limine.h +++ /dev/null @@ -1,495 +0,0 @@ -/* BSD Zero Clause License */ - -/* Copyright (C) 2022-2023 mintsuki and contributors. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef _LIMINE_H -#define _LIMINE_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* Misc */ - -#ifdef LIMINE_NO_POINTERS -# define LIMINE_PTR(TYPE) uint64_t -#else -# define LIMINE_PTR(TYPE) TYPE -#endif - -#ifdef __GNUC__ -# define LIMINE_DEPRECATED __attribute__((__deprecated__)) -# define LIMINE_DEPRECATED_IGNORE_START \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") -# define LIMINE_DEPRECATED_IGNORE_END \ - _Pragma("GCC diagnostic pop") -#else -# define LIMINE_DEPRECATED -# define LIMINE_DEPRECATED_IGNORE_START -# define LIMINE_DEPRECATED_IGNORE_END -#endif - -#define LIMINE_COMMON_MAGIC 0xc7b1dd30df4c8b88, 0x0a82e883a194f07b - -struct limine_uuid { - uint32_t a; - uint16_t b; - uint16_t c; - uint8_t d[8]; -}; - -#define LIMINE_MEDIA_TYPE_GENERIC 0 -#define LIMINE_MEDIA_TYPE_OPTICAL 1 -#define LIMINE_MEDIA_TYPE_TFTP 2 - -struct limine_file { - uint64_t revision; - LIMINE_PTR(void *) address; - uint64_t size; - LIMINE_PTR(char *) path; - LIMINE_PTR(char *) cmdline; - uint32_t media_type; - uint32_t unused; - uint32_t tftp_ip; - uint32_t tftp_port; - uint32_t partition_index; - uint32_t mbr_disk_id; - struct limine_uuid gpt_disk_uuid; - struct limine_uuid gpt_part_uuid; - struct limine_uuid part_uuid; -}; - -/* Boot info */ - -#define LIMINE_BOOTLOADER_INFO_REQUEST { LIMINE_COMMON_MAGIC, 0xf55038d8e2a1202f, 0x279426fcf5f59740 } - -struct limine_bootloader_info_response { - uint64_t revision; - LIMINE_PTR(char *) name; - LIMINE_PTR(char *) version; -}; - -struct limine_bootloader_info_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_bootloader_info_response *) response; -}; - -/* Stack size */ - -#define LIMINE_STACK_SIZE_REQUEST { LIMINE_COMMON_MAGIC, 0x224ef0460a8e8926, 0xe1cb0fc25f46ea3d } - -struct limine_stack_size_response { - uint64_t revision; -}; - -struct limine_stack_size_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_stack_size_response *) response; - uint64_t stack_size; -}; - -/* HHDM */ - -#define LIMINE_HHDM_REQUEST { LIMINE_COMMON_MAGIC, 0x48dcf1cb8ad2b852, 0x63984e959a98244b } - -struct limine_hhdm_response { - uint64_t revision; - uint64_t offset; -}; - -struct limine_hhdm_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_hhdm_response *) response; -}; - -/* Framebuffer */ - -#define LIMINE_FRAMEBUFFER_REQUEST { LIMINE_COMMON_MAGIC, 0x9d5827dcd881dd75, 0xa3148604f6fab11b } - -#define LIMINE_FRAMEBUFFER_RGB 1 - -struct limine_video_mode { - uint64_t pitch; - uint64_t width; - uint64_t height; - uint16_t bpp; - uint8_t memory_model; - uint8_t red_mask_size; - uint8_t red_mask_shift; - uint8_t green_mask_size; - uint8_t green_mask_shift; - uint8_t blue_mask_size; - uint8_t blue_mask_shift; -}; - -struct limine_framebuffer { - LIMINE_PTR(void *) address; - uint64_t width; - uint64_t height; - uint64_t pitch; - uint16_t bpp; - uint8_t memory_model; - uint8_t red_mask_size; - uint8_t red_mask_shift; - uint8_t green_mask_size; - uint8_t green_mask_shift; - uint8_t blue_mask_size; - uint8_t blue_mask_shift; - uint8_t unused[7]; - uint64_t edid_size; - LIMINE_PTR(void *) edid; - /* Response revision 1 */ - uint64_t mode_count; - LIMINE_PTR(struct limine_video_mode **) modes; -}; - -struct limine_framebuffer_response { - uint64_t revision; - uint64_t framebuffer_count; - LIMINE_PTR(struct limine_framebuffer **) framebuffers; -}; - -struct limine_framebuffer_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_framebuffer_response *) response; -}; - -/* Terminal */ - -#define LIMINE_TERMINAL_REQUEST { LIMINE_COMMON_MAGIC, 0xc8ac59310c2b0844, 0xa68d0c7265d38878 } - -#define LIMINE_TERMINAL_CB_DEC 10 -#define LIMINE_TERMINAL_CB_BELL 20 -#define LIMINE_TERMINAL_CB_PRIVATE_ID 30 -#define LIMINE_TERMINAL_CB_STATUS_REPORT 40 -#define LIMINE_TERMINAL_CB_POS_REPORT 50 -#define LIMINE_TERMINAL_CB_KBD_LEDS 60 -#define LIMINE_TERMINAL_CB_MODE 70 -#define LIMINE_TERMINAL_CB_LINUX 80 - -#define LIMINE_TERMINAL_CTX_SIZE ((uint64_t)(-1)) -#define LIMINE_TERMINAL_CTX_SAVE ((uint64_t)(-2)) -#define LIMINE_TERMINAL_CTX_RESTORE ((uint64_t)(-3)) -#define LIMINE_TERMINAL_FULL_REFRESH ((uint64_t)(-4)) - -/* Response revision 1 */ -#define LIMINE_TERMINAL_OOB_OUTPUT_GET ((uint64_t)(-10)) -#define LIMINE_TERMINAL_OOB_OUTPUT_SET ((uint64_t)(-11)) - -#define LIMINE_TERMINAL_OOB_OUTPUT_OCRNL (1 << 0) -#define LIMINE_TERMINAL_OOB_OUTPUT_OFDEL (1 << 1) -#define LIMINE_TERMINAL_OOB_OUTPUT_OFILL (1 << 2) -#define LIMINE_TERMINAL_OOB_OUTPUT_OLCUC (1 << 3) -#define LIMINE_TERMINAL_OOB_OUTPUT_ONLCR (1 << 4) -#define LIMINE_TERMINAL_OOB_OUTPUT_ONLRET (1 << 5) -#define LIMINE_TERMINAL_OOB_OUTPUT_ONOCR (1 << 6) -#define LIMINE_TERMINAL_OOB_OUTPUT_OPOST (1 << 7) - -LIMINE_DEPRECATED_IGNORE_START - -struct LIMINE_DEPRECATED limine_terminal; - -typedef void (*limine_terminal_write)(struct limine_terminal *, const char *, uint64_t); -typedef void (*limine_terminal_callback)(struct limine_terminal *, uint64_t, uint64_t, uint64_t, uint64_t); - -struct LIMINE_DEPRECATED limine_terminal { - uint64_t columns; - uint64_t rows; - LIMINE_PTR(struct limine_framebuffer *) framebuffer; -}; - -struct LIMINE_DEPRECATED limine_terminal_response { - uint64_t revision; - uint64_t terminal_count; - LIMINE_PTR(struct limine_terminal **) terminals; - LIMINE_PTR(limine_terminal_write) write; -}; - -struct LIMINE_DEPRECATED limine_terminal_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_terminal_response *) response; - LIMINE_PTR(limine_terminal_callback) callback; -}; - -LIMINE_DEPRECATED_IGNORE_END - -/* 5-level paging */ - -#define LIMINE_5_LEVEL_PAGING_REQUEST { LIMINE_COMMON_MAGIC, 0x94469551da9b3192, 0xebe5e86db7382888 } - -struct limine_5_level_paging_response { - uint64_t revision; -}; - -struct limine_5_level_paging_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_5_level_paging_response *) response; -}; - -/* SMP */ - -#define LIMINE_SMP_REQUEST { LIMINE_COMMON_MAGIC, 0x95a67b819a1b857e, 0xa0b61b723b6a73e0 } - -struct limine_smp_info; - -typedef void (*limine_goto_address)(struct limine_smp_info *); - -#if defined (__x86_64__) || defined (__i386__) - -#define LIMINE_SMP_X2APIC (1 << 0) - -struct limine_smp_info { - uint32_t processor_id; - uint32_t lapic_id; - uint64_t reserved; - LIMINE_PTR(limine_goto_address) goto_address; - uint64_t extra_argument; -}; - -struct limine_smp_response { - uint64_t revision; - uint32_t flags; - uint32_t bsp_lapic_id; - uint64_t cpu_count; - LIMINE_PTR(struct limine_smp_info **) cpus; -}; - -#elif defined (__aarch64__) - -struct limine_smp_info { - uint32_t processor_id; - uint32_t gic_iface_no; - uint64_t mpidr; - uint64_t reserved; - LIMINE_PTR(limine_goto_address) goto_address; - uint64_t extra_argument; -}; - -struct limine_smp_response { - uint64_t revision; - uint32_t flags; - uint64_t bsp_mpidr; - uint64_t cpu_count; - LIMINE_PTR(struct limine_smp_info **) cpus; -}; - -#else -#error Unknown architecture -#endif - -struct limine_smp_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_smp_response *) response; - uint64_t flags; -}; - -/* Memory map */ - -#define LIMINE_MEMMAP_REQUEST { LIMINE_COMMON_MAGIC, 0x67cf3d9d378a806f, 0xe304acdfc50c3c62 } - -#define LIMINE_MEMMAP_USABLE 0 -#define LIMINE_MEMMAP_RESERVED 1 -#define LIMINE_MEMMAP_ACPI_RECLAIMABLE 2 -#define LIMINE_MEMMAP_ACPI_NVS 3 -#define LIMINE_MEMMAP_BAD_MEMORY 4 -#define LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE 5 -#define LIMINE_MEMMAP_KERNEL_AND_MODULES 6 -#define LIMINE_MEMMAP_FRAMEBUFFER 7 - -struct limine_memmap_entry { - uint64_t base; - uint64_t length; - uint64_t type; -}; - -struct limine_memmap_response { - uint64_t revision; - uint64_t entry_count; - LIMINE_PTR(struct limine_memmap_entry **) entries; -}; - -struct limine_memmap_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_memmap_response *) response; -}; - -/* Entry point */ - -#define LIMINE_ENTRY_POINT_REQUEST { LIMINE_COMMON_MAGIC, 0x13d86c035a1cd3e1, 0x2b0caa89d8f3026a } - -typedef void (*limine_entry_point)(void); - -struct limine_entry_point_response { - uint64_t revision; -}; - -struct limine_entry_point_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_entry_point_response *) response; - LIMINE_PTR(limine_entry_point) entry; -}; - -/* Kernel File */ - -#define LIMINE_KERNEL_FILE_REQUEST { LIMINE_COMMON_MAGIC, 0xad97e90e83f1ed67, 0x31eb5d1c5ff23b69 } - -struct limine_kernel_file_response { - uint64_t revision; - LIMINE_PTR(struct limine_file *) kernel_file; -}; - -struct limine_kernel_file_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_kernel_file_response *) response; -}; - -/* Module */ - -#define LIMINE_MODULE_REQUEST { LIMINE_COMMON_MAGIC, 0x3e7e279702be32af, 0xca1c4f3bd1280cee } - -#define LIMINE_INTERNAL_MODULE_REQUIRED (1 << 0) - -struct limine_internal_module { - LIMINE_PTR(const char *) path; - LIMINE_PTR(const char *) cmdline; - uint64_t flags; -}; - -struct limine_module_response { - uint64_t revision; - uint64_t module_count; - LIMINE_PTR(struct limine_file **) modules; -}; - -struct limine_module_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_module_response *) response; - - /* Request revision 1 */ - uint64_t internal_module_count; - LIMINE_PTR(struct limine_internal_module **) internal_modules; -}; - -/* RSDP */ - -#define LIMINE_RSDP_REQUEST { LIMINE_COMMON_MAGIC, 0xc5e77b6b397e7b43, 0x27637845accdcf3c } - -struct limine_rsdp_response { - uint64_t revision; - LIMINE_PTR(void *) address; -}; - -struct limine_rsdp_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_rsdp_response *) response; -}; - -/* SMBIOS */ - -#define LIMINE_SMBIOS_REQUEST { LIMINE_COMMON_MAGIC, 0x9e9046f11e095391, 0xaa4a520fefbde5ee } - -struct limine_smbios_response { - uint64_t revision; - LIMINE_PTR(void *) entry_32; - LIMINE_PTR(void *) entry_64; -}; - -struct limine_smbios_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_smbios_response *) response; -}; - -/* EFI system table */ - -#define LIMINE_EFI_SYSTEM_TABLE_REQUEST { LIMINE_COMMON_MAGIC, 0x5ceba5163eaaf6d6, 0x0a6981610cf65fcc } - -struct limine_efi_system_table_response { - uint64_t revision; - LIMINE_PTR(void *) address; -}; - -struct limine_efi_system_table_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_efi_system_table_response *) response; -}; - -/* Boot time */ - -#define LIMINE_BOOT_TIME_REQUEST { LIMINE_COMMON_MAGIC, 0x502746e184c088aa, 0xfbc5ec83e6327893 } - -struct limine_boot_time_response { - uint64_t revision; - int64_t boot_time; -}; - -struct limine_boot_time_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_boot_time_response *) response; -}; - -/* Kernel address */ - -#define LIMINE_KERNEL_ADDRESS_REQUEST { LIMINE_COMMON_MAGIC, 0x71ba76863cc55f63, 0xb2644a48c516a487 } - -struct limine_kernel_address_response { - uint64_t revision; - uint64_t physical_base; - uint64_t virtual_base; -}; - -struct limine_kernel_address_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_kernel_address_response *) response; -}; - -/* Device Tree Blob */ - -#define LIMINE_DTB_REQUEST { LIMINE_COMMON_MAGIC, 0xb40ddb48fb54bac7, 0x545081493f81ffb7 } - -struct limine_dtb_response { - uint64_t revision; - LIMINE_PTR(void *) dtb_ptr; -}; - -struct limine_dtb_request { - uint64_t id[4]; - uint64_t revision; - LIMINE_PTR(struct limine_dtb_response *) response; -}; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sys/include/sys/loader.h b/sys/include/sys/loader.h deleted file mode 100644 index 43ad36e..0000000 --- a/sys/include/sys/loader.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_LOADER_H_ -#define _SYS_LOADER_H_ - -#include -#include -#include - -/* DANGER!: DO NOT CHANGE THESE DEFINES */ -#define AT_NULL 0 -#define AT_ENTRY 1 -#define AT_PHDR 2 -#define AT_PHENT 3 -#define AT_PHNUM 4 -#define AT_EXECPATH 5 -#define AT_SECURE 6 -#define AT_RANDOM 7 -#define AT_EXECFN 8 -#define AT_PAGESIZE 9 - -#define STACK_PUSH(ptr, val) *(--ptr) = val -#define AUXVAL(ptr, tag, val) __extension__ ({ \ - STACK_PUSH(ptr, val); \ - STACK_PUSH(ptr, tag); \ -}); - -/* Auxiliary Vector */ -struct auxval { - uint64_t at_entry; - uint64_t at_phdr; - uint64_t at_phent; - uint64_t at_phnum; -}; - -struct exec_args { - char **argp, **envp; - struct auxval auxv; - struct vas vas; -}; - -#if defined(_KERNEL) - -uintptr_t loader_init_stack(void *stack_top, struct exec_args args); -int loader_unload(struct vas vas, struct vm_range *exec_range); -int loader_load(struct vas vas, const void *dataptr, struct auxval *auxv, - size_t load_base, char **ld_path, struct vm_range *prog_range); - -#endif /* defined(_KERNEL) */ -#endif /* !_SYS_LOADER_H_ */ diff --git a/sys/include/sys/machdep.h b/sys/include/sys/machdep.h deleted file mode 100644 index 0ecb83e..0000000 --- a/sys/include/sys/machdep.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_MACHDEP_H_ -#define _SYS_MACHDEP_H_ - -#include -#include -#include - -#if defined(_KERNEL) - -#define MAXCPUS 32 - -int processor_init_pcb(struct proc *proc); -int processor_free_pcb(struct proc *proc); -void processor_switch_to(struct proc *old_td, struct proc *new_td); -void processor_init(void); -void processor_halt(void); -void intr_mask(void); -void intr_unmask(void); -void machine_panic(void); -__weak void chips_init(void); -__weak void pre_init(void); -__weak void serial_dbgch(char c); -__weak void cpu_halt_others(void); -__weak void cpu_reset(void); - -#endif /* defined(_KERNEL) */ -#endif /* !_SYS_MACHDEP_H_ */ diff --git a/sys/include/sys/mmio.h b/sys/include/sys/mmio.h deleted file mode 100644 index 69d8fd2..0000000 --- a/sys/include/sys/mmio.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2023-2024 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. - */ - -/* - * For documentation: See mmio(9) - */ - -#ifndef _SYS_MMIO_H_ -#define _SYS_MMIO_H_ - -#include -#include -#include - -/* - * mmio_write - Writes to MMIO address with specific size - * - * @addr: Address to write to. - * @val: Value to write. - * - * These functions will add the higher half - * offset (VM_HIGHER_HALF) if the MMIO address - * is less than VM_HIGHER_HALF as it'll be safe - * to assume it's a physical address. Page faults - * from writes could be due to the resulting virtual - * address not being mapped. - */ -#define _MMIO_WRITE_TYPE(TYPE, SUFFIX) \ - static inline void \ - mmio_write##SUFFIX(volatile void *addr, TYPE val) \ - { \ - uintptr_t tmp; \ - \ - tmp = (uintptr_t)addr; \ - if (tmp < VM_HIGHER_HALF) { \ - tmp += VM_HIGHER_HALF; \ - } \ - *(volatile TYPE *)tmp = val; \ - __mem_barrier(); \ - } - -/* - * mmio_read - Does the same as mmio_write but for reading - * - * @addr: Address to read from. - */ -#define _MMIO_READ_TYPE(TYPE, SUFFIX) \ - static inline TYPE \ - mmio_read##SUFFIX(volatile void *addr) \ - { \ - uintptr_t tmp; \ - \ - tmp = (uintptr_t)addr; \ - if (tmp < VM_HIGHER_HALF) { \ - tmp += VM_HIGHER_HALF; \ - } \ - \ - __mem_barrier(); /* Ensure writes complete */ \ - return *(volatile TYPE *)tmp; \ - } - -/* - * To write to an MMIO address of, for example, - * 8 bits, use mmio_write8(addr, val) - */ -_MMIO_WRITE_TYPE(uint8_t, 8) -_MMIO_WRITE_TYPE(uint16_t, 16) -_MMIO_WRITE_TYPE(uint32_t, 32) -#if __SIZEOF_SIZE_T__ == 8 -_MMIO_WRITE_TYPE(uint64_t, 64) -#endif -__extension__ - -/* - * To read from an MMIO address of, for example, - * 8 bits, use mmio_read8(addr) - */ -_MMIO_READ_TYPE(uint8_t, 8) -_MMIO_READ_TYPE(uint16_t, 16) -_MMIO_READ_TYPE(uint32_t, 32) -#if __SIZEOF_SIZE_T__ == 8 -_MMIO_READ_TYPE(uint64_t, 64) -#endif -__extension__ - -#endif /* !_SYS_MMIO_H_ */ diff --git a/sys/include/sys/mount.h b/sys/include/sys/mount.h deleted file mode 100644 index b208bf7..0000000 --- a/sys/include/sys/mount.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_MOUNT_H_ -#define _SYS_MOUNT_H_ - -#include -#include -#include -#include - -#define FS_NAME_MAX 16 /* Max length of FS type name including nul */ - -struct fs_info; -struct mount; -struct vnode; - -struct vfsops { - int(*init)(struct fs_info *info, struct vnode *source); -}; - -struct mount { - int flags; - size_t phash; /* Path hash */ - struct fs_info *fs; - TAILQ_ENTRY(mount) link; -}; - -struct fs_info { - char name[FS_NAME_MAX]; /* Filesystem type name */ - struct vfsops *vfsops; /* Filesystem operations */ - struct vops *vops; /* Vops for our vnode */ - struct vnode *vnode; /* Vnode for this filesystem */ - struct mount *mp_root; - uint16_t caps; -}; - -/* - * Filesystem capabilities - */ -#define FSCAP_FULLPATH __BIT(0) /* Requires full path per lookup */ - -/* - * Mount flags - */ -#define MNT_RDONLY 0x00000001 - -#if defined(_KERNEL) -int vfs_mount(const char *path, int mntflags, struct fs_info *fs); -int vfs_get_mp(const char *path, struct mount **mp); -void vfs_mount_init(void); -#endif /* defined(_KERNEL) */ - -#endif /* !_SYS_MOUNT_H_ */ diff --git a/sys/include/sys/mutex.h b/sys/include/sys/mutex.h deleted file mode 100644 index dfd2dec..0000000 --- a/sys/include/sys/mutex.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -#ifndef _SYS_MUTEX_H_ -#define _SYS_MUTEX_H_ - -struct mutex { - volatile _Atomic bool lock; -}; - -void mutex_acquire(struct mutex *mutex); -void mutex_release(struct mutex *mutex); - -#endif /* !_SYS_MUTEX_H_ */ diff --git a/sys/include/sys/panic.h b/sys/include/sys/panic.h deleted file mode 100644 index 961e5d5..0000000 --- a/sys/include/sys/panic.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_PANIC_H_ -#define _SYS_PANIC_H_ - -#include - -#if defined(_KERNEL) - -void panic(const char *fmt, ...); - -#endif - -#endif diff --git a/sys/include/sys/proc.h b/sys/include/sys/proc.h deleted file mode 100644 index e3416f9..0000000 --- a/sys/include/sys/proc.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_PROC_H_ -#define _SYS_PROC_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define PROC_MAX_FDS 256 -#define PROC_MAX_ADDR_RANGE 4 - -#define PROC_STACK_PAGES 8 -#define PROC_STACK_SIZE (PROC_STACK_PAGES*vm_get_page_size()) - -/* - * The PHYS_TO_VIRT/VIRT_TO_PHYS macros convert - * addresses to lower and higher half addresses. - * Userspace addresses are on the lower half, - * therefore, we can just wrap over these to - * keep things simple. - * - * XXX: TODO: This won't work when not identity mapping - * lowerhalf addresses. Once that is updated, - * get rid of this. - */ -#define USER_TO_KERN(user) PHYS_TO_VIRT(user) -#define KERN_TO_USER(kern) VIRT_TO_PHYS(kern) - -enum { - ADDR_RANGE_EXEC = 0, /* Program address range */ - ADDR_RANGE_STACK /* Stack address range */ -}; - -/* - * A task running on the CPU e.g., a process or - * a thread. - */ -struct proc { - pid_t pid; - struct cpu_info *cpu; - struct trapframe *tf; - struct pcb pcb; - struct vas addrsp; - struct vm_range addr_range[PROC_MAX_ADDR_RANGE]; - struct spinlock lock; - uint8_t is_user; - uint8_t rested; - uint32_t signal; - uint32_t priority; - struct filedesc *fds[PROC_MAX_FDS]; - struct spinlock mapspace_lock; - struct vm_mapspace mapspace; - TAILQ_ENTRY(proc) link; -}; - -#endif /* !_SYS_PROC_H_ */ diff --git a/sys/include/sys/queue.h b/sys/include/sys/queue.h deleted file mode 100644 index 60231f4..0000000 --- a/sys/include/sys/queue.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -#ifndef _QUEUE_H_ -#define _QUEUE_H_ - -#define _Q_INVALIDATE(a) - -/* - * Tail queue definitions. - */ -#define TAILQ_HEAD(name, type) \ -struct name { \ - struct type *tqh_first; /* first element */ \ - struct type **tqh_last; /* addr of last next element */ \ - size_t nelem; /* Number of elements */ \ -} - -#define TAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).tqh_first } - -#define TAILQ_ENTRY(type) \ -struct { \ - struct type *tqe_next; /* next element */ \ - struct type **tqe_prev; /* address of previous next element */ \ -} - -/* - * Tail queue access methods. - */ -#define TAILQ_NELEM(head) ((head)->nelem) -#define TAILQ_FIRST(head) ((head)->tqh_first) -#define TAILQ_END(head) NULL -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) -/* XXX */ -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) -#define TAILQ_EMPTY(head) \ - (TAILQ_FIRST(head) == TAILQ_END(head)) - -#define TAILQ_FOREACH(var, head, field) \ - for((var) = TAILQ_FIRST(head); \ - (var) != TAILQ_END(head); \ - (var) = TAILQ_NEXT(var, field)) - -#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = TAILQ_FIRST(head); \ - (var) != TAILQ_END(head) && \ - ((tvar) = TAILQ_NEXT(var, field), 1); \ - (var) = (tvar)) - - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for((var) = TAILQ_LAST(head, headname); \ - (var) != TAILQ_END(head); \ - (var) = TAILQ_PREV(var, headname, field)) - -#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ - for ((var) = TAILQ_LAST(head, headname); \ - (var) != TAILQ_END(head) && \ - ((tvar) = TAILQ_PREV(var, headname, field), 1); \ - (var) = (tvar)) - -/* - * Tail queue functions. - */ -#define TAILQ_INIT(head) do { \ - (head)->tqh_first = NULL; \ - (head)->tqh_last = &(head)->tqh_first; \ - (head)->nelem = 0; \ -} while (0) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ - (head)->tqh_first->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (head)->tqh_first = (elm); \ - (elm)->field.tqe_prev = &(head)->tqh_first; \ - ++(head)->nelem; \ -} while (0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.tqe_next = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - ++(head)->nelem; \ -} while (0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ - (elm)->field.tqe_next->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (listelm)->field.tqe_next = (elm); \ - (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ - ++(head)->nelem; \ -} while (0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - (elm)->field.tqe_next = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ - ++(head)->nelem; \ -} while (0) - -#define TAILQ_REMOVE(head, elm, field) do { \ - if (((elm)->field.tqe_next) != NULL) \ - (elm)->field.tqe_next->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ - _Q_INVALIDATE((elm)->field.tqe_prev); \ - _Q_INVALIDATE((elm)->field.tqe_next); \ - --(head)->nelem; \ -} while (0) - -#define TAILQ_REPLACE(head, elm, elm2, field) do { \ - if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \ - (elm2)->field.tqe_next->field.tqe_prev = \ - &(elm2)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm2)->field.tqe_next; \ - (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ - *(elm2)->field.tqe_prev = (elm2); \ - _Q_INVALIDATE((elm)->field.tqe_prev); \ - _Q_INVALIDATE((elm)->field.tqe_next); \ -} while (0) - -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - } \ -} while (0) -#endif /* _QUEUE_H_ */ diff --git a/sys/include/sys/reboot.h b/sys/include/sys/reboot.h deleted file mode 100644 index e09bd4f..0000000 --- a/sys/include/sys/reboot.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_REBOOT_H_ -#define _SYS_REBOOT_H_ - -#if defined(_KERNEL) -#include -#endif - -#define REBOOT_DEFAULT 0x0000 - -int reboot(int type); - -#if defined(_KERNEL) -uint64_t sys_reboot(struct syscall_args *args); -#endif /* defined(_KERNEL) */ - -#endif /* !_SYS_REBOOT_H_ */ diff --git a/sys/include/sys/sched.h b/sys/include/sys/sched.h deleted file mode 100644 index 06cf860..0000000 --- a/sys/include/sys/sched.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_SCHED_H_ -#define _SYS_SCHED_H_ - -#include -#include -#include -#include -#include -#include -#include - -struct proc *this_td(void); -void sched_init(void); -void sched_exit(void); -void sched_context_switch(struct trapframe *tf); -void sched_rest(void); - -__noreturn -void sched_enter(void); - -__noreturn -uint64_t sys_exit(struct syscall_args *args); - -#endif /* !_SYS_SCHED_H_ */ diff --git a/sys/include/sys/sched_state.h b/sys/include/sys/sched_state.h deleted file mode 100644 index 52d6c56..0000000 --- a/sys/include/sys/sched_state.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_SCHED_STATE_H_ -#define _SYS_SCHED_STATE_H_ - -#include - -/* - * Scheduler state, per CPU. - */ -struct sched_state { - struct proc *td; /* Current_thread */ -}; - -#endif /* !_SYS_SCHED_STATE_H_ */ diff --git a/sys/include/sys/schedvar.h b/sys/include/sys/schedvar.h deleted file mode 100644 index 2a0a1fc..0000000 --- a/sys/include/sys/schedvar.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_SCHEDVAR_H_ -#define _SYS_SCHEDVAR_H_ - -#include -#include -#include - -#define DEFAULT_TIMESLICE_USEC 3000 -#define SHORT_TIMESLICE_USEC 10 - -#define SCHED_POLICY_MLFQ 0x0000U /* Multilevel feedback queue */ -#define SCHED_POLICY_RR 0x0001U /* Round robin */ - -typedef uint8_t schedpolicy_t; - -/* Might be set by kconf(1) */ -#if defined(__SCHED_NQUEUE) -#define SCHED_NQUEUE __SCHED_NQUEUE -#else -#define SCHED_NQUEUE 4 -#endif - -/* Ensure SCHED_NQUEUE is an acceptable value */ -__STATIC_ASSERT(SCHED_NQUEUE <= 8, "SCHED_NQUEUE exceeds max"); -__STATIC_ASSERT(SCHED_NQUEUE > 0, "SCHED_NQUEUE cannot be zero"); - -struct sched_queue { - TAILQ_HEAD(, proc) q; - size_t nthread; -}; - -#endif /* !_SYS_SCHEDVAR_H_ */ diff --git a/sys/include/sys/signal.h b/sys/include/sys/signal.h deleted file mode 100644 index 640773d..0000000 --- a/sys/include/sys/signal.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_SIGNAL_H_ -#define _SYS_SIGNAL_H_ - -#if defined(_KERNEL) -#include -#endif - -#define SIGFPE 8 /* Floating point exception */ -#define SIGKILL 9 /* Kill */ -#define SIGSEGV 11 /* Segmentation violation */ - -#if defined(_KERNEL) -void signal_handle(struct proc *curtd); -void signal_raise(struct proc *to, int signal); -#endif /* defined(_KERNEL) */ - -#endif /* !_SYS_SIGNAL_H_ */ diff --git a/sys/include/sys/sio.h b/sys/include/sys/sio.h deleted file mode 100644 index 6f13a09..0000000 --- a/sys/include/sys/sio.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SIO_H_ -#define _SIO_H_ - -#include - -#if defined(_KERNEL) -enum sio_type { - SIO_NONE, /* None specified */ - SIO_USER, /* Userspace related transaction */ - SIO_KERN, /* Kernel transaction */ -}; - -/* - * System I/O transaction - * - * This structure describes a system I/O transaction - * and contains common fields that are used - * with system I/O. - */ -struct sio_txn { - void *buf; /* Source/dest buffer */ - off_t offset; /* Transfer offset */ - size_t len; /* Length in bytes */ - enum sio_type type; /* Transaction type */ -}; - -#endif /* defined(_KERNEL) */ -#endif /* !_SIO_H_ */ diff --git a/sys/include/sys/spinlock.h b/sys/include/sys/spinlock.h deleted file mode 100644 index 98bc342..0000000 --- a/sys/include/sys/spinlock.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_SPINLOCK_H_ -#define _SYS_SPINLOCK_H_ - -#include - -struct spinlock { - volatile _Atomic bool lock; -}; - -static inline void -spinlock_acquire(struct spinlock *lock) -{ - while (__atomic_test_and_set(&lock->lock, __ATOMIC_ACQUIRE)); -} - -static inline void -spinlock_release(struct spinlock *lock) -{ - __atomic_clear(&lock->lock, __ATOMIC_RELEASE); -} - -#endif /* !_SYS_SPINLOCK_H_ */ diff --git a/sys/include/sys/syscall.h b/sys/include/sys/syscall.h deleted file mode 100644 index 4ef3666..0000000 --- a/sys/include/sys/syscall.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_SYSCALL_H_ -#define _SYS_SYSCALL_H_ - -#include -#if defined(_KERNEL) -#include -#endif - -/* Do not reorder */ -enum { - SYS_exit = 1, - SYS_write, - SYS_open, - SYS_close, - SYS_read, - SYS_lseek, - SYS_mmap, - SYS_munmap, - SYS_ioctl, - SYS_execv, - SYS_mount, - SYS_reboot, - __MAX_SYSCALLS -}; - -struct syscall_args { - uint64_t code; - uint64_t arg0, arg1, arg2; - uint64_t arg3, arg4, arg5, arg6; - uint64_t ip; - uint64_t sp; -}; - -#if defined(_KERNEL) -extern uint64_t(*g_syscall_table[__MAX_SYSCALLS])(struct syscall_args *args); -void __syscall(struct trapframe *tf); -#endif - -#endif diff --git a/sys/include/sys/syslog.h b/sys/include/sys/syslog.h deleted file mode 100644 index 18948ee..0000000 --- a/sys/include/sys/syslog.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2023-2024 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. - */ - -/* - * For documentation: See syslog(9) - */ - -#ifndef _SYS_SYSLOG_H_ -#define _SYS_SYSLOG_H_ - -#include -#include -#include - -#if defined(_KERNEL) - -#define OMIT_TIMESTAMP "\x01" - -void syslog_init(void); -void syslog_init_proc(void); -void kprintf(const char *fmt, ...); -void vkprintf(const char *fmt, va_list *ap); - -extern struct vcons_screen g_syslog_screen; -extern bool g_syslog_use_tty; - -#endif /* defined(_KERNEL) */ - -#endif /* !_SYS_SYSLOG_H_ */ diff --git a/sys/include/sys/system.h b/sys/include/sys/system.h deleted file mode 100644 index 03ac710..0000000 --- a/sys/include/sys/system.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_SYSTEM_H_ -#define _SYS_SYSTEM_H_ - -#include -#include - -#if defined(_KERNEL) -int copyin(uintptr_t uaddr, void *kaddr, size_t len); -int copyout(const void *kaddr, uintptr_t uaddr, size_t len); -int copyinstr(uintptr_t uaddr, char *kaddr, size_t len); -uint64_t sys_ioctl(struct syscall_args *args); -#endif - -#endif /* !_SYS_SYSTEM_H_ */ diff --git a/sys/include/sys/termios.h b/sys/include/sys/termios.h deleted file mode 100644 index 1fda67e..0000000 --- a/sys/include/sys/termios.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_TERMIOS_H_ -#define _SYS_TERMIOS_H_ - -#if defined(_KERNEL) -#include -#else -#include -#endif - -#define NCCS 20 - -/* - * Output flags - software output processing - */ -#define OPOST 0x00000001U /* Enable output processing */ -#if defined(_KERNEL) || defined(_HYRA_SOURCE) -#define OCRNL 0x00000002U /* Map NL to CR-NL */ -#endif /* defined(_KERNEL) || defined(_HYRA_SOURCE) */ - -/* - * Local flags - */ -#define ICANON 0x00000001U -#define ECHO 0x00000002U - -typedef uint32_t tcflag_t; -typedef uint32_t speed_t; -typedef uint8_t cc_t; - -struct termios { - tcflag_t c_iflag; /* Input flags */ - tcflag_t c_oflag; /* Output flags */ - tcflag_t c_cflag; /* Control flags */ - tcflag_t c_lflag; /* Local flags */ - cc_t c_cc[NCCS]; /* Control chars */ - int c_ispeed; /* Input speed */ - int c_ospeed; /* Output speed */ -}; - -#endif /* !_SYS_TERMIOS_H_ */ diff --git a/sys/include/sys/timer.h b/sys/include/sys/timer.h deleted file mode 100644 index e33b2d3..0000000 --- a/sys/include/sys/timer.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2023-2024 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. - */ - -/* - * For documentation: See timer(9) - */ - -#ifndef _SYS_TIMER_H_ -#define _SYS_TIMER_H_ - -#include - -/* Timer IDs */ -#define TIMER_SCHED 0x00000000U /* Scheduler reserved timer */ -#define TIMER_GP 0x00000001U /* General purpose timer */ - -/* Number of timer IDs, adjust when adding timer IDs */ -#define TIMER_ID_COUNT 2 - -/* Timer registry status */ -#define TMRR_SUCCESS 0x00000000U /* Successful */ -#define TMRR_HAS_ENTRY 0x00000001U /* Already has an entry */ -#define TMRR_INVALID_TYPE 0x00000002U /* Invalid timer id */ -#define TMRR_EMPTY_ENTRY 0x00000003U /* Entry is empty */ -#define TMRR_INVALID_ARG 0x00000004U /* Invalid iface arg */ - -/* See timer ID defines */ -typedef uint8_t timer_id_t; - -/* See timer registry status */ -typedef int tmrr_status_t; - -/* - * Represents a timer, pointer fields - * are optional and may be set to NULL, therefore - * it is paramount to verify any function or general - * pointer field within this struct is checked for - * a NULL value. Fields should be NULL if the timer - * driver implementation doesn't implement support - * for a functionality. - * - * XXX: The msleep, usleep, ... functions must return - * either EXIT_SUCCESS and EXIT_FAILURE from sys/errno.h - * ONLY. - */ -struct timer { - const char *name; /* e.g "HPET" */ - size_t(*calibrate)(void); /* Returns frequency, 0 for unspecified */ - size_t(*get_time_usec)(void); /* Time since init (microseconds) */ - size_t(*get_time_sec)(void); /* Time since init (seconds) */ - int(*msleep)(size_t ms); - int(*usleep)(size_t us); - int(*nsleep)(size_t ns); - void(*periodic_ms)(size_t ms); - void(*periodic_us)(size_t ms); - void(*oneshot_ms)(size_t ms); - void(*oneshot_us)(size_t ms); - void(*stop)(void); -}; - -tmrr_status_t register_timer(timer_id_t id, const struct timer *tmr); -tmrr_status_t tmr_registry_overwrite(timer_id_t, const struct timer *tmr); -tmrr_status_t req_timer(timer_id_t id, struct timer *tmr_out); - -#endif /* !_SYS_TIMER_H_ */ diff --git a/sys/include/sys/tty.h b/sys/include/sys/tty.h deleted file mode 100644 index 18583a5..0000000 --- a/sys/include/sys/tty.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_TTY_H_ -#define _SYS_TTY_H_ - -#include -#if defined(_KERNEL) -#include -#include -#include -#include -#endif - -/* TTY ioctl commands */ -#define TCSETS 0x00000000U -#define TCGETS 0x00000001U - -#if defined(_KERNEL) -#define TTY_RING_SIZE 32 -#define TTY_SOURCE_RAW 0x0001U /* Raw text */ -#define TTY_SOURCE_DEV 0x0002U /* Input from device (e.g keyboard) */ - -struct tty_ring { - char data[TTY_RING_SIZE]; /* Ring data */ - off_t enq_index; /* Enqueue index */ - off_t deq_index; /* Dequeue index */ -}; - -struct tty { - dev_t id; - struct vcons_screen *scr; /* Console screen */ - struct tty_ring ring; /* Input ring */ - struct tty_ring outring; /* Output ring */ - struct spinlock rlock; /* Ring lock */ - struct termios termios; /* Termios structure */ - struct device *dev; /* Device pointer */ -}; - -extern struct tty g_root_tty; - -dev_t tty_attach(struct tty *tty); -int tty_putc(struct tty *tty, int c, int flags); -int tty_putstr(struct tty *tty, const char *s, size_t count); -ssize_t tty_flush(struct tty *tty); - -#endif /* defined(_KERNEL) */ -#endif /* !_SYS_TTY_H_ */ diff --git a/sys/include/sys/types.h b/sys/include/sys/types.h deleted file mode 100644 index 8636d4b..0000000 --- a/sys/include/sys/types.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_TYPES_H_ -#define _SYS_TYPES_H_ - -#define NULL ((void *)0) -#define true 1 -#define false 0 - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef short int16_t; -typedef unsigned short uint16_t; -typedef int int32_t; -typedef unsigned int uint32_t; -#if __SIZEOF_LONG__ == 8 -typedef long int64_t; -typedef unsigned long uint64_t; -#elif __SIZEOF_LONG__ == 4 -__extension__ -typedef long long int64_t; -__extension__ -typedef unsigned long long uint64_t; -#else -#error "Unsupported long size" -#endif - -#if __SIZEOF_SIZE_T__ == 8 -typedef uint64_t size_t; -typedef int64_t ssize_t; /* Byte count or error */ -#elif __SIZEOF_SIZE_T__ == 4 -typedef uint32_t size_t; -typedef int32_t ssize_t; /* Byte count or error */ -#else -#error "Unsupported size_t size" -#endif - -typedef _Bool bool; -typedef ssize_t off_t; -typedef size_t uintptr_t; -typedef int pid_t; -typedef int dev_t; - -#if defined(_KERNEL) -typedef uintptr_t vaddr_t; /* Virtual address */ -typedef uintptr_t paddr_t; /* Physical address */ -typedef uint32_t vm_prot_t; /* Access flags */ -#endif /* defined(_KERNEL) */ - -#endif /* !_SYS_TYPES_H_ */ diff --git a/sys/include/sys/vfs.h b/sys/include/sys/vfs.h deleted file mode 100644 index 1f7e423..0000000 --- a/sys/include/sys/vfs.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_VFS_H_ -#define _SYS_VFS_H_ - -#include -#include -#include -#include - -/* Max path length */ -#define PATH_MAX 1024 - -#if defined(_KERNEL) - -extern struct vnode *g_root_vnode; - -void vfs_init(void); -struct fs_info *vfs_byname(const char *name); - -int vfs_vget(struct vnode *parent, const char *name, struct vnode **vp); -int vfs_path_to_node(const char *path, struct vnode **vp); - -char *vfs_get_fname_at(const char *path, size_t idx); -int vfs_rootname(const char *path, char **new_path); - -bool vfs_is_valid_path(const char *path); -ssize_t vfs_hash_path(const char *path); - -ssize_t vfs_read(struct vnode *vp, struct sio_txn *sio); -ssize_t vfs_write(struct vnode *vp, struct sio_txn *sio); - -int vfs_getattr(struct vnode *vp, struct vattr *vattr); -int vfs_open(struct vnode *vp); - -int vfs_close(struct vnode *vp); -uint64_t sys_mount(struct syscall_args *args); - -#endif /* defined(_KERNEL) */ -#endif /* !_SYS_VFS_H_ */ diff --git a/sys/include/sys/vnode.h b/sys/include/sys/vnode.h deleted file mode 100644 index 8201f94..0000000 --- a/sys/include/sys/vnode.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _SYS_VNODE_H_ -#define _SYS_VNODE_H_ - -#include -#include -#include -#include -#include - -struct vnode; -struct vattr; - -struct vops { - int(*vget)(struct vnode *parent, const char *name, struct vnode **vp); - int(*read)(struct vnode *vp, struct sio_txn *sio); - int(*write)(struct vnode *vp, struct sio_txn *sio); - int(*getattr)(struct vnode *vp, struct vattr *vattr); - int(*open)(struct vnode *vp); - int(*close)(struct vnode *vp); -}; - -struct vattr { - size_t size; /* File size in bytes */ - int type; /* Vnode type */ -}; - -struct vnode { - int type; - int flags; - struct vm_object *vmobj; - struct mount *mp; /* Ptr to vfs vnode is in */ - struct vops *vops; - struct vnode *parent; - struct fs_info *fs; /* Filesystem this vnode belongs to, can be NULL */ - void *data; /* Filesystem specific data */ -}; - -/* - * Vnode type flags - */ -#define VREG 0x01 /* Regular file */ -#define VDIR 0x02 /* Directory */ -#define VCHR 0x03 /* Character device */ -#define VBLK 0x04 /* Block device */ - -#if defined(_KERNEL) -int vfs_alloc_vnode(struct vnode **vnode, struct mount *mp, int type); -#endif - -#endif diff --git a/sys/include/vm/dynalloc.h b/sys/include/vm/dynalloc.h deleted file mode 100644 index 44d2f5a..0000000 --- a/sys/include/vm/dynalloc.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2023-2024 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. - */ - -/* - * For documentation: See dynalloc(9) - */ - -#ifndef _VM_DYNALLOC_H_ -#define _VM_DYNALLOC_H_ - -#include - -void *dynalloc(size_t sz); -void *dynalloc_memalign(size_t sz, size_t align); -void *dynrealloc(void *old_ptr, size_t newsize); -void dynfree(void *ptr); - -#endif /* !_VM_DYNALLOC_H_ */ diff --git a/sys/include/vm/fault.h b/sys/include/vm/fault.h deleted file mode 100644 index f0e308c..0000000 --- a/sys/include/vm/fault.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _VM_FAULT_H_ -#define _VM_FAULT_H_ - -#include -#include - -int vm_fault(vaddr_t va, vm_prot_t access_type); - -#endif /* !_VM_FAULT_H_ */ diff --git a/sys/include/vm/map.h b/sys/include/vm/map.h deleted file mode 100644 index a1e74d9..0000000 --- a/sys/include/vm/map.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _VM_MMAP_H_ -#define _VM_MMAP_H_ - -#include -#include -#include -#include -#include -#include -#include - -#define MAP_SHARED 0x0001 -#define MAP_PRIVATE 0x0002 -#define MAP_ANONYMOUS 0x0010 -#define MAP_FAILED ((void *)-1) - -/* Memory map table entry count */ -#define MTAB_ENTRIES 32 - -struct vm_object; - -struct vm_mapping { - TAILQ_ENTRY(vm_mapping) link; - struct vm_range range; - struct vm_object *vmobj; - paddr_t physmem_base; - vm_prot_t prot; - - /* Private */ - size_t vhash; /* Virtual address hash */ -}; - -typedef TAILQ_HEAD(, vm_mapping) vm_mapq_t; - -struct vm_mapspace { - vm_mapq_t mtab[MTAB_ENTRIES]; /* Map table */ - size_t map_count; -}; - -/* Mapping operations */ -int vm_map_destroy(struct vas vas, vaddr_t va, size_t bytes); -int vm_map_create(struct vas vas, vaddr_t va, paddr_t pa, vm_prot_t prot, - size_t bytes); - -/* Syscalls */ -uint64_t sys_mmap(struct syscall_args *args); -uint64_t sys_munmap(struct syscall_args *args); - -/* Mapespace operations */ -void vm_mapspace_insert(struct vm_mapspace *ms, struct vm_mapping *mapping); -void vm_mapspace_remove(struct vm_mapspace *ms, struct vm_mapping *mapping); -struct vm_mapping *vm_mapping_fetch(struct vm_mapspace *ms, vaddr_t va); -void vm_free_mapq(vm_mapq_t *mapq); - -#endif /* !_VM_MMAP_H_ */ diff --git a/sys/include/vm/obj.h b/sys/include/vm/obj.h deleted file mode 100644 index 6e24516..0000000 --- a/sys/include/vm/obj.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _VM_OBJ_H_ -#define _VM_OBJ_H_ - -#include -#include -#include -#include -#include - -struct vm_object { - struct spinlock lock; /* Protects this object */ - struct vm_mapspace mapspace; /* Mapspace this object points to */ - struct vm_pagerops *pgops; /* Pager operations */ - - uint8_t is_anon : 1; /* Is an anonymous mapping */ - uint8_t demand : 1; /* Only mapped upon access */ - int ref; /* Ref count */ - struct vnode *vnode; /* Only used if `is_anon` is 0 */ -}; - -#define vm_object_ref(OBJPTR) (++(OBJPTR)->ref) -#define vm_object_unref(OBJPTR) do { \ - if ((OBJPTR)->ref > 0) { \ - --(OBJPTR)->ref; \ - } \ - } while (0); - -size_t vm_obj_count(void); -int vm_obj_init(struct vm_object **res, struct vnode *vnode); -int vm_obj_destroy(struct vm_object *obj); - -#endif /* !_VM_OBJ_H_ */ diff --git a/sys/include/vm/page.h b/sys/include/vm/page.h deleted file mode 100644 index 80fa74f..0000000 --- a/sys/include/vm/page.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _VM_PAGE_H_ -#define _VM_PAGE_H_ - -#include - -struct vm_page { - paddr_t physaddr; -}; - -void vm_zero_page(void *page, size_t page_count); - -#endif /* !_VM_PAGE_H_ */ diff --git a/sys/include/vm/pager.h b/sys/include/vm/pager.h deleted file mode 100644 index e57afe1..0000000 --- a/sys/include/vm/pager.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _VM_PAGER_H_ -#define _VM_PAGER_H_ - -#include -#include - -struct vm_object; - -struct vm_pagerops { - int(*get)(struct vm_object *obj, off_t off, size_t len, struct vm_page *pg); - int(*store)(struct vm_object *obj, off_t off, size_t len, struct vm_page *pg); - /* TODO: Remove this and add demand paging */ - int(*get_paddr)(struct vm_object *obj, paddr_t *paddr, vm_prot_t prot); -}; - -extern struct vm_pagerops g_vnode_pagerops; -extern struct vm_pagerops g_dev_pagerops; - -int vm_pager_get(struct vm_object *obj, off_t off, size_t len, struct vm_page *pg); -int vm_pager_paddr(struct vm_object *obj, paddr_t *paddr, vm_prot_t prot); - -#endif /* !_VM_PAGER_H_ */ diff --git a/sys/include/vm/physseg.h b/sys/include/vm/physseg.h deleted file mode 100644 index 956f82f..0000000 --- a/sys/include/vm/physseg.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _VM_VM_PHYSSEG_H_ -#define _VM_VM_PHYSSEG_H_ - -#include - -struct physmem_stat { - size_t reserved_kib; /* Reserved memory */ - size_t total_kib; /* Total memory */ - size_t avl_kib; /* Available memory */ - size_t alloc_kib; /* Allocated physical memory */ -}; - -void vm_physseg_init(void); -uintptr_t vm_alloc_pageframe(size_t count); - -void vm_free_pageframe(uintptr_t base, size_t count); -struct physmem_stat vm_phys_memstat(void); - -#endif /* !_VM_VM_PHYSSEG_H_ */ diff --git a/sys/include/vm/pmap.h b/sys/include/vm/pmap.h deleted file mode 100644 index cb18885..0000000 --- a/sys/include/vm/pmap.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 _VM_PMAP_H_ -#define _VM_PMAP_H_ - -/* - * Each architecture is expected to implement - * this header. It should contain a `struct vas' - * which will contain information about a VAS - * (virtual address space) - * - * On AMD64 this struct contains: PML4, etc - * - * XXX: Compiler errors pointing to this include means you - * forgot to implement it!!! - * - * `struct vas' MUST have a `struct spinlock lock' field!!! - */ -#include - -#include -#include -#include - -/* prot flags for mappings */ -#define PROT_WRITE __BIT(0) /* Writable */ -#define PROT_EXEC __BIT(1) /* Executable */ -#define PROT_USER __BIT(2) /* User accessible */ - -/* Caching types */ -#define VM_CACHE_UC 0x00000U /* Uncachable */ -#define VM_CACHE_WT 0x00001U /* Write-through */ - -#define is_vas_valid(vas) (vas.top_level != 0) - -/* - * vm_ctx - Per core virtual memory context - */ -struct vm_ctx { - uintptr_t dynalloc_pool_phys; - size_t dynalloc_pool_sz; /* In bytes */ - tlsf_t tlsf_ctx; - struct spinlock dynalloc_lock; -}; - -/* - * Mark a virtual address with a specific caching - * type. - */ -int pmap_set_cache(struct vm_ctx *, struct vas, vaddr_t, int); - -/* - * Create a virtual address space - * and return the descriptor. - */ -int pmap_create_vas(struct vm_ctx *, struct vas *); - -/* - * Switch the current virtual address space - * to another. - */ -void pmap_switch_vas(struct vm_ctx *, struct vas); - -/* - * Read virtual address space descriptor - * and return it. - */ -struct vas pmap_read_vas(void); - -/* - * Map a physical address to a virtual address. - */ -int pmap_map(struct vm_ctx *, struct vas, vaddr_t, paddr_t, vm_prot_t); - -/* - * Get rid of a virtual address space and free - * resources. - */ -int pmap_free_vas(struct vm_ctx *, struct vas); - -/* - * Unmap a page. - */ -int pmap_unmap(struct vm_ctx *, struct vas, vaddr_t); - -/* - * Architecture specific init code for pmap - */ -int pmap_init(struct vm_ctx *); -#endif /* _VM_PMAP_H_ */ diff --git a/sys/include/vm/tlsf.h b/sys/include/vm/tlsf.h deleted file mode 100644 index e9b5a91..0000000 --- a/sys/include/vm/tlsf.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef INCLUDED_tlsf -#define INCLUDED_tlsf - -/* -** Two Level Segregated Fit memory allocator, version 3.1. -** Written by Matthew Conte -** http://tlsf.baisoku.org -** -** Based on the original documentation by Miguel Masmano: -** http://www.gii.upv.es/tlsf/main/docs -** -** This implementation was written to the specification -** of the document, therefore no GPL restrictions apply. -** -** Copyright (c) 2006-2016, Matthew Conte -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * 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. -** * Neither the name of the copyright holder 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 MATTHEW CONTE 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 - -#if defined(__cplusplus) -extern "C" { -#endif - -/* tlsf_t: a TLSF structure. Can contain 1 to N pools. */ -/* pool_t: a block of memory that TLSF can manage. */ -typedef void* tlsf_t; -typedef void* pool_t; - -/* Create/destroy a memory pool. */ -tlsf_t tlsf_create(void* mem); -tlsf_t tlsf_create_with_pool(void* mem, size_t bytes); -void tlsf_destroy(tlsf_t tlsf); -pool_t tlsf_get_pool(tlsf_t tlsf); - -/* Add/remove memory pools. */ -pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes); -void tlsf_remove_pool(tlsf_t tlsf, pool_t pool); - -/* malloc/memalign/realloc/free replacements. */ -void* tlsf_malloc(tlsf_t tlsf, size_t bytes); -void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t bytes); -void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size); -void tlsf_free(tlsf_t tlsf, void* ptr); - -/* Returns internal block size, not original request size */ -size_t tlsf_block_size(void* ptr); - -/* Overheads/limits of internal structures. */ -size_t tlsf_size(void); -size_t tlsf_align_size(void); -size_t tlsf_block_size_min(void); -size_t tlsf_block_size_max(void); -size_t tlsf_pool_overhead(void); -size_t tlsf_alloc_overhead(void); - -/* Debugging. */ -typedef void (*tlsf_walker)(void* ptr, size_t size, int used, void* user); -void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user); -/* Returns nonzero if any internal consistency check fails. */ -int tlsf_check(tlsf_t tlsf); -int tlsf_check_pool(pool_t pool); - -#if defined(__cplusplus) -}; -#endif - -#endif diff --git a/sys/include/vm/vm.h b/sys/include/vm/vm.h deleted file mode 100644 index 1c23b8a..0000000 --- a/sys/include/vm/vm.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2023-2024 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. - */ - -/* - * For documentation: See vm(9) - */ - -#ifndef _VM_H_ -#define _VM_H_ - -#include -#include -#include -#include -#include -#include - -extern volatile struct limine_hhdm_request g_hhdm_request; - -#define VM_HIGHER_HALF (g_hhdm_request.response->offset) - -#define PHYS_TO_VIRT(phys) (void *)((uintptr_t)phys + VM_HIGHER_HALF) -#define VIRT_TO_PHYS(virt) ((uintptr_t)virt - VM_HIGHER_HALF) - -struct vm_range { - uintptr_t start; - uintptr_t end; -}; - -struct vm_memstat { - struct physmem_stat pmem_stat; - size_t vmobj_cnt; -}; - -/* - * Returns the machine's pagesize: - * - * XXX TODO: This needs to be moved to vmm_init.c - * while returning a non-constant value. - */ -static inline size_t -vm_get_page_size(void) -{ - return 4096; -} - -void vm_init(void); -struct vm_ctx *vm_get_ctx(void); -struct vas vm_get_kvas(void); -struct vm_memstat vm_memstat(void); - -#endif /* !_VM_H_ */ diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c deleted file mode 100644 index 847f4a6..0000000 --- a/sys/kern/init_main.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("init_main"); -__KERNEL_META("$Hyra$: init_main.c, Ian Marco Moffett, " - "Where the Hyra kernel first starts up"); - -static inline void -log_timer(const char *purpose, tmrr_status_t s, const struct timer *tmr) -{ - if (s == TMRR_EMPTY_ENTRY) { - kprintf("init_main: %s not yet registered\n", purpose); - } else if (tmr->name == NULL) { - kprintf("init_main: Nameless %s registered; unknown\n", purpose); - } else { - kprintf("init_main: %s registered: %s\n", purpose, tmr->name); - } -} - -/* - * Logs what timers are registered - * on the system. - */ -static void -list_timers(void) -{ - struct timer timer_tmp; - tmrr_status_t status; - - status = req_timer(TIMER_SCHED, &timer_tmp); - log_timer("SCHED_TMR", status, &timer_tmp); - - status = req_timer(TIMER_GP, &timer_tmp); - log_timer("GENERAL_PURPOSE_TMR", status, &timer_tmp); -} - -void -main(void) -{ - struct cpu_info *ci; - int status; - - __TRY_CALL(pre_init); - syslog_init(); - PRINT_LOGO(); - - kprintf("Hyra/%s v%s: %s (%s)\n", - HYRA_ARCH, HYRA_VERSION, HYRA_BUILDDATE, - HYRA_BUILDBRANCH); - - acpi_init(); - __TRY_CALL(chips_init); - - processor_init(); - list_timers(); - vfs_init(); - - /* Attach the root TTY */ - if ((status = tty_attach(&g_root_tty)) < 0) - kprintf("Failed to attach root TTY (got %d)\n", status); - - DRIVERS_INIT(); - sched_init(); - ci = this_cpu(); - - /* Stop writing kernel messages to TTY */ - g_syslog_use_tty = false; - - __TRY_CALL(ap_bootstrap, ci); - sched_enter(); - - while (1); - __builtin_unreachable(); -} diff --git a/sys/kern/kern_cpu.c b/sys/kern/kern_cpu.c deleted file mode 100644 index 1779244..0000000 --- a/sys/kern/kern_cpu.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include - -__MODULE_NAME("kern_cpu"); -__KERNEL_META("$Hyra$: kern_cpu.c, Ian Marco Moffett, " - "Machine independent CPU interface"); - -#define CI_LIST_SZ \ - sizeof(struct cpu_info *) * (MAXCPUS + 1) - -static size_t ncpu = 0; -static struct cpu_info **ci_list = NULL; - -void -cpu_attach(struct cpu_info *ci) -{ - if ((ci->idx = ncpu++) >= (MAXCPUS + 1)) { - panic("Machine core count exceeds MAXCPUS!\n"); - } - - if (ci_list == NULL) { - ci_list = dynalloc(CI_LIST_SZ); - __assert(ci_list != NULL); - } - - ci_list[cpu_index(ci)] = ci; -} - -struct cpu_info * -cpu_get(size_t i) -{ - if (i >= ncpu || ci_list == NULL) { - return NULL; - } - - return ci_list[i]; -} - -size_t -cpu_count(void) -{ - return ncpu; -} diff --git a/sys/kern/kern_device.c b/sys/kern/kern_device.c deleted file mode 100644 index cbba965..0000000 --- a/sys/kern/kern_device.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include - -static TAILQ_HEAD(, device) devices; -static struct spinlock devices_lock = {0}; -static bool device_list_init = false; - -dev_t -device_alloc_major(void) -{ - static dev_t major = 1; - return major++; -} - -struct device * -device_fetch(dev_t major, dev_t minor) -{ - struct device *dev; - - TAILQ_FOREACH(dev, &devices, link) { - if (dev->major == major && dev->minor == minor) { - return dev; - } - } - - return NULL; -} - -dev_t -device_create(struct device *dev, dev_t major, dev_t minor) -{ - if (dev == NULL || minor == 0) { - return -EINVAL; - } - - if (major == 0) { - return -EINVAL; - } - - if (!device_list_init) { - TAILQ_INIT(&devices); - device_list_init = true; - } - - dev->major = major; - dev->minor = minor; - - spinlock_acquire(&devices_lock); - TAILQ_INSERT_HEAD(&devices, dev, link); - spinlock_release(&devices_lock); - return dev->major; -} diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c deleted file mode 100644 index 202da23..0000000 --- a/sys/kern/kern_exec.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("exec"); -__KERNEL_META("$Hyra$: kern_exec.c, Ian Marco Moffett, " - "exec() implementation"); - -#define ARG_MAX 1024 - -/* - * Allocates a buffer in in `res' and fetches - * the args from `argv' - * - * @argv: User argv - * @res: Exec args result. - * - * XXX: res->argp is dynamically allocated, remember - * to free it! - */ -static int -exec_get_args(char **argv, struct exec_args *res) -{ - static char *dmmy_envp[] = {NULL}; - const size_t ARG_LEN = sizeof(char) * ARG_MAX; - char *argp = NULL; - void *tmp; - - struct proc *td; - size_t argp_len = 0; - - if (res == NULL) - return -EINVAL; - - /* Allocate argp */ - res->argp = dynalloc(ARG_LEN); - if (res->argp == NULL) - return -ENOMEM; - - td = this_td(); - res->vas = td->addrsp; - res->envp = dmmy_envp; - - /* Read argv */ - copyin((uintptr_t)argv, &argp, sizeof(char *)); - for (;;) { - if (argp == NULL) { - res->argp[argp_len] = NULL; - break; - } - - /* Fetch this arg and get next argp */ - copyinstr((uintptr_t)argp, res->argp[argp_len++], ARG_MAX); - copyin((uintptr_t)++argv, &argp, sizeof(char *)); - - /* Try to resize the argp buffer */ - tmp = dynrealloc(res->argp, ARG_LEN * (argp_len + 1)); - if (tmp == NULL) { - dynfree(res->argp); - return -ENOMEM; - } - res->argp = tmp; - } - - return 0; -} - -/* - * Reset the stack of the process. - * - * @td: Target thread. - * @args: Exec args. - * - * Returns the new stack pointer. - */ -static uintptr_t -exec_set_stack(struct proc *td, struct exec_args args) -{ - struct vm_range *stack_range; - uintptr_t stack_top, sp; - - stack_range = &td->addr_range[ADDR_RANGE_STACK]; - stack_top = stack_range->start + (PROC_STACK_SIZE); - - sp = loader_init_stack((void *)stack_top, args); - return sp; -} - -/* - * execv() implementation. - * - * @pathname: Path of file to execute. - * @argv: Args. - * @sp_res: Pointer to new stack pointer - */ -static int -execv(char *pathname, char **argv, uintptr_t *sp_res) -{ - char *bin = NULL; - struct filedesc *filedes; - struct vm_range *exec_range; - struct exec_args args; - - struct proc *td = this_td(); - int fd, ret = 0; - int status; - size_t bin_size; - - if ((status = exec_get_args(argv, &args)) != 0) - return status; - - spinlock_acquire(&td->lock); - fd = open(pathname, O_RDONLY); - - if (fd < 0) { - ret = -ENOENT; - goto done; - } - - filedes = fd_from_fdnum(td, fd); - if (__unlikely(filedes == NULL)) { - /* - * Should not happen. The kernel might be in some - * erroneous state. - */ - ret = -EIO; - goto done; - } - - lseek(fd, 0, SEEK_END); - bin_size = filedes->offset; - lseek(fd, 0, SEEK_SET); - - /* Allocate memory for the binary */ - bin = dynalloc(bin_size); - if (bin == NULL) { - ret = -ENOMEM; - goto done; - } - - /* Read-in the binary */ - if ((status = read(fd, bin, bin_size)) < 0) { - ret = status; - goto done; - } - - /* - * Unload the current process image. After we do this, - * we cannot return in this state until we replace it. - * - * XXX: This is one of the last things we do in case of - * errors. - */ - exec_range = &td->addr_range[ADDR_RANGE_EXEC]; - loader_unload(td->addrsp, exec_range); - - /* - * Now we try to load the new program and hope everything - * works... If something goes wrong here then we'll be forced - * to send a SIGSEGV to the thread. - */ - status = loader_load(td->addrsp, bin, &args.auxv, 0, NULL, exec_range); - if (status != 0) { - /* Well shit */ - kprintf("exec: Failed to load new process image\n"); - signal_raise(td, SIGSEGV); - for (;;); - } - - *sp_res = exec_set_stack(td, args); - set_frame_ip(td->tf, args.auxv.at_entry); -done: - /* We are done, cleanup and release the thread */ - if (bin != NULL) dynfree(bin); - fd_close_fdnum(td, fd); - dynfree(args.argp); - spinlock_release(&td->lock); - return ret; -} - -/* - * Arg0: Pathname - * Arg1: Argv - */ -uint64_t -sys_execv(struct syscall_args *args) -{ - uintptr_t sp; - char pathname[PATH_MAX]; - char **argv = (char **)args->arg1; - - int status; - struct proc *td = this_td(); - - copyinstr(args->arg0, pathname, PATH_MAX); - if ((status = execv(pathname, argv, &sp)) != 0) - return status; - - args->ip = get_frame_ip(td->tf); - args->sp = sp; - return 0; -} diff --git a/sys/kern/kern_filedesc.c b/sys/kern/kern_filedesc.c deleted file mode 100644 index 17a3d84..0000000 --- a/sys/kern/kern_filedesc.c +++ /dev/null @@ -1,494 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_RW_SIZE 0x7FFFF000 - -/* - * This function is a helper for write(). It creates - * a buffer and copies write data to it. - * - * @td: Current thread. - * @data: Data to copy. - * @buf_out: Pointer to buffer that will store data. - * @count: Number of bytes. - */ -static int -make_write_buf(struct proc *td, const void *data, char **buf_out, size_t count) -{ - char *buf = NULL; - - /* Count cannot be 0 or exceed the max size */ - if (count > MAX_RW_SIZE || count == 0) { - return -EINVAL; - } - - buf = dynalloc(count); - - if (buf == NULL) { - return -ENOMEM; - } - - __assert(buf_out != NULL); - *buf_out = buf; - - memset(buf, 0, count); - - if (td->is_user) { - /* - * A user process called us, so we want to be careful - * and use copyin() - */ - if (copyin((uintptr_t)data, buf, count) != 0) { - signal_raise(NULL, SIGSEGV); - } - } else { - /* Can just memcpy() here */ - memcpy(buf, (char *)data, count); - } - - return 0; -} - -/* - * Helper function for write() - */ -static ssize_t -do_write(struct vnode *vp, char *buf, size_t count) -{ - struct sio_txn sio = { .buf = buf, .len = count }; - struct vops *vops = vp->vops; - int status; - - __assert(vops != NULL); - - /* Can we call the write operation? */ - if (vops->write == NULL) { - return -EACCES; - } - - /* Attempt a write */ - if ((status = vops->write(vp, &sio)) < 0) { - return status; - } - - return count; -} - -/* - * Allocate a file descriptor. - * - * @td: Thread to allocate from, NULL for current thread. - * @fd_out: Pointer to allocated file descriptor output. - * - * This routine will create a new file descriptor - * table entry. - * - * Returns 0 on success. - */ -int -fd_alloc(struct proc *td, struct filedesc **fd_out) -{ - struct filedesc *fd; - - if (td == NULL) { - td = this_td(); - __assert(td != NULL); - } - - /* Find free fd table entry */ - for (size_t i = 0; i < PROC_MAX_FDS; ++i) { - if (td->fds[i] != NULL) { - /* In use */ - continue; - } - - fd = dynalloc(sizeof(struct filedesc)); - memset(fd, 0, sizeof(struct filedesc)); - - if (fd == NULL) { - return -ENOMEM; - } - - fd->fdno = i; - td->fds[i] = fd; - - if (fd_out != NULL) - *fd_out = fd; - - return 0; - } - - return -EMFILE; -} - -/* - * Fetch a file descriptor from a file descriptor - * number. - * - * @td: Thread to fetch from, NULL for current thread. - * @fdno: File descriptor to fetch - */ -struct filedesc * -fd_from_fdnum(const struct proc *td, int fdno) -{ - if (td == NULL) { - td = this_td(); - __assert(td != NULL); - } - - if (fdno < 0 || fdno > PROC_MAX_FDS) { - return NULL; - } - - return td->fds[fdno]; -} - -/* - * Close a file descriptor from its fd number. - * - * @td: Thread to fetch from, NULL for current thread. - * @fdno: File descriptor number to close. - */ -void -fd_close_fdnum(struct proc *td, int fdno) -{ - struct filedesc *fd; - - if (td == NULL) { - td = this_td(); - __assert(td != NULL); - } - - fd = fd_from_fdnum(td, fdno); - if (fd == NULL) { - return; - } - - if (fd->vnode != NULL) { - vfs_close(fd->vnode); - } - - dynfree(fd); - td->fds[fdno] = NULL; -} - -ssize_t -write(int fd, const void *buf, size_t count) -{ - struct proc *td = this_td(); - struct filedesc *desc = NULL; - struct vnode *vp = NULL; - char *in_buf = NULL; - - ssize_t ret = count; - int status; - - /* - * Create our write buffer... Memory will be allocated - * and data copied. - */ - if ((status = make_write_buf(td, buf, &in_buf, count)) != 0) { - return status; - } - - /* Is this stdout/stderr? */ - if (fd == 1 || fd == 2) { - /* TODO: Update this when we have PTYs */ - vcons_putstr(&g_syslog_screen, in_buf, count); - return count; - } - - desc = fd_from_fdnum(td, fd); - if (desc == NULL) { - return -EBADF; - } - - mutex_acquire(&desc->lock); - if (desc->oflag != O_WRONLY && desc->oflag != O_WRONLY) { - ret = -EACCES; - goto cleanup; - } - - /* Does this file descriptor exist? */ - if (desc == NULL) { - ret = -EBADF; - goto cleanup; - } - - /* Do we have a vnode? */ - if (desc->vnode == NULL) { - ret = -EACCES; - goto cleanup; - } - - vp = desc->vnode; - status = do_write(vp, in_buf, count); - - if (status < 0) { - ret = status; - goto cleanup; - } -cleanup: - mutex_release(&desc->lock); - dynfree(in_buf); - return ret; -} - -/* - * Open a file and return a file descriptor. - * - * @pathname: File path. - * @oflag: Flags. - */ -int -open(const char *pathname, int oflag) -{ - struct vnode *vp; - struct filedesc *fd; - int status; - - /* - * Attempt to create a vnode, call the open hook then - * allocate a file descriptor - */ - if ((status = vfs_path_to_node(pathname, &vp)) != 0) { - return status; - } - if ((status = vfs_open(vp)) != 0) { - return status; - } - if ((status = fd_alloc(this_td(), &fd)) != 0) { - return status; - } - - fd->oflag = oflag; - fd->vnode = vp; - fd->is_dir = (vp->type == VDIR); - return fd->fdno; -} - -/* - * Read file into a buffer. - * - * @fd: File descriptor number. - * @buf: Buffer to read to. - * @count: Number of bytes to read. - */ -int -read(int fd, void *buf, size_t count) -{ - ssize_t bytes_read; - struct vnode *vnode; - struct filedesc *fd_desc; - struct sio_txn sio = { - .buf = buf, - .len = count, - .type = SIO_NONE - }; - - fd_desc = fd_from_fdnum(this_td(), fd); - if (fd_desc == NULL) { - return -EBADF; - } - - mutex_acquire(&fd_desc->lock); - if (fd_desc->oflag == O_WRONLY) { - bytes_read = -EACCES; - goto done; - } - - sio.offset = fd_desc->offset; - vnode = fd_desc->vnode; - - if (count > MAX_RW_SIZE) { - bytes_read = -EACCES; - goto done; - } - - bytes_read = vfs_read(vnode, &sio); - fd_desc->offset += bytes_read; -done: - mutex_release(&fd_desc->lock); - return bytes_read; -} - -/* - * Reposition the file offset - * - * @fd: File descriptor. - * @offset: Offset for the reposition - * @whence: SEEK_SET, SEEK_CUR, or SEEK_END - * - * TODO: Implement SEEK_END - */ -off_t -lseek(int fd, off_t offset, int whence) -{ - struct filedesc *fd_desc; - struct vattr vattr; - - fd_desc = fd_from_fdnum(this_td(), fd); - - if (fd_desc == NULL) { - return -EBADF; - } - - if (vfs_getattr(fd_desc->vnode, &vattr) != 0) { - return -1; - } - - switch (whence) { - case SEEK_SET: - if (offset > vattr.size) - return -ESPIPE; - - fd_desc->offset = offset; - break; - case SEEK_CUR: - if ((fd_desc->offset + offset) > vattr.size) - return -ESPIPE; - - fd_desc->offset += offset; - break; - case SEEK_END: - fd_desc->offset = vattr.size; - break; - default: - return -EINVAL; - } - - return fd_desc->offset; -} - -/* - * arg0: int fd - * arg1: const void *buf - * arg2: count - */ -uint64_t -sys_write(struct syscall_args *args) -{ - return write(args->arg0, (void *)args->arg1, args->arg2); -} - -/* - * arg0: const char *pathname - * arg1: int oflag - */ -uint64_t -sys_open(struct syscall_args *args) -{ - char *pathbuf = dynalloc(sizeof(char) * PATH_MAX); - int ret; - - if (pathbuf == NULL) { - return -ENOMEM; - } - - if (copyinstr(args->arg0, pathbuf, PATH_MAX) != 0) { - signal_raise(NULL, SIGSEGV); - } - - ret = open(pathbuf, args->arg1); - dynfree(pathbuf); - return ret; -} - -/* - * arg0: fd - */ -uint64_t -sys_close(struct syscall_args *args) -{ - fd_close_fdnum(this_td(), args->arg0); - return 0; -} - -/* - * arg0: fd - * arg1: char *buf - * arg2: size_t count - */ -uint64_t -sys_read(struct syscall_args *args) -{ - char *kbuf; - ssize_t bytes_read; - - if (args->arg2 > MAX_RW_SIZE || args->arg2 == 0) { - return -EINVAL; - } - - kbuf = dynalloc(args->arg2); - if (kbuf == NULL) { - return -ENOMEM; - } - - /* - * Try to read into our kernel buffer then copy out - * to userspace. - */ - if ((bytes_read = read(args->arg0, kbuf, args->arg2)) < 0) { - /* Failure */ - dynfree(kbuf); - return bytes_read; - } - if (copyout(kbuf, args->arg1, bytes_read) != 0) { - signal_raise(NULL, SIGSEGV); - } - - dynfree(kbuf); - return bytes_read; -} - -/* - * arg0: fd - * arg1: offset: - * arg2: whence - */ -uint64_t -sys_lseek(struct syscall_args *args) -{ - return lseek(args->arg0, args->arg1, args->arg2); -} diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c deleted file mode 100644 index 0c80334..0000000 --- a/sys/kern/kern_intr.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include - -#define PROC_BUF_SIZE 4096 - -static TAILQ_HEAD(, intr_info) intrlist; -static struct mutex intrlist_lock = {0}; -static struct proc_entry *proc; - -static int -proc_read(struct proc_entry *entry, struct sio_txn *sio) -{ - struct intr_info *info; - char buf[PROC_BUF_SIZE]; - char *p = &buf[0]; - size_t idx = 0, len; - int res; - - mutex_acquire(&intrlist_lock); - TAILQ_FOREACH(info, &intrlist, link) { - __assert((sizeof(buf) - idx) > 0); - res = snprintf(p, sizeof(buf) - idx, - "CPU%d\t\t%d\t\t%s\t\t%s\n", - info->affinity, - info->count, - info->source, - info->device - ); - - if (res > 0) { - idx += res; - p += res; - } - - if (idx >= (PROC_BUF_SIZE - 1)) { - break; - } - } - - len = idx + 1; - buf[idx] = '\0'; - - if (sio->len > PROC_BUF_SIZE) - sio->len = PROC_BUF_SIZE; - if (len > sio->len) - len = sio->len; - - memcpy(sio->buf, buf, len); - mutex_release(&intrlist_lock); - return len; -} - -/* - * Register an interrupt stat - * - * @source: Source of interrupt (e.g IOAPIC) - * @dev: Device (e.g i8042) - */ -struct intr_info * -intr_info_alloc(const char *source, const char *dev) -{ - struct intr_info *intr; - - intr = dynalloc(sizeof(*intr)); - if (intr == NULL) - return NULL; - - memset(intr, 0, sizeof(*intr)); - intr->source = source; - intr->device = dev; - return intr; -} - -void -intr_register(struct intr_info *info) -{ - if (info == NULL) - return; - - TAILQ_INSERT_TAIL(&intrlist, info, link); -} - -void -intr_init_proc(void) -{ - /* Init the interrupt list */ - TAILQ_INIT(&intrlist); - - /* Setup /proc/interrupts */ - proc = procfs_alloc_entry(); - proc->read = proc_read; - procfs_add_entry("interrupts", proc); -} diff --git a/sys/kern/kern_ioctl.c b/sys/kern/kern_ioctl.c deleted file mode 100644 index 4b81983..0000000 --- a/sys/kern/kern_ioctl.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include - -static int -do_ioctl(int fd, uint32_t cmd, uintptr_t arg) -{ - struct proc *td = this_td(); - struct filedesc *filedes; - struct vnode *vp; - struct device *dev; - int status; - - filedes = fd_from_fdnum(td, fd); - - /* Fetch the vnode */ - if (filedes == NULL) - return -EBADF; - if ((vp = filedes->vnode) == NULL) - return -EIO; - - if ((status = devfs_get_dev(vp, &dev)) != 0) - return status; - if (dev->ioctl == NULL) - return -EIO; - - return dev->ioctl(dev, cmd, arg); -} - -/* - * Arg0: Fd. - * Arg1: Cmd. - * Arg2: Arg. - */ -uint64_t -sys_ioctl(struct syscall_args *args) -{ - return do_ioctl(args->arg0, args->arg1, args->arg2); -} diff --git a/sys/kern/kern_loader.c b/sys/kern/kern_loader.c deleted file mode 100644 index 8edc160..0000000 --- a/sys/kern/kern_loader.c +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("kern_loader"); -__KERNEL_META("$Hyra$: kern_loader.c, Ian Marco Moffett, " - "Kernel ELF loader"); - -#define pr_trace(fmt, ...) kprintf("loader: " fmt, ##__VA_ARGS__) -#define pr_error(...) pr_trace(__VA_ARGS__) - -#define PHDR(hdrptr, IDX) \ - (void *)((uintptr_t)hdr + (hdrptr)->e_phoff + (hdrptr->e_phentsize*IDX)) - -int -loader_unload(struct vas vas, struct vm_range *exec_range) -{ - size_t start, end; - - start = exec_range->start; - end = exec_range->end; - - /* FIXME: Figure out how to free physical memory too */ - return vm_map_destroy(vas, start, (end - start)); -} - -uintptr_t -loader_init_stack(void *stack_top, struct exec_args args) -{ - uintptr_t *sp = stack_top; - uintptr_t old_sp = 0; - size_t argc, envc, len; - char **argvp = args.argp; - char **envp = args.envp; - struct auxval auxv = args.auxv; - - /* Copy strings */ - old_sp = (uintptr_t)sp; - for (argc = 0; argvp[argc] != NULL; ++argc) { - len = strlen(argvp[argc]) + 1; - sp = (void *)((char *)sp - len); - memcpy((char *)sp, argvp[argc], len); - } - for (envc = 0; envp[envc] != NULL; ++envc) { - len = strlen(envp[envc]) + 1; - sp = (void *)((char *)sp - len); - memcpy((char *)sp, envp[envc], len); - } - - /* Ensure the stack is aligned */ - sp = (void *)__ALIGN_DOWN((uintptr_t)sp, 16); - if (((argc + envc + 1) & 1) != 0) - --sp; - - AUXVAL(sp, AT_NULL, 0x0); - AUXVAL(sp, AT_SECURE, 0x0); - AUXVAL(sp, AT_ENTRY, auxv.at_entry); - AUXVAL(sp, AT_PHDR, auxv.at_phdr); - AUXVAL(sp, AT_PHNUM, auxv.at_phnum); - AUXVAL(sp, AT_PAGESIZE, vm_get_page_size()); - STACK_PUSH(sp, 0); - - /* Copy envp pointers */ - sp -= envc; - for (int i = 0; i < envc; ++i) { - len = strlen(envp[i]) + 1; - old_sp -= len; - sp[i] = KERN_TO_USER(old_sp); - } - - /* Copy argvp pointers */ - STACK_PUSH(sp, 0); - sp -= argc; - for (int i = 0; i < argc; ++i) { - len = strlen(argvp[i]) + 1; - old_sp -= len; - sp[i] = KERN_TO_USER(old_sp); - } - - STACK_PUSH(sp, argc); - return (uintptr_t)sp; -} - -int loader_load(struct vas vas, const void *dataptr, struct auxval *auxv, - size_t load_base, char **ld_path, struct vm_range *prog_range) -{ - const Elf64_Ehdr *hdr = dataptr; - Elf64_Phdr *phdr; - vm_prot_t prot = PROT_USER; - - uintptr_t physmem; - size_t misalign, page_count, map_len; - int status; - - uintptr_t start_addr = (uintptr_t)-1; - uintptr_t end_addr = 0; - - const size_t GRANULE = vm_get_page_size(); - void *tmp_ptr; - - if (auxv == NULL) { - pr_error("Auxval argument NULL\n"); - return -1; - } - - if (memcmp(hdr->e_ident, ELFMAG, 4) != 0) { - /* Bad ELF header */ - pr_error("ELF header bad! (Magic incorrect)\n"); - return -1; - } - - /* Parse program headers */ - for (size_t i = 0; i < hdr->e_phnum; ++i) { - phdr = PHDR(hdr, i); - switch (phdr->p_type) { - case PT_LOAD: - if (__TEST(phdr->p_flags, PF_W)) - prot |= PROT_WRITE; - if (__TEST(phdr->p_flags, PF_X)) { - prot |= PROT_EXEC; - } - - misalign = phdr->p_vaddr & (GRANULE - 1); - page_count = __DIV_ROUNDUP(phdr->p_memsz + misalign, GRANULE); - physmem = vm_alloc_pageframe(page_count); - map_len = page_count * GRANULE; - - /* - * Now we want to compute the start address of the - * program and the end address. - */ - if (start_addr == (uintptr_t)-1) { - start_addr = phdr->p_vaddr; - } - - end_addr = __MAX(end_addr, phdr->p_vaddr + page_count*GRANULE); - - /* Do we not have enough page frames? */ - if (physmem == 0) { - pr_error("Failed to allocate physical memory\n"); - vm_free_pageframe(physmem, page_count); - return -ENOMEM; - } - - status = vm_map_create(vas, phdr->p_vaddr + load_base, physmem, prot, map_len); - - if (status != 0) { - return status; - } - - /* Now we want to copy the data */ - tmp_ptr = (void *)((uintptr_t)hdr + phdr->p_offset); - memcpy(PHYS_TO_VIRT(physmem), tmp_ptr, phdr->p_filesz); - break; - case PT_INTERP: - if (ld_path == NULL) { - break; - } - - *ld_path = dynalloc(phdr->p_filesz); - - if (ld_path == NULL) { - pr_error("Failed to allocate memory for PT_INTERP path\n"); - return -ENOMEM; - } - - memcpy(*ld_path, (char *)hdr + phdr->p_offset, phdr->p_filesz); - break; - case PT_PHDR: - auxv->at_phdr = phdr->p_vaddr + load_base; - break; - } - } - - auxv->at_entry = hdr->e_entry + load_base; - auxv->at_phent = hdr->e_phentsize; - auxv->at_phnum = hdr->e_phnum; - prog_range->start = start_addr; - prog_range->end = end_addr; - return 0; -} diff --git a/sys/kern/kern_mutex.c b/sys/kern/kern_mutex.c deleted file mode 100644 index ea770b1..0000000 --- a/sys/kern/kern_mutex.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include - -void -mutex_acquire(struct mutex *mutex) -{ - struct proc *td = this_td(); - register bool rest = (td != NULL); - - while (__atomic_test_and_set(&mutex->lock, __ATOMIC_ACQUIRE)) { - if (!rest) - continue; - - sched_rest(); - } -} - -void -mutex_release(struct mutex *mutex) -{ - __atomic_clear(&mutex->lock, __ATOMIC_RELEASE); -} diff --git a/sys/kern/kern_panic.c b/sys/kern/kern_panic.c deleted file mode 100644 index 71744af..0000000 --- a/sys/kern/kern_panic.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include - -/* - * Tells the user something terribly - * wrong happened then halting the system - * as soon as possible. - * - * XXX: There is no need to cleanup stuff here (e.g `va_list ap`) - * as we won't be returning from here anyways and the source - * of the panic could be *anywhere* so it's best not to mess with - * things. - */ -void -panic(const char *fmt, ...) -{ - va_list ap; - static struct spinlock lock = {0}; - - intr_mask(); - spinlock_acquire(&lock); /* Never released */ - __TRY_CALL(cpu_halt_others); - - g_syslog_use_tty = true; - va_start(ap, fmt); - - kprintf(OMIT_TIMESTAMP "panic: "); - vkprintf(fmt, &ap); - - machine_panic(); - __builtin_unreachable(); -} diff --git a/sys/kern/kern_reboot.c b/sys/kern/kern_reboot.c deleted file mode 100644 index 8f7c400..0000000 --- a/sys/kern/kern_reboot.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include - -int -reboot(int type) -{ - __TRY_CALL(cpu_reset); - - /* Should be unreachable if the reboot works */ - return -1; -} - -/* - * Arg0: Type - */ -uint64_t -sys_reboot(struct syscall_args *args) -{ - return reboot(args->arg0); -} diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c deleted file mode 100644 index ddc99ca..0000000 --- a/sys/kern/kern_sched.c +++ /dev/null @@ -1,490 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Thread ready queues - all threads ready to be - * scheduled should be added to the toplevel queue. - */ -static struct sched_queue qlist[SCHED_NQUEUE]; - -/* - * Global scheduler state. - */ -static size_t nthread = 0; -static schedpolicy_t policy = SCHED_POLICY_MLFQ; - -/* - * Thread queue lock - all operations to `qlist' - * must be done with this lock acquired. - * - * This lock is aligned on a cache line boundary to ensure - * it has its own cache line to reduce contention. This is - * because it is constantly acquired and released on every - * processor. - */ -__cacheline_aligned -static struct spinlock tdq_lock = {0}; - -/* - * Lower thread priority. - */ -static inline void -td_pri_lower(struct proc *td) -{ - if (td->priority < (SCHED_NQUEUE - 1)) - ++td->priority; -} - -/* - * Raise thread priority. - */ -static inline void -td_pri_raise(struct proc *td) -{ - if (td->priority > 0) - --td->priority; -} - -/* - * Called during preemption. We raise the priority - * if the thread has been rested. If the thread has not - * been rested, we lower its priority. - */ -static void -td_pri_update(struct proc *td) -{ - if (td->rested) { - td->rested = 0; - td_pri_raise(td); - return; - } - - td_pri_lower(td); -} - -/* - * Enqueue a thread into the scheduler. - */ -static void -sched_enqueue_td(struct proc *td) -{ - struct sched_queue *queue; - - spinlock_acquire(&tdq_lock); - queue = &qlist[td->priority]; - - TAILQ_INSERT_TAIL(&queue->q, td, link); - spinlock_release(&tdq_lock); -} - -/* - * Dequeue a thread from a queue. - */ -static struct proc * -sched_dequeue_td(void) -{ - struct sched_queue *queue; - struct proc *td = NULL; - - spinlock_acquire(&tdq_lock); - - /* - * Try to pop a thread from a queue. We start at the - * highest priority which is 0. - */ - for (size_t i = 0; i < SCHED_NQUEUE; ++i) { - queue = &qlist[i]; - - if (!TAILQ_EMPTY(&queue->q)) { - td = TAILQ_FIRST(&queue->q); - TAILQ_REMOVE(&queue->q, td, link); - break; - } - } - - spinlock_release(&tdq_lock); - return td; -} - -/* - * Create a new thread stack. - * sched_new_td() helper. - */ -static uintptr_t -sched_create_stack(bool is_user, struct exec_args args, struct proc *td) -{ - int status; - uintptr_t stack; - struct vm_range *stack_range; - const vm_prot_t USERSTACK_PROT = PROT_WRITE | PROT_USER; - - stack_range = &td->addr_range[ADDR_RANGE_STACK]; - - /* - * Kernel stacks can be allocated with dynalloc() as they - * are on the higher half. - */ - if (!is_user) { - stack = (uintptr_t)dynalloc(PROC_STACK_SIZE); - stack_range->start = stack; - stack_range->end = stack + PROC_STACK_SIZE; - return loader_init_stack((void *)(stack + PROC_STACK_SIZE), args); - } - - stack = vm_alloc_pageframe(PROC_STACK_PAGES); - if (stack == 0) { - return 0; - } - - status = vm_map_create(args.vas, stack, stack, USERSTACK_PROT, PROC_STACK_SIZE); - if (status != 0) { - vm_free_pageframe(stack, PROC_STACK_PAGES); - return 0; - } - - stack_range->start = stack; - stack_range->end = stack + PROC_STACK_SIZE; - - memset(USER_TO_KERN(stack), 0, PROC_STACK_SIZE); - stack = loader_init_stack((void *)USER_TO_KERN(stack + PROC_STACK_SIZE), args); - return stack; -} - -/* - * Create a new thread. - * - * @ip: Instruction pointer to start at. - * @is_user: True for user program. - * @exec_args: Common exec args. - */ -static int -sched_new_td(uintptr_t ip, bool is_user, struct exec_args args, struct vm_range *prog_range, - struct proc **res) -{ - struct vm_range *exec_range; - struct proc *td; - struct trapframe *tf; - uintptr_t stack; - int retval = 0; - - td = dynalloc(sizeof(struct proc)); - tf = dynalloc(sizeof(struct trapframe)); - if (td == NULL || tf == NULL) { - retval = -ENOMEM; - goto done; - } - - /* Keep them in a known state */ - memset(td, 0, sizeof(*td)); - memset(tf, 0, sizeof(*tf)); - - /* Try to create a stack */ - stack = sched_create_stack(is_user, args, td); - if (stack == 0) { - retval = -ENOMEM; - goto done; - } - - /* Setup initial thread state */ - td->pid = ++nthread; - td->tf = tf; - td->addrsp = args.vas; - td->is_user = is_user; - processor_init_pcb(td); - - /* Setup each mapping table */ - for (size_t i = 0; i < MTAB_ENTRIES; ++i) { - TAILQ_INIT(&td->mapspace.mtab[i]); - } - - /* Setup standard file descriptors */ - __assert(fd_alloc(td, NULL) == 0); /* STDIN */ - __assert(fd_alloc(td, NULL) == 0); /* STDOUT */ - __assert(fd_alloc(td, NULL) == 0); /* STDERR */ - - exec_range = &td->addr_range[ADDR_RANGE_EXEC]; - memcpy(exec_range, prog_range, sizeof(struct vm_range)); - - /* Init the trapframe */ - if (!is_user) { - init_frame(tf, ip, stack); - } else { - init_frame_user(tf, ip, KERN_TO_USER(stack)); - } -done: - if (retval != 0 && td != NULL) - dynfree(td); - if (retval != 0 && tf != NULL) - dynfree(td); - if (retval == 0 && res != NULL) - *res = td; - - return retval; -} - -/* - * Perform timer oneshot - * - * @now: True for shortest timeslice. - */ -static inline void -sched_oneshot(bool now) -{ - struct timer timer; - size_t usec = (now) ? SHORT_TIMESLICE_USEC : DEFAULT_TIMESLICE_USEC; - tmrr_status_t tmr_status; - - tmr_status = req_timer(TIMER_SCHED, &timer); - __assert(tmr_status == TMRR_SUCCESS); - - timer.oneshot_us(usec); -} - -/* - * Enter the schedulera and wait until - * preemption. - */ -void -sched_enter(void) -{ - sched_oneshot(false); - - for (;;) { - hint_spinwait(); - } -} - -/* - * Initialize all of the queues. - */ -static void -sched_init_queues(void) -{ - for (size_t i = 0; i < SCHED_NQUEUE; ++i) { - TAILQ_INIT(&qlist[i].q); - } -} - -/* - * Load the first thread (init) - */ -static void -sched_load_init(void) -{ - struct exec_args args; - struct proc *init; - struct auxval *auxvp = &args.auxv; - struct vm_range init_range; - int tmp; - - char *argv[] = {"/usr/sbin/init", NULL}; - char *envp[] = {NULL}; - const char *init_bin; - - if ((init_bin = initramfs_open("/usr/sbin/init")) == NULL) - panic("Could not open /usr/sbin/init\n"); - - pmap_create_vas(vm_get_ctx(), &args.vas); - args.argp = argv; - args.envp = envp; - - tmp = loader_load(args.vas, init_bin, auxvp, 0, NULL, &init_range); - if (tmp != 0) - panic("Failed to load init\n"); - - if (sched_new_td(auxvp->at_entry, true, args, &init_range, &init) != 0) - panic("Failed to create init thread\n"); - - sched_enqueue_td(init); -} - -static void -sched_destroy_td(struct proc *td) -{ - struct vm_range *stack_range; - struct vm_range *exec_range; - vm_mapq_t *mapq; - - processor_free_pcb(td); - stack_range = &td->addr_range[ADDR_RANGE_STACK]; - exec_range = &td->addr_range[ADDR_RANGE_EXEC]; - - /* - * User thread's have their stack allocated - * with vm_alloc_pageframe() and kernel thread's - * have their stacks allocated with dynalloc() - */ - if (td->is_user) { - vm_free_pageframe(stack_range->start, PROC_STACK_PAGES); - } else { - dynfree((void *)stack_range->start); - } - - for (size_t i = 0; i < MTAB_ENTRIES; ++i) { - mapq = &td->mapspace.mtab[i]; - vm_free_mapq(mapq); - } - - for (size_t i = 0; i < PROC_MAX_FDS; ++i) { - fd_close_fdnum(td, i); - } - - loader_unload(td->addrsp, exec_range); - pmap_free_vas(vm_get_ctx(), td->addrsp); - dynfree(td); -} - -/* - * Cause an early preemption and lets - * the next thread run. - */ -void -sched_rest(void) -{ - struct proc *td = this_td(); - - if (td == NULL) - return; - - td->rested = 1; - sched_oneshot(true); -} - -void -sched_exit(void) -{ - struct proc *td = this_td(); - struct vas kvas = vm_get_kvas(); - - spinlock_acquire(&tdq_lock); - intr_mask(); - - /* Switch to kernel VAS and destroy td */ - pmap_switch_vas(vm_get_ctx(), kvas); - sched_destroy_td(td); - - spinlock_release(&tdq_lock); - intr_unmask(); - sched_enter(); -} - -/* - * Get the current running thread. - */ -struct proc * -this_td(void) -{ - struct sched_state *state; - struct cpu_info *ci; - - ci = this_cpu(); - state = &ci->sched_state; - return state->td; -} - -/* - * Thread context switch routine - * - * Handles the transition from the currently running - * thread to the next thread. - */ -void -sched_context_switch(struct trapframe *tf) -{ - struct cpu_info *ci = this_cpu(); - struct sched_state *state = &ci->sched_state; - struct proc *next_td, *td = state->td; - - if (td != NULL) { - signal_handle(state->td); - } - - /* - * If a thread is currently running and our policy is - * MLFQ, then we should update the thread's priority. - */ - if (td != NULL && policy == SCHED_POLICY_MLFQ) { - td_pri_update(td); - } - - /* Don't preempt if we have no threads */ - if ((next_td = sched_dequeue_td()) == NULL) { - sched_oneshot(false); - return; - } - - /* - * If we have a thread currently running, then we should save - * its current register state and re-enqueue it. - */ - if (td != NULL) { - memcpy(td->tf, tf, sizeof(struct trapframe)); - sched_enqueue_td(td); - } - - /* Perform the switch */ - memcpy(tf, next_td->tf, sizeof(struct trapframe)); - processor_switch_to(td, next_td); - - state->td = next_td; - pmap_switch_vas(vm_get_ctx(), next_td->addrsp); - sched_oneshot(false); -} - -uint64_t -sys_exit(struct syscall_args *args) -{ - sched_exit(); - __builtin_unreachable(); -} - -void -sched_init(void) -{ - sched_init_queues(); - sched_load_init(); -} diff --git a/sys/kern/kern_signal.c b/sys/kern/kern_signal.c deleted file mode 100644 index 7c31c86..0000000 --- a/sys/kern/kern_signal.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("kern_signal"); -__KERNEL_META("$Hyra$: kern_signal.c, Ian Marco Moffett, " - "Signal handling code"); - -static void -signal_log(const char *s) -{ - vcons_putstr(&g_syslog_screen, s, strlen(s)); -} - -/* - * Handle any signals within the current thread - * - * TODO: Add sigaction support, default action - * for all currently is killing the process. - */ -void -signal_handle(struct proc *curtd) -{ - int signo = curtd->signal; - - if (signo == 0) { - return; - } - - spinlock_acquire(&curtd->lock); - curtd->signal = 0; - - switch (signo) { - case SIGFPE: - signal_log("Arithmetic error\n"); - break; - case SIGSEGV: - signal_log("Segmentation fault\n"); - break; - case SIGKILL: - signal_log("Killed\n"); - break; - } - - spinlock_release(&curtd->lock); - sched_exit(); -} - -/* - * Raise a signal for a process - * - * @to: Can be NULL to mean the current process - * @signal: Signal to send - * - * TODO: Add more functionality. - */ -void -signal_raise(struct proc *to, int signal) -{ - if (to == NULL) { - to = this_td(); - } - - to->signal = signal; - if (to == this_td()) { - /* Current process, just preempt */ - sched_context_switch(to->tf); - } -} diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c deleted file mode 100644 index d9b1b3a..0000000 --- a/sys/kern/kern_subr.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include - -/* - * Check if a user address is valid. - * - * @uaddr: User address to check. - * - * Returns true if valid, otherwise false. - */ -static bool -check_uaddr(uintptr_t uaddr) -{ - struct proc *td = this_td(); - struct vm_range exec_range = td->addr_range[ADDR_RANGE_EXEC]; - struct vm_range stack_range = td->addr_range[ADDR_RANGE_STACK]; - - if (uaddr >= exec_range.start && uaddr <= exec_range.end) { - return true; - } - if (uaddr >= stack_range.start && uaddr <= stack_range.end) { - return true; - } - - return false; -} - -/* - * Copy from userspace to the kernel. - * - * @uaddr: Userspace address. - * @kaddr: Kernelspace address. - * @len: Length of data. - */ -int -copyin(uintptr_t uaddr, void *kaddr, size_t len) -{ - if (!check_uaddr(uaddr) || !check_uaddr(uaddr + len)) { - return -EFAULT; - } - - memcpy(kaddr, (void *)uaddr, len); - return 0; -} - -/* - * Copy from the kernel to userspace. - * - * @kaddr: Kernelspace address. - * @uaddr: Userspace address. - * @len: Length of data. - */ -int -copyout(const void *kaddr, uintptr_t uaddr, size_t len) -{ - if (!check_uaddr(uaddr) || !check_uaddr(uaddr + len)) { - return -EFAULT; - } - - memcpy((void *)uaddr, kaddr, len); - return 0; -} - -/* - * Copy in a string from userspace - * - * Unlike the typical copyin(), this routine will - * copy until we've hit NUL ('\0') - * - * @uaddr: Userspace address. - * @kaddr: Kernelspace address. - * @len: Length of string. - * - * XXX: Please note that if `len' is less than the actual - * string length, the returned value will not be - * NUL terminated. - */ -int -copyinstr(uintptr_t uaddr, char *kaddr, size_t len) -{ - char *dest = (char *)kaddr; - char *src = (char *)uaddr; - - if (!check_uaddr(uaddr)) { - return -EFAULT; - } - - for (size_t i = 0; i < len; ++i) { - if (!check_uaddr(uaddr + i)) { - return -EFAULT; - } - - dest[i] = src[i]; - - if (src[i] == '\0') { - break; - } - } - - return 0; -} diff --git a/sys/kern/kern_syscall.c b/sys/kern/kern_syscall.c deleted file mode 100644 index 35185ea..0000000 --- a/sys/kern/kern_syscall.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -uint64_t(*g_syscall_table[__MAX_SYSCALLS])(struct syscall_args *args) = { - sys_exit, - sys_write, - sys_open, - sys_close, - sys_read, - sys_lseek, - sys_mmap, - sys_munmap, - sys_ioctl, - sys_execv, - sys_mount, - sys_reboot -}; diff --git a/sys/kern/kern_syslog.c b/sys/kern/kern_syslog.c deleted file mode 100644 index 86877e0..0000000 --- a/sys/kern/kern_syslog.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(__KMSG_BUF_SHIFT) -#define KMSG_BUF_SHIFT __KMSG_BUF_SHIFT -#else -#define KMSG_BUF_SHIFT 12 -#endif - -#define KMSG_BUF_SIZE (1 << KMSG_BUF_SHIFT) - -__STATIC_ASSERT(KMSG_BUF_SHIFT <= 16, "Log buffer shift too large!\n"); - -static char kmsg_buf[KMSG_BUF_SIZE]; -static size_t kmsg_buf_idx = 0; -static struct proc_entry *kmsg_proc; -static struct spinlock lock = {0}; - -struct vcons_screen g_syslog_screen = {0}; -bool g_syslog_use_tty = true; - -static inline void -kmsg_buf_putc(char c) -{ - kmsg_buf[kmsg_buf_idx++] = c; - kmsg_buf[kmsg_buf_idx] = '\0'; - if (kmsg_buf_idx >= (KMSG_BUF_SIZE - 1)) - kmsg_buf_idx = 0; -} - -static int -proc_kmsg_read(struct proc_entry *p, struct sio_txn *sio) -{ - if (sio->len > KMSG_BUF_SIZE) - sio->len = KMSG_BUF_SIZE; - - memcpy(sio->buf, kmsg_buf, sio->len); - return sio->len; -} - -static void -syslog_write(const char *s, size_t len) -{ - size_t tmp_len = len; - const char *tmp_s = s; - - while (tmp_len--) { -#if defined(__SERIAL_DEBUG) - serial_dbgch(*tmp_s); -#endif /* defined(__SERIAL_DEBUG) */ - kmsg_buf_putc(*tmp_s); - if (g_syslog_use_tty) - tty_putc(&g_root_tty, *tmp_s, TTY_SOURCE_RAW); - - ++tmp_s; - } - - tty_flush(&g_root_tty); -} - -/* - * XXX: Not serialized - */ -void -vkprintf(const char *fmt, va_list *ap) -{ - char buffer[1024] = {0}; - - vsnprintf(buffer, sizeof(buffer), fmt, *ap); - syslog_write(buffer, strlen(buffer)); -} - -void -kprintf(const char *fmt, ...) -{ - va_list ap; - char timestamp[64] = "[ 0.000000] "; - bool has_counter = true; - bool use_timestamp = true; - const char *fmt_p = fmt; - struct timer tmr = {0}; - - spinlock_acquire(&lock); - - /* - * If the first char is OMIT_TIMESTAMP, then we won't - * print out the timestamp. - */ - if (*fmt_p == OMIT_TIMESTAMP[0]) { - ++fmt_p; - use_timestamp = false; - } - - /* See if we can use the counter */ - if (req_timer(TIMER_GP, &tmr) != 0) - has_counter = false; - - /* If we can use the counter, format the timestamp */ - if (has_counter) { - if (tmr.get_time_sec != NULL && tmr.get_time_usec != NULL) - snprintf(timestamp, sizeof(timestamp), "[ %d.%06d] ", - tmr.get_time_sec(), tmr.get_time_usec()); - - } - - if (use_timestamp) { - syslog_write(timestamp, strlen(timestamp)); - } - - va_start(ap, fmt); - vkprintf(fmt_p, &ap); - va_end(ap); - - spinlock_release(&lock); -} - -void -syslog_init_proc(void) -{ - kmsg_proc = procfs_alloc_entry(); - kmsg_proc->read = proc_kmsg_read; - procfs_add_entry("kmsg", kmsg_proc); -} - -void -syslog_init(void) -{ - g_syslog_screen.bg = 0x000000; - g_syslog_screen.fg = 0x808080; - - vcons_attach(&g_syslog_screen); -} diff --git a/sys/kern/kern_timer.c b/sys/kern/kern_timer.c deleted file mode 100644 index 5cc808f..0000000 --- a/sys/kern/kern_timer.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -/* - * When a timer on the machine has been registered - * to the Hyra kernel, they'll be added to the Hyra timer - * registry. - */ -static const struct timer *tmr_registry[TIMER_ID_COUNT] = { 0 }; - -/* - * Returns true if the timer ID given - * is valid. - * - * @id: ID to verify. - */ -static inline bool -is_timer_id_valid(timer_id_t id) -{ - return id < TIMER_ID_COUNT; -} - -/* - * Adds timer on the machine to the timer registry. To be specific, - * this function writes information about the specific timer to the - * timer registry. However, it will not overwrite an entry. To do this - * you must use tmr_registry_overwrite(), of course with caution. - * - * @id: ID of timer to register. - * @tmr: Timer descriptor to register. - */ -tmrr_status_t -register_timer(timer_id_t id, const struct timer *tmr) -{ - if (!is_timer_id_valid(id)) - return TMRR_INVALID_TYPE; - - if (tmr_registry[id] != NULL) - return TMRR_HAS_ENTRY; - - tmr_registry[id] = tmr; - return TMRR_SUCCESS; -} - -/* - * Overwrites an entry within the timer registery. - * Use with caution. - * - * @id: ID of entry to overwrite. - * @tmr: Timer descriptor to write. - */ -tmrr_status_t -tmr_registry_overwrite(timer_id_t id, const struct timer *tmr) -{ - if (!is_timer_id_valid(id)) - return TMRR_INVALID_TYPE; - - tmr_registry[id] = tmr; - return TMRR_SUCCESS; -} - -/* - * Requests a specific timer descriptor - * with a specific ID. - * - * @id: ID to request. - * @tmr_out: Pointer to memory that'll hold the - * requested descriptor. - */ -tmrr_status_t -req_timer(timer_id_t id, struct timer *tmr_out) -{ - if (!is_timer_id_valid(id)) - return TMRR_INVALID_TYPE; - - if (tmr_registry[id] == NULL) - return TMRR_EMPTY_ENTRY; - - if (tmr_out == NULL) - return TMRR_INVALID_ARG; - - *tmr_out = *tmr_registry[id]; - return TMRR_SUCCESS; -} diff --git a/sys/kern/kern_tty.c b/sys/kern/kern_tty.c deleted file mode 100644 index e47c2e2..0000000 --- a/sys/kern/kern_tty.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include - -static dev_t tty_major = 0; -struct tty g_root_tty = { - .scr = &g_syslog_screen, - .ring = { - .enq_index = 0, - .deq_index = 0, - }, - .termios = { - .c_lflag = ICANON | ECHO - } -}; - -static inline dev_t -tty_alloc_id(void) -{ - static dev_t id = 1; - - return id++; -} - -static inline bool -tty_is_special(char c) -{ - return c < 0x1F; -} - -static inline void -tty_reset_ring(struct tty_ring *ring) -{ - ring->enq_index = 0; - ring->deq_index = 0; -} - -static void -tty_process(struct tty *tty, char c, bool echo) -{ - const struct termios *termios; - bool canon, special; - - termios = &tty->termios; - canon = __TEST(termios->c_lflag, ICANON); - special = tty_is_special(c); - - if (canon && special) - vcons_process_output(tty->scr, c); - if (echo && !special) - vcons_putch(tty->scr, c); -} - -/* - * Flushes the TTY ring buffer. - * - * @tty: TTY to flush. - * - * Returns number of bytes flushed. - */ -static ssize_t -__tty_flush(struct tty *tty) -{ - struct tty_ring *ring = &tty->ring; - struct tty_ring *outring = &tty->outring; - size_t count = 0; - char tmp; - - /* Do we have any data left? */ - if (ring->deq_index >= ring->enq_index) - return -EAGAIN; - - /* - * Flush the input ring to the output ring - * to allow user programs to fetch from it - * with /dev/ttyN. - */ - while (ring->deq_index < ring->enq_index) { - tmp = ring->data[ring->deq_index++]; - outring->data[outring->enq_index++] = tmp; - - if (outring->enq_index > TTY_RING_SIZE) - tty_reset_ring(outring); - - ++count; - } - - tty_reset_ring(ring); - return count; -} - -static int -tty_dev_read(struct device *dev, struct sio_txn *sio) -{ - struct tty_ring *ring = &g_root_tty.outring; - size_t len, max_len; - - spinlock_acquire(&g_root_tty.rlock); - max_len = (ring->enq_index - ring->deq_index); - len = sio->len; - - if (len > max_len) - len = max_len; - - /* - * Transfer data from the TTY ring with SIO then - * ensure the ring is clean by resetting it. - * - * TODO: As of now we are just reading the root - * TTY, add support for multiple TTYs. - */ - memcpy(sio->buf, ring->data, len); - tty_reset_ring(ring); - spinlock_release(&g_root_tty.rlock); - return len; -} - -static int -tty_dev_ioctl(struct device *dev, uint32_t cmd, uintptr_t arg) -{ - /* TODO: Support multiple TTYs */ - struct termios *tp = &g_root_tty.termios; - - switch (cmd) { - case TCGETS: - copyout(tp, arg, sizeof(struct termios)); - break; - case TCSETS: - copyin(arg, tp, sizeof(struct termios)); - break; - default: - return -EINVAL; - } - - return 0; -} - -static int -tty_dev_open(struct device *dev) -{ - /* TODO: Support multiple TTYs */ - struct tty *tty = &g_root_tty; - struct tty_ring *ring = &tty->outring; - - /* Ensure the ring is clean */ - spinlock_acquire(&tty->rlock); - tty_reset_ring(ring); - spinlock_release(&tty->rlock); - return 0; -} - -/* - * Serialized wrapper over __tty_flush() - */ -ssize_t -tty_flush(struct tty *tty) -{ - ssize_t ret; - - spinlock_acquire(&tty->rlock); - ret = __tty_flush(tty); - spinlock_release(&tty->rlock); - return ret; -} - -/* - * Write a character to a TTY - * - * @tty: TTY to write to. - * @c: Character to write. - */ -int -tty_putc(struct tty *tty, int c, int flags) -{ - struct tty_ring *ring; - const struct termios *termios; - bool canon, echo; - - ring = &tty->ring; - termios = &tty->termios; - - canon = __TEST(termios->c_lflag, ICANON); - echo = __TEST(termios->c_lflag, ECHO); - - spinlock_acquire(&tty->rlock); - ring->data[ring->enq_index++] = c; - - /* - * Process the characters for both device input - * and raw input. Device input will only be echoed - * if the ECHO bit is set within c_lflag - */ - if (__TEST(flags, TTY_SOURCE_DEV) && echo) - tty_process(tty, c, echo); - if (__TEST(flags, TTY_SOURCE_RAW)) - tty_process(tty, c, true); - - /* - * If we are in canonical mode and we have a linefeed ('\n') - * character, we should flush the ring. - */ - if (canon && c == ASCII_LF) { - __tty_flush(tty); - } - - /* - * Just flush the ring if we aren't in canonical - * mode. - */ - if (!canon) { - __tty_flush(tty); - } - - /* Reset the ring if it is full */ - if (ring->enq_index >= TTY_RING_SIZE) { - tty_reset_ring(ring); - } - - spinlock_release(&tty->rlock); - return 0; -} - -/* - * Write a string to a TTY - * - * @tty: TTY to write to. - * @s: String to write. - * @count: Number of bytes to write. - */ -int -tty_putstr(struct tty *tty, const char *s, size_t count) -{ - for (size_t i = 0; i < count; ++i) { - tty_putc(tty, *s++, TTY_SOURCE_RAW); - } - - return 0; -} - -dev_t -tty_attach(struct tty *tty) -{ - int tmp; - char devname[128]; - struct device *dev = device_alloc(); - - if (dev == NULL) - return -ENOMEM; - - /* - * Allocate a major for the driver if we don't - * have one yet. - */ - if (tty_major == 0) - tty_major = device_alloc_major(); - - /* Now try to create the device */ - tty->id = tty_alloc_id(); - if ((tmp = device_create(dev, tty_major, tty->id)) < 0) - return tmp; - - dev->read = tty_dev_read; - dev->ioctl = tty_dev_ioctl; - dev->open = tty_dev_open; - dev->blocksize = 1; - - snprintf(devname, sizeof(devname), "tty%d", tty->id); - return devfs_add_dev(devname, dev); -} diff --git a/sys/kern/vfs_init.c b/sys/kern/vfs_init.c deleted file mode 100644 index 6754b1f..0000000 --- a/sys/kern/vfs_init.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("vfs"); -__KERNEL_META("$Hyra$: vfs.c, Ian Marco Moffett, " - "Hyra Virtual File System"); - -#define INITRAMFS_ID 0 -#define DEVFS_ID 1 -#define PROCFS_ID 2 - -static struct fs_info filesystems[] = { - [INITRAMFS_ID] = { "initramfs", &g_initramfs_ops, NULL}, - [DEVFS_ID] = { "dev", &g_devfs_ops, &g_devfs_vops }, - [PROCFS_ID] = { "proc", &g_procfs_ops, &g_procfs_vops } -}; - -struct vnode *g_root_vnode = NULL; - -struct fs_info * -vfs_byname(const char *name) -{ - for (int i = 0; i < __ARRAY_COUNT(filesystems); ++i) { - if (strcmp(filesystems[i].name, name) == 0) { - return &filesystems[i]; - } - } - - return NULL; -} - -void -vfs_init(void) -{ - struct fs_info *info; - struct vfsops *vfsops; - - vfs_mount_init(); - __assert(vfs_alloc_vnode(&g_root_vnode, NULL, VDIR) == 0); - - for (int i = 0; i < __ARRAY_COUNT(filesystems); ++i) { - info = &filesystems[i]; - vfsops = info->vfsops; - - __assert(vfsops->init != NULL); - __assert(vfs_mount(info->name, 0, info) == 0); - vfsops->init(info, NULL); - } - - g_root_vnode->vops = &g_initramfs_vops; - g_root_vnode->fs = &filesystems[INITRAMFS_ID]; -} diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c deleted file mode 100644 index ea73d1a..0000000 --- a/sys/kern/vfs_lookup.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include - -/* - * Fetches the filename within a path at - * the nth index denoted by `idx' - * - * Returns memory allocated by dynalloc() - * containing the filename. - * - * XXX: MUST FREE RETURN VALUE WITH dynfree() WHEN - * DONE! - */ -char * -vfs_get_fname_at(const char *path, size_t idx) -{ - size_t pathlen = strlen(path); - size_t fname_len; - - char *path_tmp = dynalloc(pathlen + 2); - char *ret = NULL; - char *start_ptr, *ptr; - - /* Make one-based */ - ++idx; - - if (path_tmp == NULL) { - return NULL; - } - - ptr = path_tmp; - memcpy(path_tmp, path, pathlen + 1); - - /* - * We want to by default have a '/' at the end - * to keep the parsing logic from getting more - * complicated than it needs to be. - */ - path_tmp[pathlen] = '/'; - path_tmp[pathlen + 1] = '\0'; - - /* Skip any leading slashes */ - while (*ptr == '/') - ++ptr; - - start_ptr = ptr; - - /* Get each filename */ - while (*ptr != '\0') { - /* Handle duplicate delimiter */ - if (*ptr == '/' && *(ptr + 1) == '/') { - /* - * Snip this delimiter and skip, the next - * will be read and filename returned (if of course - * the index is reached). - */ - *(ptr++) = '\0'; - continue; - } - - if (*ptr == '/') { - *(ptr++) = '\0'; - - /* Continue if index not reached */ - if ((--idx) != 0) { - start_ptr = ptr; - continue; - } - - /* Index has been reached, start_ptr contains name */ - fname_len = strlen(start_ptr); - ret = dynalloc(fname_len + 1); - - if (ret != NULL) { - memcpy(ret, start_ptr, fname_len + 1); - } - break; - } - - ++ptr; - } - - dynfree(path_tmp); - return ret; -} - -/* - * Fetches a vnode from a path. - * - * @path: Path to fetch vnode from. - * @vp: Output var for fetched vnode. - * - * Returns 0 on success. - */ -int -vfs_path_to_node(const char *path, struct vnode **vp) -{ - struct vnode *vnode = g_root_vnode; - struct mount *mp; - struct fs_info *fs; - char *name; - int s = 0, fs_caps = 0; - - if (strcmp(path, "/") == 0 || !vfs_is_valid_path(path)) { - return -EINVAL; - } else if (*path != '/') { - return -EINVAL; - } - - /* See if we have a mountpoint with this name */ - name = vfs_get_fname_at(path, 0); - if (vfs_get_mp(name, &mp) == 0) { - fs = mp->fs; - vnode = fs->vnode; - } - - /* Fetch filesystem capabilities if we can */ - if (vnode->fs != NULL) { - fs = vnode->fs; - fs_caps = fs->caps; - } - - /* - * If the filesystem requires full-path lookups, we can try - * throwing the full path at the filesystem to see if - * it'll give us a vnode. - */ - if (__TEST(fs_caps, FSCAP_FULLPATH)) { - s = vfs_vget(vnode, path, &vnode); - goto done; - } - - for (size_t i = 1;; ++i) { - name = vfs_get_fname_at(path, i); - if (name == NULL) break; - - s = vfs_vget(vnode, name, &vnode); - dynfree(name); - - if (s != 0) break; - } - -done: - if (vp != NULL && s == 0) { - *vp = vnode; - } - - return s; -} diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c deleted file mode 100644 index 27d0ec3..0000000 --- a/sys/kern/vfs_mount.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include - -/* TODO: Make this more flexible */ -#define MOUNTLIST_SIZE 8 - -/* Mountlist entry */ -struct mountlist_entry { - TAILQ_HEAD(, mount) buckets; -}; - -static struct mountlist_entry *mountlist = NULL; - -static int -vfs_create_mp(const char *path, int mntflags, struct mount **mp_out) -{ - struct mount *mp; - - mp = dynalloc(sizeof(struct mount)); - if (mp == NULL) { - return -ENOMEM; - } - - mp->flags = mntflags; - *mp_out = mp; - return 0; -} - -static int -mount(const char *source, const char *target, const char *filesystemtype, - unsigned long mountflags, const void *data) -{ - struct vnode *source_vnode; - struct fs_info *info; - int status; - - if (source == NULL || target == NULL || filesystemtype == NULL) - return -EFAULT; - - /* - * Check mount flags. - * - * XXX: No flags implemented yet. - */ - if (mountflags != 0) - return -EINVAL; - - /* Locate source, if any */ - if (strcmp(source, "none") == 0) { - source_vnode = NULL; - } else { - status = vfs_path_to_node(source, &source_vnode); - if (status != 0) - return status; - } - - /* Locate filesystem */ - info = vfs_byname(filesystemtype); - if (info == NULL) - return -ENODEV; - - /* Create mount point */ - status = vfs_mount(target, 0, info); - if (status != 0) - return status; - - /* Initialize filesystem if needed */ - if (info->vfsops->init != NULL) - return info->vfsops->init(info, source_vnode); - - return 0; -} - -/* - * Mount a mountpoint - * - * @path: Path this mountpoint belongs to - * @mntflags: Flags to mount with - * @fs: Filesystem to mount - * - * If this mount entry already exists, -EEXIST - * will be returned. - */ -int -vfs_mount(const char *path, int mntflags, struct fs_info *fs) -{ - size_t hash; - int status; - struct mountlist_entry *entry; - struct mount *mp; - - /* Exclude leading slash */ - if (*path == '/') { - ++path; - } - - hash = vfs_hash_path(path); - - if ((status = vfs_create_mp(path, mntflags, &mp)) != 0) { - return status; - } - - if (hash == -1) { - /* Something is wrong with the path */ - return -EINVAL; - } - - if (vfs_get_mp(path, NULL) == 0) { - /* mount hit, do not duplicate this entry */ - return -EEXIST; - } - - if ((status = vfs_alloc_vnode(&fs->vnode, mp, VDIR)) != 0) { - return status; - } - - mp->phash = hash; - mp->fs = fs; - fs->vnode->vops = fs->vops; - - entry = &mountlist[hash % MOUNTLIST_SIZE]; - TAILQ_INSERT_TAIL(&entry->buckets, mp, link); - return 0; -} - -/* - * Fetch mountpoint - * - * @path: Path of target mountpoint - * @mp: Pointer of variable where mountpoint fetched will - * be stored - * - * Returns 0 upon a mplist hit, on a mplist miss this - * function returns -ENOENT. - */ -int -vfs_get_mp(const char *path, struct mount **mp) -{ - size_t hash; - struct mountlist_entry *entry; - struct mount *mount_iter; - - /* Exclude leading slash */ - if (*path == '/') { - ++path; - } - - hash = vfs_hash_path(path); - - if (hash == 0) { - /* Something is wrong with the path */ - return -EINVAL; - } - - entry = &mountlist[hash % MOUNTLIST_SIZE]; - TAILQ_FOREACH(mount_iter, &entry->buckets, link) { - if (mount_iter->phash == hash) { - if (mp != NULL) *mp = mount_iter; - return 0; - } - } - - return -ENOENT; -} - -void -vfs_mount_init(void) -{ - mountlist = dynalloc(sizeof(struct mountlist_entry) * MOUNTLIST_SIZE); - __assert(mountlist != NULL); - - for (size_t i = 0; i < MOUNTLIST_SIZE; ++i) { - TAILQ_INIT(&mountlist[i].buckets); - } -} - -uint64_t -sys_mount(struct syscall_args *args) -{ - return mount((void *)args->arg0, (void *)args->arg1, (void *)args->arg2, - (unsigned long)args->arg3, (void *)args->arg4); -} diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c deleted file mode 100644 index 60afa31..0000000 --- a/sys/kern/vfs_subr.c +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include - -/* FNV-1a defines */ -#define FNV_OFFSET 14695981039346656037ULL -#define FNV_PRIME 1099511628211ULL - -/* - * FNV-1a hash function - * https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function - */ -static size_t -vfs_hash(const char *data) -{ - size_t hash = FNV_OFFSET; - const char *p = data; - - while (*p) { - hash ^= (size_t)(uint8_t)(*p); - hash *= FNV_PRIME; - ++p; - } - - return hash; -} - -/* - * Hashes a path - * - * @path: Path to hash. - * - * Returns -1 on failure, >= 0 return values - * are valid. - */ -ssize_t -vfs_hash_path(const char *path) -{ - char *name = NULL; - size_t i = 0, hash = 0; - - if (strcmp(path, "/") == 0 || !vfs_is_valid_path(path)) { - return -1; - } - - do { - name = vfs_get_fname_at(path, i++); - if (name != NULL) { - hash += vfs_hash(name); - dynfree(name); - } - } while (name != NULL); - - return hash; -} - - -/* - * This function checks if a path is valid. - * - * @path: Path to check. - * - * Returns true if valid, otherwise false. - */ -bool -vfs_is_valid_path(const char *path) -{ - const char *ptr = path; - char c; - - while (*ptr != '\0') { - c = *(ptr++); - switch (c) { - case '/': - case '-': - case '_': - case '.': - /* Valid char, can continue */ - continue; - default: - /* - * This could be an alphabetical or "numeric" char which - * is valid. We want to handle this too. To make things - * easier we'll OR the char by 0x20 to convert it to - * lowercase if it is alphabetical. - */ - c |= 0x20; - if (c >= 'a' && c <= 'z') - continue; - else if (c >= '0' && c <= '9') - continue; - - /* We got an invalid char */ - return false; - } - } - - return true; -} - -/* - * Allocates a vnode - * - * @vnode: Pointer to vnode pointer where newly allocated - * vnode will be stored. - * - * @mp: Mountpoint this vnode is associated with. - * @type: Vnode type. - * - * This function will return 0 upon success and < 0 on failure. - */ -int -vfs_alloc_vnode(struct vnode **vnode, struct mount *mp, int type) -{ - struct vnode *new_vnode = dynalloc(sizeof(struct vnode)); - - if (new_vnode == NULL) { - return -ENOMEM; - } - - memset(new_vnode, 0, sizeof(struct vnode)); - new_vnode->type = type; - new_vnode->mp = mp; - - *vnode = new_vnode; - return 0; -} - -/* - * Returns the rootname of a path - * For example, "/foo/bar/" will be "foo" and - * "/foo/bar/baz" will also be "foo" - * - * There will be no slashes in the returned string - * unless "/" is passed. - * - * XXX: Returns memory allocated by dynalloc, - * remember to free the memory with dynfree() - * - * @path: Path to get rootname of - * @new_path: New path will be placed here. - */ -int -vfs_rootname(const char *path, char **new_path) -{ - char *tmp = NULL; - const char *ptr = path; - size_t len = 0; - - if (!vfs_is_valid_path(path)) { - *new_path = NULL; - return -EINVAL; - } - - if (*path == '/') { - /* Skip first '/' */ - ++ptr; - ++path; - } - - for (; *ptr != '\0' && *ptr != '/'; ++ptr) { - if (*ptr == '/') { - break; - } - ++len; - } - - tmp = dynalloc(sizeof(char) * len + 1); - if (tmp == NULL) { - *new_path = NULL; - return -ENOMEM; - } - - if (len == 0) { - /* Handle input that is just "/" */ - tmp[0] = '/'; - tmp[1] = '\0'; - } else { - memcpy(tmp, path, len + 2); - } - - *new_path = tmp; - return 0; -} - - -int -vfs_vget(struct vnode *parent, const char *name, struct vnode **vp) -{ - return parent->vops->vget(parent, name, vp); -} - -ssize_t -vfs_read(struct vnode *vp, struct sio_txn *sio) -{ - return vp->vops->read(vp, sio); -} - -ssize_t -vfs_write(struct vnode *vp, struct sio_txn *sio) -{ - return vp->vops->write(vp, sio); -} - -int -vfs_getattr(struct vnode *vp, struct vattr *vattr) -{ - return vp->vops->getattr(vp, vattr); -} - -int vfs_open(struct vnode *vp) -{ - if (vp->vops->open == NULL) - return -EIO; - - return vp->vops->open(vp); -} - -int -vfs_close(struct vnode *vp) -{ - if (vp->vops->close == NULL) - return -EIO; - - return vp->vops->close(vp); -} diff --git a/sys/lib/logo.c b/sys/lib/logo.c deleted file mode 100644 index 051d597..0000000 --- a/sys/lib/logo.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -/* - * Ascii art logo. - */ - -uint8_t g_logo[] = { - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x38, 0x38, 0x20, 0x60, 0x38, 0x2E, 0x60, - 0x38, 0x38, 0x38, 0x38, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2C, 0x38, 0x27, 0x20, 0x38, - 0x20, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x6F, 0x2E, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2E, 0x38, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x38, 0x38, 0x38, 0x20, 0x20, 0x60, 0x38, 0x2E, 0x60, 0x38, 0x38, 0x38, - 0x38, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x2C, 0x38, 0x27, 0x20, 0x20, 0x38, 0x20, 0x38, 0x38, 0x38, - 0x38, 0x20, 0x20, 0x20, 0x20, 0x60, 0x38, 0x38, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2E, 0x38, 0x38, 0x38, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x60, 0x38, 0x2E, 0x60, 0x38, 0x38, 0x38, 0x38, 0x2E, 0x20, - 0x20, 0x2C, 0x38, 0x27, 0x20, 0x20, 0x20, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x60, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x38, 0x20, - 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x38, 0x38, 0x20, - 0x20, 0x20, 0x20, 0x60, 0x38, 0x2E, 0x60, 0x38, 0x38, 0x38, 0x38, 0x2E, 0x2C, 0x38, 0x27, 0x20, - 0x20, 0x20, 0x20, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2C, 0x38, - 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2E, 0x20, 0x60, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x60, 0x38, 0x2E, 0x60, 0x38, 0x38, 0x38, 0x38, 0x38, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, - 0x20, 0x38, 0x38, 0x38, 0x38, 0x2E, 0x20, 0x20, 0x20, 0x2C, 0x38, 0x38, 0x27, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2E, 0x38, 0x2E, 0x20, 0x60, 0x38, 0x38, 0x38, 0x38, 0x38, 0x2E, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x38, 0x2E, - 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x20, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x50, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2E, - 0x38, 0x60, 0x38, 0x2E, 0x20, 0x60, 0x38, 0x38, 0x38, 0x38, 0x38, 0x2E, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x38, 0x20, 0x38, 0x38, 0x38, - 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x60, 0x38, 0x62, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2E, 0x38, 0x27, 0x20, 0x60, 0x38, - 0x2E, 0x20, 0x60, 0x38, 0x38, 0x38, 0x38, 0x38, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x38, 0x20, - 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x38, 0x38, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x60, 0x38, 0x62, 0x2E, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x2E, 0x38, 0x27, 0x20, 0x20, 0x20, 0x60, 0x38, 0x2E, 0x20, 0x60, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x2E, 0x20, 0x20, 0x20, 0x0A, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, - 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x60, 0x38, 0x62, 0x2E, 0x20, 0x20, 0x20, 0x20, - 0x2E, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x2E, 0x20, 0x60, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x2E, 0x20, 0x20, 0x0A, 0x38, 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, - 0x20, 0x38, 0x38, 0x38, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x20, 0x38, 0x38, 0x38, - 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x38, 0x38, 0x2E, 0x20, 0x2E, 0x38, 0x27, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x38, 0x2E, 0x20, 0x60, 0x38, 0x38, 0x38, 0x38, 0x38, 0x2E, - 0x20, 0x00 -}; diff --git a/sys/lib/string/itoa.c b/sys/lib/string/itoa.c deleted file mode 100644 index 01e2fef..0000000 --- a/sys/lib/string/itoa.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -static char *itoa_base10_convert(int64_t value, char *buf); - -static char * -itoa_base10_convert(int64_t value, char *buf) -{ - size_t i; - uint8_t tmp; - bool is_negative; - - i = 0; - is_negative = false; - - if (value == 0) { - buf[i++] = '0'; - buf[i++] = '\0'; - return buf; - } - - if (value < 0) { - /* Easier to handle positive numbers */ - value *= -1; - is_negative = true; - } - - while (value > 0) { - buf[i++] = '0' + (value % 10); - value /= 10; - } - - if (is_negative) { - buf[i++] = '-'; - } - - buf[i--] = '\0'; - - /* Result is in reverse */ - for (int j = 0; j < i; ++j, --i) { - tmp = buf[j]; - buf[j] = buf[i]; - buf[i] = tmp; - } - - return buf; -} - -static char * -itoa_convert_base16(uint64_t n, char *buffer) -{ - bool pad; - uint8_t nibble; - uint8_t i, j, tmp; - const char *ascii_nums = "0123456789ABCDEF"; - - i = 0; - pad = false; - - if (n == 0) { - /* Zero, no need to parse */ - memcpy(buffer, "0x00\0", 5); - return buffer; - } - /* If one digit, pad out 2 later */ - if (n < 0x10) { - pad = true; - } - - while (n > 0) { - nibble = (uint8_t)n & 0x0F; - nibble = ascii_nums[nibble]; - buffer[i++] = nibble; - n >>= 4; /* Fetch next nibble */ - } - - if (pad) { - buffer[i++] = '0'; - } - - /* Add "0x" prefix */ - buffer[i++] = 'x'; - buffer[i++] = '0'; - buffer[i--] = '\0'; - - /* Unreverse the result */ - for (j = 0; j < i; ++j, --i) { - tmp = buffer[j]; - buffer[j] = buffer[i]; - buffer[i] = tmp; - } - return buffer; -} - -char * -itoa(int64_t value, char *buf, int base) -{ - switch (base) { - case 10: - return itoa_base10_convert(value, buf); - case 16: - return itoa_convert_base16(value, buf); - default: - return NULL; - } -} diff --git a/sys/lib/string/memcmp.c b/sys/lib/string/memcmp.c deleted file mode 100644 index 6e95aa8..0000000 --- a/sys/lib/string/memcmp.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2023-2024 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. - */ -/* $Id */ - -#include - -int -memcmp(const void *s1, const void *s2, size_t n) -{ - if (n != 0) { - const unsigned char *p1 = s1, *p2 = s2; - - do { - if (*p1++ != *p2++) { - return (*--p1 - *--p2); - } - } while (--n != 0); - } - return 0; -} diff --git a/sys/lib/string/memcpy.c b/sys/lib/string/memcpy.c deleted file mode 100644 index 09cb90e..0000000 --- a/sys/lib/string/memcpy.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -void * -memcpy(void *dest, const void *src, size_t n) -{ - for (size_t i = 0; i < n; ++i) { - ((char *)dest)[i] = ((char *)src)[i]; - } - - return dest; -} - -void * -memcpy32(void *dest, const void *src, size_t n) -{ - for (size_t i = 0; i < n; ++i) { - ((uint32_t *)dest)[i] = ((uint32_t *)src)[i]; - } - - return dest; -} diff --git a/sys/lib/string/memmove.c b/sys/lib/string/memmove.c deleted file mode 100644 index ea5cad2..0000000 --- a/sys/lib/string/memmove.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -void * -memmove(void *s1, const void *s2, size_t n) -{ - const char *f = s2; - char *t = s1; - - if (f < t) { - f += n; - t += n; - while (n-- > 0) - *--t = *--f; - } else { - while (n-- > 0) - *t++ = *f++; - } - - return s1; -} diff --git a/sys/lib/string/memset.c b/sys/lib/string/memset.c deleted file mode 100644 index 4e92cc6..0000000 --- a/sys/lib/string/memset.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -void * -memset(void *s, int c, size_t n) -{ - for (size_t i = 0; i < n; ++i) { - ((char *)s)[i] = c; - } - - return s; -} - -void * -memset64(void *s, int c, size_t n) -{ - for (size_t i = 0; i < n; ++i) { - ((uint32_t *)s)[i] = c; - } - - return s; -} diff --git a/sys/lib/string/strcmp.c b/sys/lib/string/strcmp.c deleted file mode 100644 index 4648f32..0000000 --- a/sys/lib/string/strcmp.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -int -strcmp(const char *s1, const char *s2) -{ - while (*s1 == *s2++) - if (*s1++ == 0) - return (0); - return (*(unsigned char *)s1 - *(unsigned char *)--s2); -} diff --git a/sys/lib/string/strlen.c b/sys/lib/string/strlen.c deleted file mode 100644 index 85ccf23..0000000 --- a/sys/lib/string/strlen.c +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - -size_t -strlen(const char *s) -{ - size_t len; - - len = 0; - while (s[len++]); - return len - 1; -} diff --git a/sys/lib/string/vsnprintf.c b/sys/lib/string/vsnprintf.c deleted file mode 100644 index b8a4faa..0000000 --- a/sys/lib/string/vsnprintf.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include - -static inline void -printc(char *buf, size_t size, size_t *off, char c) -{ - if (*off < size - 1) { - buf[(*off)++] = c; - } - buf[*off] = 0; -} - -static void -printstr(char *buf, size_t size, size_t *off, const char *s) -{ - while (*off < size - 1 && *s != '\0') { - buf[(*off)++] = *(s)++; - } - buf[*off] = 0; -} - -int -snprintf(char *s, size_t size, const char *fmt, ...) -{ - va_list ap; - int ret; - - va_start(ap, fmt); - ret = vsnprintf(s, size, fmt, ap); - va_end(ap); - return ret; -} - -int -vsnprintf(char *s, size_t size, const char *fmt, va_list ap) -{ - size_t tmp_len, num_len, off = 0; - ssize_t num = 0; - char c, c1, num_buf[256] = {0}; - const char *tmp_str; - uint8_t pad_width = 0; - - while (off < (size - 1)) { - while (*fmt && *fmt != '%') { - printc(s, size, &off, *fmt++); - } - if (*(fmt)++ == '\0' || off == size - 1) { - return off; - } - - /* - * Handle a case where we have "%0N". For example: - * "%04d" - */ - if (*fmt == '0') { - ++fmt; - while (*fmt >= '0' && *fmt <= '9') { - pad_width = pad_width * 10 + (*fmt - '0'); - ++fmt; - } - } - - c = *fmt++; - switch (c) { - case 'c': - c1 = (char )va_arg(ap, int); - printc(s, size, &off, c1); - break; - case 'd': - num = va_arg(ap, int); - itoa(num, num_buf, 10); - - if (pad_width > 0) { - num_len = strlen(num_buf); - for (size_t i = num_len; i < pad_width; ++i) - printc(s, size, &off, '0'); - } - printstr(s, size, &off, num_buf); - break; - case 'p': - num = va_arg(ap, uint64_t); - itoa(num, num_buf, 16); - tmp_len = strlen(num_buf); - /* - * Now we pad this. - * - * XXX TODO: This assumes 64-bits, should be - * cleaned up. - */ - for (size_t i = 0; i < 18 - tmp_len; ++i) { - printc(s, size, &off, '0'); - } - printstr(s, size, &off, num_buf + 2); - break; - case 'x': - num = va_arg(ap, uint64_t); - itoa(num, num_buf, 16); - tmp_len = strlen(num_buf); - printstr(s, size, &off, num_buf + 2); - break; - case 's': - tmp_str = va_arg(ap, const char *); - printstr(s, size, &off, tmp_str); - break; - } - } - - return 0; -} diff --git a/sys/lib/sysfont.c b/sys/lib/sysfont.c deleted file mode 100644 index e5ae2aa..0000000 --- a/sys/lib/sysfont.c +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 - - -const uint8_t DEFAULT_FONT_DATA[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x81, 0x81, 0xa5, 0xa5, 0x81, - 0x81, 0xa5, 0x99, 0x81, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0xff, - 0xff, 0xdb, 0xdb, 0xff, 0xff, 0xdb, 0xe7, 0xff, 0x7e, 0x3c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, - 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x3c, 0x3c, 0xdb, 0xff, 0xff, 0xdb, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0xff, 0x66, 0x18, 0x18, - 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, - 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc, 0x84, 0x84, 0xcc, 0x78, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, - 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1e, - 0x0e, 0x1e, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0xfc, 0x30, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x1c, 0x1e, 0x16, 0x12, - 0x10, 0x10, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x2c, - 0x26, 0x32, 0x3a, 0x2e, 0x26, 0x22, 0x62, 0xe2, 0xc6, 0x0e, 0x0c, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf8, 0xfe, - 0xf8, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x06, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x78, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x78, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb, - 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, - 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, - 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x78, 0x30, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x78, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0xfc, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x0c, 0xfe, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0xfe, 0x60, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x24, 0x66, 0xff, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, - 0x38, 0x38, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x78, 0x78, 0x78, 0x78, 0x30, 0x30, 0x30, 0x00, 0x30, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, - 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xc6, 0x7c, - 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x0c, 0x0c, 0x18, 0x38, - 0x30, 0x60, 0x60, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, - 0x6c, 0x38, 0x30, 0x76, 0xde, 0xcc, 0xcc, 0xde, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0xfe, 0x38, 0x6c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, - 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, - 0x0c, 0x0c, 0x18, 0x38, 0x30, 0x60, 0x60, 0xc0, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xc6, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, - 0x06, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0x06, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, - 0xfe, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, - 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3c, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, - 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, - 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x00, 0x30, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde, - 0xde, 0xde, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, - 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, - 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc, - 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xcc, 0xf8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, - 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, - 0xc0, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, - 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c, - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc6, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, - 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, - 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, - 0xee, 0xfe, 0xd6, 0xd6, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc6, 0xc6, 0xe6, 0xe6, 0xf6, 0xde, 0xce, 0xce, 0xc6, 0xc6, - 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, - 0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xf6, 0xda, - 0x6c, 0x06, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, - 0xd8, 0xcc, 0xcc, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, - 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, - 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c, - 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x38, - 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfe, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc0, 0xc0, - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, - 0x60, 0x60, 0x30, 0x38, 0x18, 0x0c, 0x0c, 0x06, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x06, 0x06, - 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, - 0xc0, 0xdc, 0xe6, 0xc6, 0xc6, 0xc6, 0xc6, 0xe6, 0xdc, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x76, 0xce, 0xc6, - 0xc6, 0xc6, 0xc6, 0xce, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xce, 0xc6, - 0xc6, 0xc6, 0xce, 0x76, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0xc0, 0xc0, - 0xc0, 0xdc, 0xe6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1e, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0xc0, 0xc0, - 0xc0, 0xc6, 0xcc, 0xd8, 0xf0, 0xf0, 0xd8, 0xcc, 0xc6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, - 0xd6, 0xd6, 0xd6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xdc, 0xe6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xe6, 0xc6, - 0xc6, 0xc6, 0xe6, 0xdc, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xce, 0xc6, 0xc6, 0xc6, 0xce, 0x76, 0x06, 0x06, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xe6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, - 0x70, 0x1c, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, - 0x30, 0xfe, 0x30, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, - 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, - 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, - 0xc6, 0xc6, 0xce, 0x76, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xfe, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xfe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1c, 0x30, 0x30, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x30, 0x30, - 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x30, - 0x30, 0x30, 0x30, 0x1c, 0x30, 0x30, 0x30, 0x30, 0xe0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x6c, - 0x6c, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, - 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x18, 0xcc, 0x78, 0x00, - 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6, - 0xfe, 0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, - 0x00, 0x7c, 0x06, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0x06, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, - 0x7e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0x06, 0x06, - 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, - 0x00, 0x7c, 0x06, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc6, - 0x7c, 0x18, 0x0c, 0x38, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, - 0xfe, 0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, - 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0xc0, - 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x38, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, - 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x3c, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, - 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, - 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, - 0x18, 0x30, 0x60, 0x00, 0xfe, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x36, 0x36, - 0x76, 0xde, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x3c, - 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, - 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, - 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xc6, 0xc6, 0xc6, - 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, - 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0x76, 0x06, 0xc6, 0x7c, 0x00, - 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, - 0x30, 0x78, 0xcc, 0xc0, 0xc0, 0xcc, 0x78, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x6c, 0x60, 0x60, 0x60, 0xf8, 0x60, 0x60, 0x60, 0xe6, - 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0xfc, - 0x30, 0xfc, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc, - 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, - 0x18, 0xd8, 0x70, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0x06, 0x06, - 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, - 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0xc6, 0xc6, 0xc6, - 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, - 0x00, 0xdc, 0xe6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, - 0x76, 0xdc, 0x00, 0xc6, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, - 0xc6, 0x00, 0x00, 0x00, 0x00, 0x78, 0xd8, 0xd8, 0x6c, 0x00, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, - 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xc6, - 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfe, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc2, 0xc6, 0xcc, 0xd8, 0x30, 0x60, 0xdc, 0x86, 0x0c, - 0x18, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0xc6, 0xcc, 0xd8, 0x30, - 0x66, 0xce, 0x9e, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, - 0x00, 0x30, 0x30, 0x30, 0x78, 0x78, 0x78, 0x78, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, - 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x88, 0x22, 0x88, - 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, - 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, - 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, - 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18, - 0x18, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0xf6, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x18, - 0x18, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, - 0x36, 0xf6, 0xf6, 0x06, 0x06, 0xf6, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x06, - 0x06, 0xf6, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0xf6, 0xf6, 0x06, 0x06, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0xfe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18, - 0x18, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x18, 0x18, 0x1f, 0x1f, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, - 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x37, 0x37, 0x30, 0x30, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x30, 0x30, 0x37, 0x37, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0xf7, 0x00, - 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x30, 0x30, 0x37, 0x37, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, - 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, - 0x36, 0xf7, 0xf7, 0x00, 0x00, 0xf7, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, - 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x1f, 0x1f, 0x18, 0x18, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x18, 0x18, 0x1f, 0x1f, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0xff, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0xff, 0xff, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, - 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, - 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xd6, 0xdc, 0xc8, 0xc8, 0xdc, 0xd6, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xd8, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, - 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7e, 0xfe, 0x24, 0x24, 0x24, 0x24, 0x66, 0xc6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfe, 0xfe, 0xc2, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc2, 0xfe, - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc8, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x76, 0x6c, 0x60, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0xfc, 0x98, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x30, 0x30, 0x78, 0xcc, 0xcc, - 0xcc, 0x78, 0x30, 0x30, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, - 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, - 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc, 0x60, 0x30, 0x78, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x76, 0xbb, 0x99, 0x99, 0xdd, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x06, 0x3c, 0x6c, 0xce, 0xd6, 0xd6, 0xe6, 0x6c, 0x78, - 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x60, 0xc0, 0xc0, 0xfe, - 0xc0, 0xc0, 0x60, 0x30, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, - 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0xfc, - 0x30, 0x30, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00, 0xfc, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00, - 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x36, 0x36, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0xfc, 0x00, 0x30, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, - 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc, 0xcc, - 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c, - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0x6c, 0x3c, 0x1c, 0x0c, 0x00, 0x00, - 0x00, 0xd8, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x0c, 0x18, 0x30, 0x60, 0x7c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 -}; diff --git a/sys/vm/tlsf.c b/sys/vm/tlsf.c deleted file mode 100644 index d4a6ddf..0000000 --- a/sys/vm/tlsf.c +++ /dev/null @@ -1,1264 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#define printf kprintf - -#if defined(__cplusplus) -#define tlsf_decl inline -#else -#define tlsf_decl static -#endif - -/* -** Architecture-specific bit manipulation routines. -** -** TLSF achieves O(1) cost for malloc and free operations by limiting -** the search for a free block to a free list of guaranteed size -** adequate to fulfill the request, combined with efficient free list -** queries using bitmasks and architecture-specific bit-manipulation -** routines. -** -** Most modern processors provide instructions to count leading zeroes -** in a word, find the lowest and highest set bit, etc. These -** specific implementations will be used when available, falling back -** to a reasonably efficient generic implementation. -** -** NOTE: TLSF spec relies on ffs/fls returning value 0..31. -** ffs/fls return 1-32 by default, returning 0 for error. -*/ - -/* -** Detect whether or not we are building for a 32- or 64-bit (LP/LLP) -** architecture. There is no reliable portable method at compile-time. -*/ -#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \ - || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__) -#define TLSF_64BIT -#endif - -/* -** gcc 3.4 and above have builtin support, specialized for architecture. -** Some compilers masquerade as gcc; patchlevel test filters them out. -*/ -#if defined (__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \ - && defined (__GNUC_PATCHLEVEL__) - -#if defined (__SNC__) -/* SNC for Playstation 3. */ - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - const unsigned int reverse = word & (~word + 1); - const int bit = 32 - __builtin_clz(reverse); - return bit - 1; -} - -#else - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - return __builtin_ffs(word) - 1; -} - -#endif - -tlsf_decl int tlsf_fls(unsigned int word) -{ - const int bit = word ? 32 - __builtin_clz(word) : 0; - return bit - 1; -} - -#elif defined (_MSC_VER) && (_MSC_VER >= 1400) && (defined (_M_IX86) || defined (_M_X64)) -/* Microsoft Visual C++ support on x86/X64 architectures. */ - -#include - -#pragma intrinsic(_BitScanReverse) -#pragma intrinsic(_BitScanForward) - -tlsf_decl int tlsf_fls(unsigned int word) -{ - unsigned long index; - return _BitScanReverse(&index, word) ? index : -1; -} - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - unsigned long index; - return _BitScanForward(&index, word) ? index : -1; -} - -#elif defined (_MSC_VER) && defined (_M_PPC) -/* Microsoft Visual C++ support on PowerPC architectures. */ - -#include - -tlsf_decl int tlsf_fls(unsigned int word) -{ - const int bit = 32 - _CountLeadingZeros(word); - return bit - 1; -} - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - const unsigned int reverse = word & (~word + 1); - const int bit = 32 - _CountLeadingZeros(reverse); - return bit - 1; -} - -#elif defined (__ARMCC_VERSION) -/* RealView Compilation Tools for ARM */ - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - const unsigned int reverse = word & (~word + 1); - const int bit = 32 - __clz(reverse); - return bit - 1; -} - -tlsf_decl int tlsf_fls(unsigned int word) -{ - const int bit = word ? 32 - __clz(word) : 0; - return bit - 1; -} - -#elif defined (__ghs__) -/* Green Hills support for PowerPC */ - -#include - -tlsf_decl int tlsf_ffs(unsigned int word) -{ - const unsigned int reverse = word & (~word + 1); - const int bit = 32 - __CLZ32(reverse); - return bit - 1; -} - -tlsf_decl int tlsf_fls(unsigned int word) -{ - const int bit = word ? 32 - __CLZ32(word) : 0; - return bit - 1; -} - -#else -/* Fall back to generic implementation. */ - -tlsf_decl int tlsf_fls_generic(unsigned int word) -{ - int bit = 32; - - if (!word) bit -= 1; - if (!(word & 0xffff0000)) { word <<= 16; bit -= 16; } - if (!(word & 0xff000000)) { word <<= 8; bit -= 8; } - if (!(word & 0xf0000000)) { word <<= 4; bit -= 4; } - if (!(word & 0xc0000000)) { word <<= 2; bit -= 2; } - if (!(word & 0x80000000)) { word <<= 1; bit -= 1; } - - return bit; -} - -/* Implement ffs in terms of fls. */ -tlsf_decl int tlsf_ffs(unsigned int word) -{ - return tlsf_fls_generic(word & (~word + 1)) - 1; -} - -tlsf_decl int tlsf_fls(unsigned int word) -{ - return tlsf_fls_generic(word) - 1; -} - -#endif - -/* Possibly 64-bit version of tlsf_fls. */ -#if defined (TLSF_64BIT) -tlsf_decl int tlsf_fls_sizet(size_t size) -{ - int high = (int)(size >> 32); - int bits = 0; - if (high) - { - bits = 32 + tlsf_fls(high); - } - else - { - bits = tlsf_fls((int)size & 0xffffffff); - - } - return bits; -} -#else -#define tlsf_fls_sizet tlsf_fls -#endif - -#undef tlsf_decl - -/* -** Constants. -*/ - -/* Public constants: may be modified. */ -enum tlsf_public -{ - /* log2 of number of linear subdivisions of block sizes. Larger - ** values require more memory in the control structure. Values of - ** 4 or 5 are typical. - */ - SL_INDEX_COUNT_LOG2 = 5, -}; - -/* Private constants: do not modify. */ -enum tlsf_private -{ -#if defined (TLSF_64BIT) - /* All allocation sizes and addresses are aligned to 8 bytes. */ - ALIGN_SIZE_LOG2 = 3, -#else - /* All allocation sizes and addresses are aligned to 4 bytes. */ - ALIGN_SIZE_LOG2 = 2, -#endif - ALIGN_SIZE = (1 << ALIGN_SIZE_LOG2), - - /* - ** We support allocations of sizes up to (1 << FL_INDEX_MAX) bits. - ** However, because we linearly subdivide the second-level lists, and - ** our minimum size granularity is 4 bytes, it doesn't make sense to - ** create first-level lists for sizes smaller than SL_INDEX_COUNT * 4, - ** or (1 << (SL_INDEX_COUNT_LOG2 + 2)) bytes, as there we will be - ** trying to split size ranges into more slots than we have available. - ** Instead, we calculate the minimum threshold size, and place all - ** blocks below that size into the 0th first-level list. - */ - -#if defined (TLSF_64BIT) - /* - ** TODO: We can increase this to support larger sizes, at the expense - ** of more overhead in the TLSF structure. - */ - FL_INDEX_MAX = 32, -#else - FL_INDEX_MAX = 30, -#endif - SL_INDEX_COUNT = (1 << SL_INDEX_COUNT_LOG2), - FL_INDEX_SHIFT = (SL_INDEX_COUNT_LOG2 + ALIGN_SIZE_LOG2), - FL_INDEX_COUNT = (FL_INDEX_MAX - FL_INDEX_SHIFT + 1), - - SMALL_BLOCK_SIZE = (1 << FL_INDEX_SHIFT), -}; - -/* -** Cast and min/max macros. -*/ - -#define tlsf_cast(t, exp) ((t) (exp)) -#define tlsf_min(a, b) ((a) < (b) ? (a) : (b)) -#define tlsf_max(a, b) ((a) > (b) ? (a) : (b)) - -/* -** Set assert macro, if it has not been provided by the user. -*/ -#if !defined (tlsf_assert) -#define tlsf_assert __assert -#endif - -/* -** Static assertion mechanism. -*/ - -#define _tlsf_glue2(x, y) x ## y -#define _tlsf_glue(x, y) _tlsf_glue2(x, y) -#define tlsf_static_assert(exp) \ - typedef char _tlsf_glue(static_assert, __LINE__) [(exp) ? 1 : -1] - -/* This code has been tested on 32- and 64-bit (LP/LLP) architectures. */ -tlsf_static_assert(sizeof(int) * CHAR_BIT == 32); -tlsf_static_assert(sizeof(size_t) * CHAR_BIT >= 32); -tlsf_static_assert(sizeof(size_t) * CHAR_BIT <= 64); - -/* SL_INDEX_COUNT must be <= number of bits in sl_bitmap's storage type. */ -tlsf_static_assert(sizeof(unsigned int) * CHAR_BIT >= SL_INDEX_COUNT); - -/* Ensure we've properly tuned our sizes. */ -tlsf_static_assert(ALIGN_SIZE == SMALL_BLOCK_SIZE / SL_INDEX_COUNT); - -/* -** Data structures and associated constants. -*/ - -/* -** Block header structure. -** -** There are several implementation subtleties involved: -** - The prev_phys_block field is only valid if the previous block is free. -** - The prev_phys_block field is actually stored at the end of the -** previous block. It appears at the beginning of this structure only to -** simplify the implementation. -** - The next_free / prev_free fields are only valid if the block is free. -*/ -typedef struct block_header_t -{ - /* Points to the previous physical block. */ - struct block_header_t* prev_phys_block; - - /* The size of this block, excluding the block header. */ - size_t size; - - /* Next and previous free blocks. */ - struct block_header_t* next_free; - struct block_header_t* prev_free; -} block_header_t; - -/* -** Since block sizes are always at least a multiple of 4, the two least -** significant bits of the size field are used to store the block status: -** - bit 0: whether block is busy or free -** - bit 1: whether previous block is busy or free -*/ -static const size_t block_header_free_bit = 1 << 0; -static const size_t block_header_prev_free_bit = 1 << 1; - -/* -** The size of the block header exposed to used blocks is the size field. -** The prev_phys_block field is stored *inside* the previous free block. -*/ -static const size_t block_header_overhead = sizeof(size_t); - -/* User data starts directly after the size field in a used block. */ -static const size_t block_start_offset = - offsetof(block_header_t, size) + sizeof(size_t); - -/* -** A free block must be large enough to store its header minus the size of -** the prev_phys_block field, and no larger than the number of addressable -** bits for FL_INDEX. -*/ -static const size_t block_size_min = - sizeof(block_header_t) - sizeof(block_header_t*); -static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX; - - -/* The TLSF control structure. */ -typedef struct control_t -{ - /* Empty lists point at this block to indicate they are free. */ - block_header_t block_null; - - /* Bitmaps for free lists. */ - unsigned int fl_bitmap; - unsigned int sl_bitmap[FL_INDEX_COUNT]; - - /* Head of free lists. */ - block_header_t* blocks[FL_INDEX_COUNT][SL_INDEX_COUNT]; -} control_t; - -/* A type used for casting when doing pointer arithmetic. */ -typedef ptrdiff_t tlsfptr_t; - -/* -** block_header_t member functions. -*/ - -static size_t block_size(const block_header_t* block) -{ - return block->size & ~(block_header_free_bit | block_header_prev_free_bit); -} - -static void block_set_size(block_header_t* block, size_t size) -{ - const size_t oldsize = block->size; - block->size = size | (oldsize & (block_header_free_bit | block_header_prev_free_bit)); -} - -static int block_is_last(const block_header_t* block) -{ - return block_size(block) == 0; -} - -static int block_is_free(const block_header_t* block) -{ - return tlsf_cast(int, block->size & block_header_free_bit); -} - -static void block_set_free(block_header_t* block) -{ - block->size |= block_header_free_bit; -} - -static void block_set_used(block_header_t* block) -{ - block->size &= ~block_header_free_bit; -} - -static int block_is_prev_free(const block_header_t* block) -{ - return tlsf_cast(int, block->size & block_header_prev_free_bit); -} - -static void block_set_prev_free(block_header_t* block) -{ - block->size |= block_header_prev_free_bit; -} - -static void block_set_prev_used(block_header_t* block) -{ - block->size &= ~block_header_prev_free_bit; -} - -static block_header_t* block_from_ptr(const void* ptr) -{ - return tlsf_cast(block_header_t*, - tlsf_cast(unsigned char*, ptr) - block_start_offset); -} - -static void* block_to_ptr(const block_header_t* block) -{ - return tlsf_cast(void*, - tlsf_cast(unsigned char*, block) + block_start_offset); -} - -/* Return location of next block after block of given size. */ -static block_header_t* offset_to_block(const void* ptr, size_t size) -{ - return tlsf_cast(block_header_t*, tlsf_cast(tlsfptr_t, ptr) + size); -} - -/* Return location of previous block. */ -static block_header_t* block_prev(const block_header_t* block) -{ - tlsf_assert(block_is_prev_free(block) && "previous block must be free"); - return block->prev_phys_block; -} - -/* Return location of next existing block. */ -static block_header_t* block_next(const block_header_t* block) -{ - block_header_t* next = offset_to_block(block_to_ptr(block), - block_size(block) - block_header_overhead); - tlsf_assert(!block_is_last(block)); - return next; -} - -/* Link a new block with its physical neighbor, return the neighbor. */ -static block_header_t* block_link_next(block_header_t* block) -{ - block_header_t* next = block_next(block); - next->prev_phys_block = block; - return next; -} - -static void block_mark_as_free(block_header_t* block) -{ - /* Link the block to the next block, first. */ - block_header_t* next = block_link_next(block); - block_set_prev_free(next); - block_set_free(block); -} - -static void block_mark_as_used(block_header_t* block) -{ - block_header_t* next = block_next(block); - block_set_prev_used(next); - block_set_used(block); -} - -static size_t align_up(size_t x, size_t align) -{ - tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); - return (x + (align - 1)) & ~(align - 1); -} - -static size_t align_down(size_t x, size_t align) -{ - tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); - return x - (x & (align - 1)); -} - -static void* align_ptr(const void* ptr, size_t align) -{ - const tlsfptr_t aligned = - (tlsf_cast(tlsfptr_t, ptr) + (align - 1)) & ~(align - 1); - tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); - return tlsf_cast(void*, aligned); -} - -/* -** Adjust an allocation size to be aligned to word size, and no smaller -** than internal minimum. -*/ -static size_t adjust_request_size(size_t size, size_t align) -{ - size_t adjust = 0; - if (size) - { - const size_t aligned = align_up(size, align); - - /* aligned sized must not exceed block_size_max or we'll go out of bounds on sl_bitmap */ - if (aligned < block_size_max) - { - adjust = tlsf_max(aligned, block_size_min); - } - } - return adjust; -} - -/* -** TLSF utility functions. In most cases, these are direct translations of -** the documentation found in the white paper. -*/ - -static void mapping_insert(size_t size, int* fli, int* sli) -{ - int fl, sl; - if (size < SMALL_BLOCK_SIZE) - { - /* Store small blocks in first list. */ - fl = 0; - sl = tlsf_cast(int, size) / (SMALL_BLOCK_SIZE / SL_INDEX_COUNT); - } - else - { - fl = tlsf_fls_sizet(size); - sl = tlsf_cast(int, size >> (fl - SL_INDEX_COUNT_LOG2)) ^ (1 << SL_INDEX_COUNT_LOG2); - fl -= (FL_INDEX_SHIFT - 1); - } - *fli = fl; - *sli = sl; -} - -/* This version rounds up to the next block size (for allocations) */ -static void mapping_search(size_t size, int* fli, int* sli) -{ - if (size >= SMALL_BLOCK_SIZE) - { - const size_t round = (1 << (tlsf_fls_sizet(size) - SL_INDEX_COUNT_LOG2)) - 1; - size += round; - } - mapping_insert(size, fli, sli); -} - -static block_header_t* search_suitable_block(control_t* control, int* fli, int* sli) -{ - int fl = *fli; - int sl = *sli; - - /* - ** First, search for a block in the list associated with the given - ** fl/sl index. - */ - unsigned int sl_map = control->sl_bitmap[fl] & (~0U << sl); - if (!sl_map) - { - /* No block exists. Search in the next largest first-level list. */ - const unsigned int fl_map = control->fl_bitmap & (~0U << (fl + 1)); - if (!fl_map) - { - /* No free blocks available, memory has been exhausted. */ - return 0; - } - - fl = tlsf_ffs(fl_map); - *fli = fl; - sl_map = control->sl_bitmap[fl]; - } - tlsf_assert(sl_map && "internal error - second level bitmap is null"); - sl = tlsf_ffs(sl_map); - *sli = sl; - - /* Return the first block in the free list. */ - return control->blocks[fl][sl]; -} - -/* Remove a free block from the free list.*/ -static void remove_free_block(control_t* control, block_header_t* block, int fl, int sl) -{ - block_header_t* prev = block->prev_free; - block_header_t* next = block->next_free; - tlsf_assert(prev && "prev_free field can not be null"); - tlsf_assert(next && "next_free field can not be null"); - next->prev_free = prev; - prev->next_free = next; - - /* If this block is the head of the free list, set new head. */ - if (control->blocks[fl][sl] == block) - { - control->blocks[fl][sl] = next; - - /* If the new head is null, clear the bitmap. */ - if (next == &control->block_null) - { - control->sl_bitmap[fl] &= ~(1U << sl); - - /* If the second bitmap is now empty, clear the fl bitmap. */ - if (!control->sl_bitmap[fl]) - { - control->fl_bitmap &= ~(1U << fl); - } - } - } -} - -/* Insert a free block into the free block list. */ -static void insert_free_block(control_t* control, block_header_t* block, int fl, int sl) -{ - block_header_t* current = control->blocks[fl][sl]; - tlsf_assert(current && "free list cannot have a null entry"); - tlsf_assert(block && "cannot insert a null entry into the free list"); - block->next_free = current; - block->prev_free = &control->block_null; - current->prev_free = block; - - tlsf_assert((uintptr_t)block_to_ptr(block) == (uintptr_t)align_ptr(block_to_ptr(block), ALIGN_SIZE) - && "block not aligned properly"); - /* - ** Insert the new block at the head of the list, and mark the first- - ** and second-level bitmaps appropriately. - */ - control->blocks[fl][sl] = block; - control->fl_bitmap |= (1U << fl); - control->sl_bitmap[fl] |= (1U << sl); -} - -/* Remove a given block from the free list. */ -static void block_remove(control_t* control, block_header_t* block) -{ - int fl, sl; - mapping_insert(block_size(block), &fl, &sl); - remove_free_block(control, block, fl, sl); -} - -/* Insert a given block into the free list. */ -static void block_insert(control_t* control, block_header_t* block) -{ - int fl, sl; - mapping_insert(block_size(block), &fl, &sl); - insert_free_block(control, block, fl, sl); -} - -static int block_can_split(block_header_t* block, size_t size) -{ - return block_size(block) >= sizeof(block_header_t) + size; -} - -/* Split a block into two, the second of which is free. */ -static block_header_t* block_split(block_header_t* block, size_t size) -{ - /* Calculate the amount of space left in the remaining block. */ - block_header_t* remaining = - offset_to_block(block_to_ptr(block), size - block_header_overhead); - - const size_t remain_size = block_size(block) - (size + block_header_overhead); - - tlsf_assert((uintptr_t)block_to_ptr(remaining) == (uintptr_t)align_ptr(block_to_ptr(remaining), ALIGN_SIZE) - && "remaining block not aligned properly"); - - tlsf_assert(block_size(block) == remain_size + size + block_header_overhead); - block_set_size(remaining, remain_size); - tlsf_assert(block_size(remaining) >= block_size_min && "block split with invalid size"); - - block_set_size(block, size); - block_mark_as_free(remaining); - - return remaining; -} - -/* Absorb a free block's storage into an adjacent previous free block. */ -static block_header_t* block_absorb(block_header_t* prev, block_header_t* block) -{ - tlsf_assert(!block_is_last(prev) && "previous block can't be last"); - /* Note: Leaves flags untouched. */ - prev->size += block_size(block) + block_header_overhead; - block_link_next(prev); - return prev; -} - -/* Merge a just-freed block with an adjacent previous free block. */ -static block_header_t* block_merge_prev(control_t* control, block_header_t* block) -{ - if (block_is_prev_free(block)) - { - block_header_t* prev = block_prev(block); - tlsf_assert(prev && "prev physical block can't be null"); - tlsf_assert(block_is_free(prev) && "prev block is not free though marked as such"); - block_remove(control, prev); - block = block_absorb(prev, block); - } - - return block; -} - -/* Merge a just-freed block with an adjacent free block. */ -static block_header_t* block_merge_next(control_t* control, block_header_t* block) -{ - block_header_t* next = block_next(block); - tlsf_assert(next && "next physical block can't be null"); - - if (block_is_free(next)) - { - tlsf_assert(!block_is_last(block) && "previous block can't be last"); - block_remove(control, next); - block = block_absorb(block, next); - } - - return block; -} - -/* Trim any trailing block space off the end of a block, return to pool. */ -static void block_trim_free(control_t* control, block_header_t* block, size_t size) -{ - tlsf_assert(block_is_free(block) && "block must be free"); - if (block_can_split(block, size)) - { - block_header_t* remaining_block = block_split(block, size); - block_link_next(block); - block_set_prev_free(remaining_block); - block_insert(control, remaining_block); - } -} - -/* Trim any trailing block space off the end of a used block, return to pool. */ -static void block_trim_used(control_t* control, block_header_t* block, size_t size) -{ - tlsf_assert(!block_is_free(block) && "block must be used"); - if (block_can_split(block, size)) - { - /* If the next block is free, we must coalesce. */ - block_header_t* remaining_block = block_split(block, size); - block_set_prev_used(remaining_block); - - remaining_block = block_merge_next(control, remaining_block); - block_insert(control, remaining_block); - } -} - -static block_header_t* block_trim_free_leading(control_t* control, block_header_t* block, size_t size) -{ - block_header_t* remaining_block = block; - if (block_can_split(block, size)) - { - /* We want the 2nd block. */ - remaining_block = block_split(block, size - block_header_overhead); - block_set_prev_free(remaining_block); - - block_link_next(block); - block_insert(control, block); - } - - return remaining_block; -} - -static block_header_t* block_locate_free(control_t* control, size_t size) -{ - int fl = 0, sl = 0; - block_header_t* block = 0; - - if (size) - { - mapping_search(size, &fl, &sl); - - /* - ** mapping_search can futz with the size, so for excessively large sizes it can sometimes wind up - ** with indices that are off the end of the block array. - ** So, we protect against that here, since this is the only callsite of mapping_search. - ** Note that we don't need to check sl, since it comes from a modulo operation that guarantees it's always in range. - */ - if (fl < FL_INDEX_COUNT) - { - block = search_suitable_block(control, &fl, &sl); - } - } - - if (block) - { - tlsf_assert(block_size(block) >= size); - remove_free_block(control, block, fl, sl); - } - - return block; -} - -static void* block_prepare_used(control_t* control, block_header_t* block, size_t size) -{ - void* p = 0; - if (block) - { - tlsf_assert(size && "size must be non-zero"); - block_trim_free(control, block, size); - block_mark_as_used(block); - p = block_to_ptr(block); - } - return p; -} - -/* Clear structure and point all empty lists at the null block. */ -static void control_construct(control_t* control) -{ - int i, j; - - control->block_null.next_free = &control->block_null; - control->block_null.prev_free = &control->block_null; - - control->fl_bitmap = 0; - for (i = 0; i < FL_INDEX_COUNT; ++i) - { - control->sl_bitmap[i] = 0; - for (j = 0; j < SL_INDEX_COUNT; ++j) - { - control->blocks[i][j] = &control->block_null; - } - } -} - -/* -** Debugging utilities. -*/ - -typedef struct integrity_t -{ - int prev_status; - int status; -} integrity_t; - -#define tlsf_insist(x) { tlsf_assert(x); if (!(x)) { status--; } } - -static void integrity_walker(void* ptr, size_t size, int used, void* user) -{ - block_header_t* block = block_from_ptr(ptr); - integrity_t* integ = tlsf_cast(integrity_t*, user); - const int this_prev_status = block_is_prev_free(block) ? 1 : 0; - const int this_status = block_is_free(block) ? 1 : 0; - const size_t this_block_size = block_size(block); - - int status = 0; - (void)used; - tlsf_insist(integ->prev_status == this_prev_status && "prev status incorrect"); - tlsf_insist(size == this_block_size && "block size incorrect"); - - integ->prev_status = this_status; - integ->status += status; -} - -int tlsf_check(tlsf_t tlsf) -{ - int i, j; - - control_t* control = tlsf_cast(control_t*, tlsf); - int status = 0; - - /* Check that the free lists and bitmaps are accurate. */ - for (i = 0; i < FL_INDEX_COUNT; ++i) - { - for (j = 0; j < SL_INDEX_COUNT; ++j) - { - const int fl_map = control->fl_bitmap & (1U << i); - const int sl_list = control->sl_bitmap[i]; - const int sl_map = sl_list & (1U << j); - const block_header_t* block = control->blocks[i][j]; - - /* Check that first- and second-level lists agree. */ - if (!fl_map) - { - tlsf_insist(!sl_map && "second-level map must be null"); - } - - if (!sl_map) - { - tlsf_insist((uint64_t)block == (uint64_t)&control->block_null && "block list must be null"); - continue; - } - - /* Check that there is at least one free block. */ - tlsf_insist(sl_list && "no free blocks in second-level map"); - tlsf_insist((uintptr_t)block != (uintptr_t)&control->block_null && "block should not be null"); - - while (block != &control->block_null) - { - int fli, sli; - tlsf_insist(block_is_free(block) && "block should be free"); - tlsf_insist(!block_is_prev_free(block) && "blocks should have coalesced"); - tlsf_insist(!block_is_free(block_next(block)) && "blocks should have coalesced"); - tlsf_insist(block_is_prev_free(block_next(block)) && "block should be free"); - tlsf_insist(block_size(block) >= block_size_min && "block not minimum size"); - - mapping_insert(block_size(block), &fli, &sli); - tlsf_insist(fli == i && sli == j && "block size indexed in wrong list"); - block = block->next_free; - } - } - } - - return status; -} - -#undef tlsf_insist - -static void default_walker(void* ptr, size_t size, int used, void* user) -{ - (void)user; - printf("\t%p %s size: %x (%p)\n", ptr, used ? "used" : "free", (unsigned int)size, block_from_ptr(ptr)); -} - -void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user) -{ - tlsf_walker pool_walker = walker ? walker : default_walker; - block_header_t* block = - offset_to_block(pool, -(int)block_header_overhead); - - while (block && !block_is_last(block)) - { - pool_walker( - block_to_ptr(block), - block_size(block), - !block_is_free(block), - user); - block = block_next(block); - } -} - -size_t tlsf_block_size(void* ptr) -{ - size_t size = 0; - if (ptr) - { - const block_header_t* block = block_from_ptr(ptr); - size = block_size(block); - } - return size; -} - -int tlsf_check_pool(pool_t pool) -{ - /* Check that the blocks are physically correct. */ - integrity_t integ = { 0, 0 }; - tlsf_walk_pool(pool, integrity_walker, &integ); - - return integ.status; -} - -/* -** Size of the TLSF structures in a given memory block passed to -** tlsf_create, equal to the size of a control_t -*/ -size_t tlsf_size(void) -{ - return sizeof(control_t); -} - -size_t tlsf_align_size(void) -{ - return ALIGN_SIZE; -} - -size_t tlsf_block_size_min(void) -{ - return block_size_min; -} - -size_t tlsf_block_size_max(void) -{ - return block_size_max; -} - -/* -** Overhead of the TLSF structures in a given memory block passed to -** tlsf_add_pool, equal to the overhead of a free block and the -** sentinel block. -*/ -size_t tlsf_pool_overhead(void) -{ - return 2 * block_header_overhead; -} - -size_t tlsf_alloc_overhead(void) -{ - return block_header_overhead; -} - -pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes) -{ - block_header_t* block; - block_header_t* next; - - const size_t pool_overhead = tlsf_pool_overhead(); - const size_t pool_bytes = align_down(bytes - pool_overhead, ALIGN_SIZE); - - if (((ptrdiff_t)mem % ALIGN_SIZE) != 0) - { - printf("tlsf_add_pool: Memory must be aligned by %u bytes.\n", - (unsigned int)ALIGN_SIZE); - return 0; - } - - if (pool_bytes < block_size_min || pool_bytes > block_size_max) - { -#if defined (TLSF_64BIT) - printf("tlsf_add_pool: Memory size must be between 0x%x and 0x%x00 bytes.\n", - (unsigned int)(pool_overhead + block_size_min), - (unsigned int)((pool_overhead + block_size_max) / 256)); -#else - printf("tlsf_add_pool: Memory size must be between %u and %u bytes.\n", - (unsigned int)(pool_overhead + block_size_min), - (unsigned int)(pool_overhead + block_size_max)); -#endif - return 0; - } - - /* - ** Create the main free block. Offset the start of the block slightly - ** so that the prev_phys_block field falls outside of the pool - - ** it will never be used. - */ - block = offset_to_block(mem, -(tlsfptr_t)block_header_overhead); - block_set_size(block, pool_bytes); - block_set_free(block); - block_set_prev_used(block); - block_insert(tlsf_cast(control_t*, tlsf), block); - - /* Split the block to create a zero-size sentinel block. */ - next = block_link_next(block); - block_set_size(next, 0); - block_set_used(next); - block_set_prev_free(next); - - return mem; -} - -void tlsf_remove_pool(tlsf_t tlsf, pool_t pool) -{ - control_t* control = tlsf_cast(control_t*, tlsf); - block_header_t* block = offset_to_block(pool, -(int)block_header_overhead); - - int fl = 0, sl = 0; - - tlsf_assert(block_is_free(block) && "block should be free"); - tlsf_assert(!block_is_free(block_next(block)) && "next block should not be free"); - tlsf_assert(block_size(block_next(block)) == 0 && "next block size should be zero"); - - mapping_insert(block_size(block), &fl, &sl); - remove_free_block(control, block, fl, sl); -} - -/* -** TLSF main interface. -*/ - -#if _DEBUG -int test_ffs_fls() -{ - /* Verify ffs/fls work properly. */ - int rv = 0; - rv += (tlsf_ffs(0) == -1) ? 0 : 0x1; - rv += (tlsf_fls(0) == -1) ? 0 : 0x2; - rv += (tlsf_ffs(1) == 0) ? 0 : 0x4; - rv += (tlsf_fls(1) == 0) ? 0 : 0x8; - rv += (tlsf_ffs(0x80000000) == 31) ? 0 : 0x10; - rv += (tlsf_ffs(0x80008000) == 15) ? 0 : 0x20; - rv += (tlsf_fls(0x80000008) == 31) ? 0 : 0x40; - rv += (tlsf_fls(0x7FFFFFFF) == 30) ? 0 : 0x80; - -#if defined (TLSF_64BIT) - rv += (tlsf_fls_sizet(0x80000000) == 31) ? 0 : 0x100; - rv += (tlsf_fls_sizet(0x100000000) == 32) ? 0 : 0x200; - rv += (tlsf_fls_sizet(0xffffffffffffffff) == 63) ? 0 : 0x400; -#endif - - if (rv) - { - printf("test_ffs_fls: %x ffs/fls tests failed.\n", rv); - } - return rv; -} -#endif - -tlsf_t tlsf_create(void* mem) -{ -#if _DEBUG - if (test_ffs_fls()) - { - return 0; - } -#endif - - if (((tlsfptr_t)mem % ALIGN_SIZE) != 0) - { - printf("tlsf_create: Memory must be aligned to %u bytes.\n", - (unsigned int)ALIGN_SIZE); - return 0; - } - - control_construct(tlsf_cast(control_t*, mem)); - - return tlsf_cast(tlsf_t, mem); -} - -tlsf_t tlsf_create_with_pool(void* mem, size_t bytes) -{ - tlsf_t tlsf = tlsf_create(mem); - tlsf_add_pool(tlsf, (char*)mem + tlsf_size(), bytes - tlsf_size()); - return tlsf; -} - -void tlsf_destroy(tlsf_t tlsf) -{ - /* Nothing to do. */ - (void)tlsf; -} - -pool_t tlsf_get_pool(tlsf_t tlsf) -{ - return tlsf_cast(pool_t, (char*)tlsf + tlsf_size()); -} - -void* tlsf_malloc(tlsf_t tlsf, size_t size) -{ - control_t* control = tlsf_cast(control_t*, tlsf); - const size_t adjust = adjust_request_size(size, ALIGN_SIZE); - block_header_t* block = block_locate_free(control, adjust); - return block_prepare_used(control, block, adjust); -} - -void* tlsf_memalign(tlsf_t tlsf, size_t align, size_t size) -{ - control_t* control = tlsf_cast(control_t*, tlsf); - const size_t adjust = adjust_request_size(size, ALIGN_SIZE); - - /* - ** We must allocate an additional minimum block size bytes so that if - ** our free block will leave an alignment gap which is smaller, we can - ** trim a leading free block and release it back to the pool. We must - ** do this because the previous physical block is in use, therefore - ** the prev_phys_block field is not valid, and we can't simply adjust - ** the size of that block. - */ - const size_t gap_minimum = sizeof(block_header_t); - const size_t size_with_gap = adjust_request_size(adjust + align + gap_minimum, align); - - /* - ** If alignment is less than or equals base alignment, we're done. - ** If we requested 0 bytes, return null, as tlsf_malloc(0) does. - */ - const size_t aligned_size = (adjust && align > ALIGN_SIZE) ? size_with_gap : adjust; - - block_header_t* block = block_locate_free(control, aligned_size); - - /* This can't be a static assert. */ - tlsf_assert(sizeof(block_header_t) == block_size_min + block_header_overhead); - - if (block) - { - void* ptr = block_to_ptr(block); - void* aligned = align_ptr(ptr, align); - size_t gap = tlsf_cast(size_t, - tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); - - /* If gap size is too small, offset to next aligned boundary. */ - if (gap && gap < gap_minimum) - { - const size_t gap_remain = gap_minimum - gap; - const size_t offset = tlsf_max(gap_remain, align); - const void* next_aligned = tlsf_cast(void*, - tlsf_cast(tlsfptr_t, aligned) + offset); - - aligned = align_ptr(next_aligned, align); - gap = tlsf_cast(size_t, - tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); - } - - if (gap) - { - tlsf_assert(gap >= gap_minimum && "gap size too small"); - block = block_trim_free_leading(control, block, gap); - } - } - - return block_prepare_used(control, block, adjust); -} - -void tlsf_free(tlsf_t tlsf, void* ptr) -{ - /* Don't attempt to free a NULL pointer. */ - if (ptr) - { - control_t* control = tlsf_cast(control_t*, tlsf); - block_header_t* block = block_from_ptr(ptr); - tlsf_assert(!block_is_free(block) && "block already marked as free"); - block_mark_as_free(block); - block = block_merge_prev(control, block); - block = block_merge_next(control, block); - block_insert(control, block); - } -} - -/* -** The TLSF block information provides us with enough information to -** provide a reasonably intelligent implementation of realloc, growing or -** shrinking the currently allocated block as required. -** -** This routine handles the somewhat esoteric edge cases of realloc: -** - a non-zero size with a null pointer will behave like malloc -** - a zero size with a non-null pointer will behave like free -** - a request that cannot be satisfied will leave the original buffer -** untouched -** - an extended buffer size will leave the newly-allocated area with -** contents undefined -*/ -void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size) -{ - control_t* control = tlsf_cast(control_t*, tlsf); - void* p = 0; - - /* Zero-size requests are treated as free. */ - if (ptr && size == 0) - { - tlsf_free(tlsf, ptr); - } - /* Requests with NULL pointers are treated as malloc. */ - else if (!ptr) - { - p = tlsf_malloc(tlsf, size); - } - else - { - block_header_t* block = block_from_ptr(ptr); - block_header_t* next = block_next(block); - - const size_t cursize = block_size(block); - const size_t combined = cursize + block_size(next) + block_header_overhead; - const size_t adjust = adjust_request_size(size, ALIGN_SIZE); - - tlsf_assert(!block_is_free(block) && "block already marked as free"); - - /* - ** If the next block is used, or when combined with the current - ** block, does not offer enough space, we must reallocate and copy. - */ - if (adjust > cursize && (!block_is_free(next) || adjust > combined)) - { - p = tlsf_malloc(tlsf, size); - if (p) - { - const size_t minsize = tlsf_min(cursize, size); - memcpy(p, ptr, minsize); - tlsf_free(tlsf, ptr); - } - } - else - { - /* Do we need to expand to the next block? */ - if (adjust > cursize) - { - block_merge_next(control, block); - block_mark_as_used(block); - } - - /* Trim the resulting block and return the original pointer. */ - block_trim_used(control, block, adjust); - p = ptr; - } - } - - return p; -} diff --git a/sys/vm/vm_device.c b/sys/vm/vm_device.c deleted file mode 100644 index 976dec7..0000000 --- a/sys/vm/vm_device.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include - -static int dv_pager_get(struct vm_object *obj, off_t off, size_t len, - struct vm_page *pg); - -static int dv_pager_store(struct vm_object *obj, off_t off, size_t len, - struct vm_page *pg); - -static int dv_pager_paddr(struct vm_object *obj, paddr_t *paddr, - vm_prot_t prot); - -/* Pager operations */ -struct vm_pagerops g_dev_pagerops = { - .get = dv_pager_get, - .store = dv_pager_store, - .get_paddr = dv_pager_paddr -}; - -/* - * Fetch a device descriptor from a memory - * object. - * - * Returns 0 on success. - */ -static int -dv_get_dev(struct vm_object *obj, struct device **res) -{ - struct device *dev; - struct vnode *vp; - int status; - - if ((vp = obj->vnode) == NULL) - return -EIO; - - /* Now try to fetch the device */ - if ((status = devfs_get_dev(vp, &dev)) != 0) - return status; - - *res = dev; - return 0; -} - -static int -dv_pager_paddr(struct vm_object *obj, paddr_t *paddr, vm_prot_t prot) -{ - struct device *dev; - int status; - - if (paddr == NULL) { - return -EINVAL; - } - - /* Try to fetch the device */ - if ((status = dv_get_dev(obj, &dev)) != 0) { - return status; - } - - if (dev->mmap == NULL) { - /* - * mmap() is not supported, this is not an object - * we can handle so try switching its operations - * to the vnode pager ops... - */ - obj->pgops = &g_vnode_pagerops; - return -ENOTSUP; - } - - *paddr = dev->mmap(dev, 0, prot); - return 0; -} - -static int -dv_pager_store(struct vm_object *obj, off_t off, size_t len, struct vm_page *pg) -{ - return -1; -} - -static int -dv_pager_get(struct vm_object *obj, off_t off, size_t len, struct vm_page *pg) -{ - return -1; -} diff --git a/sys/vm/vm_dynalloc.c b/sys/vm/vm_dynalloc.c deleted file mode 100644 index dea4460..0000000 --- a/sys/vm/vm_dynalloc.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include - -/* - * Dynamically allocates memory - * - * @sz: The amount of bytes to allocate - */ -void * -dynalloc(size_t sz) -{ - struct vm_ctx *vm_ctx = vm_get_ctx(); - void *tmp; - - spinlock_acquire(&vm_ctx->dynalloc_lock); - tmp = tlsf_malloc(vm_ctx->tlsf_ctx, sz); - spinlock_release(&vm_ctx->dynalloc_lock); - return tmp; -} - -void * -dynalloc_memalign(size_t sz, size_t align) -{ - struct vm_ctx *vm_ctx = vm_get_ctx(); - void *tmp; - - spinlock_acquire(&vm_ctx->dynalloc_lock); - tmp = tlsf_memalign(vm_ctx->tlsf_ctx, align, sz); - spinlock_release(&vm_ctx->dynalloc_lock); - return tmp; -} - -/* - * Reallocates memory pool created by `dynalloc()' - * - * @old_ptr: Pointer to old pool. - * @newsize: Size of new pool. - */ -void * -dynrealloc(void *old_ptr, size_t newsize) -{ - struct vm_ctx *vm_ctx = vm_get_ctx(); - void *tmp; - - spinlock_acquire(&vm_ctx->dynalloc_lock); - tmp = tlsf_realloc(vm_ctx->tlsf_ctx, old_ptr, newsize); - spinlock_release(&vm_ctx->dynalloc_lock); - return tmp; -} - -/* - * Free dynamically allocated memory - * - * @ptr: Pointer to base of memory. - */ -void -dynfree(void *ptr) -{ - struct vm_ctx *vm_ctx = vm_get_ctx(); - - spinlock_acquire(&vm_ctx->dynalloc_lock); - tlsf_free(vm_ctx->tlsf_ctx, ptr); - spinlock_release(&vm_ctx->dynalloc_lock); -} diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c deleted file mode 100644 index 45def7f..0000000 --- a/sys/vm/vm_fault.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include - -static struct vm_mapping * -vm_mapq_search(vm_mapq_t *mq, vaddr_t addr) -{ - struct vm_mapping *mapping; - const struct vm_range *range; - - TAILQ_FOREACH(mapping, mq, link) { - range = &mapping->range; - if (addr >= range->start && addr <= range->end) { - return mapping; - } - } - - return NULL; -} - -static struct vm_mapping * -vm_find_mapping(vaddr_t addr) -{ - struct vm_mapping *mapping; - struct proc *td = this_td(); - vm_mapq_t *mapq; - - mapping = vm_mapping_fetch(&td->mapspace, addr); - if (mapping != NULL) - return mapping; - - /* Need to search other maps */ - for (size_t i = 0; i < MTAB_ENTRIES; ++i) { - mapq = &td->mapspace.mtab[i]; - mapping = vm_mapq_search(mapq, addr); - if (mapping != NULL) - return mapping; - } - - return NULL; -} - -static int -vm_demand_page(struct vm_mapping *mapping, vaddr_t va, vm_prot_t access_type) -{ - struct proc *td; - paddr_t pa_base; - - int s; - size_t granule = vm_get_page_size(); - - /* Allocate physical memory if needed */ - if (mapping->physmem_base == 0) { - pa_base = vm_alloc_pageframe(1); - mapping->physmem_base = pa_base; - } else { - pa_base = mapping->physmem_base; - } - - td = this_td(); - s = vm_map_create(td->addrsp, va, pa_base, access_type, granule); - return s; -} - -int -vm_fault(vaddr_t va, vm_prot_t access_type) -{ - struct vm_mapping *mapping; - struct vm_object *vmobj; - - int s = 0; - size_t granule = vm_get_page_size(); - vaddr_t va_base = va & ~(granule - 1); - - mapping = vm_find_mapping(va_base); - if (mapping == NULL) - return -1; - - if ((vmobj = mapping->vmobj) == NULL) - /* Virtual memory object non-existent */ - return -1; - if ((access_type & ~mapping->prot) != 0) - /* Invalid access type */ - return -1; - - vm_object_ref(vmobj); - - /* Can we perform demand paging? */ - if (vmobj->demand) { - s = vm_demand_page(mapping, va_base, access_type); - if (s != 0) - goto done; - } - -done: - /* Drop the vmobj ref */ - vm_object_unref(vmobj); - return s; -} diff --git a/sys/vm/vm_init.c b/sys/vm/vm_init.c deleted file mode 100644 index 3087e6e..0000000 --- a/sys/vm/vm_init.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include - -/* - * XXX: As of now, these are constant... It would be nice if we could - * have this value expanded upon request so we can keep it small - * to not hog up resources. Would make it more flexible too :^) - */ -#define DYNALLOC_POOL_SZ 0x400000 /* 4 MiB */ -#define DYNALLOC_POOL_PAGES (DYNALLOC_POOL_SZ / vm_get_page_size()) - -static volatile struct vas kernel_vas; - -/* - * TODO: Move this to a per CPU structure, this kinda sucks - * how it is right now... - */ -static struct vm_ctx bsp_vm_ctx = {0}; - -volatile struct limine_hhdm_request g_hhdm_request = { - .id = LIMINE_HHDM_REQUEST, - .revision = 0 -}; - -struct vm_ctx * -vm_get_ctx(void) -{ - return &bsp_vm_ctx; -} - -/* - * Return the kernel VAS. - */ -struct vas -vm_get_kvas(void) -{ - return kernel_vas; -} - -void -vm_init(void) -{ - void *pool_va; - - kernel_vas = pmap_read_vas(); - if (pmap_init(vm_get_ctx()) != 0) { - panic("Failed to init pmap layer\n"); - } - - /* Setup virtual memory context */ - bsp_vm_ctx.dynalloc_pool_sz = DYNALLOC_POOL_SZ; - bsp_vm_ctx.dynalloc_pool_phys = vm_alloc_pageframe(DYNALLOC_POOL_PAGES); - if (bsp_vm_ctx.dynalloc_pool_phys == 0) { - panic("Failed to allocate dynamic pool\n"); - } - pool_va = PHYS_TO_VIRT(bsp_vm_ctx.dynalloc_pool_phys); - bsp_vm_ctx.tlsf_ctx = tlsf_create_with_pool(pool_va, DYNALLOC_POOL_SZ); - __assert(bsp_vm_ctx.tlsf_ctx != 0); -} diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c deleted file mode 100644 index ca1d18a..0000000 --- a/sys/vm/vm_map.c +++ /dev/null @@ -1,540 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define ALLOC_MAPPING() dynalloc(sizeof(struct vm_mapping)) -#define DESTROY_MAPPING(MAPPING) dynfree(MAPPING) -#define MMAP_DEFAULT_OFF 0x3000000 - -static size_t -vm_hash_vaddr(vaddr_t va) { - va = (va ^ (va >> 30)) * (size_t)0xBF58476D1CE4E5B9; - va = (va ^ (va >> 27)) * (size_t)0x94D049BB133111EB; - va = va ^ (va >> 31); - return va; -} - -/* - * Fetches a suitable offset to be added to an - * address that will be mapped with mmap() to - * avoid clobbering the address space. - */ -static uintptr_t -vm_get_mapoff(struct proc *td) -{ - /* - * FIXME: For now we are adding a fixed offset to the - * address to be mapped. - * - * It would be best to ensure that it isn't in - * range of the process *just in case*. - */ - (void)td; - return MMAP_DEFAULT_OFF; -} - -/* - * Destroy a map queue. - */ -void -vm_free_mapq(vm_mapq_t *mapq) -{ - struct vm_mapping *map; - size_t map_pages, granule; - - granule = vm_get_page_size(); - TAILQ_FOREACH(map, mapq, link) { - map_pages = (map->range.end - map->range.start) / granule; - vm_free_pageframe(map->range.start, map_pages); - } - dynfree(map); -} - -/* - * Remove a mapping from a mapspace. - * - * @ms: Mapspace. - * @mapping: Mapping to remove. - */ -void -vm_mapspace_remove(struct vm_mapspace *ms, struct vm_mapping *mapping) -{ - size_t vhash; - vm_mapq_t *mapq; - - if (ms == NULL) - return; - - vhash = vm_hash_vaddr(mapping->range.start); - mapq = &ms->mtab[vhash % MTAB_ENTRIES]; - TAILQ_REMOVE(mapq, mapping, link); - --ms->map_count; -} - -/* - * Fetch a mapping from a mapspace. - * - * @ms: Mapspace. - * @va: Virtual address. - */ -struct vm_mapping * -vm_mapping_fetch(struct vm_mapspace *ms, vaddr_t va) -{ - size_t vhash; - const vm_mapq_t *mapq; - struct vm_mapping *map; - - if (ms == NULL) - return NULL; - - vhash = vm_hash_vaddr(va); - mapq = &ms->mtab[vhash % MTAB_ENTRIES]; - - TAILQ_FOREACH(map, mapq, link) { - if (map->vhash == vhash) { - return map; - } - } - - return NULL; -} - -/* - * Insert a mapping into a mapspace. - * - * @ms: Target mapspace. - * @mapping: Mapping to insert. - */ -void -vm_mapspace_insert(struct vm_mapspace *ms, struct vm_mapping *mapping) -{ - size_t vhash; - vm_mapq_t *q; - - if (mapping == NULL || ms == NULL) - return; - - vhash = vm_hash_vaddr(mapping->range.start); - mapping->vhash = vhash; - - q = &ms->mtab[vhash % MTAB_ENTRIES]; - TAILQ_INSERT_HEAD(q, mapping, link); - ++ms->map_count; -} - -/* - * Create a mapping (internal helper) - * - * @addr: Address to map. - * @physmem: Physical address, set to 0 to alloc one here - * @prot: Protection flags. - * - * Returns zero on failure. - */ -static paddr_t -vm_map(void *addr, paddr_t physmem, vm_prot_t prot, size_t len) -{ - struct proc *td = this_td(); - const size_t GRANULE = vm_get_page_size(); - - int status; - - /* Allocate the physical memory if needed */ - if (physmem == 0) - physmem = vm_alloc_pageframe(len / GRANULE); - - if (physmem == 0) - return 0; - - /* - * XXX: There is no need to worry about alignment yet - * as vm_map_create() handles that internally. - */ - prot |= PROT_USER; - status = vm_map_create(td->addrsp, (vaddr_t)addr, physmem, prot, len); - if (status != 0) { - vm_free_pageframe(physmem, len / GRANULE); - return 0; - } - - return physmem; -} - -/* - * Create a mapping backed by a file. - * - * @addr: Address to map. - * @prot: Protection flags. - * @len: Length of mapping. - * @off: Offset. - * @fd: File descriptor. - */ -static paddr_t -vm_fd_map(void *addr, vm_prot_t prot, size_t len, off_t off, int fd, - struct vm_mapping *mapping) -{ - paddr_t physmem = 0; - - int oflag; - struct filedesc *filedes; - struct vnode *vp; - - struct proc *td = this_td(); - struct vm_page pg = {0}; - - /* Attempt to get the vnode */ - filedes = fd_from_fdnum(td, fd); - if (filedes == NULL) - return 0; - if ((vp = filedes->vnode) == NULL) - return 0; - - /* Check the perms of the filedes */ - oflag = filedes->oflag; - if (__TEST(prot, PROT_WRITE) && oflag == O_RDONLY) - return 0; - if (!__TEST(prot, PROT_WRITE) && oflag == O_WRONLY) - return 0; - - /* Try to create the virtual memory object */ - if (vm_obj_init(&vp->vmobj, vp) != 0) - return 0; - - mapping->vmobj = vp->vmobj; - vm_object_ref(vp->vmobj); - - /* Try to fetch a physical address */ - if (vm_pager_paddr(vp->vmobj, &physmem, prot) != 0) { - vm_obj_destroy(vp->vmobj); - return 0; - } - - /* - * If the pager found a physical address for the object to - * be mapped to, then we start off with an anonymous mapping - * then connect it to the physical address (creates a shared mapping) - */ - if (physmem != 0) { - vm_map(addr, physmem, prot, len); - return physmem; - } - - /* - * If the pager could not find a physical address for - * the object to be mapped to, start of with just a plain - * anonymous mapping then page-in from whatever filesystem - * (creates a shared mapping) - */ - physmem = vm_map(addr, 0, prot, len); - pg.physaddr = physmem; - - if (vm_pager_get(vp->vmobj, off, len, &pg) != 0) { - vm_obj_destroy(vp->vmobj); - return 0; - } - - return physmem; -} - -static int -munmap(void *addr, size_t len) -{ - struct proc *td = this_td(); - struct vm_mapping *mapping; - struct vm_object *obj; - - struct vm_mapspace *ms; - size_t map_len, granule; - vaddr_t map_start, map_end; - - ms = &td->mapspace; - - granule = vm_get_page_size(); - mapping = vm_mapping_fetch(ms, (vaddr_t)addr); - if (mapping == NULL) { - return -1; - } - - spinlock_acquire(&td->mapspace_lock); - map_start = mapping->range.start; - map_end = mapping->range.end; - map_len = map_end - map_start; - - /* Try to release any virtual memory objects */ - if ((obj = mapping->vmobj) != NULL) { - /* - * Drop our ref and try to cleanup. If the refcount - * is > 0, something is still holding it and we can't - * do much. - */ - vm_object_unref(obj); - if (obj->ref == 0) { - vm_obj_destroy(obj); - } - } - - /* Release the mapping */ - vm_map_destroy(td->addrsp, map_start, map_len); - vm_free_pageframe(mapping->range.start, map_len / granule); - - /* Destroy the mapping descriptor */ - vm_mapspace_remove(ms, mapping); - dynfree(mapping); - spinlock_release(&td->mapspace_lock); - return 0; -} - -static void * -mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off) -{ - const int PROT_MASK = PROT_WRITE | PROT_EXEC; - const size_t GRANULE = vm_get_page_size(); - uintptr_t map_end, map_start; - - struct proc *td = this_td(); - struct vm_mapping *mapping; - struct vm_object *vmobj; - - size_t misalign = ((vaddr_t)addr) & (GRANULE - 1); - off_t mapoff = vm_get_mapoff(td); - - paddr_t physmem = 0; - vaddr_t va = (vaddr_t)addr + mapoff; - - /* Ensure of valid prot flags */ - if ((prot & ~PROT_MASK) != 0) - return MAP_FAILED; - - /* Try to allocate a mapping */ - mapping = ALLOC_MAPPING(); - if (mapping == NULL) - return MAP_FAILED; - - /* Setup prot and mapping start */ - mapping->prot = prot | PROT_USER; - map_start = __ALIGN_DOWN(va, GRANULE); - - /* Ensure the length is aligned */ - len = __ALIGN_UP(len + misalign, GRANULE); - - /* - * Now we check what type of map request - * this is. - */ - if (__TEST(flags, MAP_ANONYMOUS)) { - /* Try to create a virtual memory object */ - if (vm_obj_init(&vmobj, NULL) != 0) - goto fail; - - /* - * If 'addr' is NULL, we'll just allocate physical - * memory right away. - */ - if (addr == NULL) - physmem = vm_alloc_pageframe(len / GRANULE); - - /* - * Enable demand paging for this object if - * `addr` is not NULL. - */ - if (addr != NULL) { - vmobj->is_anon = 1; - vmobj->demand = 1; - - mapping->vmobj = vmobj; - mapping->physmem_base = 0; - } else if (addr == NULL && physmem != 0) { - map_start = physmem + mapoff; - vm_map((void *)map_start, physmem, prot, len); - addr = (void *)physmem; - - vmobj->is_anon = 1; - vmobj->demand = 0; - mapping->vmobj = vmobj; - mapping->physmem_base = physmem; - } - - /* Did this work? */ - if (physmem == 0 && addr == NULL) { - goto fail; - } - } else if (__TEST(flags, MAP_SHARED)) { - physmem = vm_fd_map((void *)map_start, prot, len, off, fildes, mapping); - if (physmem == 0) { - goto fail; - } - } - - /* Setup map_end and map ranges */ - map_end = map_start + len; - mapping->range.start = map_start; - mapping->range.end = map_end; - mapping->physmem_base = physmem; - - /* Add to mapspace */ - spinlock_acquire(&td->mapspace_lock); - vm_mapspace_insert(&td->mapspace, mapping); - spinlock_release(&td->mapspace_lock); - return (void *)map_start; -fail: - DESTROY_MAPPING(mapping); - return MAP_FAILED; -} - -/* - * Internal routine for cleaning up. - * - * @va: VA to start unmapping at. - * @bytes_aligned: Amount of bytes to unmap. - * - * XXX DANGER!!: `bytes_aligned' is expected to be aligned by the - * machine's page granule. If this is not so, - * undefined behaviour will occur. This will - * be enforced via a panic. - */ -static void -vm_map_cleanup(struct vas vas, struct vm_ctx *ctx, vaddr_t va, - size_t bytes_aligned, size_t granule) -{ - __assert(bytes_aligned != 0); - __assert((bytes_aligned & (granule - 1)) == 0); - - for (size_t i = 0; i < bytes_aligned; i += 0x1000) { - if (pmap_unmap(ctx, vas, va + i) != 0) { - /* - * XXX: This shouldn't happen... If it somehow does, - * then this should be handled. - */ - panic("Could not cleanup!!!\n"); - } - } -} - -/* - * Create a virtual memory mappings in the current - * address space. - * - * @va: Virtual address. - * @pa: Physical address. - * @prot: Protection flags. - * @bytes: Amount of bytes to be mapped. This is aligned by the - * machine's page granule, typically a 4k boundary. - */ -int -vm_map_create(struct vas vas, vaddr_t va, paddr_t pa, vm_prot_t prot, size_t bytes) -{ - size_t granule = vm_get_page_size(); - size_t misalign = va & (granule - 1); - int s; - - struct vm_ctx *ctx = vm_get_ctx(); - - /* - * The amount of bytes to be mapped should fully span pages, - * so we ensure it is aligned by the page granularity. - */ - bytes = __ALIGN_UP(bytes + misalign, granule); - - /* Align VA/PA by granule */ - va = __ALIGN_DOWN(va, granule); - pa = __ALIGN_DOWN(pa, granule); - - if (bytes == 0) { - /* You can't map 0 pages, silly! */ - return -1; - } - - for (uintptr_t i = 0; i < bytes; i += granule) { - s = pmap_map(ctx, vas, va + i, pa + i, prot); - if (s != 0) { - /* Something went a bit wrong here, cleanup */ - vm_map_cleanup(vas, ctx, va, i, bytes); - return -1; - } - } - - return 0; -} - -/* - * Destroy a virtual memory mapping in the current - * address space. - */ -int -vm_map_destroy(struct vas vas, vaddr_t va, size_t bytes) -{ - struct vm_ctx *ctx = vm_get_ctx(); - size_t granule = vm_get_page_size(); - size_t misalign = va & (granule - 1); - int s; - - /* We want bytes to be aligned by the granule */ - bytes = __ALIGN_UP(bytes + misalign, granule); - - /* Align VA by granule */ - va = __ALIGN_DOWN(va, granule); - - if (bytes == 0) { - return -1; - } - - for (uintptr_t i = 0; i < bytes; i += granule) { - s = pmap_unmap(ctx, vas, va + i); - if (s != 0) { - return -1; - } - } - - return 0; -} - -uint64_t -sys_mmap(struct syscall_args *args) -{ - return (uintptr_t)mmap((void *)args->arg0, args->arg1, args->arg2, - args->arg3, args->arg4, args->arg5); -} - -uint64_t -sys_munmap(struct syscall_args *args) -{ - return munmap((void *)args->arg0, args->arg1); -} diff --git a/sys/vm/vm_obj.c b/sys/vm/vm_obj.c deleted file mode 100644 index b501c6b..0000000 --- a/sys/vm/vm_obj.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include - -static size_t obj_count = 0; - -static void -vm_set_pgops(struct vm_object *obj, struct vnode *vnode) -{ - if (vnode == NULL) { - obj->vnode = NULL; - return; - } - - /* Is this a device? */ - if (vnode->type == VCHR || vnode->type == VBLK) { - obj->pgops = &g_dev_pagerops; - } else { - obj->pgops = &g_vnode_pagerops; - } -} - -int -vm_obj_init(struct vm_object **res, struct vnode *vnode) -{ - struct vm_object *obj = dynalloc(sizeof(struct vm_object)); - - if (obj == NULL) { - return -ENOMEM; - } - - memset(obj, 0, sizeof(struct vm_object)); - obj->vnode = vnode; - obj->ref = 0; - - vm_set_pgops(obj, vnode); - *res = obj; - ++obj_count; - return 0; -} - -int -vm_obj_destroy(struct vm_object *obj) -{ - struct vnode *vp = obj->vnode; - - /* Check the ref count */ - if (obj->ref > 0) - return -EBUSY; - - if (vp != NULL) - vp->vmobj = NULL; - - dynfree(obj); - --obj_count; - return 0; -} - -size_t -vm_obj_count(void) -{ - return obj_count; -} diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c deleted file mode 100644 index f496fee..0000000 --- a/sys/vm/vm_page.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include - -__MODULE_NAME("vm_page"); -__KERNEL_META("$Hyra$: vm_page.c, Ian Marco Moffett, " - "Virtual memory page specific operations"); - -/* - * Zero `page_count' pages. - * - * @page: First page to start zeroing at - * @page_count: Number of pages to zero. - */ -void -vm_zero_page(void *page, size_t page_count) -{ - const size_t PAGE_SIZE = vm_get_page_size(); - size_t bytes = page_count * PAGE_SIZE; - - /* - * This *should not* happen. Page sizes - * are usually 2^n but if this runs, something - * *very* weird is happening and either something - * broke badly. Or it's that damn technological - * degeneration that is getting out of hand within - * our world!! But really, page sizes *should* be a - * power of 2 and it would be pretty worrying if - * this branches causing a panic stating something - * that shouldn't happen, happened. - * - * The reason why it is wise for pages to be a power of - * 2 is so we can efficiently read/write to the page in - * fixed-sized power of 2 blocks cleanly without the risk - * of clobbering other pages we didn't intend to mess with. - */ - if ((PAGE_SIZE & 1) != 0) { - panic("Unexpected page size, not power of 2!\n"); - } - - memset64(page, 0, bytes/8); -} diff --git a/sys/vm/vm_pager.c b/sys/vm/vm_pager.c deleted file mode 100644 index 0046e9c..0000000 --- a/sys/vm/vm_pager.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include - -/* - * Get pages from backing store. - */ -int -vm_pager_get(struct vm_object *obj, off_t off, size_t len, struct vm_page *pg) -{ - struct vm_pagerops *pgops = obj->pgops; - - if (obj->is_anon) { - return -1; - } - - return pgops->get(obj, off, len, pg); -} - -/* - * Get physical address. - * - * TODO: Remove this and add demanding paging. - */ -int -vm_pager_paddr(struct vm_object *obj, paddr_t *paddr, vm_prot_t prot) -{ - struct vm_pagerops *pgops = obj->pgops; - - if (obj->is_anon) { - return -1; - } - - if (pgops->get_paddr == NULL) { - return 0; - } - - return pgops->get_paddr(obj, paddr, prot); -} diff --git a/sys/vm/vm_physseg.c b/sys/vm/vm_physseg.c deleted file mode 100644 index 88560e5..0000000 --- a/sys/vm/vm_physseg.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include - -__MODULE_NAME("vm_physseg"); -__KERNEL_META("$Hyra$: vm_physseg.c, Ian Marco Moffett, " - "The Hyra physical memory manager"); - -#if defined(VM_PHYSSEG_DEBUG) -#define DPRINTF(...) KDEBUG(__VA_ARGS__) -#else -#define DPRINTF(...) __nothing -#endif /* defined(VM_PHYSSEG_DEBUG) */ - -static struct limine_memmap_request mmap_req = { - .id = LIMINE_MEMMAP_REQUEST, - .revision = 0 -}; - -static struct limine_memmap_response *resp = NULL; - -__used static const char *segment_name[] = { - [LIMINE_MEMMAP_USABLE] = "usable", - [LIMINE_MEMMAP_RESERVED] = "reserved", - [LIMINE_MEMMAP_ACPI_RECLAIMABLE] = "ACPI reclaimable", - [LIMINE_MEMMAP_ACPI_NVS] = "ACPI NVS", - [LIMINE_MEMMAP_BAD_MEMORY] = "bad", - [LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE] = "bootloader reclaimable", - [LIMINE_MEMMAP_KERNEL_AND_MODULES] = "kernel and modules", - [LIMINE_MEMMAP_FRAMEBUFFER] = "framebuffer" -}; - -static const int MAX_SEGMENTS = __ARRAY_COUNT(segment_name); - - -static bitmap_t bitmap = NULL; -static size_t pages_total = 0; -static size_t pages_reserved = 0; -static size_t last_used_idx = 0; -static size_t pages_allocated = 0; -static size_t bitmap_size = 0; -static size_t highest_frame_idx; -static size_t bitmap_free_start; /* Beginning bit of free region */ - -static void -vm_physseg_getstat(void) -{ - struct limine_memmap_entry *entry; - size_t entry_pages = 0; - - pages_total = 0; - pages_reserved = 0; - - for (size_t i = 0; i < resp->entry_count; ++i) { - entry = resp->entries[i]; - entry_pages = entry->length / vm_get_page_size(); - - /* Drop invalid entries */ - if (entry->type >= MAX_SEGMENTS) { - continue; - } - - pages_total += entry_pages; - - if (entry->type != LIMINE_MEMMAP_USABLE) { - pages_reserved += entry_pages; - continue; - } - } -} - -static void -vm_physseg_bitmap_alloc(void) -{ - struct limine_memmap_entry *entry; - uintptr_t highest_addr = 0; - - for (size_t i = 0; i < resp->entry_count; ++i) { - entry = resp->entries[i]; - - /* Drop any entries with an invalid type */ - if (entry->type >= MAX_SEGMENTS) { - continue; - } - - if (entry->type != LIMINE_MEMMAP_USABLE) { - /* This memory is not usable */ - continue; - } - - if (entry->length >= bitmap_size) { - bitmap = PHYS_TO_VIRT(entry->base); - memset(bitmap, 0xFF, bitmap_size); - entry->length -= bitmap_size; - entry->base += bitmap_size; - return; - } - - highest_addr = __MAX(highest_addr, entry->base + entry->length); - } -} - -static void -vm_physseg_bitmap_populate(void) -{ - struct limine_memmap_entry *entry; -#if defined(VM_PHYSSEG_DEBUG) - size_t start, end; -#endif /* defined(VM_PHYSSEG_DEBUG) */ - - for (size_t i = 0; i < resp->entry_count; ++i) { - entry = resp->entries[i]; - - /* Drop any entries with an invalid type */ - if (entry->type >= MAX_SEGMENTS) { - continue; - } - -#if defined(VM_PHYSSEG_DEBUG) - /* Dump the memory map if we are debugging */ - start = entry->base; - end = entry->base + entry->length; - DPRINTF("0x%x - 0x%x, size: 0x%x, type: %s\n", - start, end, entry->length, - segment_name[entry->type]); -#endif /* defined(VM_PHYSSEG_DEBUG) */ - - /* Don't set non-usable entries as free */ - if (entry->type != LIMINE_MEMMAP_USABLE) { - continue; - } - - /* Populate */ - if (bitmap_free_start == 0) { - bitmap_free_start = entry->base/0x1000; - } - for (size_t j = 0; j < entry->length; j += 0x1000) { - bitmap_unset_bit(bitmap, (entry->base + j) / 0x1000); - } - } -} - -static void -vm_physseg_bitmap_init(void) -{ - uintptr_t highest_addr; - struct limine_memmap_entry *entry; - - highest_addr = 0; - highest_frame_idx = 0; - - /* Find the highest entry */ - for (size_t i = 0; i < resp->entry_count; ++i) { - entry = resp->entries[i]; - - if (entry->type != LIMINE_MEMMAP_USABLE) { - /* Memeory not usable */ - continue; - } - - highest_addr = __MAX(highest_addr, entry->base + entry->length); - } - - highest_frame_idx = highest_addr / 0x1000; - bitmap_size = __ALIGN_UP(highest_frame_idx / 8, 0x1000); - - DPRINTF("Bitmap size: %d bytes\n", bitmap_size); - DPRINTF("Allocating and populating bitmap now...\n"); - - vm_physseg_bitmap_alloc(); - vm_physseg_bitmap_populate(); -} - -uintptr_t -vm_alloc_pageframe(size_t count) -{ - size_t pages = 0; - size_t tmp; - - while (last_used_idx < highest_frame_idx) { - if (!bitmap_test_bit(bitmap, last_used_idx++)) { - /* We have a free page */ - if (++pages != count) - continue; - - tmp = last_used_idx - count; - - for (size_t i = tmp; i < last_used_idx; ++i) - bitmap_set_bit(bitmap, i); - - pages_allocated += count; - return tmp * vm_get_page_size(); - } else { - pages = 0; - } - } - - return 0; -} - -/* - * Frees physical pageframes. - * - * @base: Base to start freeing at. - * @count: Number of pageframes to free. - */ -void -vm_free_pageframe(uintptr_t base, size_t count) -{ - const size_t PAGE_SIZE = vm_get_page_size(); - - for (uintptr_t p = base; p < base + (count*PAGE_SIZE); p += PAGE_SIZE) { - bitmap_unset_bit(bitmap, p/0x1000); - } - - pages_allocated -= count; -} - -void -vm_physseg_init(void) -{ - resp = mmap_req.response; - - vm_physseg_bitmap_init(); -} - -struct physmem_stat -vm_phys_memstat(void) -{ - size_t pagesize = vm_get_page_size(); - struct physmem_stat stat; - - vm_physseg_getstat(); - stat.total_kib = (pages_total * pagesize) / 1024; - stat.reserved_kib = (pages_reserved * pagesize) / 1024; - stat.alloc_kib = (pages_allocated * pagesize) / 1024; - stat.avl_kib = stat.total_kib - stat.alloc_kib; - return stat; -} diff --git a/sys/vm/vm_stat.c b/sys/vm/vm_stat.c deleted file mode 100644 index 6374699..0000000 --- a/sys/vm/vm_stat.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include - -struct vm_memstat -vm_memstat(void) -{ - struct vm_memstat stat; - - stat.pmem_stat = vm_phys_memstat(); - stat.vmobj_cnt = vm_obj_count(); - return stat; -} diff --git a/sys/vm/vm_vnode.c b/sys/vm/vm_vnode.c deleted file mode 100644 index e3d95ac..0000000 --- a/sys/vm/vm_vnode.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2023-2024 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 -#include -#include -#include -#include -#include -#include -#include - -static int vn_pager_get(struct vm_object *obj, off_t off, size_t len, - struct vm_page *pg); - -static int vn_pager_store(struct vm_object *obj, off_t off, size_t len, - struct vm_page *pg); - -/* Pager operations */ -struct vm_pagerops g_vnode_pagerops = { - .get = vn_pager_get, - .store = vn_pager_store -}; - -static inline void -vn_prep_sio(struct sio_txn *sio, char *pg, off_t off, size_t len) -{ - sio->len = __ALIGN_DOWN(len, vm_get_page_size()); - sio->buf = pg; - sio->offset = off; - sio->len = len; -} - -static int -vn_pager_io(struct vm_object *obj, off_t off, size_t len, - struct vm_page *pg, bool out) -{ - struct sio_txn sio; - struct vnode *vp; - ssize_t paged_bytes; - char *dest; - int res = 0; - - if (obj == NULL || pg == NULL) { - return -EIO; - } - - spinlock_acquire(&obj->lock); - vm_object_ref(obj); - dest = PHYS_TO_VIRT(pg->physaddr); - - /* Attempt to fetch the vnode */ - if ((vp = obj->vnode) == NULL) { - res = -EIO; - goto done; - } - - /* Prepare the SIO transaction */ - vn_prep_sio(&sio, dest, off, len); - if (sio.len == 0) { - res = -EIO; - goto done; - } - - /* Perform I/O on the backing store */ - paged_bytes = out ? vfs_write(vp, &sio) : vfs_read(vp, &sio); - if (paged_bytes < 0) { - /* Failure */ - res = paged_bytes; - goto done; - } -done: - vm_object_unref(obj); - spinlock_release(&obj->lock); - return res; -} - -static int -vn_pager_store(struct vm_object *obj, off_t off, size_t len, struct vm_page *pg) -{ - return vn_pager_io(obj, off, len, pg, true); -} - -static int -vn_pager_get(struct vm_object *obj, off_t off, size_t len, struct vm_page *pg) -{ - return vn_pager_io(obj, off, len, pg, false); -} -- cgit v1.2.3