/* SPDX-License-Identifier: LicenseRef-Starship-1.0 * Copyright (c) 2023-2026 Robert A. James */ /* test_sk_v4_slots.c -- kernel/src/v4/sk_v4_slots.c on the host (#178): a controller's drive slots * are allocated once and never replaced, so the pointers the identity code keeps into them (the * offered stick, the spare, Zuse's device) stay good. kmalloc_aligned is faked. */ #define _POSIX_C_SOURCE 200809L #include "harness.h" #include "starkernel/v4/sk_v4_slots.h" #include #include static unsigned allocs; void *kmalloc_aligned(size_t size, size_t align) { void *p = 0; allocs++; return posix_memalign(&p, align, size) ? 0 : p; } typedef struct { int attached; char name[16]; } drive; /* a slot, as sk_v4_drive_t is to the identity code */ int main(void) { void *slots = 0; uint32_t count = 0, n; drive *d, *held; n = sk_v4_slots_get(&slots, &count, 9u, sizeof(drive)); d = (drive *)slots; CHECK(n == 9u && d && allocs == 1u && d[3].attached == 0, "first: 9 zeroed slots, one allocation (n %u)", n); d[3].attached = 1; strcpy(d[3].name, "Zuse"); held = &d[3]; /* as g_zuse_dev, g_offered, g_spare hold one */ n = sk_v4_slots_get(&slots, &count, 9u, sizeof(drive)); CHECK(slots == (void *)d && n == 9u && allocs == 1u, "again, the same size: the same array, no allocation"); n = sk_v4_slots_get(&slots, &count, 17u, sizeof(drive)); CHECK(slots == (void *)d && allocs == 1u, "#178: asked for more: the same array, not replaced (allocations %u)", allocs); CHECK(n == 9u, "#178: and only the 9 slots it has may be used, not 17 (n %u)", n); CHECK(held->attached == 1 && strcmp(held->name, "Zuse") == 0 && held == &((drive *)slots)[3], "#178: a pointer held into a slot is still the slot, with the drive in it"); { void *none = 0; uint32_t c = 0; unsigned before = allocs; CHECK(sk_v4_slots_get(&none, &c, 0u, sizeof(drive)) == 0u && none == 0 && allocs == before, "0 slots wanted: none to use, nothing allocated"); } return DONE(); }