Files
LithosAnanke/kernel/src/homeblocks_sig.c
T
Claude 16b9747d33 chore(license): the source headers name the Starship License 1.0 (SL-1.0), as LICENSE does [skip ci]
347 headers said "Licensed under the StarForth License, Version 1.0" -- a
shortening (Captain Bob, 2026-11-08: "License file SL I think I shortened
accidently"); LICENSE is, and has been since the first commit, the
Starship License 1.0 (SL-1.0, SPDX LicenseRef-Starship-1.0). 349 files,
566 occurrences, now "Starship License, Version 1.0 (SL-1.0)".

Left as they are, pending a ruling: docs/patent/ (the patent figures),
docs/formal/ (the citable volumes) and the generated reports under
docs/working/experiments/ (32 files). Comments and license text only:
the amd64 kernel builds, every changed script parses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
2026-11-08 17:54:24 +00:00

88 lines
3.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
StarForth — Steady-State Virtual Machine Runtime
Copyright (c) 2023–2025 Robert A. James
All rights reserved.
This file is part of the StarForth project.
Licensed under the Starship License, Version 1.0 (SL-1.0) (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at:
https://github.com/star.4th@proton.me/StarForth/LICENSE.txt
This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
express or implied, including but not limited to the warranties of
merchantability, fitness for a particular purpose, and noninfringement.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* homeblocks_sig.c - Drive signature check (FABRIC-2.md, Milestone 4).
* See starkernel/homeblocks_sig.h for the format and interface design.
*/
#include "starkernel/homeblocks_sig.h"
#include <stddef.h>
#include <string.h>
#include "blkio.h"
#include "block_subsystem.h" /* compute_crc64() -- same CRC-64/ISO this file's
* check reuses rather than duplicating */
uint64_t homeblocks_sig_compute_crc(const homeblocks_sig_t *sig) {
/* Covers every field up to but not including hdr_crc itself (and never
* _pad, which sits after it) -- offsetof is the exact boundary, not a
* hand-counted byte offset that could drift out of sync with the
* struct's own field list. */
size_t crc_span = offsetof(homeblocks_sig_t, hdr_crc);
return compute_crc64((const uint8_t *)sig, crc_span);
}
homeblocks_sig_result_t homeblocks_sig_check(struct blkio_dev *dev,
uint32_t sig_start_fblock,
homeblocks_sig_t *out_sig) {
uint8_t buf[4096];
uint32_t i;
homeblocks_sig_t local;
uint64_t expected_crc;
if (!dev) return HOMEBLOCKS_SIG_READ_ERROR;
/* homeblocks_sig_t is exactly one 4KiB devblock; blkio's own unit is a
* 1KiB "forth block" (BLKIO_FORTH_BLOCK_SIZE), so the header spans 4
* consecutive reads starting at sig_start_fblock. */
for (i = 0; i < 4; i++) {
if (blkio_read((blkio_dev_t *)dev, sig_start_fblock + i,
buf + (size_t)i * BLKIO_FORTH_BLOCK_SIZE) != BLKIO_OK) {
return HOMEBLOCKS_SIG_READ_ERROR;
}
}
/* Copy into a properly-aligned local rather than reinterpreting buf's
* address directly -- buf is only byte-aligned, and homeblocks_sig_t
* has uint64_t members; a raw cast would be a strict-aliasing and
* alignment violation for no benefit over one memcpy. */
memcpy(&local, buf, sizeof(local));
if (HOMEBLOCKS_SIG_GET_MAGIC(local.magic) != (uint32_t)(HOMEBLOCKS_SIG_MAGIC & 0xFFFFFFFFULL)) {
return HOMEBLOCKS_SIG_BLANK;
}
if (HOMEBLOCKS_SIG_GET_VERSION(local.magic) != HOMEBLOCKS_SIG_VERSION_0) {
return HOMEBLOCKS_SIG_BAD_VERSION;
}
expected_crc = homeblocks_sig_compute_crc(&local);
if (expected_crc != local.hdr_crc) {
return HOMEBLOCKS_SIG_BAD_CRC;
}
if (out_sig) *out_sig = local;
return HOMEBLOCKS_SIG_OK;
}