From ac9741e12222e72bad3414bc6f588e70a3d130cc Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Tue, 14 Apr 2026 22:47:15 +0800 Subject: feat: implement FDT-based memory discovery and add comprehensive debug logging to exec syscalls --- include/kernel/config.h | 6 +-- include/kernel/fdt.h | 45 +++++++++++++++++++++ include/kernel/pmm.h | 11 +++-- include/kernel/syscall.h | 103 ++++++++++++++++++++++++++++++++++------------- 4 files changed, 132 insertions(+), 33 deletions(-) create mode 100644 include/kernel/fdt.h (limited to 'include/kernel') diff --git a/include/kernel/config.h b/include/kernel/config.h index 45d85cd..49df2ff 100644 --- a/include/kernel/config.h +++ b/include/kernel/config.h @@ -1,12 +1,12 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2026 Richard QIn + * Copyright (C) 2026 Richard Qin */ #pragma once #include "common/types.h" +#include "kernel/fdt.h" +// Legacy compat — these are still referenced in some places extern uint64 g_uart_base; -extern uint64 g_clint_base; -extern uint64 g_plic_base; extern uint64 g_dtb_addr; \ No newline at end of file diff --git a/include/kernel/fdt.h b/include/kernel/fdt.h new file mode 100644 index 0000000..89cbae6 --- /dev/null +++ b/include/kernel/fdt.h @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2026 Richard Qin + * LumeOS - FDT Device Discovery + */ + +#pragma once +#include "common/types.h" + +// Single device descriptor (populated from FDT) +struct FdtDevice { + uint64 base_addr; // MMIO base address + uint64 size; // MMIO region size + uint32 irq; // Interrupt number (0 = none) +}; + +// Device registry — populated by fdt_parse(), consumed by drivers +struct DeviceRegistry { + // Memory + uint64 mem_base; + uint64 mem_size; + + // Core platform devices + FdtDevice uart; + FdtDevice plic; + FdtDevice clint; + + // VirtIO devices (multiple possible) + static constexpr int MAX_VIRTIO = 8; + FdtDevice virtio[MAX_VIRTIO]; + int virtio_count; + + // MMIO ranges for kvminit() to map + static constexpr int MAX_MMIO = 16; + struct MmioRegion { + uint64 base; + uint64 size; + } mmio_regions[MAX_MMIO]; + int mmio_count; +}; + +extern DeviceRegistry g_devices; + +// Parse FDT and populate g_devices +void fdt_parse(uint64 dtb); diff --git a/include/kernel/pmm.h b/include/kernel/pmm.h index 1fc3070..261786d 100644 --- a/include/kernel/pmm.h +++ b/include/kernel/pmm.h @@ -1,16 +1,21 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2026 Richard QIn + * Copyright (C) 2026 Richard Qin */ #pragma once #include "common/types.h" #include "kernel/spinlock.h" +#include "kernel/fdt.h" // For g_devices // Physical Memory Layout Definition #define KERNBASE 0x80000000 -// Set the memory size to 128MB -#define PHYSIZE (128 * 1024 * 1024) + +// Dynamic memory size from FDT +// Default to 128MB if FDT not present/parsed +extern uint64 g_phys_size; + +#define PHYSIZE (g_phys_size) #define PHYSTOP (KERNBASE + PHYSIZE) // Buddy System Max Order diff --git a/include/kernel/syscall.h b/include/kernel/syscall.h index af4c474..3594c08 100644 --- a/include/kernel/syscall.h +++ b/include/kernel/syscall.h @@ -1,35 +1,84 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2026 Richard QIn -*/ + * Copyright (C) 2026 Richard Qin + * Lume OS - Linux Compatibility Layer + * + * Strictly aligned with Linux RISC-V 64 ABI (asm-generic) + * Reference: linux/usr/include/asm-generic/unistd.h + */ #pragma once -#define SYS_putc 1 -#define SYS_fork 2 -#define SYS_exit 3 -#define SYS_wait 4 -#define SYS_pipe 5 -#define SYS_read 6 -#define SYS_kill 7 -#define SYS_exec 8 -#define SYS_fstat 9 -#define SYS_chdir 10 -#define SYS_dup 11 -#define SYS_getpid 12 -#define SYS_sbrk 13 -#define SYS_sleep 14 -#define SYS_uptime 15 -#define SYS_open 16 -#define SYS_write 17 -#define SYS_mknod 18 -#define SYS_unlink 19 -#define SYS_link 20 -#define SYS_mkdir 21 -#define SYS_close 22 -#define SYS_disk_test 23 -#define SYS_lseek 24 -#define SYS_shutdown 25 +// File System +#define SYS_getcwd 17 +#define SYS_dup 23 +#define SYS_dup3 24 +#define SYS_fcntl 25 +#define SYS_ioctl 29 +#define SYS_mknodat 33 +#define SYS_mkdirat 34 +#define SYS_unlinkat 35 +#define SYS_linkat 37 +#define SYS_umount2 39 +#define SYS_mount 40 +#define SYS_statfs 43 +#define SYS_ftruncate 46 +#define SYS_faccessat 48 +#define SYS_chdir 49 +#define SYS_fchmod 52 +#define SYS_fchmodat 53 +#define SYS_fchownat 54 +#define SYS_openat 56 +#define SYS_close 57 +#define SYS_vhangup 58 +#define SYS_pipe2 59 +#define SYS_getdents64 61 +#define SYS_lseek 62 +#define SYS_read 63 +#define SYS_write 64 +#define SYS_readv 65 +#define SYS_writev 66 +#define SYS_pread64 67 +#define SYS_pwrite64 68 +#define SYS_pselect6 72 +#define SYS_ppoll 73 +#define SYS_readlinkat 78 +#define SYS_fstatat 79 // newfstatat +#define SYS_fstat 80 + +// Process Management +#define SYS_exit 93 +#define SYS_exit_group 94 +#define SYS_set_tid_address 96 +#define SYS_nanosleep 101 +#define SYS_kill 129 +#define SYS_rt_sigaction 134 +#define SYS_times 153 +#define SYS_uname 160 +#define SYS_gettimeofday 169 +#define SYS_getpid 172 +#define SYS_getppid 173 +#define SYS_getuid 174 +#define SYS_geteuid 175 +#define SYS_getgid 176 +#define SYS_getegid 177 +#define SYS_sysinfo 179 +#define SYS_brk 214 +#define SYS_munmap 215 +#define SYS_mremap 216 +#define SYS_clone 220 +#define SYS_execve 221 +#define SYS_mmap 222 +#define SYS_wait4 260 +#define SYS_prlimit64 261 + +// System +#define SYS_reboot 142 // Used for shutdown + +// === Custom / Debug (Non-Standard) === +// Placed above 1000 to avoid conflicts with Linux ABI +#define SYS_putc 1000 +#define SYS_disk_test 1001 #ifndef __ASSEMBLER__ void syscall(); -- cgit v1.2.3