wip(kernel): Artemis grows to fill the stick at its first boot -- metadata only, capped at 256 GiB (#92, Task 2) [skip ci]

Not yet accepted (plan 2026-10-29-stick-5, Task 2, step 3).
- gpt.c: the writer, gpt_grow_last() -- the backup entry array and header to
  the disk's end, the last partition to the last usable sector (whole MiB,
  capped), both headers' CRCs, the backup before the primary, the
  protective MBR's size; gpt_alternate_lba().
- sk_v4_grow.c: the volume grown to its partition -- its fence (the Artemis
  signature, Zuse's genesis marker) moved to the new top, the header last;
  the partition grown no further than the BAM tracks (the block subsystem
  places the fence by the device's size, so a volume must fill it).
- sk_v4_identity.c: a stick of 8 GB or more whose GPT ends short of the disk
  is grown before its partitions are opened; "Artemis: grown to fill the
  stick" / "under 8 GB -- not grown" / "past 256 GiB ... left unused".
- block_subsystem: blk_volume_compute_totals() (compute_totals_from_B,
  public) and blk_subsys_set_format_bam_for(); v3's behaviour unchanged.
- mkartemis --bam-for, mkdiskimage.sh --bam-for, kernel/Makefile
  STICK_GROW_MIN_BYTES / STICK_ARTEMIS_CAP_GIB: the stick's and data stick's
  Artemis BAM sized for 256 GiB (6144 devblocks). STICK.md 5a: 256 GiB (R1).

After: stick_grow PASS (16 GiB: 12129370 user blocks, 8 s POST to prompt;
second boot not grown, recognised; sfdisk --verify: no errors), stick_small
PASS, check_images.sh PASS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
This commit is contained in:
Claude
2026-11-08 12:03:46 +00:00
parent 4e935e4825
commit 5bb247d678
17 changed files with 889 additions and 22 deletions
+16
View File
@@ -33,6 +33,22 @@ int gpt_read(blkio_dev_t *disk, gpt_part_t *parts, unsigned max, unsigned *count
* returned GPT_OK: which disk it was, so a stick can be told from another. */
void gpt_disk_guid(uint8_t guid[16]);
/* The backup header's LBA (header bytes 32..39) of the last gpt_read that
* returned GPT_OK: a disk whose backup header is not its last sector is larger
* than the table written to it. */
uint64_t gpt_alternate_lba(void);
/* Grow the partition of `type` -- which must be the disk's last -- to the end
* of `disk` (plan 2026-10-29-stick-5, Task 2): the backup entry array and
* header moved to the disk's last sectors, the partition's last LBA to the
* last usable sector before them (on a whole MiB, at most `max_part_sectors`
* long), both headers rewritten with their CRCs -- the backup first, so a
* write torn between them leaves the old primary valid -- and the protective
* MBR's size. GPT_OK with `*new_last_lba` the partition's last LBA (unchanged,
* and nothing written, when the backup header is already the disk's last
* sector); GPT_BAD or GPT_EIO otherwise. */
int gpt_grow_last(blkio_dev_t *disk, const uint8_t type[16], uint64_t max_part_sectors, uint64_t *new_last_lba);
/* The index of the first partition of `type`, or -1. */
int gpt_find(const gpt_part_t *parts, unsigned count, const uint8_t type[16]);
+23
View File
@@ -0,0 +1,23 @@
/* sk_v4_grow.h -- Artemis grows to fill the stick at its first boot
* (docs/v4.0.0/STICK.md 5a; plan 2026-10-29-stick-5, Task 2).
*
* Built only with STARFORTH_V4=1 (Kconfig.kernel).
*/
#ifndef STARKERNEL_V4_SK_V4_GROW_H
#define STARKERNEL_V4_SK_V4_GROW_H
#include <stdint.h>
#include "blkio.h"
/* How far the Artemis partition `art` may grow, in 512-byte sectors: no
* further than `cap_sectors`, nor than its volume's BAM can track. 0 when
* `art` holds no STFR v2 volume. Reads only. */
uint64_t sk_v4_grow_cap_sectors(blkio_dev_t *art, uint64_t cap_sectors);
/* Grow the volume on `art` to fill its partition: its fence (the Artemis
* signature, Zuse's genesis marker) moved to the new top, then its header.
* Metadata only. 1 when grown, 0 when it already fills the partition, -1 on
* an error -- the old header then still names the old volume, whole. */
int sk_v4_grow_artemis(blkio_dev_t *art);
#endif /* STARKERNEL_V4_SK_V4_GROW_H */