Reorganize source tree: kernel/, v3/, v4/ split and board infrastructure
Source tree reorganization: - Move StarForth v3 engine to v3/ (src/, include/, Makefile) - Move kernel to kernel/ (src/, include/, linker/, Makefile) - Create v4/ skeleton for F18-ISA golden model (DECOMPOSITION.md, JUSTIFICATION.md) - Move FABRIC-0..4.md to docs/fabric/ - Move ONTOLOGY.md and ROADMAP.md to docs/ Board infrastructure: - Add boards/ser5/, boards/raspi/, boards/milkv/, boards/zynq7020/ - Each board has board.mk (ISA, CPU flags, boot recipe) and README.md - Root Makefile becomes thin dispatcher: boot_image, all, clean, docs take TARGET - make boot_image TARGET=SER5|RASPI|MILKV builds one GPT/MBR image per board - ZYNQ7020 target exists but stops with clear error (ARMv7 port not built yet) - scripts/mkdiskimage.sh builds disk images for all boards Docs pipeline: - docs/book/ with LaTeX master (main.tex) and Makefile - pandoc converts Markdown to LaTeX at build time - Two Lua filters: table-widths.lua (wide tables wrap), code-breaks.lua (inline code breaks) - make docs builds single PDF (754 pages, 0 missing characters) - make docs TARGET=<board> adds board appendix - build/docs/<book|board>/meta.tex stamps git commit into PDF Bug fixes: - 42 include paths that only worked by accident now use correct relative paths - clang-18 hardcode replaced with configurable CC variable (fixed aarch64 build) - Pi 5: kernel_2712.img linked at 0x80000, .bss zeroed, memory reserved - Doxyfile, .clang-tidy, README.md, Kconfig paths updated Verified: - Hosted v3 build passes 1012 tests, 0 failures - SER5 image boots in QEMU (OVMF), POST passes, K exact (65536 = Q48_ONE) - Milk-V image boots in QEMU (OpenSBI + U-Boot + bootefi), POST passes - make clean TARGET=<board> removes only that board and its ISA objects - make all builds all boards, hosted v3, and docs in one run Co-authored-by: Junie <junie@jetbrains.com>
This commit is contained in:
+1
-1
@@ -14,7 +14,7 @@ Checks: >
|
|||||||
|
|
||||||
WarningsAsErrors: [ ]
|
WarningsAsErrors: [ ]
|
||||||
|
|
||||||
HeaderFilterRegex: '^src/.*|^include/.*'
|
HeaderFilterRegex: '^v3/(src|include)/.*|^kernel/(src|include)/.*'
|
||||||
|
|
||||||
AnalyzeTemporaryDtors: false
|
AnalyzeTemporaryDtors: false
|
||||||
FormatStyle: none
|
FormatStyle: none
|
||||||
|
|||||||
+28
-28
@@ -6,8 +6,8 @@
|
|||||||
# clang-tidy will ALWAYS false-positive them. Always.
|
# clang-tidy will ALWAYS false-positive them. Always.
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
src/platform/**
|
v3/src/platform/**
|
||||||
src/platform/*
|
v3/src/platform/*
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
# Skip test infrastructure
|
# Skip test infrastructure
|
||||||
@@ -15,8 +15,8 @@ src/platform/*
|
|||||||
# and stress edge conditions clang-tidy will never grok.
|
# and stress edge conditions clang-tidy will never grok.
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
src/test_runner/**
|
v3/src/test_runner/**
|
||||||
src/test_runner/*
|
v3/src/test_runner/*
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
# Skip word definitions generated or "mechanically patterned"
|
# Skip word definitions generated or "mechanically patterned"
|
||||||
@@ -24,30 +24,30 @@ src/test_runner/*
|
|||||||
# clang-tidy gives ZERO useful feedback on them.
|
# clang-tidy gives ZERO useful feedback on them.
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
src/word_source/string_words.c
|
v3/src/word_source/string_words.c
|
||||||
src/word_source/block_words.c
|
v3/src/word_source/block_words.c
|
||||||
src/word_source/arithmetic_words.c
|
v3/src/word_source/arithmetic_words.c
|
||||||
src/word_source/mixed_arithmetic_words.c
|
v3/src/word_source/mixed_arithmetic_words.c
|
||||||
src/word_source/return_stack_words.c
|
v3/src/word_source/return_stack_words.c
|
||||||
src/word_source/defining_words.c
|
v3/src/word_source/defining_words.c
|
||||||
src/word_source/stack_words.c
|
v3/src/word_source/stack_words.c
|
||||||
src/word_source/logical_words.c
|
v3/src/word_source/logical_words.c
|
||||||
src/word_source/memory_words.c
|
v3/src/word_source/memory_words.c
|
||||||
src/word_source/io_words.c
|
v3/src/word_source/io_words.c
|
||||||
src/word_source/dictionary_words.c
|
v3/src/word_source/dictionary_words.c
|
||||||
src/word_source/dictionary_manipulation_words.c
|
v3/src/word_source/dictionary_manipulation_words.c
|
||||||
src/word_source/vocabulary_words.c
|
v3/src/word_source/vocabulary_words.c
|
||||||
src/word_source/system_words.c
|
v3/src/word_source/system_words.c
|
||||||
src/word_source/starforth_words.c
|
v3/src/word_source/starforth_words.c
|
||||||
src/word_source/editor_words.c
|
v3/src/word_source/editor_words.c
|
||||||
src/word_source/format_words.c
|
v3/src/word_source/format_words.c
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
# Skip headers belonging to the word system
|
# Skip headers belonging to the word system
|
||||||
# Same reason: no signal, infinite false positives.
|
# Same reason: no signal, infinite false positives.
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
src/word_source/include/*
|
v3/src/word_source/include/*
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
# Skip anything that implements performance knobs,
|
# Skip anything that implements performance knobs,
|
||||||
@@ -55,15 +55,15 @@ src/word_source/include/*
|
|||||||
# These are meant to be weird, and tidy can't reason about them.
|
# These are meant to be weird, and tidy can't reason about them.
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
src/stack_management.c
|
v3/src/stack_management.c
|
||||||
src/profiler.c
|
v3/src/profiler.c
|
||||||
src/vm_debug.c
|
v3/src/vm_debug.c
|
||||||
src/physics_runtime.c
|
v3/src/physics_runtime.c
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
# Skip integration + stress torture-tests.
|
# Skip integration + stress torture-tests.
|
||||||
# These *intentionally* do UB-like bullshit.
|
# These *intentionally* do UB-like bullshit.
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
src/test_runner/modules/*stress*
|
v3/src/test_runner/modules/*stress*
|
||||||
src/test_runner/modules/*integration*
|
v3/src/test_runner/modules/*integration*
|
||||||
|
|||||||
+20
-20
@@ -224,43 +224,43 @@ changes with any new C word registration).
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Build kernel for a given architecture (amd64 default)
|
# Build kernel for a given architecture (amd64 default)
|
||||||
make -f Makefile.starkernel ARCH=amd64
|
make -f kernel/Makefile ARCH=amd64
|
||||||
make -f Makefile.starkernel ARCH=aarch64
|
make -f kernel/Makefile ARCH=aarch64
|
||||||
make -f Makefile.starkernel ARCH=riscv64
|
make -f kernel/Makefile ARCH=riscv64
|
||||||
|
|
||||||
# Run in QEMU with OVMF
|
# Run in QEMU with OVMF
|
||||||
make -f Makefile.starkernel qemu
|
make -f kernel/Makefile qemu
|
||||||
make -f Makefile.starkernel ARCH=aarch64 qemu
|
make -f kernel/Makefile ARCH=aarch64 qemu
|
||||||
make -f Makefile.starkernel ARCH=riscv64 qemu
|
make -f kernel/Makefile ARCH=riscv64 qemu
|
||||||
|
|
||||||
# Clean
|
# Clean
|
||||||
make -f Makefile.starkernel clean
|
make -f kernel/Makefile clean
|
||||||
```
|
```
|
||||||
|
|
||||||
Output: `build/<arch>/kernel/starkernel_loader.efi` + `build/<arch>/kernel/starkernel_kernel.elf`.
|
Output: `build/<arch>/kernel/starkernel_loader.efi` + `build/<arch>/kernel/starkernel_kernel.elf`.
|
||||||
|
|
||||||
Two independently tracked version strings flow into the generated `include/version.h`:
|
Two independently tracked version strings flow into the generated `include/version.h`:
|
||||||
`VERSION` (`Makefile.starkernel` — the embedded StarForth engine version, currently `3.1.0`;
|
`VERSION` (`kernel/Makefile` — the embedded StarForth engine version, currently `3.1.0`;
|
||||||
note this does **not** auto-sync with the standalone StarForth repo's own version) and
|
note this does **not** auto-sync with the standalone StarForth repo's own version) and
|
||||||
`LITHOS_VERSION` (`Makefile.starkernel` — the kernel version, currently **`2.0.0`**;
|
`LITHOS_VERSION` (`kernel/Makefile` — the kernel version, currently **`2.0.0`**;
|
||||||
corrected 2026-09-19 — this file said `2.0.1`, but `FABRIC-3.md` §I.2 rolled it back to
|
corrected 2026-09-19 — this file said `2.0.1`, but `FABRIC-3.md` §I.2 rolled it back to
|
||||||
`2.0.0` on 2026-09-04 because `2.0.1` names the SER5 hardware-track line and claims hardware
|
`2.0.0` on 2026-09-04 because `2.0.1` names the SER5 hardware-track line and claims hardware
|
||||||
progress not yet verified. The versioning policy is **semantic, not sequential** — see the
|
progress not yet verified. The versioning policy is **semantic, not sequential** — see the
|
||||||
roadmap table in `Makefile.starkernel` before choosing any version).
|
roadmap table in `kernel/Makefile` before choosing any version).
|
||||||
|
|
||||||
### Build configuration (Kconfig — real, wired, not vestigial)
|
### Build configuration (Kconfig — real, wired, not vestigial)
|
||||||
|
|
||||||
Every kernel-only knob (`STARFORTH_ENABLE_VM`, `PARITY_MODE`, the shared physics/heartbeat
|
Every kernel-only knob (`STARFORTH_ENABLE_VM`, `PARITY_MODE`, the shared physics/heartbeat
|
||||||
family, etc.) is an optional Kconfig symbol defined across `Kconfig`, `Kconfig.arch`,
|
family, etc.) is an optional Kconfig symbol defined across `Kconfig`, `Kconfig.arch`,
|
||||||
`Kconfig.heartbeat`, `Kconfig.kernel`, `Kconfig.physics`, `Kconfig.variant` (~40 symbols
|
`Kconfig.heartbeat`, `Kconfig.kernel`, `Kconfig.physics`, `Kconfig.variant` (~40 symbols
|
||||||
total). `Makefile.starkernel` pulls its defaults from this system via a `kconfig_bool(...)`
|
total). `kernel/Makefile` pulls its defaults from this system via a `kconfig_bool(...)`
|
||||||
mechanism — e.g. `STARFORTH_ENABLE_VM` defaults to **1** (confirmed at
|
mechanism — e.g. `STARFORTH_ENABLE_VM` defaults to **1** (confirmed at
|
||||||
`Makefile.starkernel:61`), meaning a plain `make -f Makefile.starkernel` already builds with
|
`kernel/Makefile:61`), meaning a plain `make -f kernel/Makefile` already builds with
|
||||||
VM + capsule-birth + ACL active. A bare invocation uses the defaults it always has:
|
VM + capsule-birth + ACL active. A bare invocation uses the defaults it always has:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make -f Makefile.starkernel ARCH=amd64 menuconfig
|
make -f kernel/Makefile ARCH=amd64 menuconfig
|
||||||
make -f Makefile.starkernel ARCH=amd64 kernel_amd64_defconfig
|
make -f kernel/Makefile ARCH=amd64 kernel_amd64_defconfig
|
||||||
```
|
```
|
||||||
|
|
||||||
### Hosted VM (vendored, for local sanity only)
|
### Hosted VM (vendored, for local sanity only)
|
||||||
@@ -277,7 +277,7 @@ StarForth repo) were removed 2026-08-15 — they referenced
|
|||||||
in the actual generated `include/version.h` (which only has `STARFORTH_VERSION`,
|
in the actual generated `include/version.h` (which only has `STARFORTH_VERSION`,
|
||||||
`STARFORTH_ARCH`, `STARFORTH_TARGET`, `STARFORTH_TIMESTAMP`, `STARFORTH_VERSION_FULL`,
|
`STARFORTH_ARCH`, `STARFORTH_TARGET`, `STARFORTH_TIMESTAMP`, `STARFORTH_VERSION_FULL`,
|
||||||
`LITHOS_VERSION`, `LITHOS_VERSION_STR`), so they could never have worked. Bump versions by hand-editing the `VERSION`/
|
`LITHOS_VERSION`, `LITHOS_VERSION_STR`), so they could never have worked. Bump versions by hand-editing the `VERSION`/
|
||||||
`LITHOS_VERSION` variables in `Makefile.starkernel` instead. Report the broken targets if
|
`LITHOS_VERSION` variables in `kernel/Makefile` instead. Report the broken targets if
|
||||||
asked, don't silently fix them.
|
asked, don't silently fix them.
|
||||||
|
|
||||||
### Important: Linker Configuration
|
### Important: Linker Configuration
|
||||||
@@ -298,9 +298,9 @@ The vendored hosted `make` build (above) is NEVER used to validate kernel change
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Run in this exact order for every kernel change:
|
# Run in this exact order for every kernel change:
|
||||||
make -f Makefile.starkernel ARCH=amd64 clean qemu
|
make -f kernel/Makefile ARCH=amd64 clean qemu
|
||||||
make -f Makefile.starkernel ARCH=aarch64 clean qemu
|
make -f kernel/Makefile ARCH=aarch64 clean qemu
|
||||||
make -f Makefile.starkernel ARCH=riscv64 clean qemu
|
make -f kernel/Makefile ARCH=riscv64 clean qemu
|
||||||
```
|
```
|
||||||
|
|
||||||
**QEMU rule — non-negotiable:** Only ONE QEMU instance may run at a time, always in the
|
**QEMU rule — non-negotiable:** Only ONE QEMU instance may run at a time, always in the
|
||||||
@@ -475,7 +475,7 @@ listed in `proof/ROOT` (corrected 2026-09-19; this file said 23, and `proof/COVE
|
|||||||
said 52 all along). **Read `proof/COVERAGE.md` first**: its stated goal is not a green build but
|
said 52 all along). **Read `proof/COVERAGE.md` first**: its stated goal is not a green build but
|
||||||
"identify precisely what cannot be proven and why — the boundary between 'formally verified'
|
"identify precisely what cannot be proven and why — the boundary between 'formally verified'
|
||||||
and 'not, for this specific reason'." Run `isabelle build -D proof/`
|
and 'not, for this specific reason'." Run `isabelle build -D proof/`
|
||||||
directly; neither `Makefile` nor `Makefile.starkernel` in this repo defines an
|
directly; neither `Makefile` nor `kernel/Makefile` in this repo defines an
|
||||||
`isabelle-build`/`isabelle-check` target (unlike the standalone StarForth repo, which has a
|
`isabelle-build`/`isabelle-check` target (unlike the standalone StarForth repo, which has a
|
||||||
broken one — this repo simply doesn't have the target at all, so there's nothing to
|
broken one — this repo simply doesn't have the target at all, so there's nothing to
|
||||||
mistakenly invoke).
|
mistakenly invoke).
|
||||||
@@ -495,7 +495,7 @@ status for kernel work.
|
|||||||
|
|
||||||
- **Strict ANSI C99** — No GNU extensions, no C++ features
|
- **Strict ANSI C99** — No GNU extensions, no C++ features
|
||||||
- **Zero warnings target, with four explicit exceptions — corrected 2026-08-18, previous
|
- **Zero warnings target, with four explicit exceptions — corrected 2026-08-18, previous
|
||||||
claim was wrong.** Build with `-Wall -Wextra -Werror`, but `Makefile.starkernel` carries
|
claim was wrong.** Build with `-Wall -Wextra -Werror`, but `kernel/Makefile` carries
|
||||||
`-Wno-error=unused-parameter -Wno-error=shift-negative-value -Wno-error=sign-compare
|
`-Wno-error=unused-parameter -Wno-error=shift-negative-value -Wno-error=sign-compare
|
||||||
-Wno-error=missing-field-initializers` — those four classes are enabled (still visible as
|
-Wno-error=missing-field-initializers` — those four classes are enabled (still visible as
|
||||||
warnings) but deliberately downgraded from fatal, everything else is. The previous version
|
warnings) but deliberately downgraded from fatal, everything else is. The previous version
|
||||||
|
|||||||
@@ -933,10 +933,12 @@ WARN_LOGFILE = docs/api/doxygen_warnings.log
|
|||||||
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
||||||
# Note: If this tag is empty the current directory is searched.
|
# Note: If this tag is empty the current directory is searched.
|
||||||
|
|
||||||
INPUT = include \
|
INPUT = v3/include \
|
||||||
src \
|
v3/src \
|
||||||
src/word_source \
|
v3/src/word_source \
|
||||||
src/test_runner \
|
v3/src/test_runner \
|
||||||
|
kernel/include \
|
||||||
|
kernel/src \
|
||||||
README.md
|
README.md
|
||||||
|
|
||||||
# This tag can be used to specify the character encoding of the source files
|
# This tag can be used to specify the character encoding of the source files
|
||||||
@@ -2366,9 +2368,10 @@ SEARCH_INCLUDES = YES
|
|||||||
# RECURSIVE has no effect here.
|
# RECURSIVE has no effect here.
|
||||||
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
|
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
|
||||||
|
|
||||||
INCLUDE_PATH = include \
|
INCLUDE_PATH = v3/include \
|
||||||
src/word_source/include \
|
kernel/include \
|
||||||
src/test_runner/include
|
v3/src/word_source/include \
|
||||||
|
v3/src/test_runner/include
|
||||||
|
|
||||||
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
|
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
|
||||||
# patterns (like *.h and *.hpp) to filter out the header-files in the
|
# patterns (like *.h and *.hpp) to filter out the header-files in the
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ choice
|
|||||||
default ARCH_AMD64
|
default ARCH_AMD64
|
||||||
help
|
help
|
||||||
Selects the value passed as ARCH= to whichever Makefile
|
Selects the value passed as ARCH= to whichever Makefile
|
||||||
(Makefile or Makefile.starkernel) is driven from this config.
|
(Makefile or kernel/Makefile) is driven from this config.
|
||||||
Both Makefiles already accept "amd64"/"aarch64"/"riscv64" as
|
Both Makefiles already accept "amd64"/"aarch64"/"riscv64" as
|
||||||
canonical spellings (each has its own alias-normalizing logic
|
canonical spellings (each has its own alias-normalizing logic
|
||||||
for other spellings like x86_64/arm64/riscv), so this choice
|
for other spellings like x86_64/arm64/riscv), so this choice
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@ config HEARTBEAT_THREAD_ENABLED
|
|||||||
builds without needing a special case. This is UI/model
|
builds without needing a special case. This is UI/model
|
||||||
correctness (menuconfig can't offer a choice LithosAnanke has no
|
correctness (menuconfig can't offer a choice LithosAnanke has no
|
||||||
way to honor -- there are no pthreads in a freestanding kernel),
|
way to honor -- there are no pthreads in a freestanding kernel),
|
||||||
not the sole enforcement mechanism: Makefile.starkernel additionally
|
not the sole enforcement mechanism: kernel/Makefile additionally
|
||||||
keeps its own unconditional `VM_FEATURE_OVERRIDES +=
|
keeps its own unconditional `VM_FEATURE_OVERRIDES +=
|
||||||
-DHEARTBEAT_THREAD_ENABLED=0` post-override exactly as it was
|
-DHEARTBEAT_THREAD_ENABLED=0` post-override exactly as it was
|
||||||
before this migration. Deliberately redundant with the `depends
|
before this migration. Deliberately redundant with the `depends
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ config STARFORTH_ENABLE_VM
|
|||||||
kernel that only reaches the M0-M6 hardware milestones (console,
|
kernel that only reaches the M0-M6 hardware milestones (console,
|
||||||
PMM, VMM, interrupts, timers, kmalloc) with no FORTH interpreter,
|
PMM, VMM, interrupts, timers, kmalloc) with no FORTH interpreter,
|
||||||
no capsules, no "ok" REPL. Gates a large source-file selection
|
no capsules, no "ok" REPL. Gates a large source-file selection
|
||||||
block in Makefile.starkernel, not just a handful of -D flags.
|
block in kernel/Makefile, not just a handful of -D flags.
|
||||||
|
|
||||||
config PARITY_MODE
|
config PARITY_MODE
|
||||||
bool "Deterministic parity harness mode (PARITY_MODE)"
|
bool "Deterministic parity harness mode (PARITY_MODE)"
|
||||||
|
|||||||
@@ -48,19 +48,39 @@ POST at boot: **parity hash verified across amd64/aarch64/riscv64 · Mama capsul
|
|||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# One boot image per physical target (output: build/boards/<board>/)
|
||||||
|
make boot_image TARGET=SER5 # Beelink SER5 -- GPT/ESP, BOOTX64.EFI
|
||||||
|
make boot_image TARGET=RASPI # Raspberry Pi 5 -- FAT, config.txt + kernel_2712.img + DTB
|
||||||
|
make boot_image TARGET=MILKV # Milk-V Mars -- GPT/ESP, BOOTRISCV64.EFI (U-Boot bootefi)
|
||||||
|
make boot_image TARGET=ZYNQ7020 # Zynq-7020 -- ARMv7 port in progress
|
||||||
|
make boards # list boards
|
||||||
|
|
||||||
|
# The same TARGET drives all, docs and clean (make help)
|
||||||
|
make # every board with a kernel port + hosted v3 + the book
|
||||||
|
make TARGET=RASPI # one board's image + build/docs/LithosAnanke-raspi.pdf
|
||||||
|
make docs # build/docs/LithosAnanke.pdf (LaTeX master: docs/book/main.tex)
|
||||||
|
make clean TARGET=RASPI # that board's outputs and build/aarch64/kernel
|
||||||
|
make clean # all of build/ except build/cache/
|
||||||
|
|
||||||
# Build kernel (requires cross-compilation toolchain, or native gcc)
|
# Build kernel (requires cross-compilation toolchain, or native gcc)
|
||||||
make -f Makefile.starkernel ARCH=amd64
|
make -f kernel/Makefile ARCH=amd64
|
||||||
|
|
||||||
# Run in QEMU with OVMF
|
# Run in QEMU with OVMF
|
||||||
make -f Makefile.starkernel qemu
|
make -f kernel/Makefile qemu
|
||||||
|
|
||||||
# Other architectures
|
# Other architectures
|
||||||
make -f Makefile.starkernel ARCH=aarch64 qemu
|
make -f kernel/Makefile ARCH=aarch64 qemu
|
||||||
make -f Makefile.starkernel ARCH=riscv64 qemu
|
make -f kernel/Makefile ARCH=riscv64 qemu
|
||||||
```
|
```
|
||||||
|
|
||||||
Artifacts: `build/amd64/kernel/starkernel_loader.efi` · `build/amd64/kernel/starkernel_kernel.elf`
|
Artifacts: `build/amd64/kernel/starkernel_loader.efi` · `build/amd64/kernel/starkernel_kernel.elf`
|
||||||
|
|
||||||
|
Tree: `kernel/` (LithosAnanke: `Makefile`, `src/`, `include/starkernel/`, `linker/`),
|
||||||
|
`v3/` (StarForth v3 engine and hosted build: `Makefile`, `src/`, `include/`),
|
||||||
|
`v4/` (StarForth v4, see `docs/v4.0.0/`), `boards/<board>/` (`board.mk` + boot files).
|
||||||
|
Every makefile runs from the repo root; the root `Makefile` forwards any other goal to
|
||||||
|
`v3/Makefile` (hosted build).
|
||||||
|
|
||||||
For the hosted VM by itself (Linux, no cross-compiler needed, no bare-metal tooling): see
|
For the hosted VM by itself (Linux, no cross-compiler needed, no bare-metal tooling): see
|
||||||
the separate **StarForth** repository — LithosAnanke used to be a branch inside that repo,
|
the separate **StarForth** repository — LithosAnanke used to be a branch inside that repo,
|
||||||
now it's its own project with its own `master`.
|
now it's its own project with its own `master`.
|
||||||
@@ -69,12 +89,12 @@ now it's its own project with its own `master`.
|
|||||||
|
|
||||||
Every kernel-only knob (`STARFORTH_ENABLE_VM`, `PARITY_MODE`, the shared
|
Every kernel-only knob (`STARFORTH_ENABLE_VM`, `PARITY_MODE`, the shared
|
||||||
physics/heartbeat family, etc.) is an optional Kconfig symbol — a plain
|
physics/heartbeat family, etc.) is an optional Kconfig symbol — a plain
|
||||||
`make -f Makefile.starkernel` uses the same defaults it always has unless
|
`make -f kernel/Makefile` uses the same defaults it always has unless
|
||||||
you opt in:
|
you opt in:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make -f Makefile.starkernel ARCH=amd64 menuconfig
|
make -f kernel/Makefile ARCH=amd64 menuconfig
|
||||||
make -f Makefile.starkernel ARCH=amd64 kernel_amd64_defconfig
|
make -f kernel/Makefile ARCH=amd64 kernel_amd64_defconfig
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# boards/
|
||||||
|
|
||||||
|
One directory per physical target. `make boot_image TARGET=<NAME>` (repo root) maps the
|
||||||
|
name to a directory here, reads its `board.mk`, and builds the single file that goes on
|
||||||
|
that board's boot medium into `build/boards/<board>/`.
|
||||||
|
|
||||||
|
| TARGET | Directory | ISA | Boot path | Image |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| `SER5` | `ser5/` | amd64 | UEFI firmware, removable-media path | GPT + FAT32 ESP: `EFI/BOOT/BOOTX64.EFI` |
|
||||||
|
| `RASPI` | `raspi/` | aarch64 | Pi 5 EEPROM firmware, native | MBR + FAT32: `config.txt`, `kernel_2712.img`, `bcm2712-rpi-5-b.dtb` |
|
||||||
|
| `MILKV` | `milkv/` | riscv64 | SPI-flash U-Boot + OpenSBI, `bootefi` | GPT + FAT32 ESP: `EFI/BOOT/BOOTRISCV64.EFI` |
|
||||||
|
| `ZYNQ7020` | `zynq7020/` | armv7 | BootROM, `BOOT.BIN`, U-Boot | not yet: needs `kernel/src/arch/armv7` |
|
||||||
|
|
||||||
|
`board.mk` sets:
|
||||||
|
|
||||||
|
- `BOARD_DESC`: one-line description (`make boards`)
|
||||||
|
- `BOARD_ARCH`: kernel ISA (`kernel/src/arch/<arch>`)
|
||||||
|
- `BOARD_BOOT`: image recipe in `kernel/Makefile` (`uefi-esp`, `rpi-native`, ...)
|
||||||
|
- `BOARD_IMAGE`: output file name
|
||||||
|
|
||||||
|
Disk images are assembled by `scripts/mkdiskimage.sh`, which needs no root access and no loop
|
||||||
|
devices. `KERNEL_ARGS="..."` is written as `starforth.cfg` (UEFI boards) or `cmdline.txt`
|
||||||
|
(Pi 5, where the firmware copies it into `/chosen/bootargs`). `BOOT_IMAGE_SIZE_MIB` sets the
|
||||||
|
image size; the default is 128.
|
||||||
|
|
||||||
|
Hardware status: none of these images has been booted on real silicon from this build. The
|
||||||
|
SER5 image has been booted in QEMU (q35 + OVMF, from its own disk) through POST. The Pi 5
|
||||||
|
native path (`raspi/README.md`) and the JH7110 peripherals have still only been checked by
|
||||||
|
compiling.
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# Milk-V Mars boot media
|
||||||
|
|
||||||
|
`make boot_image TARGET=MILKV` builds `build/boards/milkv/lithos-milkv.img`: a GPT disk with one
|
||||||
|
FAT32 EFI System Partition. Write it to an SD card with `dd`. The partition holds:
|
||||||
|
|
||||||
|
- `EFI/BOOT/BOOTRISCV64.EFI`: the riscv64 monolithic loader, the same one QEMU boots.
|
||||||
|
- `startup.nsh`: for a UEFI shell, if one is used.
|
||||||
|
- `starforth.cfg`: only present when `KERNEL_ARGS="..."` is given.
|
||||||
|
|
||||||
|
The board's own SPI-flash U-Boot, with OpenSBI underneath, finds the loader through its standard
|
||||||
|
`bootefi` scan of the removable-media path. U-Boot passes its devicetree to the loader through the
|
||||||
|
EFI configuration table.
|
||||||
|
|
||||||
|
Status: booted in QEMU through the same chain the board uses: OpenSBI, then U-Boot
|
||||||
|
`qemu-riscv64_smode`, then `bootefi` from this image's ESP, then the loader and the kernel. POST
|
||||||
|
passed, Stadium conservation was exact (resident 43691 + reservoir 21845 = 65536 = `Q48_ONE`), and
|
||||||
|
Hestia and Artemis came up. Not yet booted on the Mars itself. The JH7110 peripherals
|
||||||
|
(framebuffer, RNG) have only been checked by compiling.
|
||||||
|
|
||||||
|
To repeat the QEMU boot (`qemu-system-riscv64` is in Ubuntu 26.04's `qemu-system-riscv` package;
|
||||||
|
OpenSBI and U-Boot come from `opensbi` and `u-boot-qemu`). Use a copy, because the kernel writes
|
||||||
|
to its disk:
|
||||||
|
|
||||||
|
```
|
||||||
|
cp build/boards/milkv/lithos-milkv.img /tmp/mv.img
|
||||||
|
qemu-system-riscv64 -machine virt -cpu rv64 -m 2048 -nographic \
|
||||||
|
-bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_dynamic.bin \
|
||||||
|
-kernel /usr/lib/u-boot/qemu-riscv64_smode/u-boot.bin \
|
||||||
|
-drive if=none,format=raw,file=/tmp/mv.img,id=d0 -device virtio-blk-device,drive=d0
|
||||||
|
```
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# boards/milkv/board.mk -- Milk-V Mars (StarFive JH7110, SiFive U74, RV64GC).
|
||||||
|
#
|
||||||
|
# The board's own SPI-flash U-Boot (OpenSBI underneath) runs the EFI
|
||||||
|
# application through its standard distro/bootefi scan: the SD card is a GPT
|
||||||
|
# disk with one FAT32 EFI System Partition holding EFI/BOOT/BOOTRISCV64.EFI,
|
||||||
|
# the same riscv64 monolithic loader QEMU boots. U-Boot passes its own
|
||||||
|
# devicetree through the EFI configuration table.
|
||||||
|
BOARD_DESC := Milk-V Mars (StarFive JH7110, RV64GC, U-Boot bootefi)
|
||||||
|
BOARD_ARCH := riscv64
|
||||||
|
BOARD_BOOT := uefi-esp
|
||||||
|
BOARD_IMAGE := lithos-milkv.img
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Raspberry Pi 5 native boot media
|
||||||
|
|
||||||
|
`make boot_image TARGET=RASPI` builds `build/boards/raspi/lithos-raspi.img`: an MBR disk
|
||||||
|
with one FAT32 (LBA) partition. Write it to an SD card with `dd`. The partition holds:
|
||||||
|
|
||||||
|
- `config.txt`: checked in here (FABRIC-3.md §IV.3 item 6). It pins `kernel_address=0x80000`
|
||||||
|
because Pi 5 firmware loads `kernel_2712.img` at 0x200000 by default.
|
||||||
|
- `kernel_2712.img`: the aarch64 kernel objects relinked at 0x80000 by
|
||||||
|
`kernel/linker/starkernel-native-rpi5.ld`, entered at `rpi5_native_start`
|
||||||
|
(`kernel/src/arch/aarch64/native_rpi5_entry.S`, which zeroes `.bss` first), and flattened
|
||||||
|
with `objcopy -O binary`.
|
||||||
|
- `bcm2712-rpi-5-b.dtb`: the Raspberry Pi firmware's own stock DTB. It is not built by this
|
||||||
|
project; it is fetched once from the firmware release pinned in `board.mk`
|
||||||
|
(`RPI_FIRMWARE_TAG`) into `build/cache/`. To use a local copy, pass `RPI5_DTB=/path/to/dtb`.
|
||||||
|
- `cmdline.txt`: only present when `KERNEL_ARGS="..."` is given. The firmware copies it into
|
||||||
|
`/chosen/bootargs`, which `rpi5_native_boot()` parses.
|
||||||
|
|
||||||
|
Not yet verified on hardware. The native path still assumes everything `kernel_main()`
|
||||||
|
needs after a UEFI handoff. The firmware enters at EL2 with the MMU off, which is not what
|
||||||
|
UEFI hands over, and that difference has not been exercised.
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# boards/raspi/board.mk -- Raspberry Pi 5 (BCM2712, Cortex-A76, aarch64).
|
||||||
|
#
|
||||||
|
# Native firmware boot, no UEFI (FABRIC-3.md §IV): the Pi 5 bootloader
|
||||||
|
# lives in EEPROM and reads config.txt, kernel_2712.img and the board DTB
|
||||||
|
# from the first FAT partition of the SD card. kernel_2712.img is the
|
||||||
|
# aarch64 kernel relinked at 0x80000 (kernel/linker/starkernel-native-rpi5.ld)
|
||||||
|
# and flattened to a raw binary.
|
||||||
|
#
|
||||||
|
# The DTB is the Raspberry Pi firmware's own stock file, not built here. It
|
||||||
|
# is fetched once from the pinned firmware release below into build/cache/
|
||||||
|
# unless RPI5_DTB points at a local copy.
|
||||||
|
BOARD_DESC := Raspberry Pi 5 (BCM2712, Cortex-A76, native firmware boot)
|
||||||
|
BOARD_ARCH := aarch64
|
||||||
|
BOARD_BOOT := rpi-native
|
||||||
|
BOARD_IMAGE := lithos-raspi.img
|
||||||
|
RPI_FIRMWARE_TAG ?= 1.20260915
|
||||||
|
RPI5_DTB_URL ?= https://raw.githubusercontent.com/raspberrypi/firmware/$(RPI_FIRMWARE_TAG)/boot/bcm2712-rpi-5-b.dtb
|
||||||
|
RPI5_DTB ?= build/cache/raspi-$(RPI_FIRMWARE_TAG)/bcm2712-rpi-5-b.dtb
|
||||||
@@ -12,6 +12,13 @@
|
|||||||
# firmware picks up.
|
# firmware picks up.
|
||||||
kernel=kernel_2712.img
|
kernel=kernel_2712.img
|
||||||
|
|
||||||
|
# Pin the load address to the one the image is linked at
|
||||||
|
# (kernel/linker/starkernel-native-rpi5.ld). Pi 5 firmware's own default
|
||||||
|
# for kernel_2712.img is 0x200000, not the classic 0x80000 -- leaving it
|
||||||
|
# implicit would load a 0x80000-linked flat image 1.5 MiB away from where
|
||||||
|
# every absolute address in it points.
|
||||||
|
kernel_address=0x80000
|
||||||
|
|
||||||
# Disable the firmware's Linux-compatible-image sanity check. Without
|
# Disable the firmware's Linux-compatible-image sanity check. Without
|
||||||
# this, official docs describe it as checking for "a compatible Device
|
# this, official docs describe it as checking for "a compatible Device
|
||||||
# Tree file before attempting to boot" and warn that "older non-compatible
|
# Tree file before attempting to boot" and warn that "older non-compatible
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Beelink SER5 boot media
|
||||||
|
|
||||||
|
`make boot_image TARGET=SER5` builds `build/boards/ser5/lithos-ser5.img`: a GPT disk with one
|
||||||
|
FAT32 EFI System Partition. Write it to a USB stick with `dd`. The partition holds:
|
||||||
|
|
||||||
|
- `EFI/BOOT/BOOTX64.EFI`: the amd64 monolithic loader, with the whole kernel embedded. Firmware
|
||||||
|
finds it through the UEFI removable-media path, so no boot entry has to be created.
|
||||||
|
- `startup.nsh`: runs the loader if the firmware drops into the UEFI shell.
|
||||||
|
- `starforth.cfg`: only present when `KERNEL_ARGS="..."` is given.
|
||||||
|
|
||||||
|
Nothing in the image is SER5-specific. It follows the generic UEFI/ACPI path in FABRIC-3.md §III.
|
||||||
|
|
||||||
|
Status: booted in QEMU (q35 + OVMF, from this image as its own disk) through POST, with Stadium
|
||||||
|
conservation exact (sum 65536 = `Q48_ONE`). Not yet booted on the SER5 itself.
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# boards/ser5/board.mk -- Beelink SER5 (AMD Ryzen, x86-64, UEFI/ACPI).
|
||||||
|
#
|
||||||
|
# Generic standards-compliant UEFI path (FABRIC-3.md §III): nothing in the
|
||||||
|
# image is SER5-specific. The monolithic loader embeds the whole kernel, so
|
||||||
|
# the image is a GPT disk with one FAT32 EFI System Partition holding
|
||||||
|
# EFI/BOOT/BOOTX64.EFI. Write it to a USB stick with dd.
|
||||||
|
BOARD_DESC := Beelink SER5 (AMD Ryzen, x86-64, UEFI)
|
||||||
|
BOARD_ARCH := amd64
|
||||||
|
BOARD_BOOT := uefi-esp
|
||||||
|
BOARD_IMAGE := lithos-ser5.img
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Xilinx Zynq-7020 boot media
|
||||||
|
|
||||||
|
The Zynq-7020's processing system is a dual Cortex-A9: ARMv7-A, 32-bit. It is the host for the
|
||||||
|
StarForth v4 mesh (`docs/v4.0.0/JUSTIFICATION.md` §5, §8).
|
||||||
|
|
||||||
|
Boot chain: BootROM, then `BOOT.BIN` (U-Boot SPL with the board's `ps7_init` DDR and clock setup),
|
||||||
|
then U-Boot, then LithosAnanke. Everything is read from the SD card's FAT partition.
|
||||||
|
|
||||||
|
Status: no image yet. `make boot_image TARGET=ZYNQ7020` stops with an error, because there is no
|
||||||
|
ARMv7 kernel port (`kernel/src/arch/armv7`: entry code, MMU, GIC, private timer). A trial
|
||||||
|
compile for Cortex-A9 built 147 of the 151 kernel and engine sources. The four that failed use
|
||||||
|
`__int128` or have no ARMv7 branch: `kernel/src/crypto/fe25519.c`,
|
||||||
|
`kernel/src/crypto/scalar25519.c`, `kernel/src/hal/hal.c` and
|
||||||
|
`v3/src/word_source/mixed_arithmetic_words.c`.
|
||||||
|
|
||||||
|
`BOOT.BIN` depends on the exact board (Zybo Z7-20, PYNQ-Z2, Arty Z7-20, ZedBoard, ...), because
|
||||||
|
`ps7_init` holds that board's DDR timing. The board has not been chosen yet.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# boards/zynq7020/board.mk -- Xilinx Zynq-7020 (dual Cortex-A9, ARMv7-A, 32-bit).
|
||||||
|
#
|
||||||
|
# Boot chain: BootROM -> BOOT.BIN (U-Boot SPL with the board's ps7_init DDR/
|
||||||
|
# clock setup) -> U-Boot -> LithosAnanke, all from the SD card's FAT
|
||||||
|
# partition. Needs the ARMv7 kernel port (kernel/src/arch/armv7), which is
|
||||||
|
# in progress: until it exists, boot_image stops with an explicit error
|
||||||
|
# rather than producing an image that cannot run.
|
||||||
|
BOARD_DESC := Xilinx Zynq-7020 (Cortex-A9, ARMv7-A, BOOT.BIN) -- ARMv7 port in progress
|
||||||
|
BOARD_ARCH := armv7
|
||||||
|
BOARD_BOOT := zynq-bootbin
|
||||||
|
BOARD_IMAGE := lithos-zynq7020.img
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# Raspberry Pi 5 native boot media
|
|
||||||
|
|
||||||
What goes on the SD card for the native (non-UEFI) boot path (FABRIC-3.md §IV):
|
|
||||||
|
|
||||||
- `config.txt` — checked in here, done (§IV.3 item 6).
|
|
||||||
- `bcm2712-rpi-5-b.dtb` — Raspberry Pi firmware's own stock DTB; not built by this
|
|
||||||
project, copied from the firmware release the card is otherwise built from.
|
|
||||||
- `kernel_2712.img` — **does not exist yet.** `config.txt` names it, but no build target
|
|
||||||
in `Makefile.starkernel` currently emits a raw image by this name at load address
|
|
||||||
0x80000 — item 1 (entry stub) explicitly scoped a separate-image build target as future
|
|
||||||
work, not part of that item. Building this file is the remaining prerequisite before
|
|
||||||
item 7 (assembling the card) is possible.
|
|
||||||
+42
-40
@@ -1,5 +1,5 @@
|
|||||||
# Capsule Block Manifest — Auto-generated
|
# Capsule Block Manifest — Auto-generated
|
||||||
<!-- Generated by mkcapsule --manifest 2026-09-22T22:29:26Z -->
|
<!-- Generated by mkcapsule --manifest 2026-10-01T19:21:21Z -->
|
||||||
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
|
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
|
||||||
<!-- Hand-written justifications and immutability notes live -->
|
<!-- Hand-written justifications and immutability notes live -->
|
||||||
<!-- in MANIFEST.md alongside this auto-generated index. -->
|
<!-- in MANIFEST.md alongside this auto-generated index. -->
|
||||||
@@ -8,42 +8,44 @@
|
|||||||
|
|
||||||
| Capsule | Blocks claimed | xxHash64 | Signed |
|
| Capsule | Blocks claimed | xxHash64 | Signed |
|
||||||
|---------|----------------|----------|--------|
|
|---------|----------------|----------|--------|
|
||||||
| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4015 | `0xf8890c05c0d8f921` | yes |
|
| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4015 | `0xf8890c05c0d8f921` | n/a |
|
||||||
| `acl-std79.4th` | 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048 | `0x773bf9209df191d1` | yes |
|
| `acl-std79.4th` | 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048 | `0x773bf9209df191d1` | n/a |
|
||||||
| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4177, 4178, 4179, 4180, 4181, 4182, 4851, 4852, 4853, 4854, 4856, 4857, 4858, 4860 | `0xe6fba9ae56e1c916` | yes |
|
| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4177, 4178, 4179, 4180, 4181, 4182, 4851, 4852, 4853, 4854, 4856, 4857, 4858, 4860 | `0xe6fba9ae56e1c916` | n/a |
|
||||||
| `block-acl.4th` | 4019, 4020 | `0xf6cc2a59e3a6734e` | yes |
|
| `block-acl.4th` | 4019, 4020 | `0xf6cc2a59e3a6734e` | n/a |
|
||||||
| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x26fb485e5c9dc6ff` | yes |
|
| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x26fb485e5c9dc6ff` | n/a |
|
||||||
| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xf154616d248e861f` | yes |
|
| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xf154616d248e861f` | n/a |
|
||||||
| `fabric.4th` | 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, 5000, 5001, 5002 | `0x9d9489cbeca4099b` | yes |
|
| `fabric.4th` | 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, 5000, 5001, 5002 | `0x9d9489cbeca4099b` | n/a |
|
||||||
| `font.4th` | 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985 | `0x3f305911500c78f6` | yes |
|
| `font.4th` | 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985 | `0x3f305911500c78f6` | n/a |
|
||||||
| `hestia:init.4th` | 4986, 4987, 4988 | `0x64e111990fbc45ff` | yes |
|
| `hestia:init.4th` | 4986, 4987, 4988 | `0x64e111990fbc45ff` | n/a |
|
||||||
| `init-l8-diverse.4th` | 4820, 4821, 4822 | `0xaa293201a6c91838` | yes |
|
| `init-l8-diverse.4th` | 4820, 4821, 4822 | `0xaa293201a6c91838` | n/a |
|
||||||
| `init-l8-omni.4th` | 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079 | `0x5979e314d6452045` | yes |
|
| `init-l8-omni.4th` | 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079 | `0x5979e314d6452045` | n/a |
|
||||||
| `init-l8-stable.4th` | 4806 | `0xdc3830f189063a9a` | yes |
|
| `init-l8-stable.4th` | 4806 | `0xdc3830f189063a9a` | n/a |
|
||||||
| `init-l8-temporal.4th` | 4830, 4831 | `0x51abd4c138246651` | yes |
|
| `init-l8-temporal.4th` | 4830, 4831 | `0x51abd4c138246651` | n/a |
|
||||||
| `init-l8-transition.4th` | 4840, 4841, 4842 | `0xbcc1a81976f0a4c9` | yes |
|
| `init-l8-transition.4th` | 4840, 4841, 4842 | `0xbcc1a81976f0a4c9` | n/a |
|
||||||
| `init-l8-volatile.4th` | 4810, 4811, 4812, 4813 | `0x98caabbbd92abac4` | yes |
|
| `init-l8-volatile.4th` | 4810, 4811, 4812, 4813 | `0x98caabbbd92abac4` | n/a |
|
||||||
| `init.4th` | 2049, 2050, 2057 | `0xea038ba684c53443` | yes |
|
| `init.4th` | 2049, 2050, 2057 | `0xea038ba684c53443` | n/a |
|
||||||
| `lib.4th` | 4050 | `0x4b216635c359ef73` | yes |
|
| `lib.4th` | 4050 | `0x4b216635c359ef73` | n/a |
|
||||||
| `multiuser-doe.4th` | 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055 | `0x22140588ee7c39e6` | yes |
|
| `multiuser-doe.4th` | 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055 | `0x22140588ee7c39e6` | n/a |
|
||||||
| `sdk.4th` | 5109, 5110, 5111, 5112, 5113, 5114, 5115 | `0x008fdbbb62c94a3a` | yes |
|
| `sdk.4th` | 5109, 5110, 5111, 5112, 5113, 5114, 5115 | `0x008fdbbb62c94a3a` | n/a |
|
||||||
| `turtle.4th` | 5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108 | `0x4d470418ca543365` | yes |
|
| `turtle.4th` | 5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108 | `0x4d470418ca543365` | n/a |
|
||||||
| `user-font-demo.4th` | 4200, 4201, 4202 | `0xce1fd7d1b581a56d` | yes |
|
| `user-font-demo.4th` | 4200, 4201, 4202 | `0xce1fd7d1b581a56d` | n/a |
|
||||||
| `workload-0.4th` | 2200, 2201 | `0x93f86f60aeba8feb` | yes |
|
| `workload-0.4th` | 2200, 2201 | `0x93f86f60aeba8feb` | n/a |
|
||||||
| `workload-1-lite.4th` | 5058, 5059 | `0x44a7a7e3176dcc8d` | yes |
|
| `workload-1-lite.4th` | 5058, 5059 | `0x44a7a7e3176dcc8d` | n/a |
|
||||||
| `workload-1.4th` | 4406, 4415, 4425, 4435 | `0x63e251adb0a03613` | yes |
|
| `workload-1.4th` | 4406, 4415, 4425, 4435 | `0x63e251adb0a03613` | n/a |
|
||||||
| `workload-2.4th` | 4506, 4515, 4525, 4535, 4545 | `0xf113b3d0bcccae47` | yes |
|
| `workload-2.4th` | 4506, 4515, 4525, 4535, 4545 | `0xf113b3d0bcccae47` | n/a |
|
||||||
| `workload-3.4th` | 4606, 4615, 4625, 4635, 4645, 4655, 4665 | `0x62b7a71576ad1041` | yes |
|
| `workload-3.4th` | 4606, 4615, 4625, 4635, 4645, 4655, 4665 | `0x62b7a71576ad1041` | n/a |
|
||||||
| `workload-4.4th` | 2130, 2131, 2132 | `0x099619264e650b1c` | yes |
|
| `workload-4.4th` | 2130, 2131, 2132 | `0x099619264e650b1c` | n/a |
|
||||||
| `workload-5-lite.4th` | 5056, 5057 | `0xea0303f38824f254` | yes |
|
| `workload-5-lite.4th` | 5056, 5057 | `0xea0303f38824f254` | n/a |
|
||||||
| `workload-5.4th` | *(none — raw code capsule)* | `0x526964c7c9506a11` | yes |
|
| `workload-5.4th` | *(none — raw code capsule)* | `0x526964c7c9506a11` | n/a |
|
||||||
| `workload-6.4th` | 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095 | `0x06fc0ce1e369ef5a` | yes |
|
| `workload-6.4th` | 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095 | `0x06fc0ce1e369ef5a` | n/a |
|
||||||
| `workload-7.4th` | 2150 | `0x02862291387eb7ac` | yes |
|
| `workload-7.4th` | 2150 | `0x02862291387eb7ac` | n/a |
|
||||||
| `workload-8.4th` | 2160 | `0x56b7f2f0efa000df` | yes |
|
| `workload-8.4th` | 2160 | `0x56b7f2f0efa000df` | n/a |
|
||||||
| `workload-9.4th` | 4706, 4715, 4725, 4735, 4745 | `0x3f2bec73142aa424` | yes |
|
| `workload-9.4th` | 4706, 4715, 4725, 4735, 4745 | `0x3f2bec73142aa424` | n/a |
|
||||||
| `workload-calib1.4th` | 5043 | `0x3b9f2d17b554fabc` | yes |
|
| `workload-calib1.4th` | 5043 | `0x3b9f2d17b554fabc` | n/a |
|
||||||
| `zuse-eligibility.4th` | 4021, 4022 | `0x7b28f4776a32e0b7` | yes |
|
| `zuse-eligibility.4th` | 4021, 4022 | `0x7b28f4776a32e0b7` | n/a |
|
||||||
| `zuse.4th` | 4016, 4017, 4018 | `0x490ded9be257a90b` | yes |
|
| `zuse.4th` | 4016, 4017, 4018 | `0xa14d5a7a88791cf6` | n/a |
|
||||||
|
|
||||||
|
*Signed column is `n/a`: this manifest run had no `--sign-key`. Re-run with `--sign-key <path>` to check signing status (does not modify or require rebuilding capsule_generated.c).*
|
||||||
|
|
||||||
## Block Map (sorted by LBN)
|
## Block Map (sorted by LBN)
|
||||||
|
|
||||||
@@ -109,9 +111,9 @@
|
|||||||
| 4007 | `ACL.4th` | `0xf8890c05c0d8f921` | ok |
|
| 4007 | `ACL.4th` | `0xf8890c05c0d8f921` | ok |
|
||||||
| 4008 | `ACL.4th` | `0xf8890c05c0d8f921` | ok |
|
| 4008 | `ACL.4th` | `0xf8890c05c0d8f921` | ok |
|
||||||
| 4015 | `ACL.4th` | `0xf8890c05c0d8f921` | ok |
|
| 4015 | `ACL.4th` | `0xf8890c05c0d8f921` | ok |
|
||||||
| 4016 | `zuse.4th` | `0x490ded9be257a90b` | ok |
|
| 4016 | `zuse.4th` | `0xa14d5a7a88791cf6` | ok |
|
||||||
| 4017 | `zuse.4th` | `0x490ded9be257a90b` | ok |
|
| 4017 | `zuse.4th` | `0xa14d5a7a88791cf6` | ok |
|
||||||
| 4018 | `zuse.4th` | `0x490ded9be257a90b` | ok |
|
| 4018 | `zuse.4th` | `0xa14d5a7a88791cf6` | ok |
|
||||||
| 4019 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
|
| 4019 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
|
||||||
| 4020 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
|
| 4020 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
|
||||||
| 4021 | `zuse-eligibility.4th` | `0x7b28f4776a32e0b7` | ok |
|
| 4021 | `zuse-eligibility.4th` | `0x7b28f4776a32e0b7` | ok |
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
# configs/
|
# configs/
|
||||||
|
|
||||||
Example Kconfig `defconfig` files — starting points for `make -f
|
Example Kconfig `defconfig` files — starting points for `make -f
|
||||||
Makefile.starkernel ARCH=<arch> defconfig` (kernel) or the equivalent
|
kernel/Makefile ARCH=<arch> defconfig` (kernel) or the equivalent
|
||||||
hosted target, matching the current committed default build behavior for
|
hosted target, matching the current committed default build behavior for
|
||||||
each profile. Loaded via `tools/kconfig/conf`.
|
each profile. Loaded via `tools/kconfig/conf`.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,112 @@
|
|||||||
|
# docs/book/Makefile -- the single LithosAnanke book, built from LaTeX.
|
||||||
|
#
|
||||||
|
# Run from the repo root (the root Makefile does this):
|
||||||
|
# make docs -> build/docs/LithosAnanke.pdf
|
||||||
|
# make docs TARGET=<board> -> build/docs/LithosAnanke-<board>.pdf
|
||||||
|
# (same book + that board's appendix)
|
||||||
|
#
|
||||||
|
# docs/book/main.tex is the master. Markdown sources are converted by pandoc
|
||||||
|
# into LaTeX fragments under build/docs/gen/ and \input from main.tex; the
|
||||||
|
# Markdown stays the source of truth until a chapter is rewritten in LaTeX.
|
||||||
|
# Figures and tables that present data read the CSV directly at LaTeX time
|
||||||
|
# (pgfplots / pgfplotstable) and cite it with \datasource{path}; see
|
||||||
|
# docs/book/README.md.
|
||||||
|
|
||||||
|
BOOK_DIR := docs/book
|
||||||
|
OUT := build/docs
|
||||||
|
GEN := $(OUT)/gen
|
||||||
|
|
||||||
|
BOARD ?=
|
||||||
|
BOARD_NAME ?=
|
||||||
|
VARIANT := $(if $(BOARD),$(BOARD),book)
|
||||||
|
VAR_DIR := $(OUT)/$(VARIANT)
|
||||||
|
PDF := $(OUT)/LithosAnanke$(if $(BOARD),-$(BOARD)).pdf
|
||||||
|
|
||||||
|
PANDOC ?= pandoc
|
||||||
|
LATEXMK ?= latexmk
|
||||||
|
PANDOC_FILTERS := $(BOOK_DIR)/pandoc/table-widths.lua $(BOOK_DIR)/pandoc/code-breaks.lua
|
||||||
|
PANDOC_FLAGS := -f gfm -t latex --top-level-division=chapter --wrap=preserve \
|
||||||
|
$(foreach f,$(PANDOC_FILTERS),--lua-filter=$(f))
|
||||||
|
|
||||||
|
# fragment name : Markdown source. The order of \input lines is main.tex's.
|
||||||
|
CHAPTERS := \
|
||||||
|
ontology:docs/ONTOLOGY.md \
|
||||||
|
roadmap:docs/ROADMAP.md \
|
||||||
|
boards:boards/README.md \
|
||||||
|
justification:docs/v4.0.0/JUSTIFICATION.md \
|
||||||
|
decomposition:docs/v4.0.0/DECOMPOSITION.md \
|
||||||
|
fabric-0:docs/fabric/FABRIC-0.md \
|
||||||
|
fabric-1:docs/fabric/FABRIC-1.md \
|
||||||
|
fabric-2:docs/fabric/FABRIC-2.md \
|
||||||
|
fabric-3:docs/fabric/FABRIC-3.md \
|
||||||
|
fabric-3-5:docs/fabric/FABRIC-3.5.md \
|
||||||
|
fabric-3-6:docs/fabric/FABRIC-3.6.md \
|
||||||
|
fabric-3-7:docs/fabric/FABRIC-3.7.md \
|
||||||
|
fabric-4:docs/fabric/FABRIC-4.md
|
||||||
|
|
||||||
|
ifneq ($(BOARD),)
|
||||||
|
ifeq ($(wildcard boards/$(BOARD)/README.md),)
|
||||||
|
$(error boards/$(BOARD)/README.md is missing: it is the board's appendix)
|
||||||
|
endif
|
||||||
|
CHAPTERS += board-$(BOARD):boards/$(BOARD)/README.md
|
||||||
|
endif
|
||||||
|
|
||||||
|
chapter_name = $(word 1,$(subst :, ,$(1)))
|
||||||
|
chapter_src = $(word 2,$(subst :, ,$(1)))
|
||||||
|
FRAGMENTS := $(foreach c,$(CHAPTERS),$(GEN)/$(call chapter_name,$(c)).tex)
|
||||||
|
|
||||||
|
.PHONY: all tools FORCE
|
||||||
|
all: $(PDF)
|
||||||
|
|
||||||
|
tools:
|
||||||
|
@missing=""; \
|
||||||
|
for t in $(PANDOC) $(LATEXMK) xelatex; do command -v $$t >/dev/null 2>&1 || missing="$$missing $$t"; done; \
|
||||||
|
if [ -n "$$missing" ]; then \
|
||||||
|
echo "Error: make docs needs:$$missing"; \
|
||||||
|
echo " sudo apt-get install -y pandoc latexmk texlive-xetex texlive-latex-extra texlive-pictures texlive-fonts-recommended fonts-dejavu fonts-dejavu-extra"; \
|
||||||
|
echo " (or a user-local TinyTeX + pandoc in ~/.local; see docs/book/README.md)"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --id-prefix keeps heading labels unique across documents that reuse
|
||||||
|
# section names ("Summary", "Open questions", ...).
|
||||||
|
define chapter_rule
|
||||||
|
$(GEN)/$(call chapter_name,$(1)).tex: $(call chapter_src,$(1)) $(PANDOC_FILTERS) | tools
|
||||||
|
@mkdir -p $(GEN)
|
||||||
|
@echo " PANDOC $$< -> $$@"
|
||||||
|
@$(PANDOC) $(PANDOC_FLAGS) --id-prefix=$(call chapter_name,$(1))- $$< -o $$@
|
||||||
|
endef
|
||||||
|
$(foreach c,$(CHAPTERS),$(eval $(call chapter_rule,$(c))))
|
||||||
|
|
||||||
|
# Pandoc's syntax-highlighting macros, taken from the installed pandoc so the
|
||||||
|
# fragments and their macros always come from the same version.
|
||||||
|
$(GEN)/pandoc-highlighting.tex: $(BOOK_DIR)/pandoc/highlighting.latex | tools
|
||||||
|
@mkdir -p $(GEN)
|
||||||
|
@printf '```c\nx\n```\n' | $(PANDOC) -f gfm -t latex -s --template=$< -o $@
|
||||||
|
|
||||||
|
# Per-build facts the book prints: the commit every \datasource refers to,
|
||||||
|
# and which board appendix (if any) is included.
|
||||||
|
$(VAR_DIR)/meta.tex: FORCE
|
||||||
|
@mkdir -p $(VAR_DIR)
|
||||||
|
@{ \
|
||||||
|
c=$$(git rev-parse --short=12 HEAD 2>/dev/null || echo unknown); \
|
||||||
|
git diff --quiet HEAD -- 2>/dev/null || c="$$c (+ uncommitted changes)"; \
|
||||||
|
printf '\\newcommand{\\bookcommit}{%s}\n' "$$c"; \
|
||||||
|
printf '\\newcommand{\\bookdate}{%s}\n' "$$(date -u +%Y-%m-%d)"; \
|
||||||
|
printf '\\def\\bookboard{%s}\n' "$(BOARD_NAME)"; \
|
||||||
|
$(if $(BOARD),printf '\\newcommand{\\bookboardappendix}{board-%s}\n' "$(BOARD)";) \
|
||||||
|
} > $@.tmp
|
||||||
|
@cmp -s $@.tmp $@ && rm -f $@.tmp || mv $@.tmp $@
|
||||||
|
|
||||||
|
FORCE:
|
||||||
|
|
||||||
|
TEXINPUTS_BOOK := $(abspath $(VAR_DIR)):$(abspath $(GEN)):$(abspath $(BOOK_DIR)):
|
||||||
|
|
||||||
|
$(PDF): $(BOOK_DIR)/main.tex $(FRAGMENTS) $(GEN)/pandoc-highlighting.tex $(VAR_DIR)/meta.tex | tools
|
||||||
|
@echo " LATEXMK $(BOOK_DIR)/main.tex -> $@"
|
||||||
|
@TEXINPUTS=$(TEXINPUTS_BOOK) $(LATEXMK) -xelatex -interaction=nonstopmode -halt-on-error \
|
||||||
|
-file-line-error -outdir=$(VAR_DIR) $(BOOK_DIR)/main.tex > $(VAR_DIR)/latexmk.log 2>&1 || { \
|
||||||
|
grep -A4 -E '^(.*:[0-9]+:|!)' $(VAR_DIR)/main.log | head -40; \
|
||||||
|
echo "Error: LaTeX failed; full log: $(VAR_DIR)/main.log"; exit 1; }
|
||||||
|
@cp $(VAR_DIR)/main.pdf $@
|
||||||
|
@echo " PDF $@"
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
# docs/book/
|
||||||
|
|
||||||
|
`make docs` builds one PDF, `build/docs/LithosAnanke.pdf`, from `main.tex` with xelatex.
|
||||||
|
`make docs TARGET=<board>` builds `build/docs/LithosAnanke-<board>.pdf`: the same book with
|
||||||
|
`boards/<board>/README.md` added as an appendix.
|
||||||
|
|
||||||
|
Tools: `sudo apt-get install -y pandoc latexmk texlive-xetex texlive-latex-extra texlive-pictures texlive-fonts-recommended fonts-dejavu fonts-dejavu-extra`
|
||||||
|
|
||||||
|
Without root, a user-local TeX Live works too (this is how the book was first built):
|
||||||
|
TinyTeX (`curl -sL https://yihui.org/tinytex/install-bin-unix.sh | sh`) plus
|
||||||
|
`tlmgr install latexmk xetex fontspec pgf pgfplots booktabs multirow fancyvrb fvextra lineno upquote ulem enumitem newunicodechar bookmark hyperref geometry xcolor graphics tools etoolbox fancyhdr truncate amsfonts`,
|
||||||
|
and the pandoc release tarball unpacked into `~/.local`.
|
||||||
|
|
||||||
|
The installed DejaVu decides italics: `fonts-dejavu-core` alone has no serif italic, so
|
||||||
|
`main.tex` falls back to a slanted upright face; `fonts-dejavu-extra` gives real italics.
|
||||||
|
|
||||||
|
## How it fits together
|
||||||
|
|
||||||
|
- `main.tex` is the master file. It sets the parts and the chapter order.
|
||||||
|
- Chapters that are still Markdown are listed in `Makefile` (`CHAPTERS`, as `name:source.md`).
|
||||||
|
At build time pandoc converts each one into `build/docs/gen/<name>.tex`, and `main.tex`
|
||||||
|
includes it with `\input{<name>}`. The Markdown stays the source until the chapter is
|
||||||
|
rewritten in LaTeX. At that point the `.tex` moves into this directory and the `CHAPTERS`
|
||||||
|
entry is removed.
|
||||||
|
- `pandoc/highlighting.latex` extracts the code-highlighting macros from the installed pandoc,
|
||||||
|
so the macros and the fragments always come from the same pandoc version.
|
||||||
|
- Two Lua filters run on every chapter. `pandoc/table-widths.lua` gives wide tables
|
||||||
|
proportional wrapping columns, because pandoc's gfm reader leaves column widths unset.
|
||||||
|
`pandoc/code-breaks.lua` lets long inline identifiers and paths break after `_ / . - :`.
|
||||||
|
Code blocks wrap through fvextra (`breaklines`).
|
||||||
|
- `build/docs/<book|board>/meta.tex` is written on every build. It records the commit (and
|
||||||
|
whether there were uncommitted changes), the date, and the board.
|
||||||
|
|
||||||
|
## Rule for data
|
||||||
|
|
||||||
|
Any figure or table that shows measured numbers is generated from the CSV when the book is
|
||||||
|
built. Numbers are never typed in by hand:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\begin{tikzpicture}
|
||||||
|
\begin{axis}[xlabel=run, ylabel=K]
|
||||||
|
\addplot table[col sep=comma, x=run, y=K]{experiments/<campaign>/results.csv};
|
||||||
|
\end{axis}
|
||||||
|
\end{tikzpicture}
|
||||||
|
\datasource{experiments/<campaign>/results.csv}
|
||||||
|
```
|
||||||
|
|
||||||
|
Use `\pgfplotstabletypeset[col sep=comma]{...}` for tables. `\datasource` prints the CSV path
|
||||||
|
and the commit, so a reader can find the exact file the figure was drawn from. CSV paths are
|
||||||
|
repo-relative, because xelatex runs from the repo root.
|
||||||
|
|
||||||
|
## Older pipelines to fold in or retire
|
||||||
|
|
||||||
|
These still exist and still have their own targets. Each one needs a decision during the
|
||||||
|
curation pass: move it into this book, or retire it.
|
||||||
|
|
||||||
|
| Source | Current target | Produces |
|
||||||
|
|---|---|---|
|
||||||
|
| `docs/formal/vol1-vm-physics`, `vol2-kernel`, `vol3-research` | `make -C docs/formal vols` | three volume PDFs |
|
||||||
|
| `docs/formal/dev-guide`, `user-guide`, `cookbook` | `make -C docs/formal books` | three practitioner PDFs |
|
||||||
|
| `docs/formal/experiments`, `proofs`, `ssrn`, `patent` | `make -C docs/formal standalone` | four standalone PDFs |
|
||||||
|
| Doxygen (`Doxyfile`) | `make -C docs/formal doxygen` | API reference PDF |
|
||||||
|
| `scripts/generate-doxygen-appendix.sh` | `make -f v3/Makefile api-docs` | AsciiDoc API appendix |
|
||||||
|
| `docs/src/internal/formal/*.thy` | `make -f v3/Makefile docs-isabelle` | Isabelle report |
|
||||||
|
| `scripts/asciidoc-to-latex.sh` | `make -f v3/Makefile docs-latex` | `docs/latex/` |
|
||||||
|
| `docs/SSRN_companion/Math_Companion_SSRN.tex` | `make -f v3/Makefile math-companion` | SSRN math companion |
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
% docs/book/main.tex -- master file of the single LithosAnanke book.
|
||||||
|
%
|
||||||
|
% Built by `make docs [TARGET=<board>]` (docs/book/Makefile) with xelatex.
|
||||||
|
% Fragments named below (ontology, fabric-0, ...) are generated by pandoc
|
||||||
|
% from the Markdown listed in docs/book/Makefile's CHAPTERS into
|
||||||
|
% build/docs/gen/; meta.tex is generated per build. Neither is committed.
|
||||||
|
\documentclass[11pt,openany]{book}
|
||||||
|
|
||||||
|
\usepackage{amsmath,amssymb}
|
||||||
|
\usepackage{fontspec}
|
||||||
|
% fonts-dejavu-core has no serif/sans italics (fonts-dejavu-extra does); when a
|
||||||
|
% shape is missing, slant the upright one rather than silently drop emphasis.
|
||||||
|
\setmainfont{DejaVu Serif}[AutoFakeSlant=0.2]
|
||||||
|
\setsansfont{DejaVu Sans}[AutoFakeSlant=0.2]
|
||||||
|
\setmonofont{DejaVu Sans Mono}[Scale=0.85]
|
||||||
|
\newfontfamily\symbolfont{DejaVu Sans}
|
||||||
|
|
||||||
|
\usepackage[letterpaper,margin=1in]{geometry}
|
||||||
|
\usepackage{xcolor}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage{longtable,booktabs,array,calc,multirow}
|
||||||
|
\usepackage{fancyvrb}
|
||||||
|
\usepackage[normalem]{ulem}
|
||||||
|
\usepackage{enumitem}
|
||||||
|
\usepackage{newunicodechar}
|
||||||
|
\usepackage{pgfplots}
|
||||||
|
\usepackage{pgfplotstable}
|
||||||
|
\pgfplotsset{compat=1.18}
|
||||||
|
\usepackage[hidelinks]{hyperref}
|
||||||
|
\usepackage{bookmark}
|
||||||
|
|
||||||
|
% --- what pandoc's LaTeX fragments expect (normally from its own template)
|
||||||
|
\providecommand{\tightlist}{\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
|
||||||
|
\providecommand{\pandocbounded}[1]{#1}
|
||||||
|
\providecommand{\st}[1]{\sout{#1}}
|
||||||
|
\newcounter{none} % pandoc: {\def\LTcaptype{none} ...} marks unnumbered tables
|
||||||
|
\usepackage{etoolbox}
|
||||||
|
\makeatletter
|
||||||
|
\def\fnum@table{\tablename~\thetable}
|
||||||
|
\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{}
|
||||||
|
\makeatother
|
||||||
|
\usepackage{fvextra}
|
||||||
|
\input{pandoc-highlighting}
|
||||||
|
% Code and diagrams are wider than the page in places: wrap, never overflow.
|
||||||
|
\RecustomVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\},breaklines,breakanywhere,fontsize=\small}
|
||||||
|
\RecustomVerbatimEnvironment{verbatim}{Verbatim}{breaklines,breakanywhere,fontsize=\small}
|
||||||
|
\setlistdepth{9}
|
||||||
|
\renewlist{itemize}{itemize}{9}
|
||||||
|
\setlist[itemize]{label=\textbullet}
|
||||||
|
\renewlist{enumerate}{enumerate}{9}
|
||||||
|
\setlist[enumerate]{label=\arabic*.}
|
||||||
|
% Running heads: chapter on the left page, section on the right, both cut to
|
||||||
|
% the page width (several design-record titles are a full sentence long).
|
||||||
|
\usepackage{fancyhdr}
|
||||||
|
\usepackage[fit]{truncate}
|
||||||
|
\pagestyle{fancy}
|
||||||
|
\fancyhf{}
|
||||||
|
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
|
||||||
|
\renewcommand{\sectionmark}[1]{\markright{#1}}
|
||||||
|
\fancyhead[LE]{\small\truncate{\dimexpr\headwidth-3em}{\leftmark}}
|
||||||
|
\fancyhead[RO]{\small\truncate{\dimexpr\headwidth-3em}{\rightmark}}
|
||||||
|
\fancyhead[RE,LO]{\small\thepage}
|
||||||
|
\renewcommand{\headrulewidth}{0.4pt}
|
||||||
|
\setlength{\headheight}{14pt}
|
||||||
|
\fancypagestyle{plain}{\fancyhf{}\fancyfoot[C]{\small\thepage}\renewcommand{\headrulewidth}{0pt}}
|
||||||
|
\setlength{\emergencystretch}{3em}
|
||||||
|
\setlength{\parindent}{0pt}
|
||||||
|
\setlength{\parskip}{0.5em}
|
||||||
|
|
||||||
|
% --- glyphs DejaVu Serif lacks: the status marks used across the docs
|
||||||
|
\newunicodechar{✅}{{\symbolfont ✔}}
|
||||||
|
\newunicodechar{✓}{{\symbolfont ✓}}
|
||||||
|
\newunicodechar{❌}{{\symbolfont ✘}}
|
||||||
|
\newunicodechar{✗}{{\symbolfont ✗}}
|
||||||
|
\newunicodechar{⬜}{{\symbolfont ☐}}
|
||||||
|
\newunicodechar{⭐}{{\symbolfont ★}}
|
||||||
|
\newunicodechar{🔶}{{\symbolfont ◆}}
|
||||||
|
\newunicodechar{⚠}{{\symbolfont ⚠}}
|
||||||
|
\newunicodechar{📋}{}
|
||||||
|
\newunicodechar{🐛}{[bug]}
|
||||||
|
\newunicodechar{🎯}{[goal]}
|
||||||
|
\newunicodechar{🟡}{{\symbolfont ●}}
|
||||||
|
\newunicodechar{📍}{{\symbolfont ▸}}
|
||||||
|
\newunicodechar{🔓}{[unlocked]}
|
||||||
|
\newunicodechar{❓}{?}
|
||||||
|
\newunicodechar{⟺}{\ensuremath{\Longleftrightarrow}}
|
||||||
|
\newunicodechar{⋯}{\ensuremath{\cdots}}
|
||||||
|
\newunicodechar{^^^^fe0f}{}
|
||||||
|
|
||||||
|
% --- the documents number their own sections (§III.1, D-3, ...)
|
||||||
|
\setcounter{secnumdepth}{0}
|
||||||
|
\setcounter{tocdepth}{1}
|
||||||
|
|
||||||
|
\input{meta}
|
||||||
|
|
||||||
|
% \datasource{path/to/data.csv}: cite the data behind a figure or table.
|
||||||
|
% Every figure or table of measured numbers reads its CSV at build time
|
||||||
|
% (\addplot table / \pgfplotstabletypeset) and is followed by this line, so
|
||||||
|
% the reader can find the exact file at the exact commit.
|
||||||
|
\newcommand{\datasource}[1]{%
|
||||||
|
\par{\small Data: \texttt{\detokenize{#1}} at commit \texttt{\bookcommit}.}\par}
|
||||||
|
|
||||||
|
\title{LithosAnanke and StarForth}
|
||||||
|
\author{}
|
||||||
|
\date{Built \bookdate{} from commit \texttt{\bookcommit}%
|
||||||
|
\ifx\bookboard\empty\else\\Board appendix: \bookboard\fi}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\frontmatter
|
||||||
|
\maketitle
|
||||||
|
\tableofcontents
|
||||||
|
|
||||||
|
\chapter{About this book}
|
||||||
|
This book is generated from the repository by \texttt{make docs}. Each
|
||||||
|
chapter below is still maintained as the Markdown file named in the table and
|
||||||
|
converted at build time; a chapter moves into LaTeX source when it is
|
||||||
|
rewritten. Part~III is the design record: those documents are archival and
|
||||||
|
are reproduced as written, including their struck-through corrections.
|
||||||
|
|
||||||
|
\begin{longtable}{@{}ll@{}}
|
||||||
|
\toprule
|
||||||
|
Chapter & Source \\
|
||||||
|
\midrule
|
||||||
|
\endhead
|
||||||
|
Ontology & \texttt{docs/ONTOLOGY.md} \\
|
||||||
|
Roadmap & \texttt{docs/ROADMAP.md} \\
|
||||||
|
Boot targets & \texttt{boards/README.md} \\
|
||||||
|
v4 justification & \texttt{docs/v4.0.0/JUSTIFICATION.md} \\
|
||||||
|
v4 decomposition & \texttt{docs/v4.0.0/DECOMPOSITION.md} \\
|
||||||
|
FABRIC-0 \dots{} FABRIC-4 & \texttt{docs/fabric/FABRIC-*.md} \\
|
||||||
|
Board appendix (\texttt{TARGET=}) & \texttt{boards/<board>/README.md} \\
|
||||||
|
\bottomrule
|
||||||
|
\end{longtable}
|
||||||
|
|
||||||
|
\mainmatter
|
||||||
|
|
||||||
|
\part{The system}
|
||||||
|
\input{ontology}
|
||||||
|
\input{roadmap}
|
||||||
|
\input{boards}
|
||||||
|
|
||||||
|
\part{StarForth v4}
|
||||||
|
\input{justification}
|
||||||
|
\input{decomposition}
|
||||||
|
|
||||||
|
\part{Design record (FABRIC series)}
|
||||||
|
\input{fabric-0}
|
||||||
|
\input{fabric-1}
|
||||||
|
\input{fabric-2}
|
||||||
|
\input{fabric-3}
|
||||||
|
\input{fabric-3-5}
|
||||||
|
\input{fabric-3-6}
|
||||||
|
\input{fabric-3-7}
|
||||||
|
\input{fabric-4}
|
||||||
|
|
||||||
|
\ifdefined\bookboardappendix
|
||||||
|
\appendix
|
||||||
|
\input{\bookboardappendix}
|
||||||
|
\fi
|
||||||
|
|
||||||
|
\end{document}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
-- docs/book/pandoc/code-breaks.lua
|
||||||
|
--
|
||||||
|
-- Inline code in the design record is full of long identifiers and paths
|
||||||
|
-- (g_wirebind_attached_username, kernel/src/arch/riscv64/...), which LaTeX
|
||||||
|
-- cannot break, so they run into the margin. Emit inline code as \texttt
|
||||||
|
-- ourselves, escaped the same way pandoc does, with a break opportunity
|
||||||
|
-- after each separator character.
|
||||||
|
|
||||||
|
local BREAK_AFTER = { ["_"] = true, ["/"] = true, ["."] = true, ["-"] = true,
|
||||||
|
[":"] = true, [","] = true, ["("] = true, ["="] = true }
|
||||||
|
|
||||||
|
local ESCAPE = {
|
||||||
|
["\\"] = "\\textbackslash{}", ["{"] = "\\{", ["}"] = "\\}",
|
||||||
|
["$"] = "\\$", ["&"] = "\\&", ["#"] = "\\#", ["%"] = "\\%", ["_"] = "\\_",
|
||||||
|
["^"] = "\\textasciicircum{}", ["~"] = "\\textasciitilde{}",
|
||||||
|
["'"] = "\\textquotesingle{}", ["`"] = "\\textasciigrave{}",
|
||||||
|
[" "] = "\\ ",
|
||||||
|
}
|
||||||
|
|
||||||
|
function Code(el)
|
||||||
|
if not FORMAT:match("latex") then return nil end
|
||||||
|
local out = {}
|
||||||
|
for _, cp in utf8.codes(el.text) do
|
||||||
|
local ch = utf8.char(cp)
|
||||||
|
out[#out + 1] = ESCAPE[ch] or ch
|
||||||
|
if BREAK_AFTER[ch] then out[#out + 1] = "\\allowbreak{}" end
|
||||||
|
end
|
||||||
|
return pandoc.RawInline("latex", "\\texttt{" .. table.concat(out) .. "}")
|
||||||
|
end
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
$if(highlighting-macros)$
|
||||||
|
$highlighting-macros$
|
||||||
|
$endif$
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
-- docs/book/pandoc/table-widths.lua
|
||||||
|
--
|
||||||
|
-- pandoc's gfm reader leaves every column width unset, so the LaTeX writer
|
||||||
|
-- emits `l` columns and a table with long cells runs off the page. For any
|
||||||
|
-- table wider than WIDE characters, give each column a width proportional
|
||||||
|
-- to its longest cell (clamped to [MIN_COL, MAX_COL] characters); the
|
||||||
|
-- writer then emits wrapping p{} columns that together fill \linewidth.
|
||||||
|
|
||||||
|
local WIDE = 72
|
||||||
|
local MIN_COL = 6
|
||||||
|
local MAX_COL = 60
|
||||||
|
|
||||||
|
local stringify = pandoc.utils.stringify
|
||||||
|
|
||||||
|
local function measure(rows, widths)
|
||||||
|
for _, row in ipairs(rows) do
|
||||||
|
local col = 1
|
||||||
|
for _, cell in ipairs(row.cells) do
|
||||||
|
local span = cell.col_span or 1
|
||||||
|
local len = utf8.len(stringify(cell.contents)) or #stringify(cell.contents)
|
||||||
|
local per = len / span
|
||||||
|
for c = col, col + span - 1 do
|
||||||
|
if per > (widths[c] or 0) then widths[c] = per end
|
||||||
|
end
|
||||||
|
col = col + span
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Table(tbl)
|
||||||
|
local n = #tbl.colspecs
|
||||||
|
local widths = {}
|
||||||
|
for i = 1, n do widths[i] = 0 end
|
||||||
|
|
||||||
|
measure(tbl.head.rows, widths)
|
||||||
|
for _, body in ipairs(tbl.bodies) do
|
||||||
|
measure(body.head, widths)
|
||||||
|
measure(body.body, widths)
|
||||||
|
end
|
||||||
|
measure(tbl.foot.rows, widths)
|
||||||
|
|
||||||
|
local total = 0
|
||||||
|
for i = 1, n do total = total + widths[i] end
|
||||||
|
if total <= WIDE then return nil end
|
||||||
|
|
||||||
|
local sum = 0
|
||||||
|
for i = 1, n do
|
||||||
|
widths[i] = math.max(MIN_COL, math.min(MAX_COL, widths[i]))
|
||||||
|
sum = sum + widths[i]
|
||||||
|
end
|
||||||
|
for i = 1, n do
|
||||||
|
tbl.colspecs[i] = { tbl.colspecs[i][1], widths[i] / sum }
|
||||||
|
end
|
||||||
|
return tbl
|
||||||
|
end
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# Makefile.starkernel — StarKernel UEFI Build System
|
# kernel/Makefile — StarKernel UEFI Build System
|
||||||
# Multi-architecture: amd64 (x86_64), aarch64 (ARM64), riscv64 (RISC-V 64)
|
# Multi-architecture: amd64 (x86_64), aarch64 (ARM64), riscv64 (RISC-V 64)
|
||||||
#
|
#
|
||||||
# Quick start:
|
# Quick start:
|
||||||
# make -f Makefile.starkernel — build for host arch
|
# make -f kernel/Makefile — build for host arch
|
||||||
# make -f Makefile.starkernel ARCH=amd64 qemu — build + boot (x86_64)
|
# make -f kernel/Makefile ARCH=amd64 qemu — build + boot (x86_64)
|
||||||
# make -f Makefile.starkernel ARCH=aarch64 qemu — build + boot (aarch64)
|
# make -f kernel/Makefile ARCH=aarch64 qemu — build + boot (aarch64)
|
||||||
# make -f Makefile.starkernel ARCH=riscv64 qemu — build + boot (riscv64)
|
# make -f kernel/Makefile ARCH=riscv64 qemu — build + boot (riscv64)
|
||||||
# make -f Makefile.starkernel help — show all targets
|
# make -f kernel/Makefile help — show all targets
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -64,7 +64,7 @@ $(eval $(call kconfig_bool,STARFORTH_ENABLE_VM,1))
|
|||||||
MONOLITHIC ?= 1
|
MONOLITHIC ?= 1
|
||||||
|
|
||||||
# Parallel build — use all available cores when not cleaning
|
# Parallel build — use all available cores when not cleaning
|
||||||
# (adding -j when 'clean' is also a goal causes a race on include/version.h)
|
# (adding -j when 'clean' is also a goal causes a race on v3/include/version.h)
|
||||||
NPROC := $(shell nproc 2>/dev/null || echo 4)
|
NPROC := $(shell nproc 2>/dev/null || echo 4)
|
||||||
ifeq ($(filter clean,$(MAKECMDGOALS)),)
|
ifeq ($(filter clean,$(MAKECMDGOALS)),)
|
||||||
MAKEFLAGS += -j$(NPROC)
|
MAKEFLAGS += -j$(NPROC)
|
||||||
@@ -106,9 +106,9 @@ KERNEL_OBJ_DIR := $(OBJ_DIR)/kernel
|
|||||||
LOADER_EFI := $(BUILD_DIR)/starkernel_loader.efi
|
LOADER_EFI := $(BUILD_DIR)/starkernel_loader.efi
|
||||||
KERNEL_ELF := $(BUILD_DIR)/starkernel_kernel.elf
|
KERNEL_ELF := $(BUILD_DIR)/starkernel_kernel.elf
|
||||||
|
|
||||||
KERNEL_SRC := src/starkernel
|
KERNEL_SRC := kernel/src
|
||||||
KERNEL_INC := include/starkernel
|
KERNEL_INC := kernel/include/starkernel
|
||||||
STARFORTH_CONFIG_HEADER := include/starforth_config.h
|
STARFORTH_CONFIG_HEADER := v3/include/starforth_config.h
|
||||||
|
|
||||||
QEMU_LOG_DIR := logs
|
QEMU_LOG_DIR := logs
|
||||||
QEMU_ISO := $(BUILD_DIR)/starkernel.iso
|
QEMU_ISO := $(BUILD_DIR)/starkernel.iso
|
||||||
@@ -129,17 +129,17 @@ ARTDISK ?= disk/artemis.img
|
|||||||
# headroom above the current 9-device identity roster (Zuse + 8 minted identities)
|
# headroom above the current 9-device identity roster (Zuse + 8 minted identities)
|
||||||
# rather than matching it exactly, per Bob's standing ruling against hardcoding a bound
|
# rather than matching it exactly, per Bob's standing ruling against hardcoding a bound
|
||||||
# to today's scale (FABRIC-3.md §VII.4). Override if a future test needs more, e.g.
|
# to today's scale (FABRIC-3.md §VII.4). Override if a future test needs more, e.g.
|
||||||
# `make -f Makefile.starkernel qemu XHCI_PORTS=32`.
|
# `make -f kernel/Makefile qemu XHCI_PORTS=32`.
|
||||||
XHCI_PORTS ?= 16
|
XHCI_PORTS ?= 16
|
||||||
# ZUSEDISK -- Zuse's own minted USB thumbdrive, attached by default so a
|
# ZUSEDISK -- Zuse's own minted USB thumbdrive, attached by default so a
|
||||||
# plain `make qemu` lands already authenticated into the Zuse identity
|
# plain `make qemu` lands already authenticated into the Zuse identity
|
||||||
# (Captain Bob, 2026-08-28). Attached at QEMU launch time via -drive/
|
# (Captain Bob, 2026-08-28). Attached at QEMU launch time via -drive/
|
||||||
# -device on the qemu-xhci controller each arch's qemu target already
|
# -device on the qemu-xhci controller each arch's qemu target already
|
||||||
# creates; xhci_bringup()'s initial port scan (src/starkernel/usb/xhci.c)
|
# creates; xhci_bringup()'s initial port scan (kernel/src/usb/xhci.c)
|
||||||
# is what makes an already-connected-at-launch device visible at all --
|
# is what makes an already-connected-at-launch device visible at all --
|
||||||
# xhci_poll_events() alone is purely hotplug-event-driven and would never
|
# xhci_poll_events() alone is purely hotplug-event-driven and would never
|
||||||
# see a device present before controller reset. Override to "" (empty) to
|
# see a device present before controller reset. Override to "" (empty) to
|
||||||
# boot without Zuse attached, e.g. `make -f Makefile.starkernel qemu ZUSEDISK=`.
|
# boot without Zuse attached, e.g. `make -f kernel/Makefile qemu ZUSEDISK=`.
|
||||||
ZUSEDISK ?= disk/thumbdrives/zuse-thumb-ident.img
|
ZUSEDISK ?= disk/thumbdrives/zuse-thumb-ident.img
|
||||||
# Precomputed (not inlined as $(if ...,...)) because the drive/device specs
|
# Precomputed (not inlined as $(if ...,...)) because the drive/device specs
|
||||||
# below are comma-heavy and GNU make's $(if) function splits its own
|
# below are comma-heavy and GNU make's $(if) function splits its own
|
||||||
@@ -153,10 +153,10 @@ else
|
|||||||
ZUSEDISK_QEMU_ARGS :=
|
ZUSEDISK_QEMU_ARGS :=
|
||||||
endif
|
endif
|
||||||
MKCAPSULE_SRC = tools/mkcapsule.c tools/pkcs8_ed25519.c \
|
MKCAPSULE_SRC = tools/mkcapsule.c tools/pkcs8_ed25519.c \
|
||||||
src/starkernel/crypto/ed25519.c \
|
kernel/src/crypto/ed25519.c \
|
||||||
src/starkernel/crypto/fe25519.c \
|
kernel/src/crypto/fe25519.c \
|
||||||
src/starkernel/crypto/scalar25519.c \
|
kernel/src/crypto/scalar25519.c \
|
||||||
src/starkernel/crypto/sha512.c
|
kernel/src/crypto/sha512.c
|
||||||
MKCAPSULE_BIN = $(BUILD_DIR)/tools/mkcapsule
|
MKCAPSULE_BIN = $(BUILD_DIR)/tools/mkcapsule
|
||||||
# Milestone 6 (Phase 8): the snakeoil intermediate's private key, generated
|
# Milestone 6 (Phase 8): the snakeoil intermediate's private key, generated
|
||||||
# offline outside this repo entirely (see FABRIC-2.md's Phase 8 §Milestone 6
|
# offline outside this repo entirely (see FABRIC-2.md's Phase 8 §Milestone 6
|
||||||
@@ -169,6 +169,28 @@ CAPSULE_GENERATED = $(BUILD_DIR)/capsule_generated.c
|
|||||||
CAPSULE_GENERATED_OBJ = $(BUILD_DIR)/capsule_generated.o
|
CAPSULE_GENERATED_OBJ = $(BUILD_DIR)/capsule_generated.o
|
||||||
CAPSULE_GENERATED_KOBJ = $(KERNEL_OBJ_DIR)/capsule_generated.o
|
CAPSULE_GENERATED_KOBJ = $(KERNEL_OBJ_DIR)/capsule_generated.o
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# BOARD (boot_image)
|
||||||
|
# ==============================================================================
|
||||||
|
# BOARD names a directory under boards/ (ser5, raspi, milkv, ...). Its
|
||||||
|
# board.mk sets BOARD_ARCH, BOARD_BOOT (how the firmware finds us) and
|
||||||
|
# BOARD_IMAGE (the single file written to the boot medium). The root
|
||||||
|
# Makefile's `make boot_image TARGET=<NAME>` maps NAME to BOARD and passes
|
||||||
|
# ARCH=$(BOARD_ARCH); the kernel objects themselves are the ordinary
|
||||||
|
# build/$(ARCH)/kernel ones, shared with `make qemu`.
|
||||||
|
BOARD ?=
|
||||||
|
ifneq ($(strip $(BOARD)),)
|
||||||
|
ifeq ($(wildcard boards/$(BOARD)/board.mk),)
|
||||||
|
$(error Unknown BOARD='$(BOARD)': no boards/$(BOARD)/board.mk)
|
||||||
|
endif
|
||||||
|
include boards/$(BOARD)/board.mk
|
||||||
|
ifneq ($(BOARD_ARCH),$(ARCH))
|
||||||
|
$(error BOARD=$(BOARD) is ARCH=$(BOARD_ARCH), but ARCH=$(ARCH) was requested)
|
||||||
|
endif
|
||||||
|
BOARD_OUT := build/boards/$(BOARD)
|
||||||
|
endif
|
||||||
|
BOOT_IMAGE_SIZE_MIB ?= 128
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# TOOLCHAIN
|
# TOOLCHAIN
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -195,8 +217,8 @@ ifeq ($(ARCH),amd64)
|
|||||||
# correctly. These flags come after COMMON_CFLAGS on the command line so
|
# correctly. These flags come after COMMON_CFLAGS on the command line so
|
||||||
# they win for amd64 only; riscv64/aarch64 keep -fPIC.
|
# they win for amd64 only; riscv64/aarch64 keep -fPIC.
|
||||||
ARCH_CFLAGS := -m64 -march=x86-64 -mno-red-zone -DARCH_AMD64 -fno-pic -fno-pie
|
ARCH_CFLAGS := -m64 -march=x86-64 -mno-red-zone -DARCH_AMD64 -fno-pic -fno-pie
|
||||||
LOADER_LINKER_SCRIPT := linker/starkernel-loader-amd64.ld
|
LOADER_LINKER_SCRIPT := kernel/linker/starkernel-loader-amd64.ld
|
||||||
KERNEL_LINKER_SCRIPT := linker/starkernel-kernel-amd64.ld
|
KERNEL_LINKER_SCRIPT := kernel/linker/starkernel-kernel-amd64.ld
|
||||||
|
|
||||||
else ifeq ($(ARCH),aarch64)
|
else ifeq ($(ARCH),aarch64)
|
||||||
ifneq ($(shell which aarch64-linux-gnu-gcc 2>/dev/null),)
|
ifneq ($(shell which aarch64-linux-gnu-gcc 2>/dev/null),)
|
||||||
@@ -211,14 +233,16 @@ else ifeq ($(ARCH),aarch64)
|
|||||||
$(error No ARM64 toolchain found. Install aarch64-linux-gnu-gcc or aarch64-none-elf-gcc)
|
$(error No ARM64 toolchain found. Install aarch64-linux-gnu-gcc or aarch64-none-elf-gcc)
|
||||||
endif
|
endif
|
||||||
# aarch64 loader uses clang + lld-link (COFF target — GCC cannot produce aarch64 PE)
|
# aarch64 loader uses clang + lld-link (COFF target — GCC cannot produce aarch64 PE)
|
||||||
LOADER_CC := clang-18
|
# Any clang with the aarch64 COFF backend works; the version is not
|
||||||
# Debian/Ubuntu package only installs the versioned lld-link-18 on PATH by
|
# pinned (Ubuntu 26.04 ships clang-21, older hosts clang-18).
|
||||||
# default (unversioned lld-link lives under /usr/lib/llvm-18/bin, which
|
LOADER_CC := $(shell which clang 2>/dev/null || ls /usr/bin/clang-[0-9]* 2>/dev/null | sort -V | tail -1 || echo clang)
|
||||||
|
# Debian/Ubuntu package only installs the versioned lld-link-NN on PATH by
|
||||||
|
# default (unversioned lld-link lives under /usr/lib/llvm-NN/bin, which
|
||||||
# isn't on PATH unless explicitly prepended) — detect whichever resolves.
|
# isn't on PATH unless explicitly prepended) — detect whichever resolves.
|
||||||
LOADER_LD := $(shell which lld-link 2>/dev/null || which lld-link-18 2>/dev/null || echo lld-link)
|
LOADER_LD := $(shell which lld-link 2>/dev/null || ls /usr/bin/lld-link-[0-9]* /usr/lib/llvm-*/bin/lld-link 2>/dev/null | sort -V | tail -1 || echo lld-link)
|
||||||
ARCH_CFLAGS := -march=armv8-a -mcpu=cortex-a72 -DARCH_AARCH64 -mno-outline-atomics
|
ARCH_CFLAGS := -march=armv8-a -mcpu=cortex-a72 -DARCH_AARCH64 -mno-outline-atomics
|
||||||
LOADER_LINKER_SCRIPT := linker/starkernel-loader-aarch64.ld
|
LOADER_LINKER_SCRIPT := kernel/linker/starkernel-loader-aarch64.ld
|
||||||
KERNEL_LINKER_SCRIPT := linker/starkernel-kernel-aarch64.ld
|
KERNEL_LINKER_SCRIPT := kernel/linker/starkernel-kernel-aarch64.ld
|
||||||
|
|
||||||
else ifeq ($(ARCH),riscv64)
|
else ifeq ($(ARCH),riscv64)
|
||||||
ifneq ($(shell which riscv64-unknown-elf-gcc 2>/dev/null),)
|
ifneq ($(shell which riscv64-unknown-elf-gcc 2>/dev/null),)
|
||||||
@@ -233,8 +257,8 @@ else ifeq ($(ARCH),riscv64)
|
|||||||
$(error No RISC-V toolchain found. Install riscv64-unknown-elf-gcc or riscv64-linux-gnu-gcc)
|
$(error No RISC-V toolchain found. Install riscv64-unknown-elf-gcc or riscv64-linux-gnu-gcc)
|
||||||
endif
|
endif
|
||||||
ARCH_CFLAGS := -march=rv64gc -mabi=lp64d -DARCH_RISCV64
|
ARCH_CFLAGS := -march=rv64gc -mabi=lp64d -DARCH_RISCV64
|
||||||
LOADER_LINKER_SCRIPT := linker/starkernel-loader-riscv64.ld
|
LOADER_LINKER_SCRIPT := kernel/linker/starkernel-loader-riscv64.ld
|
||||||
KERNEL_LINKER_SCRIPT := linker/starkernel-kernel-riscv64.ld
|
KERNEL_LINKER_SCRIPT := kernel/linker/starkernel-kernel-riscv64.ld
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Default loader toolchain = kernel toolchain (overridden for aarch64 above)
|
# Default loader toolchain = kernel toolchain (overridden for aarch64 above)
|
||||||
@@ -260,13 +284,13 @@ COMMON_CFLAGS := \
|
|||||||
-ffreestanding -nostdlib -fno-builtin \
|
-ffreestanding -nostdlib -fno-builtin \
|
||||||
-fPIC -fvisibility=hidden -fno-stack-protector -fshort-wchar \
|
-fPIC -fvisibility=hidden -fno-stack-protector -fshort-wchar \
|
||||||
$(ARCH_CFLAGS) \
|
$(ARCH_CFLAGS) \
|
||||||
-I$(KERNEL_INC) -Iinclude -Isrc \
|
-I$(KERNEL_INC) -Iv3/include -Ikernel/include -Iv3/src \
|
||||||
-include $(STARFORTH_CONFIG_HEADER) \
|
-include $(STARFORTH_CONFIG_HEADER) \
|
||||||
-DPARITY_MODE=$(PARITY_MODE)
|
-DPARITY_MODE=$(PARITY_MODE)
|
||||||
|
|
||||||
VMCORE_CFLAGS_COMMON := \
|
VMCORE_CFLAGS_COMMON := \
|
||||||
$(filter-out -I$(KERNEL_INC),$(COMMON_CFLAGS)) \
|
$(filter-out -I$(KERNEL_INC),$(COMMON_CFLAGS)) \
|
||||||
-Iinclude -I. -Isrc/word_source -Isrc/test_runner/include \
|
-Iv3/include -Ikernel/include -I. -Iv3/src/word_source -Iv3/src/test_runner/include \
|
||||||
-Wno-error=unused-parameter -Wno-error=shift-negative-value \
|
-Wno-error=unused-parameter -Wno-error=shift-negative-value \
|
||||||
-Wno-error=sign-compare -Wno-error=missing-field-initializers
|
-Wno-error=sign-compare -Wno-error=missing-field-initializers
|
||||||
|
|
||||||
@@ -281,8 +305,8 @@ LOADER_BASE_CFLAGS := \
|
|||||||
-mno-stack-arg-probe \
|
-mno-stack-arg-probe \
|
||||||
-march=armv8-a \
|
-march=armv8-a \
|
||||||
-DARCH_AARCH64 \
|
-DARCH_AARCH64 \
|
||||||
-I$(KERNEL_INC) -Iinclude -Isrc \
|
-I$(KERNEL_INC) -Iv3/include -Ikernel/include -Iv3/src \
|
||||||
-Iinclude/starkernel/freestanding \
|
-Ikernel/include/starkernel/freestanding \
|
||||||
-include $(STARFORTH_CONFIG_HEADER) \
|
-include $(STARFORTH_CONFIG_HEADER) \
|
||||||
-DPARITY_MODE=$(PARITY_MODE) \
|
-DPARITY_MODE=$(PARITY_MODE) \
|
||||||
-DPLATFORM_TIME_NO_INLINE
|
-DPLATFORM_TIME_NO_INLINE
|
||||||
@@ -308,7 +332,7 @@ ifeq ($(ARCH),aarch64)
|
|||||||
else ifeq ($(ARCH),riscv64)
|
else ifeq ($(ARCH),riscv64)
|
||||||
LOADER_LDFLAGS_PE := # ELF→objcopy pipeline in link rule
|
LOADER_LDFLAGS_PE := # ELF→objcopy pipeline in link rule
|
||||||
else
|
else
|
||||||
LOADER_LINKER_SCRIPT_PE := linker/starkernel-loader-amd64-pe.ld
|
LOADER_LINKER_SCRIPT_PE := kernel/linker/starkernel-loader-amd64-pe.ld
|
||||||
LOADER_LDFLAGS_PE := \
|
LOADER_LDFLAGS_PE := \
|
||||||
-T $(LOADER_LINKER_SCRIPT_PE) -m i386pep -nostdlib \
|
-T $(LOADER_LINKER_SCRIPT_PE) -m i386pep -nostdlib \
|
||||||
--enable-reloc-section --image-base 0 --subsystem 10 -e efi_main
|
--enable-reloc-section --image-base 0 --subsystem 10 -e efi_main
|
||||||
@@ -429,7 +453,7 @@ LOADER_CFLAGS += $(VM_FEATURE_OVERRIDES)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# SK_CMD — optional startup FORTH script injected before the interactive REPL.
|
# SK_CMD — optional startup FORTH script injected before the interactive REPL.
|
||||||
# Usage: make -f Makefile.starkernel qemu SK_CMD="TIME-TICKS . BYE"
|
# Usage: make -f kernel/Makefile qemu SK_CMD="TIME-TICKS . BYE"
|
||||||
ifdef SK_CMD
|
ifdef SK_CMD
|
||||||
KERNEL_CFLAGS += -DSK_STARTUP_FORTH='"$(SK_CMD)"'
|
KERNEL_CFLAGS += -DSK_STARTUP_FORTH='"$(SK_CMD)"'
|
||||||
LOADER_CFLAGS += -DSK_STARTUP_FORTH='"$(SK_CMD)"'
|
LOADER_CFLAGS += -DSK_STARTUP_FORTH='"$(SK_CMD)"'
|
||||||
@@ -439,7 +463,7 @@ endif
|
|||||||
# The loader reads this file from the EFI partition and parses it at boot.
|
# The loader reads this file from the EFI partition and parses it at boot.
|
||||||
# Supported flags: --doe --log-level=<debug|info|warn|error>
|
# Supported flags: --doe --log-level=<debug|info|warn|error>
|
||||||
# --stack=<N>[MG] --heap=<N>[MG]
|
# --stack=<N>[MG] --heap=<N>[MG]
|
||||||
# Usage: make -f Makefile.starkernel qemu KERNEL_ARGS="--doe --log-level=info"
|
# Usage: make -f kernel/Makefile qemu KERNEL_ARGS="--doe --log-level=info"
|
||||||
KERNEL_ARGS ?=
|
KERNEL_ARGS ?=
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -534,19 +558,19 @@ KERNEL_ASM := $(wildcard $(KERNEL_SRC)/arch/$(ARCH)/*.S)
|
|||||||
|
|
||||||
ifeq ($(STARFORTH_ENABLE_VM),1)
|
ifeq ($(STARFORTH_ENABLE_VM),1)
|
||||||
VM_ALL_SRCS := \
|
VM_ALL_SRCS := \
|
||||||
$(wildcard src/*.c) \
|
$(wildcard v3/src/*.c) \
|
||||||
$(wildcard src/word_source/*.c) \
|
$(wildcard v3/src/word_source/*.c) \
|
||||||
$(wildcard src/test_runner/*.c) \
|
$(wildcard v3/src/test_runner/*.c) \
|
||||||
$(wildcard src/test_runner/modules/*.c)
|
$(wildcard v3/src/test_runner/modules/*.c)
|
||||||
|
|
||||||
VM_EXCLUDE := \
|
VM_EXCLUDE := \
|
||||||
src/main.c src/cli.c src/repl.c \
|
v3/src/main.c v3/src/cli.c v3/src/repl.c \
|
||||||
src/platform/% \
|
v3/src/platform/% \
|
||||||
src/blkio_factory.c src/blkio_file.c \
|
v3/src/blkio_factory.c v3/src/blkio_file.c \
|
||||||
src/log.c src/doe_metrics.c \
|
v3/src/log.c v3/src/doe_metrics.c \
|
||||||
src/vm.c src/vm_core.c src/vm_bootstrap.c src/vm_runtime.c src/vm_time.c \
|
v3/src/vm.c v3/src/vm_core.c v3/src/vm_bootstrap.c v3/src/vm_runtime.c v3/src/vm_time.c \
|
||||||
src/word_source/q48_16_words.c \
|
v3/src/word_source/q48_16_words.c \
|
||||||
src/test_runner/modules/break_me_tests.c
|
v3/src/test_runner/modules/break_me_tests.c
|
||||||
|
|
||||||
VM_CORE_SRCS := $(filter-out $(VM_EXCLUDE),$(VM_ALL_SRCS))
|
VM_CORE_SRCS := $(filter-out $(VM_EXCLUDE),$(VM_ALL_SRCS))
|
||||||
|
|
||||||
@@ -569,8 +593,8 @@ LOADER_EXTRA_SRCS := \
|
|||||||
|
|
||||||
KERNEL_EXTRA_SRCS := $(LOADER_EXTRA_SRCS)
|
KERNEL_EXTRA_SRCS := $(LOADER_EXTRA_SRCS)
|
||||||
|
|
||||||
LOADER_VM_OBJS := $(patsubst src/%.c,$(LOADER_OBJ_DIR)/vmcore/%.o,$(VM_CORE_SRCS))
|
LOADER_VM_OBJS := $(patsubst v3/src/%.c,$(LOADER_OBJ_DIR)/vmcore/%.o,$(VM_CORE_SRCS))
|
||||||
KERNEL_VM_OBJS := $(patsubst src/%.c,$(KERNEL_OBJ_DIR)/vmcore/%.o,$(VM_CORE_SRCS))
|
KERNEL_VM_OBJS := $(patsubst v3/src/%.c,$(KERNEL_OBJ_DIR)/vmcore/%.o,$(VM_CORE_SRCS))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LOADER_SRCS := $(LOADER_SRCS_BASE) $(LOADER_EXTRA_SRCS)
|
LOADER_SRCS := $(LOADER_SRCS_BASE) $(LOADER_EXTRA_SRCS)
|
||||||
@@ -603,7 +627,7 @@ KERNEL_OBJS := \
|
|||||||
# MAIN TARGETS
|
# MAIN TARGETS
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|
||||||
all: include/version.h $(CAPSULE_GENERATED_OBJ) $(CAPSULE_GENERATED_KOBJ) $(LOADER_EFI) $(KERNEL_ELF)
|
all: v3/include/version.h $(CAPSULE_GENERATED_OBJ) $(CAPSULE_GENERATED_KOBJ) $(LOADER_EFI) $(KERNEL_ELF)
|
||||||
@echo "StarKernel built successfully for $(ARCH)"
|
@echo "StarKernel built successfully for $(ARCH)"
|
||||||
@echo " Loader: $(LOADER_EFI)"
|
@echo " Loader: $(LOADER_EFI)"
|
||||||
@echo " Kernel: $(KERNEL_ELF)"
|
@echo " Kernel: $(KERNEL_ELF)"
|
||||||
@@ -611,13 +635,13 @@ all: include/version.h $(CAPSULE_GENERATED_OBJ) $(CAPSULE_GENERATED_KOBJ) $(LOAD
|
|||||||
kernel: all
|
kernel: all
|
||||||
|
|
||||||
kernel-all:
|
kernel-all:
|
||||||
@$(MAKE) -f Makefile.starkernel ARCH=amd64 TARGET=$(TARGET)
|
@$(MAKE) -f kernel/Makefile ARCH=amd64 TARGET=$(TARGET)
|
||||||
@$(MAKE) -f Makefile.starkernel ARCH=aarch64 TARGET=$(TARGET)
|
@$(MAKE) -f kernel/Makefile ARCH=aarch64 TARGET=$(TARGET)
|
||||||
@$(MAKE) -f Makefile.starkernel ARCH=riscv64 TARGET=$(TARGET)
|
@$(MAKE) -f kernel/Makefile ARCH=riscv64 TARGET=$(TARGET)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf build/$(ARCH)/$(TARGET)
|
rm -rf build/$(ARCH)/$(TARGET)
|
||||||
rm -f include/version.h
|
rm -f v3/include/version.h
|
||||||
|
|
||||||
clean-kernel:
|
clean-kernel:
|
||||||
@echo "Cleaning all StarKernel build artifacts..."
|
@echo "Cleaning all StarKernel build artifacts..."
|
||||||
@@ -636,8 +660,8 @@ FORCE:
|
|||||||
# here after a hosted `make` run silently reuses that stale/wrong-flavored file
|
# here after a hosted `make` run silently reuses that stale/wrong-flavored file
|
||||||
# and fails with "LITHOS_VERSION_STR undeclared" deep in kernel_main.c, instead
|
# and fails with "LITHOS_VERSION_STR undeclared" deep in kernel_main.c, instead
|
||||||
# of regenerating its own correct version.
|
# of regenerating its own correct version.
|
||||||
include/version.h: FORCE
|
v3/include/version.h: FORCE
|
||||||
@mkdir -p include
|
@mkdir -p v3/include
|
||||||
@BUILD_TS=$$(date -Iseconds 2>/dev/null || echo "unknown"); \
|
@BUILD_TS=$$(date -Iseconds 2>/dev/null || echo "unknown"); \
|
||||||
printf '#ifndef STARFORTH_VERSION_H\n#define STARFORTH_VERSION_H\n\n' > $@; \
|
printf '#ifndef STARFORTH_VERSION_H\n#define STARFORTH_VERSION_H\n\n' > $@; \
|
||||||
printf '#define STARFORTH_VERSION "%s"\n' "$(VERSION)" >> $@; \
|
printf '#define STARFORTH_VERSION "%s"\n' "$(VERSION)" >> $@; \
|
||||||
@@ -653,7 +677,7 @@ include/version.h: FORCE
|
|||||||
$(MKCAPSULE_BIN): $(MKCAPSULE_SRC)
|
$(MKCAPSULE_BIN): $(MKCAPSULE_SRC)
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
@echo "HOSTCC $(MKCAPSULE_SRC)"
|
@echo "HOSTCC $(MKCAPSULE_SRC)"
|
||||||
@cc -std=c99 -Wall -Wextra -O2 -Iinclude -Itools -o $@ $(MKCAPSULE_SRC)
|
@cc -std=c99 -Wall -Wextra -O2 -Iv3/include -Ikernel/include -Itools -o $@ $(MKCAPSULE_SRC)
|
||||||
|
|
||||||
# Generate capsule_generated.c from capsules/
|
# Generate capsule_generated.c from capsules/
|
||||||
CAPSULE_SRCS := $(shell find $(CAPSULES_DIR) -type f ! -name '.*' 2>/dev/null)
|
CAPSULE_SRCS := $(shell find $(CAPSULES_DIR) -type f ! -name '.*' 2>/dev/null)
|
||||||
@@ -695,12 +719,12 @@ $(LOADER_OBJ_DIR)/%.o: $(KERNEL_SRC)/%.c | $(LOADER_OBJ_DIR)
|
|||||||
@$(LOADER_CC) $(LOADER_CFLAGS) -c $< -o $@
|
@$(LOADER_CC) $(LOADER_CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
# Compile loader VM core sources
|
# Compile loader VM core sources
|
||||||
$(LOADER_OBJ_DIR)/vmcore/%.o: src/%.c include/version.h | $(LOADER_OBJ_DIR)
|
$(LOADER_OBJ_DIR)/vmcore/%.o: v3/src/%.c v3/include/version.h | $(LOADER_OBJ_DIR)
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
@echo "CC (loader) $<"
|
@echo "CC (loader) $<"
|
||||||
ifeq ($(ARCH),aarch64)
|
ifeq ($(ARCH),aarch64)
|
||||||
@$(LOADER_CC) $(LOADER_CFLAGS) \
|
@$(LOADER_CC) $(LOADER_CFLAGS) \
|
||||||
-Iinclude -I. -Isrc/test_runner/include \
|
-Iv3/include -Ikernel/include -I. -Iv3/src/test_runner/include \
|
||||||
-Wno-error=unused-parameter -Wno-error=shift-negative-value \
|
-Wno-error=unused-parameter -Wno-error=shift-negative-value \
|
||||||
-Wno-error=sign-compare -Wno-error=missing-field-initializers \
|
-Wno-error=sign-compare -Wno-error=missing-field-initializers \
|
||||||
-Wno-unused-function \
|
-Wno-unused-function \
|
||||||
@@ -722,10 +746,10 @@ $(KERNEL_OBJ_DIR)/%.o: $(KERNEL_SRC)/%.c | $(KERNEL_OBJ_DIR)
|
|||||||
@$(CC) $(KERNEL_CFLAGS) -c $< -o $@
|
@$(CC) $(KERNEL_CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
# Compile kernel VM core sources
|
# Compile kernel VM core sources
|
||||||
$(KERNEL_OBJ_DIR)/vmcore/%.o: src/%.c include/version.h | $(KERNEL_OBJ_DIR)
|
$(KERNEL_OBJ_DIR)/vmcore/%.o: v3/src/%.c v3/include/version.h | $(KERNEL_OBJ_DIR)
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
@echo "CC (kernel) $<"
|
@echo "CC (kernel) $<"
|
||||||
@$(CC) $(VMCORE_CFLAGS_COMMON) $(filter-out -I$(KERNEL_INC),$(KERNEL_CFLAGS)) -Isrc/starkernel/vm -c $< -o $@
|
@$(CC) $(VMCORE_CFLAGS_COMMON) $(filter-out -I$(KERNEL_INC),$(KERNEL_CFLAGS)) -Ikernel/src/vm -c $< -o $@
|
||||||
|
|
||||||
# Compile kernel assembly sources
|
# Compile kernel assembly sources
|
||||||
$(KERNEL_OBJ_DIR)/%.o: $(KERNEL_SRC)/%.S | $(KERNEL_OBJ_DIR)
|
$(KERNEL_OBJ_DIR)/%.o: $(KERNEL_SRC)/%.S | $(KERNEL_OBJ_DIR)
|
||||||
@@ -802,7 +826,7 @@ OVMF_CODE := /usr/share/OVMF/OVMF_CODE_4M.fd
|
|||||||
OVMF_VARS_RO := /usr/share/OVMF/OVMF_VARS_4M.fd
|
OVMF_VARS_RO := /usr/share/OVMF/OVMF_VARS_4M.fd
|
||||||
|
|
||||||
# QEMU_DISPLAY — window backend for the framebuffer console (gtk/sdl/none/...).
|
# QEMU_DISPLAY — window backend for the framebuffer console (gtk/sdl/none/...).
|
||||||
# Usage: make -f Makefile.starkernel qemu QEMU_DISPLAY=none # headless/CI
|
# Usage: make -f kernel/Makefile qemu QEMU_DISPLAY=none # headless/CI
|
||||||
QEMU_DISPLAY ?= gtk
|
QEMU_DISPLAY ?= gtk
|
||||||
|
|
||||||
# QEMU_EXTRA — extra raw qemu-system-* args appended verbatim to every arch's
|
# QEMU_EXTRA — extra raw qemu-system-* args appended verbatim to every arch's
|
||||||
@@ -1072,38 +1096,98 @@ else ifeq ($(ARCH),riscv64)
|
|||||||
# fallback boot path EFI/BOOT/BOOT<ARCH>.EFI. Storage on real hardware is the
|
# fallback boot path EFI/BOOT/BOOT<ARCH>.EFI. Storage on real hardware is the
|
||||||
# USB BOT/xHCI path (already live), not virtio.
|
# USB BOT/xHCI path (already live), not virtio.
|
||||||
thumbdrive: all
|
thumbdrive: all
|
||||||
@mkdir -p $(BUILD_DIR)
|
@printf 'FS0:\\EFI\\BOOT\\%s\r\n' "$(EFI_BOOTNAME)" > $(BUILD_DIR)/thumbdrive-startup.nsh
|
||||||
@if ! which sgdisk >/dev/null 2>&1; then echo "Error: sgdisk not found. Install gdisk (apt-get install gdisk)."; exit 1; fi
|
@bash scripts/mkdiskimage.sh --out $(BUILD_DIR)/starkernel-thumbdrive.img --table gpt \
|
||||||
@if ! which mkfs.fat >/dev/null 2>&1; then echo "Error: mkfs.fat not found. Install dosfstools (apt-get install dosfstools)."; exit 1; fi
|
--size-mib 128 --label STARKERNEL \
|
||||||
@case "$(ARCH)" in \
|
$(LOADER_EFI):/EFI/BOOT/$(EFI_BOOTNAME) \
|
||||||
amd64) BOOTNAME="BOOTX64.EFI" ;; \
|
$(BUILD_DIR)/thumbdrive-startup.nsh:/startup.nsh
|
||||||
aarch64) BOOTNAME="BOOTAA64.EFI" ;; \
|
@rm -f $(BUILD_DIR)/thumbdrive-startup.nsh
|
||||||
riscv64) BOOTNAME="BOOTRISCV64.EFI" ;; \
|
@echo "Write to a USB stick with: dd if=$(BUILD_DIR)/starkernel-thumbdrive.img of=/dev/sdX bs=4M status=progress"
|
||||||
*) echo "Error: no thumbdrive EFI boot name for ARCH=$(ARCH)"; exit 1 ;; \
|
|
||||||
esac; \
|
|
||||||
# Geometry: 128 MiB disk (262144 sectors), GPT partition 1 spans sectors \
|
|
||||||
# 2048..262110 (the GPT last-usable sector for this disk size), i.e. \
|
|
||||||
# 260063 sectors. The FAT32 ESP image MUST match the partition size \
|
|
||||||
# exactly; a larger ESP overruns the disk (GPT grows corrupt) or \
|
|
||||||
# spills past the partition end, both of which made earlier builds \
|
|
||||||
# unbootable on hardware. \
|
|
||||||
DISK=$(BUILD_DIR)/starkernel-thumbdrive.img; \
|
|
||||||
ESP_SECTORS=260063; \
|
|
||||||
rm -f $$DISK $(BUILD_DIR)/thumbdrive-esp.img; \
|
|
||||||
dd if=/dev/zero of=$(BUILD_DIR)/thumbdrive-esp.img bs=512 count=$$ESP_SECTORS 2>/dev/null; \
|
|
||||||
mkfs.fat -F 32 -n "STARKERNEL" $(BUILD_DIR)/thumbdrive-esp.img >/dev/null 2>&1; \
|
|
||||||
mmd -i $(BUILD_DIR)/thumbdrive-esp.img ::/EFI; \
|
|
||||||
mmd -i $(BUILD_DIR)/thumbdrive-esp.img ::/EFI/BOOT; \
|
|
||||||
mcopy -i $(BUILD_DIR)/thumbdrive-esp.img $(LOADER_EFI) ::/EFI/BOOT/$$BOOTNAME; \
|
|
||||||
printf 'FS0:\\EFI\\BOOT\\%s\r\n' "$$BOOTNAME" > $(BUILD_DIR)/thumbdrive-startup.nsh; \
|
|
||||||
mcopy -i $(BUILD_DIR)/thumbdrive-esp.img $(BUILD_DIR)/thumbdrive-startup.nsh ::/startup.nsh; \
|
|
||||||
dd if=/dev/zero of=$$DISK bs=1M count=128 2>/dev/null; \
|
|
||||||
sgdisk -n 1:2048:0 -t 1:ef00 -c 1:"EFI System" $$DISK >/dev/null 2>&1; \
|
|
||||||
dd if=$(BUILD_DIR)/thumbdrive-esp.img of=$$DISK bs=512 seek=2048 conv=notrunc 2>/dev/null; \
|
|
||||||
rm -f $(BUILD_DIR)/thumbdrive-esp.img $(BUILD_DIR)/thumbdrive-startup.nsh; \
|
|
||||||
echo "Thumbdrive image: $$DISK"; \
|
|
||||||
echo "Write to a USB stick with: dd if=$$DISK of=/dev/sdX bs=4M status=progress"
|
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# BOOT IMAGES (one per board)
|
||||||
|
# ==============================================================================
|
||||||
|
# boot_image -- the single file written to a board's boot medium. Driven by
|
||||||
|
# BOARD (boards/<board>/board.mk); normally invoked from the repo root as
|
||||||
|
# make boot_image TARGET=SER5|RASPI|MILKV|ZYNQ7020
|
||||||
|
# Output: build/boards/<board>/$(BOARD_IMAGE).
|
||||||
|
#
|
||||||
|
# BOARD_BOOT selects the recipe:
|
||||||
|
# uefi-esp -- GPT disk, one FAT32 EFI System Partition holding the
|
||||||
|
# monolithic loader as EFI/BOOT/BOOT<ARCH>.EFI (+ startup.nsh
|
||||||
|
# for the UEFI shell, + starforth.cfg when KERNEL_ARGS is set).
|
||||||
|
# Real UEFI firmware (SER5) and U-Boot's bootefi (Milk-V) both
|
||||||
|
# boot it through the removable-media fallback path.
|
||||||
|
# rpi-native -- MBR disk, one FAT32 (LBA) partition holding config.txt,
|
||||||
|
# kernel_2712.img (kernel relinked at 0x80000 and flattened)
|
||||||
|
# and the stock BCM2712 DTB (+ cmdline.txt, which firmware
|
||||||
|
# copies into /chosen/bootargs, when KERNEL_ARGS is set).
|
||||||
|
ifeq ($(ARCH),amd64)
|
||||||
|
EFI_BOOTNAME := BOOTX64.EFI
|
||||||
|
else ifeq ($(ARCH),aarch64)
|
||||||
|
EFI_BOOTNAME := BOOTAA64.EFI
|
||||||
|
else ifeq ($(ARCH),riscv64)
|
||||||
|
EFI_BOOTNAME := BOOTRISCV64.EFI
|
||||||
|
endif
|
||||||
|
|
||||||
|
RPI5_NATIVE_LINKER_SCRIPT := kernel/linker/starkernel-native-rpi5.ld
|
||||||
|
RPI5_NATIVE_ELF := $(BUILD_DIR)/starkernel_rpi5.elf
|
||||||
|
RPI5_NATIVE_IMG := $(BUILD_DIR)/kernel_2712.img
|
||||||
|
|
||||||
|
$(RPI5_NATIVE_ELF): $(KERNEL_OBJS) $(RPI5_NATIVE_LINKER_SCRIPT) | $(BUILD_DIR)
|
||||||
|
@echo "LD (rpi5 native) $@"
|
||||||
|
@$(LD) -T $(RPI5_NATIVE_LINKER_SCRIPT) -nostdlib --build-id=none \
|
||||||
|
-e rpi5_native_start $(KERNEL_OBJS) -o $@
|
||||||
|
|
||||||
|
$(RPI5_NATIVE_IMG): $(RPI5_NATIVE_ELF)
|
||||||
|
@echo "OBJCOPY (raw) $@"
|
||||||
|
@$(OBJCOPY) -O binary $< $@
|
||||||
|
|
||||||
|
.PHONY: boot_image
|
||||||
|
ifeq ($(strip $(BOARD)),)
|
||||||
|
boot_image:
|
||||||
|
@echo "boot_image needs a board. From the repo root:"
|
||||||
|
@echo " make boot_image TARGET=SER5|RASPI|MILKV|ZYNQ7020"
|
||||||
|
@exit 1
|
||||||
|
else ifeq ($(BOARD_BOOT),uefi-esp)
|
||||||
|
boot_image: all
|
||||||
|
@mkdir -p $(BOARD_OUT)
|
||||||
|
@printf 'FS0:\\EFI\\BOOT\\%s\r\n' "$(EFI_BOOTNAME)" > $(BOARD_OUT)/startup.nsh
|
||||||
|
@rm -f $(BOARD_OUT)/starforth.cfg
|
||||||
|
$(if $(KERNEL_ARGS),@printf '%s\n' '$(KERNEL_ARGS)' > $(BOARD_OUT)/starforth.cfg)
|
||||||
|
@bash scripts/mkdiskimage.sh --out $(BOARD_OUT)/$(BOARD_IMAGE) --table gpt \
|
||||||
|
--size-mib $(BOOT_IMAGE_SIZE_MIB) --label LITHOS \
|
||||||
|
$(LOADER_EFI):/EFI/BOOT/$(EFI_BOOTNAME) \
|
||||||
|
$(BOARD_OUT)/startup.nsh:/startup.nsh \
|
||||||
|
$(if $(KERNEL_ARGS),$(BOARD_OUT)/starforth.cfg:/starforth.cfg)
|
||||||
|
@echo "$(BOARD_DESC)"
|
||||||
|
@echo "Write with: dd if=$(BOARD_OUT)/$(BOARD_IMAGE) of=/dev/sdX bs=4M conv=fsync status=progress"
|
||||||
|
else ifeq ($(BOARD_BOOT),rpi-native)
|
||||||
|
$(RPI5_DTB):
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
@echo " FETCH $(RPI5_DTB_URL)"
|
||||||
|
@curl -fsSL -o $@.tmp $(RPI5_DTB_URL) || { rm -f $@.tmp; \
|
||||||
|
echo "Error: could not fetch the Pi 5 DTB. Copy bcm2712-rpi-5-b.dtb from a Raspberry Pi"; \
|
||||||
|
echo "firmware release and pass RPI5_DTB=/path/to/bcm2712-rpi-5-b.dtb"; exit 1; }
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
boot_image: v3/include/version.h $(RPI5_NATIVE_IMG) $(RPI5_DTB)
|
||||||
|
@mkdir -p $(BOARD_OUT)
|
||||||
|
@rm -f $(BOARD_OUT)/cmdline.txt
|
||||||
|
$(if $(KERNEL_ARGS),@printf '%s\n' '$(KERNEL_ARGS)' > $(BOARD_OUT)/cmdline.txt)
|
||||||
|
@bash scripts/mkdiskimage.sh --out $(BOARD_OUT)/$(BOARD_IMAGE) --table mbr \
|
||||||
|
--size-mib $(BOOT_IMAGE_SIZE_MIB) --label LITHOS \
|
||||||
|
boards/$(BOARD)/config.txt:/config.txt \
|
||||||
|
$(RPI5_NATIVE_IMG):/kernel_2712.img \
|
||||||
|
$(RPI5_DTB):/bcm2712-rpi-5-b.dtb \
|
||||||
|
$(if $(KERNEL_ARGS),$(BOARD_OUT)/cmdline.txt:/cmdline.txt)
|
||||||
|
@echo "$(BOARD_DESC)"
|
||||||
|
@echo "Write with: dd if=$(BOARD_OUT)/$(BOARD_IMAGE) of=/dev/mmcblkX bs=4M conv=fsync status=progress"
|
||||||
|
else
|
||||||
|
boot_image:
|
||||||
|
@echo "Error: BOARD=$(BOARD) has BOARD_BOOT='$(BOARD_BOOT)', which has no boot_image recipe"
|
||||||
|
@exit 1
|
||||||
|
endif
|
||||||
|
|
||||||
# iso-usb — build a PURE UEFI isohybrid ISO for the Iso Image Writer workflow
|
# iso-usb — build a PURE UEFI isohybrid ISO for the Iso Image Writer workflow
|
||||||
# (GNOME Disks "Restore Disk Image...", or dd). Writes a single .iso to a USB
|
# (GNOME Disks "Restore Disk Image...", or dd). Writes a single .iso to a USB
|
||||||
@@ -1150,7 +1234,7 @@ iso-usb: all
|
|||||||
# yourself with Ctrl-A X or by closing the window).
|
# yourself with Ctrl-A X or by closing the window).
|
||||||
# amd64/aarch64: serial → stdio (bidirectional, you can type into the REPL);
|
# amd64/aarch64: serial → stdio (bidirectional, you can type into the REPL);
|
||||||
# riscv64: uses proper GPT (esp dir not supported)
|
# riscv64: uses proper GPT (esp dir not supported)
|
||||||
qemu-esp: include/version.h $(LOADER_EFI) $(KERNEL_ELF)
|
qemu-esp: v3/include/version.h $(LOADER_EFI) $(KERNEL_ELF)
|
||||||
ifeq ($(ARCH),amd64)
|
ifeq ($(ARCH),amd64)
|
||||||
@rm -rf $(BUILD_DIR)/esp
|
@rm -rf $(BUILD_DIR)/esp
|
||||||
@mkdir -p $(BUILD_DIR)/esp/EFI/BOOT
|
@mkdir -p $(BUILD_DIR)/esp/EFI/BOOT
|
||||||
@@ -1206,7 +1290,7 @@ else ifeq ($(ARCH),riscv64)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# qemu-gdb — launch QEMU with GDB stub on port 1234
|
# qemu-gdb — launch QEMU with GDB stub on port 1234
|
||||||
qemu-gdb: include/version.h $(LOADER_EFI) $(KERNEL_ELF)
|
qemu-gdb: v3/include/version.h $(LOADER_EFI) $(KERNEL_ELF)
|
||||||
ifeq ($(ARCH),amd64)
|
ifeq ($(ARCH),amd64)
|
||||||
@mkdir -p $(BUILD_DIR)/esp/EFI/BOOT
|
@mkdir -p $(BUILD_DIR)/esp/EFI/BOOT
|
||||||
@cp $(LOADER_EFI) $(BUILD_DIR)/esp/EFI/BOOT/BOOTX64.EFI
|
@cp $(LOADER_EFI) $(BUILD_DIR)/esp/EFI/BOOT/BOOTX64.EFI
|
||||||
@@ -1259,7 +1343,7 @@ help:
|
|||||||
@echo "StarKernel Build System"
|
@echo "StarKernel Build System"
|
||||||
@echo "======================="
|
@echo "======================="
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Usage: make -f Makefile.starkernel [ARCH=<arch>] [TARGET=<target>] <goal>"
|
@echo "Usage: make -f kernel/Makefile [ARCH=<arch>] [TARGET=<target>] <goal>"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Architectures (aliases accepted):"
|
@echo "Architectures (aliases accepted):"
|
||||||
@echo " ARCH=amd64 / x86_64 — x86-64 (default on x86 host)"
|
@echo " ARCH=amd64 / x86_64 — x86-64 (default on x86 host)"
|
||||||
@@ -1289,8 +1373,8 @@ help:
|
|||||||
@echo " help — show this message"
|
@echo " help — show this message"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Examples:"
|
@echo "Examples:"
|
||||||
@echo " make -f Makefile.starkernel ARCH=amd64 qemu"
|
@echo " make -f kernel/Makefile ARCH=amd64 qemu"
|
||||||
@echo " make -f Makefile.starkernel ARCH=aarch64 clean qemu"
|
@echo " make -f kernel/Makefile ARCH=aarch64 clean qemu"
|
||||||
@echo " make -f Makefile.starkernel ARCH=riscv64 clean qemu"
|
@echo " make -f kernel/Makefile ARCH=riscv64 clean qemu"
|
||||||
@echo " make -f Makefile.starkernel ARCH=x86_64 qemu # alias works"
|
@echo " make -f kernel/Makefile ARCH=x86_64 qemu # alias works"
|
||||||
@echo " make -f Makefile.starkernel kernel-all"
|
@echo " make -f kernel/Makefile kernel-all"
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user