Fix riscv64 boot crash: add missing kernel stack trampoline
kernel_main on riscv64 ran directly on EDK2's UEFI boot-time stack, with no dedicated stack switch — amd64 has always had a kernel_entry.S trampoline for exactly this reason (its own comment: "the FORTH interpreter + DOE experiment loop can easily exceed that depth"). aarch64 happens to get away without one because its firmware's default stack is apparently larger, but that was never a guarantee. On riscv64 the VM bootstrap's call depth (27 word-registration modules -> physics/SSM init -> Tripod capsule birth) overflowed that small stack, corrupting a return address and producing a wild jump / page fault right after vm_init_with_host() returned — reproduced consistently across the 2026-08-01 DoE campaign logs. - src/starkernel/arch/riscv64/kernel_entry.S (new): RISC-V stack-switch trampoline mirroring amd64's, giving the kernel a dedicated 2 MiB BSS stack before anything deep runs. - kernel_main.c: riscv64 now builds kernel_main_impl (invoked via the trampoline) instead of kernel_main directly, same pattern as amd64. - Makefile.starkernel: wires the new file into the riscv64 build. - uefi_loader.c: RAW_LOG() was silently a no-op on every non-amd64 arch; added a real raw-UART writer for riscv64 (QEMU virt's uart8250 at MMIO 0x10000000) so existing loader diagnostics actually produce output. Verified: all three architectures boot clean to [Hera] ok> in the required order (amd64, aarch64, riscv64); logs and DoE CSVs from these runs included. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
a852db2209
commit
736627510b
@@ -325,10 +325,10 @@ static void print_banner(void) {
|
||||
/**
|
||||
* @brief Main kernel entry point after UEFI handoff — executes milestones M0–M6.
|
||||
*
|
||||
* On amd64, @c kernel_entry.S switches the stack from UEFI's default to a 2 MiB
|
||||
* zero-initialised BSS stack and tail-calls this function as @c kernel_main_impl.
|
||||
* On aarch64 and riscv64 the assembly trampoline is not yet implemented and the
|
||||
* UEFI loader calls @c kernel_main directly.
|
||||
* On amd64 and riscv64, @c kernel_entry.S switches the stack from UEFI's default
|
||||
* to a 2 MiB zero-initialised BSS stack and tail-calls this function as
|
||||
* @c kernel_main_impl. On aarch64 the assembly trampoline is not yet implemented
|
||||
* and the UEFI loader calls @c kernel_main directly.
|
||||
*
|
||||
* Milestone sequence:
|
||||
* - **M0 — Architecture early init** (@c arch_early_init()): On amd64, installs a
|
||||
@@ -357,7 +357,7 @@ static void print_banner(void) {
|
||||
* framebuffer descriptor, runtime services pointer, and parsed
|
||||
* kernel command-line arguments.
|
||||
*/
|
||||
#if defined(__x86_64__)
|
||||
#if defined(__x86_64__) || defined(__riscv)
|
||||
void kernel_main_impl(BootInfo *boot_info) {
|
||||
#else
|
||||
void kernel_main(BootInfo *boot_info) {
|
||||
|
||||
Reference in New Issue
Block a user