uefi.h: the UEFI device path and Block I/O protocols, a typed LocateDevicePath, and BootDisk
{gpt, is_stick, disk_guid[16]} appended to BootInfo after args (boot_info_offsets.h unchanged).
The loader, before ExitBootServices, cuts its image's device path at the partition's HardDrive
node, locates the whole disk's Block I/O (whole path consumed, not a logical partition, 512-byte
blocks), reads it as 1 KiB blocks through a loader-side blkio adapter, and runs the kernel's own
gpt_read: is it a StarshipOS stick (identity and Artemis partitions), and its DiskGUID
(gpt_disk_guid, new). No HardDrive node (an ISO/CD boot), no GPT, or any failure: not a stick.
Monolithic builds only (the non-monolithic loader does not link gpt.c, and does not build today:
kernel/src/vm/vm_core.c -- reported, not fixed).
The kernel prints 'Boot disk: a StarshipOS stick' or '... not a StarshipOS stick', and on a stick
system=v3 gives 'System: v3 is not on this stick -- StarForth v4' and boots v4.
Tests: stick_v3 (new), stick_boot and zuse x3 failed on the new lines before, pass after; v3_keys
still boots v3 off a stick. Acceptance: amd64, aarch64, riscv64 to [zuse@Hera] ok>, POST 538/538,
dict_hash 0xfec8c47cfc6f437f; v4 suite and test-32 0 failures.
Plan: docs/v4.0.0/plans/2026-10-27-stick-4-one-disk.md, Task 3.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
56 lines
2.3 KiB
C
56 lines
2.3 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 -- no protective MBR -- (or one whose sectors are not 512 bytes): read it raw */
|
|
#define GPT_BAD 2 /* a protective MBR, but its header or entry array does not check out: not used */
|
|
#define GPT_EIO 3 /* its first block could not be read: 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 DiskGUID (header bytes 56..71, as on disk) of the last gpt_read that
|
|
* returned GPT_OK: which disk it was, so a stick can be told from another. */
|
|
void gpt_disk_guid(uint8_t guid[16]);
|
|
|
|
/* 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 */
|