rumpk/hal/main.zig

109 lines
3.0 KiB
Zig

// SPDX-License-Identifier: LCL-1.0
// Copyright (c) 2026 Markus Maiwald
// Stewardship: Self Sovereign Society Foundation
//
// This file is part of the Nexus Commonwealth.
// See legal/LICENSE_COMMONWEALTH.md for license terms.
//! Rumpk Layer 0: The Concrete Foundation (HAL Entry Point)
//!
//! This is the hardware floor. Sets up stack, initializes UART,
//! draws the initial HUD, and hands off to Nim L1.
//!
//! SAFETY: Runs in bare-metal mode with no runtime support.
const uart = @import("uart.zig");
const hud = @import("hud.zig");
const virtio_net = @import("virtio_net.zig");
const virtio_block = @import("virtio_block.zig");
export fn hal_io_init() void {
virtio_net.init();
virtio_block.init();
}
// =========================================================
// Stack Setup (16KB)
// =========================================================
// SAFETY(Stack): Memory is immediately used by _start before any read.
// Initialized to `undefined` for performance (no zeroing 64KB at boot).
export var stack_bytes: [64 * 1024]u8 align(16) = undefined;
// =========================================================
// Entry Point (Naked - no prologue)
// =========================================================
export fn _start() callconv(.naked) noreturn {
// ARM64: Set up stack pointer, then call zig_entry
asm volatile (
// 1. Enable FP/SIMD (prevents traps if compiler vectorizes crypto)
\\ mov x0, #3 << 20
\\ msr cpacr_el1, x0
\\ isb
// 2. Set up stack
\\ adrp x0, stack_bytes
\\ add x0, x0, :lo12:stack_bytes
\\ add sp, x0, #65536
\\ bl zig_entry
\\ b .
);
unreachable;
}
// =========================================================
// HAL Exports to Nim (The ABI Contract)
// =========================================================
export fn console_write(ptr: [*]const u8, len: usize) void {
uart.write_bytes(ptr[0..len]);
}
export fn rumpk_halt() noreturn {
uart.puts("[Rumpk L0] Halting.\n");
while (true) {
asm volatile ("wfi");
}
}
// Nim Entry Points
extern fn NimMain() void;
extern fn kmain() void;
// =========================================================
// Zig Entry (called from _start)
// =========================================================
export fn zig_entry() void {
uart.init();
// HUD DRAW
uart.print(hud.CLEAR);
hud.set_color(36); // Cyan
hud.draw_box(1, 1, 80, 3, "RUMPK HUD v0.1");
hud.draw_box(1, 4, 80, 20, "NEXSHELL CONSOLE");
hud.draw_box(1, 24, 80, 2, "IDENTITY");
hud.move_to(2, 4);
uart.print("CPU: AArch64 | STATUS: INITIALIZING | MASK: SOVEREIGN");
hud.move_to(25, 4);
uart.print("CELL: /Cell/Root | ID: 0xDEADBEEF");
hud.move_to(5, 4);
hud.reset_color();
uart.puts("[Rumpk L0] Handing off to Nim L1...\n");
// Initialize Nim Runtime
NimMain();
// HANDOFF
kmain();
// If Nim returns, halt
uart.puts("[Rumpk L0] Nim returned unexpectedly.\n");
rumpk_halt();
}