Files
LithosAnanake/docs/lithosananke/hal/overview.md
T

14 KiB

Hardware Abstraction Layer (HAL) Architecture

⚠️ Important Note: This document describes the target HAL architecture with standardized hal_* function naming. The current codebase uses sf_time_backend_t and similar abstractions with different naming conventions. See migration-plan.md for the refactoring steps to migrate existing platform code to the HAL interfaces described here.

HISTORICAL — L4Re/Fiasco.OC: this document's L4Re references (platform comparison table, microkernel discussion, etc.) describe a target that was a supported platform through mid-2026. L4Re support has since been removed as an active target — src/platform/l4re/time.c and related #ifdef __l4__ code are retained for reference but no longer wired into any build. Treat every L4Re mention below as historical design context, not a currently buildable platform.

Executive Summary

The Hardware Abstraction Layer (HAL) is the architectural foundation that enables StarForth to evolve from a hosted VM into LithosAnanke while preserving the physics-driven adaptive runtime's deterministic behavior across all platforms.

Critical insight: The HAL is not an afterthought—it's the linchpin that makes LithosAnanke → StarshipOS possible without compromising StarForth's experimental integrity.


The Problem

StarForth currently runs on multiple platforms:

  • Linux (POSIX, hosted)
  • L4Re/Fiasco.OC (microkernel)
  • Bare metal (limited, experimental)

Each platform has its own:

  • Timing mechanisms (POSIX timers vs. hardware timers)
  • Interrupt handling (signals vs. IDT/APIC)
  • Memory allocation (malloc vs. physical page frames)
  • I/O mechanisms (stdin/stdout vs. UART/framebuffer)

Without a HAL: Platform-specific code bleeds into the VM core, physics subsystems, and word implementations. This creates:

  • ❌ Fragile #ifdef PLATFORM_X conditionals throughout codebase
  • ❌ Platform-specific bugs in supposedly portable code
  • ❌ Inability to test kernel code on hosted platforms
  • ❌ Risk to deterministic behavior guarantees (0% algorithmic variance)

With a HAL: Clean separation between VM logic and platform implementation:

  • ✅ VM and physics subsystems are platform-agnostic
  • ✅ Platform code is isolated and testable
  • ✅ New platforms (LithosAnanke) can be added without touching VM core
  • ✅ Deterministic behavior guaranteed by HAL contract, not platform quirks

Architecture Overview

┌────────────────────────────────────────────────────────────┐
│  StarForth VM Core + Physics Subsystems                    │
│  • Interpreter loop (vm.c)                                 │
│  • Execution heat tracking                                 │
│  • Rolling window of truth                                 │
│  • Hot-words cache                                         │
│  • Pipelining metrics                                      │
│  • Inference engine                                        │
│  • Heartbeat coordination                                  │
│                                                             │
│  ↓ Calls HAL interfaces (platform-agnostic)                │
├────────────────────────────────────────────────────────────┤
│  Hardware Abstraction Layer (HAL)                          │
│  • hal_time.h      - Monotonic time, timers, calibration   │
│  • hal_interrupt.h - IRQ management, ISR registration      │
│  • hal_memory.h    - Allocation, page mapping, heap        │
│  • hal_console.h   - Character I/O (serial, framebuffer)   │
│  • hal_cpu.h       - CPU ID, relax/halt, SMP coordination  │
│                                                             │
│  ↓ Platform-specific implementations                       │
├────────────────────────────────────────────────────────────┤
│  Platform Implementations                                  │
│  ┌──────────────┬──────────────┬──────────────────────┐   │
│  │ Linux        │ L4Re         │ Kernel (LithosAnanke)  │   │
│  │ (POSIX)      │ (microkernel)│ (freestanding)       │   │
│  ├──────────────┼──────────────┼──────────────────────┤   │
│  │ clock_gettime│ L4Re::Clock  │ TSC + HPET + APIC    │   │
│  │ timerfd      │ L4Re::IrqEoi │ IDT + APIC IRQ       │   │
│  │ malloc/free  │ dataspaces   │ PMM + VMM + kmalloc  │   │
│  │ stdin/stdout │ L4Re::Console│ UART + framebuffer   │   │
│  │ pthread      │ L4Re::Thread │ SMP bring-up         │   │
│  └──────────────┴──────────────┴──────────────────────┘   │
└────────────────────────────────────────────────────────────┘

Design Principles

1. VM Purity

The VM core must never know which platform it's running on. All platform awareness lives in HAL implementations.

