boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

commit 56dfcbf7c27c97396b11fa3e71bee8d9a03a6eed
parent ccb69f1c9fcd1e3b5222653b3ba3255ba05efc79
Author: Ryan Sepassi <rsepassi@gmail.com>
Date:   Fri, 24 Apr 2026 16:04:52 -0700

Drop "v2" from P1 naming everywhere

The "v2" suffix was a transitional label from the P1 redesign and no
longer needs distinguishing. Replace P1v2 / P1 v2 / P1v2-{32,64} with
P1 / P1-{32,64} in docs, comments, and source headers. Rename the
generated-table build path build/p1v2/ -> build/p1/, and the docs/P1v2.md
references that already point at docs/P1.md.

Diffstat:
MM1pp/M1pp.P1 | 8++++----
MMakefile | 24++++++++++++------------
MP1/P1-aarch64.M1pp | 4++--
MP1/P1-amd64.M1pp | 4++--
MP1/P1-riscv64.M1pp | 4++--
MP1/P1.M1pp | 4++--
MP1/P1pp.P1pp | 2+-
MP1/gen/llvm_disasm_aarch64.py | 2+-
MP1/gen/p1_gen.py | 8++++----
Mdocs/LIBP1PP.md | 10+++++-----
Mdocs/LISP-C.md | 6+++---
Mdocs/P1.md | 52++++++++++++++++++++++++++--------------------------
Mscripts/build-p1.sh | 6+++---
Mscripts/run-tests.sh | 19++++++++++---------
Mtests/M1pp/00-hello.M1 | 6+++---
15 files changed, 80 insertions(+), 79 deletions(-)

