/* 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 #include #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 */