Foundry/tt/tests/ft_tt_relaunch_gate.c

87 lines
3.5 KiB
C

/* SPDX-License-Identifier: AGPL-3.0-or-later */
/* Copyright (C) 2026 David (Corey) Herrera */
/**
* @file ft_tt_relaunch_gate.c
* @brief Implementation of the re-launch probe verdict. Pure arithmetic over a record of
* observations; it opens nothing and reads nothing.
*
* @status Complete. Gated off-hardware by tests/test_relaunch_gate.c, one mutation per
* ground.
* @issues None
* @todo None
*/
#include "ft_tt_relaunch_gate.h"
static bool block_index_is_legal(uint32_t index)
{
return index == FT_TT_RELAUNCH_BLOCK_A || index == FT_TT_RELAUNCH_BLOCK_B;
}
ft_tt_relaunch_outcome ft_tt_relaunch_gate_judge(const ft_tt_relaunch_evidence *evidence)
{
if (evidence == NULL)
return FT_TT_RELAUNCH_INVALID_EVIDENCE;
/* Vacuity first, deliberately. A probe that could not have failed must never be
* reported as a pass, whatever else the record says — the experiment this feeds is
* decided by its NEGATIVE result. */
if (!evidence->status_poisoned_before)
return FT_TT_RELAUNCH_VACUOUS_STATUS_NOT_POISONED;
if (!evidence->destination_poisoned_before)
return FT_TT_RELAUNCH_VACUOUS_DESTINATION_NOT_POISONED;
if (!block_index_is_legal(evidence->previous_block_index) ||
!block_index_is_legal(evidence->demanded_block_index))
return FT_TT_RELAUNCH_INVALID_EVIDENCE;
if (evidence->previous_block_index == evidence->demanded_block_index)
return FT_TT_RELAUNCH_VACUOUS_SAME_BLOCK;
if (evidence->launch_rc != 0)
return FT_TT_RELAUNCH_LAUNCH_FAILED;
if (!evidence->every_status_magic_present)
return FT_TT_RELAUNCH_NEVER_RAN;
if (evidence->kernel_error != 0u)
return FT_TT_RELAUNCH_KERNEL_ERROR;
if (!evidence->rounds_complete)
return FT_TT_RELAUNCH_SHORT_RUN;
if (!evidence->payload_matched_demanded)
return FT_TT_RELAUNCH_PAYLOAD_WRONG;
if (!evidence->payload_rejected_other)
return FT_TT_RELAUNCH_PAYLOAD_STALE;
return FT_TT_RELAUNCH_CLEAN;
}
bool ft_tt_relaunch_outcome_is_clean(ft_tt_relaunch_outcome outcome)
{
return outcome == FT_TT_RELAUNCH_CLEAN;
}
const char *ft_tt_relaunch_outcome_text(ft_tt_relaunch_outcome outcome)
{
switch (outcome) {
case FT_TT_RELAUNCH_CLEAN:
return "the still-booted core accepted work and the payload tracked the source";
case FT_TT_RELAUNCH_VACUOUS_STATUS_NOT_POISONED:
return "VACUOUS: the status block was not poisoned, so \"never ran\" reads as DONE";
case FT_TT_RELAUNCH_VACUOUS_DESTINATION_NOT_POISONED:
return "VACUOUS: the destination was not poisoned, so a match may be stale L1";
case FT_TT_RELAUNCH_VACUOUS_SAME_BLOCK:
return "VACUOUS: the probe demanded the block already sitting in the destination";
case FT_TT_RELAUNCH_INVALID_EVIDENCE:
return "the record is malformed; nothing may be concluded from it";
case FT_TT_RELAUNCH_LAUNCH_FAILED:
return "the re-launch failed or timed out on a core that needed no re-boot";
case FT_TT_RELAUNCH_NEVER_RAN:
return "a status block still held the host poison: the kernel never ran";
case FT_TT_RELAUNCH_KERNEL_ERROR:
return "the kernel reported an error at the point of issue";
case FT_TT_RELAUNCH_SHORT_RUN:
return "a core stopped before its last round";
case FT_TT_RELAUNCH_PAYLOAD_WRONG:
return "a destination does not hold the demanded block";
case FT_TT_RELAUNCH_PAYLOAD_STALE:
return "a destination still holds the previous block: nothing landed";
}
return "unknown outcome";
}