diff --git a/M1pp/M1pp.P1 b/M1pp/M1pp.P1 @@ -1,4 +1,4 @@ -## m1pp.M1 — bootstrap M1 macro-expander, P1v2. +## m1pp.M1 — bootstrap M1 macro-expander, P1. ## ## Runtime shape: m1pp input.M1 output.M1 ## @@ -20,7 +20,7 @@ ## macro_body_tokens[]; consume through the %endm line ## without emitting output. ## -## P1v2 ABI: a0..a3 arg/return, t0..t2 caller-saved temps, s0..s3 callee-saved +## P1 ABI: a0..a3 arg/return, t0..t2 caller-saved temps, s0..s3 callee-saved ## (unused here). Non-leaf functions use enter_0 / eret. Entry is the portable ## p1_main (a0=argc, a1=argv); the backend-owned :_start stub captures ## argc/argv from the native entry state and sys_exits p1_main's return value. @@ -1514,7 +1514,7 @@ DEFINE EXPR_INVALID 1200000000000000 ## --- %macro storage: parse header + body into macros[] / macro_body_tokens -- ## Called at proc_pos == line-start `%macro`. Leaves proc_pos past the %endm ## line with proc_line_start = 1. Uses BSS scratch (def_m_ptr, def_param_ptr, -## def_body_line_start) since P1v2 enter/eret does not save s* registers. +## def_body_line_start) since P1 enter/eret does not save s* registers. ## ## Macro record layout (296 bytes, see M1PP_MACRO_RECORD_SIZE): ## +0 name.ptr (8) @@ -5960,7 +5960,7 @@ ZERO8 :paste_scratch ZERO32 ZERO32 ZERO32 ZERO32 ZERO32 ZERO32 ZERO32 ZERO32 -## parse_args + expand_macro_tokens + find_param spill slots (P1v2 has +## parse_args + expand_macro_tokens + find_param spill slots (P1 has ## no callee-save spill on enter, and find_param's inner byte compare ## needs every caller-saved register; parse_args + expand_macro_tokens ## carry state across iterations and nested calls). One u64 each (ZERO8). diff --git a/Makefile b/Makefile @@ -89,31 +89,31 @@ $(TOOLS_DIR)/M0 $(TOOLS_DIR)/hex2-0 $(TOOLS_DIR)/catm $(TOOLS_DIR)/hex0 $(TOOLS_ tools-native: sh scripts/build-native-tools.sh -# --- P1v2 backend tables -------------------------------------------------- +# --- P1 backend tables -------------------------------------------------- # -# build/p1v2/<arch>/p1_<arch>.M1 is the M1-format DEFINE table for that +# build/p1/<arch>/p1_<arch>.M1 is the M1-format DEFINE table for that # arch, generated by P1/gen/p1_gen.py. Used by scripts/build-p1.sh (the .P1 # pipeline; .P1pp uses the M1pp form under P1/P1-<arch>.M1pp instead). -build/p1v2/aarch64/p1_aarch64.M1: $(wildcard P1/gen/*.py) - python3 P1/gen/p1_gen.py --arch aarch64 build/p1v2 +build/p1/aarch64/p1_aarch64.M1: $(wildcard P1/gen/*.py) + python3 P1/gen/p1_gen.py --arch aarch64 build/p1 -build/p1v2/amd64/p1_amd64.M1: $(wildcard P1/gen/*.py) - python3 P1/gen/p1_gen.py --arch amd64 build/p1v2 +build/p1/amd64/p1_amd64.M1: $(wildcard P1/gen/*.py) + python3 P1/gen/p1_gen.py --arch amd64 build/p1 -build/p1v2/riscv64/p1_riscv64.M1: $(wildcard P1/gen/*.py) - python3 P1/gen/p1_gen.py --arch riscv64 build/p1v2 +build/p1/riscv64/p1_riscv64.M1: $(wildcard P1/gen/*.py) + python3 P1/gen/p1_gen.py --arch riscv64 build/p1 # --- Programs (per arch) -------------------------------------------------- m1pp: $(OUT_DIR)/m1pp pokem: $(OUT_DIR)/pokem -$(OUT_DIR)/m1pp: M1pp/M1pp.P1 build/p1v2/$(ARCH)/p1_$(ARCH).M1 \ +$(OUT_DIR)/m1pp: M1pp/M1pp.P1 build/p1/$(ARCH)/p1_$(ARCH).M1 \ scripts/build-p1.sh scripts/lint.sh sh scripts/build-p1.sh $(ARCH) M1pp/M1pp.P1 $@ -$(OUT_DIR)/pokem: pokem/pokem.P1 build/p1v2/$(ARCH)/p1_$(ARCH).M1 \ +$(OUT_DIR)/pokem: pokem/pokem.P1 build/p1/$(ARCH)/p1_$(ARCH).M1 \ scripts/build-p1.sh scripts/lint.sh sh scripts/build-p1.sh $(ARCH) pokem/pokem.P1 $@ @@ -123,7 +123,7 @@ HELLO_SRC := tests/M1pp/00-hello.M1 hello: $(OUT_DIR)/hello -$(OUT_DIR)/hello: $(HELLO_SRC) build/p1v2/$(ARCH)/p1_$(ARCH).M1 \ +$(OUT_DIR)/hello: $(HELLO_SRC) build/p1/$(ARCH)/p1_$(ARCH).M1 \ scripts/build-p1.sh scripts/lint.sh $(TOOLS_DIR)/M0 M1PP_BOOTSTRAP_TOOLS=1 sh scripts/build-p1.sh $(ARCH) $(HELLO_SRC) $@ @@ -153,7 +153,7 @@ ifeq ($(SUITE),) else @$(MAKE) --no-print-directory \ $(foreach a,$(TEST_ARCHES),image-$(a)) \ - $(foreach a,$(TEST_ARCHES),build/p1v2/$(a)/p1_$(a).M1) + $(foreach a,$(TEST_ARCHES),build/p1/$(a)/p1_$(a).M1) ifeq ($(SUITE),m1pp) sh scripts/run-tests.sh --suite=m1pp $(if $(ARCH_FILTER),--arch=$(ARCH_FILTER)) else ifeq ($(SUITE),p1) diff --git a/P1/P1-aarch64.M1pp b/P1/P1-aarch64.M1pp @@ -1,4 +1,4 @@ -# aarch64.M1M -- P1v2 aarch64 backend expressed in m1macro. +# aarch64.M1M -- P1 aarch64 backend expressed in m1macro. # # This mirrors p1/aarch64.py using the m1macro integer builtins: # %(sexpr), $(sexpr), and %select(cond, then, else). @@ -504,7 +504,7 @@ %endm %macro p1_entry() -# :_start stub emitted by the aarch64 backend per the P1v2 program-entry +# :_start stub emitted by the aarch64 backend per the P1 program-entry # model. Captures argc from [sp] into a0, computes argv=sp+8 into a1, # calls p1_main under the one-word direct-result convention, then issues # a native Linux sys_exit with p1_main's return value as the exit status. diff --git a/P1/P1-amd64.M1pp b/P1/P1-amd64.M1pp @@ -1,4 +1,4 @@ -# P1-amd64.M1pp -- P1v2 amd64 backend expressed in m1macro. +# P1-amd64.M1pp -- P1 amd64 backend expressed in m1macro. # # Mirrors p1/P1-aarch64.M1pp. Native register mapping is backend-private; # see the amd_reg_* table below. amd64 is variable-length, so every op @@ -835,7 +835,7 @@ %endm %macro p1_entry() -# :_start stub per the P1v2 program-entry model. Linux amd64 puts argc +# :_start stub per the P1 program-entry model. Linux amd64 puts argc # at [rsp] and argv starting at [rsp+8]. Load argc into a0 (rdi), # compute &argv[0] into a1 (rsi), call p1_main under the one-word # direct-result convention, then issue sys_exit with p1_main's return diff --git a/P1/P1-riscv64.M1pp b/P1/P1-riscv64.M1pp @@ -1,4 +1,4 @@ -# P1-riscv64.M1pp -- P1v2 riscv64 backend expressed in m1macro. +# P1-riscv64.M1pp -- P1 riscv64 backend expressed in m1macro. # # Mirrors p1/P1-aarch64.M1pp; same macro surface, different encodings. # Native register picks follow docs/P1.md's 64-bit mapping table. @@ -479,7 +479,7 @@ %endm %macro p1_entry() -# :_start stub per the P1v2 program-entry model. Linux riscv64 puts argc +# :_start stub per the P1 program-entry model. Linux riscv64 puts argc # at [sp] and argv starting at [sp+8], matching the generic SysV entry # stack. Load argc into a0, compute &argv[0] into a1, call p1_main under # the one-word direct-result convention, then issue sys_exit with the diff --git a/P1/P1.M1pp b/P1/P1.M1pp @@ -1,4 +1,4 @@ -# P1.M1M -- portable P1v2 macro front-end. +# P1.M1M -- portable P1 macro front-end. # # This file assumes an arch-specific backend M1M has already been prepended. # The backend must provide the target hooks used below: @@ -246,7 +246,7 @@ target # ---- Program entry -------------------------------------------------------- # -# The portable P1v2 program-entry model emits a backend-specific `:_start` +# The portable P1 program-entry model emits a backend-specific `:_start` # stub that captures argc/argv from the native entry state, calls the # portable label `p1_main` under the one-word direct-result convention # (a0=argc, a1=argv), and sys_exits p1_main's return value. The stub is diff --git a/P1/P1pp.P1pp b/P1/P1pp.P1pp @@ -5,7 +5,7 @@ # # catm P1-<arch>.M1pp P1.M1pp p1pp.P1pp usersrc.P1pp > program.M1 # -# Targets P1v2-64 only (WORD = 8). All internal labels use the +# Targets P1-64 only (WORD = 8). All internal labels use the # `libp1pp__` prefix; public entry points are unprefixed. # # See docs/LIBP1PP.md for the public contract. diff --git a/P1/gen/llvm_disasm_aarch64.py b/P1/gen/llvm_disasm_aarch64.py @@ -23,7 +23,7 @@ def repo_root(): def default_input_path(): - return repo_root() / 'build' / 'p1v2' / 'aarch64' / 'p1_aarch64.M1' + return repo_root() / 'build' / 'p1' / 'aarch64' / 'p1_aarch64.M1' def ensure_generated(path: Path): diff --git a/P1/gen/p1_gen.py b/P1/gen/p1_gen.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 -"""Generate P1 v2 DEFINE tables. +"""Generate P1 DEFINE tables. -This is a fresh generator for docs/P1v2.md. The ISA surface is described by +This is a fresh generator for docs/P1.md. The ISA surface is described by plain namedtuple rows, and each backend registers a simple row-type -> encoder mapping. The emitted immediate/offset domains are still curated tables rather than the full theoretical spec space, so extending coverage is a one-line data @@ -79,7 +79,7 @@ ENTER_SIZES = tuple(range(0, 129)) HEADER = """## p1_{arch}.M1 — GENERATED by p1/gen/p1_gen.py. Do not edit by hand. ## -## This table targets the P1 v2 ISA described in docs/P1v2.md. +## This table targets the P1 ISA described in docs/P1.md. ## Row shapes are shared; per-arch lowering lives in p1/gen/<arch>.py. """ @@ -221,7 +221,7 @@ def parse_args(argv): else: positional.append(arg) i += 1 - build_root = positional[0] if positional else os.path.join('build', 'p1v2') + build_root = positional[0] if positional else os.path.join('build', 'p1') if not archs: archs = list(sorted(ARCHES)) return check, archs, build_root diff --git a/docs/LIBP1PP.md b/docs/LIBP1PP.md @@ -25,10 +25,10 @@ definitions. ### Width -libp1pp v1 targets **P1v2-64 only**. Word size is 8 bytes. Pointer values, +libp1pp v1 targets **P1-64 only**. Word size is 8 bytes. Pointer values, integer results, and syscall arguments are all one word. -Porting libp1pp to P1v2-32 is out of scope for this document. +Porting libp1pp to P1-32 is out of scope for this document. ### Syscall numbers @@ -94,7 +94,7 @@ allocator: `bump_alloc` called before `bump_init` returns `0` (the other libp1pp function is callable from the first instruction of `p1_main`. -`p1_main` itself inherits the portable entry contract from P1 v2: +`p1_main` itself inherits the portable entry contract from P1: `a0` = `argc`, `a1` = `argv`. libp1pp does not wrap or interpose on `p1_main`. @@ -266,7 +266,7 @@ picking names, and their local labels cannot collide. ## Frame locals libp1pp does not introduce a new local-variable macro. Use M1PP's `%struct` -directly: its 8-byte stride matches `WORD` on P1v2-64, and it already +directly: its 8-byte stride matches `WORD` on P1-64, and it already synthesizes `%name.SIZE` for `ENTER`. %struct parse_f { state cursor endp tmp } @@ -554,6 +554,6 @@ The following were considered and deferred: - Multiple bump arenas — one global arena covers bootstrap needs. - `strcpy` / `strcat` — length-aware callers should use `memcpy` with an explicit byte count. -- P1v2-32 support. +- P1-32 support. - `envp` / auxv / command-line-aware helpers beyond what `p1_main` already receives. diff --git a/docs/LISP-C.md b/docs/LISP-C.md @@ -33,8 +33,8 @@ not the source. The source is M1PP-preprocessed P1 assembly. ## Word size -P1v2-64 is the initial target. Every heap word is 8 bytes; every object -is 8-byte aligned. P1v2-32 is out of scope for the first pass; porting +P1-64 is the initial target. Every heap word is 8 bytes; every object +is 8-byte aligned. P1-32 is out of scope for the first pass; porting would require a parallel layout story because M1PP's `%struct` stride is fixed at 8. @@ -285,7 +285,7 @@ switch wider than ~3 cases, which we use for the special-form cascade in `eval`. Each entry is 8 bytes: a 4-byte M1 label reference plus 4 bytes of -pad. P1v2-64 has no 4-byte load, only full-word `LD`, so padding to +pad. P1-64 has no 4-byte load, only full-word `LD`, so padding to a word is the cheap path. ``` diff --git a/docs/P1.md b/docs/P1.md @@ -1,13 +1,13 @@ -# P1 v2 +# P1 ## Scope -P1 v2 is a portable pseudo-ISA for standalone executables. +P1 is a portable pseudo-ISA for standalone executables. -P1 v2 has two width variants: +P1 has two width variants: -- **P1v2-64** — one word is one 64-bit integer or pointer value -- **P1v2-32** — one word is one 32-bit integer or pointer value +- **P1-64** — one word is one 64-bit integer or pointer value +- **P1-32** — one word is one 32-bit integer or pointer value Portable source may use any number of word arguments. The first four argument registers are explicit, and additional argument words are passed through a @@ -18,7 +18,7 @@ portable indirect-result convention described below. ## Toolchain envelope -P1 v2 must be assemblable through the existing `M0` + `hex2` path, with +P1 must be assemblable through the existing `M0` + `hex2` path, with `catm` as the only composition primitive between source or generated fragments. The spec therefore assumes only the following toolchain features: @@ -56,7 +56,7 @@ as `LA rd, %label` and `LA_BR %label`. ### Exposed registers -P1 v2 exposes the following source-level registers: +P1 exposes the following source-level registers: - `a0`–`a3` — argument registers. Also caller-saved general registers. - `t0`–`t2` — caller-saved temporaries. @@ -78,7 +78,7 @@ No hidden register may carry a live P1 value across an instruction boundary. ### Arguments and return values -P1 v2 defines three result conventions: one-word direct, two-word direct, and +P1 defines three result conventions: one-word direct, two-word direct, and indirect. In the one-word direct-result convention: @@ -155,7 +155,7 @@ before a frame is established. ### Incoming stack-argument area -P1 v2 defines an abstract incoming stack-argument area for explicit argument +P1 defines an abstract incoming stack-argument area for explicit argument words that do not fit in registers. - Slot `0` is the first stack-passed explicit argument word. @@ -210,8 +210,8 @@ and the backend chooses its layout and total allocation size. Word sizes: -- `WORD = 8` in P1v2-64 -- `WORD = 4` in P1v2-32 +- `WORD = 8` in P1-64 +- `WORD = 4` in P1-32 `STACK_ALIGN` is target-defined and must satisfy the native call ABI at every call boundary. @@ -223,7 +223,7 @@ Leaf functions that need no frame-local storage may omit the frame entirely. - A function that allocates a frame must restore `sp` before returning. - Callee-saved registers modified by the function must be restored before returning. -- The standard frame layout is the only frame shape recognized by P1 v2. +- The standard frame layout is the only frame shape recognized by P1. ## Op Set Summary @@ -251,7 +251,7 @@ Portable source has three immediate classes: with `LI` - **Materialized address** — the address of a label loaded with `LA` -P1 v2 also uses two structured assembly-time operands: +P1 also uses two structured assembly-time operands: - **Frame-local byte count** — a non-negative byte count used by `ENTER` - **Argument-slot index** — a non-negative word-slot index used by `LDARG` @@ -315,7 +315,7 @@ establishment. ### Prologue / Epilogue -P1 v2 has a single frame-establishment op, `ENTER size`. Frame teardown is +P1 has a single frame-establishment op, `ENTER size`. Frame teardown is not a standalone op; it is embedded in `ERET`, `TAIL`, and `TAILR`. `ENTER size` establishes a standard frame with `size` bytes of frame-local @@ -344,7 +344,7 @@ by storing it in frame-local storage within its standard frame. ### Branching -P1 v2 branch targets are carried through the hidden branch-target mechanism +P1 branch targets are carried through the hidden branch-target mechanism `br`. Portable source may load `br` only through: - `LA_BR %label` — materialize the address of `%label` as the next branch, call, @@ -377,7 +377,7 @@ instruction. ### Arithmetic -P1 v2 defines the following arithmetic and bitwise operations on one-word +P1 defines the following arithmetic and bitwise operations on one-word values: - register-register: `ADD`, `SUB`, `AND`, `OR`, `XOR`, `SHL`, `SHR`, `SAR`, @@ -391,10 +391,10 @@ active word size. zero-fills. `SAR` is an arithmetic right shift and sign-fills. For register-count shifts, only the low `5` bits of the shift count are -observed in `P1v2-32`, and only the low `6` bits are observed in `P1v2-64`. +observed in `P1-32`, and only the low `6` bits are observed in `P1-64`. -Immediate-form shifts use inline immediates in the range `0..31` in `P1v2-32` -and `0..63` in `P1v2-64`. +Immediate-form shifts use inline immediates in the range `0..31` in `P1-32` +and `0..63` in `P1-64`. `DIV` is signed division on one-word two's-complement values and truncates toward zero. `REM` is the corresponding signed remainder. @@ -405,7 +405,7 @@ remainder case. ### Moves -P1 v2 defines the following move and materialization operations: +P1 defines the following move and materialization operations: - `MOV` — register-to-register copy - `LI` — load one-word integer constant @@ -426,14 +426,14 @@ part of the general move family. ### Memory -P1 v2 defines the following memory-access operations: +P1 defines the following memory-access operations: - `LD`, `ST` — one-word load and store - `LB`, `SB` — byte load and store - `LDARG` — one-word load from the incoming stack-argument area -`LD` and `ST` access one full word: 4 bytes in `P1v2-32` and 8 bytes in -`P1v2-64`. +`LD` and `ST` access one full word: 4 bytes in `P1-32` and 8 bytes in +`P1-64`. `LB` loads one byte and zero-extends it to a full word. `SB` stores the low 8 bits of the source value. @@ -458,7 +458,7 @@ requirement. ## Program Entry -P1 v2 defines a portable program-entry model so that portable source +P1 defines a portable program-entry model so that portable source does not need to know how the native loader delivers `argc` / `argv`. The target backend is responsible for emitting a per-arch `_start` @@ -505,7 +505,7 @@ registers are preserved across the syscall. The mapping from symbolic syscall names to numeric syscall identifiers is target-defined. The set of syscalls available to a given program is likewise -specified outside the core P1 v2 ISA, for example by a target profile or +specified outside the core P1 ISA, for example by a target profile or runtime interface document. ## Target notes @@ -524,5 +524,5 @@ runtime interface document. conventions; backends may preserve P1 caller-saved registers that happen to land in natively callee-saved native registers as a matter of backend policy. -- Frame-pointer use is backend policy, not part of the P1 v2 architectural +- Frame-pointer use is backend policy, not part of the P1 architectural register set. diff --git a/scripts/build-p1.sh b/scripts/build-p1.sh @@ -1,8 +1,8 @@ #!/bin/sh -## build-p1.sh — assemble a P1v2 source (.P1 or .M1) into a runnable ELF. +## build-p1.sh — assemble a P1 source (.P1 or .M1) into a runnable ELF. ## ## Pipeline: -## 1. lint — assert every P1v2 op token in <src> is defined +## 1. lint — assert every P1 op token in <src> is defined ## 2. prune — strip DEFINEs the source doesn't reference ## 3. cat — pruned defs ++ <src> -> combined.M1 ## 4. M1 — combined.M1 -> .hex2 @@ -41,7 +41,7 @@ case "$ARCH" in *) echo "build-p1.sh: unsupported arch '$ARCH'" >&2; exit 1 ;; esac -P1_DEFS=build/p1v2/$ARCH/p1_$ARCH.M1 +P1_DEFS=build/p1/$ARCH/p1_$ARCH.M1 ELF_HDR=vendor/seed/$ARCH/ELF.hex2 BASE_ADDR=0x600000 ## must match the load address encoded in $ELF_HDR TOOLS=build/$ARCH/tools ## bootstrap M0/hex2-0/catm (when M1PP_BOOTSTRAP_TOOLS=1) diff --git a/scripts/run-tests.sh b/scripts/run-tests.sh @@ -8,16 +8,17 @@ ## (parked, ad-hoc debugging). ## ## Suites: -## m1pp tests/M1pp/<name>.M1 — P1v2 program built via build-p1.sh, -## run in container, stdout diffed. -## tests/M1pp/<name>.M1pp — m1pp expander parity test: m1pp -## binary (built once) consumes the -## fixture and writes <out>; diffed. -## aarch64 only. +## m1pp tests/M1pp/<name>.M1 — P1 program built via build-p1.sh +## for each requested arch, run in +## container, stdout diffed. +## tests/M1pp/<name>.M1pp — m1pp expander parity test: per-arch +## m1pp binary consumes the fixture +## and writes <out>; diffed. ## p1 tests/P1/<name>.P1pp — P1pp program built via build-p1pp.sh ## for each requested arch, run in -## container, stdout diffed. Default: -## all three arches. +## container, stdout diffed. +## +## All three arches by default; --arch restricts to one. ## ## Usage: scripts/run-tests.sh --suite <m1pp|p1> [--arch ARCH] [name ...] @@ -98,7 +99,7 @@ m1pp_build_expander() { arch=$1 bin=build/$arch/m1pp src=M1pp/M1pp.P1 - defs=build/p1v2/$arch/p1_$arch.M1 + defs=build/p1/$arch/p1_$arch.M1 if [ -x "$bin" ] && [ "$bin" -nt "$src" ] && [ "$bin" -nt "$defs" ]; then return 0 fi diff --git a/tests/M1pp/00-hello.M1 b/tests/M1pp/00-hello.M1 @@ -1,10 +1,10 @@ -## P1v2 hello-world smoke fixture. +## P1 hello-world smoke fixture. ## ## Exercises the build pipeline (lint -> prune -> catm -> M0 -> ELF link -> -## hex2-0) against build/p1v2/aarch64/p1_aarch64.M1. Standalone program — +## hex2-0) against build/p1/aarch64/p1_aarch64.M1. Standalone program — ## does not drive the m1pp expander. ## -## P1v2 syscall ABI: +## P1 syscall ABI: ## a0 = syscall number on entry, return value on exit ## a1, a2, a3, t0, s0, s1 = syscall arguments 0..5