Anti-pattern (current):

#ifdef PLATFORM_LINUX
    clock_gettime(CLOCK_MONOTONIC, &ts);
#elif PLATFORM_L4RE
    l4re_kip_clock(kip);
#elif PLATFORM_KERNEL
    rdtsc();
#endif

Correct pattern (HAL):

// In VM code (platform-agnostic)
uint64_t now = hal_time_now_ns();

// In platform/linux/hal_time.c
uint64_t hal_time_now_ns(void) {
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    return (uint64_t)ts.tv_sec * 1000000000ULL + ts.tv_nsec;
}

// In platform/kernel/hal_time.c
uint64_t hal_time_now_ns(void) {
    return tsc_to_ns(rdtsc());
}

2. Contract-First Design

HAL interfaces are contracts, not convenience wrappers. Each HAL function has:

  • Precise semantics - What it does, guaranteed across all platforms
  • Error handling - When it can fail and how
  • Performance expectations - Allowed latency/overhead
  • Concurrency model - Thread-safe? ISR-safe?

3. Testability on Hosted Platforms

LithosAnanke code must be developable and testable on Linux/L4Re before deploying to bare metal.

Example: Heartbeat ISR development

  • Kernel implementation: APIC timer interrupt → ISR → ring buffer
  • Linux test implementation: timerfd + signal handler → ISR → ring buffer
  • Same HAL interface, same VM code, different platform layer

4. Zero Overhead When Possible

HAL calls should compile to direct hardware access on kernel platforms, not add abstraction tax.

Good: hal_time_now_ns() inlines to rdtsc() with -O2 Bad: Function pointer indirection adds 5-10 cycles per call

5. Fail-Fast Validation

HAL implementations validate platform assumptions at init time, not during execution.

Example:

void hal_time_init(void) {
    // Calibrate TSC frequency at boot
    tsc_calibrate_hpet();

    // Validate monotonicity
    uint64_t t1 = hal_time_now_ns();
    hal_cpu_relax();
    uint64_t t2 = hal_time_now_ns();

    if (t2 < t1) {
        hal_panic("hal_time: TSC not monotonic!");
    }
}

HAL Subsystems

1. Time & Timers (hal_time.h)

Purpose: Monotonic time, periodic/oneshot timers, calibration

Critical for StarForth: The heartbeat subsystem and physics feedback loops depend on precise, jitter-free timing. HAL must guarantee:

  • Monotonic time (never goes backward)
  • Sub-microsecond resolution
  • Calibrated frequency (for TSC-based timing)

Platform challenges:

  • Linux: clock_gettime() is good, but signal-based timers have latency
  • Kernel: TSC drift, HPET/PIT fallback, per-core calibration

2. Interrupts (hal_interrupt.h)

Purpose: Enable/disable IRQs, register ISRs, query interrupt context

Critical for StarForth: Heartbeat ISR must run at precise intervals without VM involvement.

Platform challenges:

  • Linux: Signals are "interrupt-like" but not true IRQs
  • Kernel: IDT setup, APIC configuration, spurious interrupt handling

3. Memory (hal_memory.h)

Purpose: Allocate/free memory, page mapping, heap management

Critical for StarForth: Dictionary allocation, stack allocation, heap allocator must work identically across platforms.

Platform challenges:

  • Linux: malloc/free are simple
  • Kernel: Physical memory manager, virtual memory manager, heap allocator—all from scratch

4. Console (hal_console.h)

Purpose: Character I/O for REPL and diagnostics

Critical for StarForth: The REPL must work on all platforms for interactive experimentation.

Platform challenges:

  • Linux: stdin/stdout are perfect
  • Kernel: UART 16550 is well-documented but framebuffer is tricky

5. CPU (hal_cpu.h)

Purpose: CPU ID, relax/halt, SMP coordination

Critical for StarForth: Per-core execution heat tracking (future), SMP scalability (future).

Platform challenges:

  • Linux: pthread local storage
  • Kernel: Local APIC, per-core stacks, CPU-local storage

HAL and the Physics Subsystems

The physics-driven adaptive runtime is the primary beneficiary of the HAL:

Physics Subsystem HAL Dependency Why
Execution Heat None (pure VM state) Tracks word execution frequency
Rolling Window hal_time_now_ns() Timestamps for window entries
Hot-Words Cache None (pure dictionary state) Frequency-based reordering
Pipelining Metrics None (pure transition tracking) Word-to-word prediction
Inference Engine hal_time_now_ns() Calibration timing, ANOVA
Heartbeat hal_timer_periodic(), hal_interrupt.* ISR-based sampling

