Files
LithosAnanake/kernel/include/starkernel/gpt.h
T
rajamesandClaude Opus 5.5 3cc4937c93 feat(kernel): the GPT reader, and Zuse from a GPT identity partition
The stick, increment 2 (plan 2026-10-26-stick-2-gpt-reader; docs/v4.0.0/
STICK.md 3 and 4: GPT for boot media and installed disks). kernel/src/gpt.c:
a CRC-32; gpt_read(), which checks the protective MBR, the primary header and
the partition-entry array (both CRCs, the revision, the sizes, the geometry);
and a partition as a blkio device, refusing blocks past its end. The two
StarshipOS partition types: identity 23BEBFE1-4817-4CF3-A537-9069BF159788,
Artemis BCD7B586-1C8E-4EEF-86A3-273A8D8EE624.

The v4 drive path: a GPT disk is used only through its StarshipOS identity
partition, and that partition -- never the disk -- is given to the block
subsystem, in a raw identity drive's place; a GPT disk with no StarshipOS
partition, or a damaged table ("GPT: a USB drive has a damaged partition
table -- not used"), is not attached (Captain Bob's ruling on the plan); a
disk with no GPT is read raw, as always. Pulling the drive detaches the
partition and ends her session. Reads only.

Red (amd64): gpt_zuse 193158, gpt_hotplug 193804, gpt_foreign 194713,
gpt_bad_crc 194947. Green: 195409, 195627, 195854, 200136; gpt_zuse aarch64
200424, riscv64 200839 (the 64 MiB partition attached, 48724 user blocks,
not the 72 MiB disk); the identity gate's and increment 1's sessions,
201119-203403, all pass.
Accepted (with the KERNEL_ARGS fix that follows): suite EXIT 0; 214300,
214507, 214911, POST 538/538, dict_hash 0xfec8c47cfc6f437f; test-32, 39
modules, 0 failures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 21:56:31 -04:00

51 lines
2.0 KiB
C

/* gpt.h -- the GPT reader, and a block device of one partition.
* docs/v4.0.0/STICK.md 3 and 4; docs/v4.0.0/plans/2026-10-26-stick-2-gpt-reader.md.
*/
#ifndef STARKERNEL_GPT_H
#define STARKERNEL_GPT_H
#include <stdint.h>
#include <stddef.h>
#include "blkio.h"
/* The two StarshipOS partition types, as their GUIDs are on disk. */
extern const uint8_t gpt_type_starship_identity[16]; /* 23BEBFE1-4817-4CF3-A537-9069BF159788 */
extern const uint8_t gpt_type_starship_artemis[16]; /* BCD7B586-1C8E-4EEF-86A3-273A8D8EE624 */
typedef struct {
uint8_t type[16];
uint64_t first_lba;
uint64_t last_lba;
} gpt_part_t;
#define GPT_OK 0 /* a valid GPT */
#define GPT_NONE 1 /* not a GPT disk (or one whose sectors are not 512 bytes): read it raw */
#define GPT_BAD 2 /* a GPT, but its header or entry array does not check out: not used */
/* Read `disk`'s protective MBR, primary GPT header and partition-entry array,
* checking both CRC-32s, the revision, the sizes and the geometry. On GPT_OK,
* `*count` partitions with a non-zero type (at most `max`) are in `parts`.
* Reads only. */
int gpt_read(blkio_dev_t *disk, gpt_part_t *parts, unsigned max, unsigned *count);
/* 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]);
/* A partition as a block device: its block n is the disk's block
* first_fblock + n; blocks past fblocks are refused. */
typedef struct {
blkio_dev_t *disk;
uint32_t first_fblock;
uint32_t fblocks;
} gpt_part_dev_t;
/* Open `dev` as partition `p` of `disk`, its state in `st` (which must live
* as long as `dev`). BLKIO_EINVAL for a partition that does not start and end
* on a 1 KiB block, or that runs past the disk. */
int gpt_part_open(blkio_dev_t *dev, gpt_part_dev_t *st, blkio_dev_t *disk, const gpt_part_t *p);
/* CRC-32 (IEEE 802.3, reflected, polynomial 0xEDB88320), as GPT uses. */
uint32_t gpt_crc32(const void *buf, size_t len);
#endif /* STARKERNEL_GPT_H */