%% SCRAP: architecture/03-architecture/hal/overview %% SOURCE: docs/working/architecture/03-architecture/hal/overview.md %% STATUS: WORKING %% FITS: dev-guide/ch-platform %% EDITORIAL: lifted — prose rewritten to press voice \section{HAL Architecture Overview} The Hardware Abstraction Layer is the architectural foundation that lets StarForth evolve from a hosted virtual machine into StarKernel while preserving the physics-driven adaptive runtime's deterministic behavior on every platform. It is not an afterthought bolted onto the interpreter; it is the linchpin that makes the StarForth $\rightarrow$ StarKernel $\rightarrow$ StarshipOS progression possible without compromising the experimental integrity of the runtime. %% TODO(bob): the source notes the current code base uses sf_time_backend_t and %% related abstractions; the hal_* naming described here is the target. Confirm %% whether to present this as target-state or to reconcile with current naming. \subsection{The Problem} StarForth runs on Linux as a hosted POSIX process, on L4Re/Fiasco.OC as a microkernel guest, and, experimentally, on bare metal. Each platform brings its own timing, interrupt handling, memory allocation, and I/O. Without an abstraction, platform-specific code bleeds into the interpreter, the physics subsystems, and the word implementations, producing fragile conditional compilation, platform-specific bugs in nominally portable code, an inability to test kernel code on a hosted platform, and a standing risk to the deterministic guarantees that the runtime depends on. With the HAL, the interpreter and physics subsystems are platform-agnostic, the platform code is isolated and testable, new platforms can be added without touching the core, and determinism is guaranteed by the HAL contract rather than by platform quirks. \subsection{Three-Layer Model} The architecture stacks in three layers. At the top, the VM core and physics subsystems call only HAL interfaces. In the middle, the HAL declares the platform-agnostic contract across six subsystems: time, interrupts, memory, console, and CPU, plus panic. At the bottom, each platform supplies a concrete implementation --- Linux mapping onto \texttt{clock\_gettime}, timers, \texttt{malloc}, standard I/O, and threads; L4Re mapping onto its clock, IRQ, dataspace, console, and thread services; StarKernel mapping onto a calibrated TSC with HPET and APIC, the IDT and APIC interrupt path, a physical and virtual memory manager with \texttt{kmalloc}, a UART and framebuffer console, and SMP bring-up. \subsection{Design Principles} \emph{VM purity}: the core never knows its platform; all platform awareness lives in HAL implementations, replacing conditional-compilation anti-patterns with a single portable call. \emph{Contract-first design}: each HAL function has precise semantics, defined error handling, a performance envelope, and a stated concurrency model. \emph{Testability on hosted platforms}: kernel-bound code, such as the heartbeat ISR, is developed and tested on Linux before it reaches bare metal, using the same interface and the same VM code over a different platform layer. \emph{Zero overhead where possible}: optimized builds inline HAL calls to direct hardware access rather than paying for function-pointer indirection. \emph{Fail-fast validation}: a platform validates its assumptions at initialization --- calibrating its timer and confirming monotonicity, for instance --- and panics immediately rather than failing silently during execution. \subsection{The HAL and the Physics Subsystems} The adaptive runtime is the HAL's primary beneficiary, and notably it touches the abstraction only lightly. Of the physics subsystems, execution heat tracking, the hot-words cache, and the pipelining metrics depend on no HAL service at all --- they operate purely on VM and dictionary state. Only the rolling window and the inference engine call \texttt{hal\_time\_now\_ns()}, and only the heartbeat depends on the timer and interrupt interfaces. That just two of six subsystems reach the HAL, and only through clean interfaces, is precisely what preserves deterministic behavior while enabling kernel deployment. \subsection{The HAL and StarKernel} StarKernel is not a fork of the VM; it is a new platform implementation of the HAL. It implements the HAL functions, the UEFI boot loader, and the device drivers, and it modifies neither the interpreter core, nor the physics subsystems, nor the word implementations. That clean separation is the proof that the abstraction works: StarKernel is a platform layer, not a VM variant. \subsection{The HAL and StarshipOS} StarshipOS builds on StarKernel by adding a process model of Forth tasks, a filesystem, a networking stack, a unified device model, and a security model grounded in capabilities and Forth-based access control. Each of these still rests on the HAL for low-level access --- the filesystem on memory and interrupts, networking on interrupts and time, the device model on the HAL as a common substrate. The HAL is therefore not merely a kernel-bootstrapping tool; it is the foundation for the entire operating system. \subsection{Success Criteria} The HAL succeeds when the VM core carries zero platform-specific code, the full test suite passes on Linux, L4Re, and StarKernel, zero algorithmic variance is maintained across platforms, no measurable performance regression is introduced by the abstraction, StarKernel boots to its \texttt{ok} prompt and runs the REPL, the heartbeat behaves identically everywhere, and new platforms can be added without touching VM code.