109 lines
3.0 KiB
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();
|
|
}
|