Key insight: Only 2 of 6 subsystems touch the HAL directly, and only via clean interfaces. This preserves deterministic behavior while enabling kernel deployment.


HAL and LithosAnanke

LithosAnanke is a new platform implementation of the HAL:

src/platform/kernel/
├── boot/
│   └── uefi_loader.c       # UEFI entry point → BootInfo handoff
├── hal_time.c              # TSC + HPET + APIC timer
├── hal_interrupt.c         # IDT + Local APIC + IOAPIC
├── hal_memory.c            # PMM + VMM + kmalloc
├── hal_console.c           # UART 16550 + framebuffer
├── hal_cpu.c               # SMP + CPU-local storage
└── drivers/                # PCI, AHCI, NVMe, VirtIO, etc.

LithosAnanke does NOT modify:

  • VM core (src/vm.c)
  • Physics subsystems (src/dictionary_heat_optimization.c, etc.)
  • Word implementations (src/word_source/*.c)

LithosAnanke ONLY implements:

  • HAL interfaces (hal_*.c)
  • UEFI boot loader (boot/uefi_loader.c)
  • Device drivers (drivers/*.c)

This is the proof that the HAL abstraction works: LithosAnanke is a pure platform layer, not a VM fork.


HAL and StarshipOS

StarshipOS builds on LithosAnanke by adding:

  • Process model - Forth tasks vs. traditional processes
  • Filesystem - FAT32, ext2, or log-structured
  • Networking - TCP/IP stack, DHCP, DNS
  • Device model - Unified block/net/char device interfaces
  • Security model - Capabilities, ACL, Forth-based access control

All of these still use the HAL for low-level access:

  • Filesystem → hal_memory for caching, hal_interrupt for async I/O
  • Networking → hal_interrupt for packet RX, hal_time for timeouts
  • Device model → HAL as the common substrate

The HAL is not just a kernel bootstrapping tool—it's the foundation for the entire OS.


Migration Strategy

Current StarForth codebase must be refactored to introduce the HAL:

Phase 1: Define HAL Interfaces

  • Write include/hal/*.h headers with contracts
  • Document semantics, error handling, performance expectations
  • No implementation yet

Phase 2: Refactor Existing Platforms

  • Create src/platform/linux/hal_*.c implementing HAL
  • Create src/platform/l4re/hal_*.c implementing HAL
  • Update VM code to call HAL instead of platform-specific APIs
  • VM must still build and pass all 936+ tests

Phase 3: Validate HAL

  • Build and test on Linux
  • Build and test on L4Re (if available)
  • Verify deterministic behavior (0% algorithmic variance) still holds
  • Benchmark: HAL must not add measurable overhead

Phase 4: Implement LithosAnanke Platform

  • Create src/platform/kernel/ with HAL implementations
  • UEFI boot loader
  • Basic MM, console, timing
  • Goal: Boot to ok prompt on QEMU/OVMF

Phase 5: Full LithosAnanke

  • Complete HAL implementations (interrupts, SMP, drivers)
  • Heartbeat ISR running at kernel level
  • Physics subsystems operational
  • Goal: Reproduce DoE results on bare metal

Phase 6: StarshipOS

  • Process model, filesystem, networking
  • Forth as native control plane
  • Goal: Self-hosting OS

Success Criteria

The HAL is successful if:

  1. ✅ VM core has zero platform-specific code
  2. ✅ All 936+ tests pass on Linux, L4Re, and LithosAnanke
  3. ✅ 0% algorithmic variance maintained across platforms
  4. ✅ No measurable performance regression from HAL abstraction
  5. ✅ LithosAnanke boots to ok prompt and runs REPL
  6. ✅ Heartbeat subsystem works identically on all platforms
  7. ✅ New platforms can be added without touching VM code

Next Steps

See companion documentation:

  • interfaces.md - Detailed HAL interface specifications
  • platform-implementations.md - How to implement HAL for new platforms
  • migration-plan.md - Step-by-step refactoring guide
  • lithosananke-integration.md - LithosAnanke-specific implementation details

References

  • StarForth VM core: src/vm.c
  • Heartbeat system: docs/03-architecture/heartbeat-system/
  • Physics feedback loops: docs/FEEDBACK_LOOPS.md
  • Platform abstraction (current): src/platform/