diff options
| author | Nathan Lee <me@nwlee.tech> | 2026-09-25 23:24:31 -0500 |
|---|---|---|
| committer | Nathan Lee <me@nwlee.tech> | 2026-09-25 23:24:31 -0500 |
| commit | 548905a86473101325540446f35ffda8acd0c3bb (patch) | |
| tree | 57e495fbdb302d83880bd36e7368cdb48cd23e25 /website-kernel/arch | |
| parent | 6858c9e7c97f772eb357e3eee0c1fcfb8adcb699 (diff) | |
scaffold kernel from parts of wkern x86
Diffstat (limited to 'website-kernel/arch')
| -rw-r--r-- | website-kernel/arch/kernel.c | 9 | ||||
| -rw-r--r-- | website-kernel/arch/linker.ld | 52 | ||||
| -rw-r--r-- | website-kernel/arch/log.c | 100 | ||||
| -rw-r--r-- | website-kernel/arch/start.S | 23 |
4 files changed, 184 insertions, 0 deletions
diff --git a/website-kernel/arch/kernel.c b/website-kernel/arch/kernel.c new file mode 100644 index 0000000..28c94d3 --- /dev/null +++ b/website-kernel/arch/kernel.c @@ -0,0 +1,9 @@ +#include <int.h> +#include <log.h> + +#define SERIAL_PORT 0x70000000 + +void kernel_main(size_t hart) { + (void)hart; + printk("wkern version %s (Compiler %s, Linker %s) on %s\n", VERSION, COMPILER_NAME, LINKER_NAME, ARCH_NAME); +} diff --git a/website-kernel/arch/linker.ld b/website-kernel/arch/linker.ld new file mode 100644 index 0000000..52a3a05 --- /dev/null +++ b/website-kernel/arch/linker.ld @@ -0,0 +1,52 @@ +OUTPUT_ARCH(riscv) +ENTRY(_start) + +MEMORY +{ + ROM (rx) : ORIGIN = 0x80000000, LENGTH = 1M + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 4M +} + +SECTIONS +{ + .text : { + KEEP(*(.text._start)) + KEEP(*(.text.start)) + *(.text) + *(.text.*) + } > ROM + .rodata : { + *(.rodata) + *(.rodata.*) + } > ROM + + .init_array : { + __init_array_start = .; + KEEP(*(.init_array)) + KEEP(*(.init_array.*)) + __init_array_end = .; + } > ROM + + .data : { + __data_start = .; + *(.data) + *(.data.*) + __data_end = .; + } > RAM AT> ROM + __data_load = LOADADDR(.data); + + .bss : { + __bss_start = .; + *(.bss) + *(.bss.*) + *(COMMON) + __bss_end = .; + } > RAM + + .stack (NOLOAD) : { + . = ALIGN(16); + __stack_bottom = .; + . += 8K; + __stack_top = .; + } > RAM +} diff --git a/website-kernel/arch/log.c b/website-kernel/arch/log.c new file mode 100644 index 0000000..63e0615 --- /dev/null +++ b/website-kernel/arch/log.c @@ -0,0 +1,100 @@ +#include <log.h> +void stub(char c) { + (void)c; + return; +} + +console_callback_t callback = stub; + +void put_char(char c) { + callback(c); +} + +void put_string(const char *s) { + while (*s) + put_char(*s++); +} + +void put_uint(unsigned int value, unsigned int radix) { + char tmp[16]; + const char digits[] = "0123456789abcdef"; + int i = 0; + + if (value == 0) { + put_char('0'); + return; + } + + while (value) { + tmp[i++] = digits[value % radix]; + value /= radix; + } + + while (i--) + put_char(tmp[i]); +} + +void put_int(int value) { + if (value < 0) { + put_char('-'); + put_uint((unsigned int)(-value), 10); + } else { + put_uint((unsigned int)value, 10); + } +} + +void vprintk(const char *fmt, __builtin_va_list args) { + while (*fmt) { + if (*fmt != '%') { + put_char(*fmt++); + continue; + } + + fmt++; + + switch (*fmt) { + case '%': + put_char('%'); + break; + + case 'c': + put_char((char)__builtin_va_arg(args, int)); + break; + + case 's': + put_string(__builtin_va_arg(args, const char *)); + break; + + case 'd': + case 'i': + put_int(__builtin_va_arg(args, int)); + break; + + case 'u': + put_uint(__builtin_va_arg(args, unsigned int), 10); + break; + + case 'x': + put_uint(__builtin_va_arg(args, unsigned int), 16); + break; + + default: + put_char('%'); + put_char(*fmt); + break; + } + + fmt++; + } +} + +void printk(const char *fmt, ...) { + __builtin_va_list args; + __builtin_va_start(args, fmt); + vprintk(fmt, args); + __builtin_va_end(args); +} + +void register_console_callback(console_callback_t cb) { + callback = cb; +} diff --git a/website-kernel/arch/start.S b/website-kernel/arch/start.S new file mode 100644 index 0000000..8248ab9 --- /dev/null +++ b/website-kernel/arch/start.S @@ -0,0 +1,23 @@ +.section .text._start +.global _start +.type _start, @function + +.extern user_regs + +_start: + csrw sstatus, zero + csrw sie, zero + + la sp, __stack_top + + la t0, __bss_start + la t1, __bss_end + beq t0, t1, 2f +1: + sw zero, 0(t0) + addi t0, t0, 4 + bltu t0, t1, 1b +2: + call kernel_main + wfi + |
