|
26 | 26 | * @brief Universal Bootloader Return Type (GAP-06) |
27 | 27 | * Uses high-hamming-distance constants to prevent 0x00 / 0x01 glitching. |
28 | 28 | */ |
29 | | -#define TOOB_HAL_ABI_V2 0x02000000 |
30 | | - |
31 | 29 | typedef enum { |
32 | 30 | BOOT_OK = 0x55AA55AA, /**< Clean success (AUTOSAR Anti-Glitch) */ |
33 | 31 |
|
34 | 32 | /* HAL Errors (from hals.md) */ |
35 | | - BOOT_ERR_FLASH = 1, /**< Flash-Operation fehlgeschlagen */ |
36 | | - BOOT_ERR_FLASH_ALIGN = 2, /**< Adresse/Länge nicht aligned */ |
37 | | - BOOT_ERR_FLASH_BOUNDS = 3, /**< Adresse außerhalb des Flashs */ |
38 | | - BOOT_ERR_CRYPTO = 4, /**< Kryptografische Operation fehlgeschlagen */ |
39 | | - BOOT_ERR_VERIFY = 5, /**< Signatur/Hash ungültig */ |
40 | | - BOOT_ERR_TIMEOUT = 6, /**< Operation hat Zeitlimit überschritten */ |
41 | | - BOOT_ERR_POWER = 7, /**< Batteriespannung zu niedrig */ |
42 | | - BOOT_ERR_NOT_SUPPORTED = 8, /**< Feature auf diesem Chip nicht verfügbar */ |
43 | | - BOOT_ERR_INVALID_ARG = 9, /**< Ungültiger Parameter (NULL, 0-Länge, etc.) */ |
44 | | - BOOT_ERR_STATE = 10, /**< Ungültiger Zustand (z.B. init nicht aufgerufen) */ |
45 | | - BOOT_ERR_FLASH_NOT_ERASED = 11, /**< Zielsektor wurde vor Write nicht gelöscht */ |
46 | | - BOOT_ERR_COUNTER_EXHAUSTED = 12, /**< OTP/eFuse Counter am Limit */ |
47 | | - BOOT_ERR_ECC_HARDFAULT = 13, /**< FATAL: NMI Unkorrigierbarer Bit-Rot (hals.md Z.47) */ |
| 33 | + BOOT_ERR_FLASH = 0xE1A1A1A1, /**< Flash-Operation fehlgeschlagen */ |
| 34 | + BOOT_ERR_FLASH_ALIGN = 0xE2B2B2B2, /**< Adresse/Länge nicht aligned */ |
| 35 | + BOOT_ERR_FLASH_BOUNDS = 0xE3C3C3C3, /**< Adresse außerhalb des Flashs */ |
| 36 | + BOOT_ERR_CRYPTO = 0xE4D4D4D4, /**< Kryptografische Operation fehlgeschlagen */ |
| 37 | + BOOT_ERR_VERIFY = 0xE5E5E5E5, /**< Signatur/Hash ungültig */ |
| 38 | + BOOT_ERR_TIMEOUT = 0xE6F6F6F6, /**< Operation hat Zeitlimit überschritten */ |
| 39 | + BOOT_ERR_POWER = 0xE7171717, /**< Batteriespannung zu niedrig */ |
| 40 | + BOOT_ERR_NOT_SUPPORTED = 0xE8282828, /**< Feature auf diesem Chip nicht verfügbar */ |
| 41 | + BOOT_ERR_INVALID_ARG = 0xE9393939, /**< Ungültiger Parameter (NULL, 0-Länge, etc.) */ |
| 42 | + BOOT_ERR_STATE = 0xEA4A4A4A, /**< Ungültiger Zustand (z.B. init nicht aufgerufen) */ |
| 43 | + BOOT_ERR_FLASH_NOT_ERASED = 0xEB5B5B5B, /**< Zielsektor wurde vor Write nicht gelöscht */ |
| 44 | + BOOT_ERR_COUNTER_EXHAUSTED = 0xEC6C6C6C, /**< OTP/eFuse Counter am Limit */ |
| 45 | + BOOT_ERR_ECC_HARDFAULT = 0xED7D7D7D, /**< FATAL: NMI Unkorrigierbarer Bit-Rot (hals.md Z.47) */ |
48 | 46 |
|
49 | 47 | /* Core State-Machine Errors */ |
50 | | - BOOT_ERR_NOT_FOUND = 14, /**< Erwartetes Image/Metadata nicht gefunden */ |
51 | | - BOOT_ERR_WDT_TRIGGER = 15, /**< Watchdog Timeout simuliert/registriert */ |
52 | | - BOOT_ERR_INVALID_STATE = 16, /**< State-Machine Fehler (z.B. Delta base_mismatch) */ |
53 | | - BOOT_ERR_WAL_FULL = 17, /**< Journal Ring blockiert/voll */ |
54 | | - BOOT_ERR_WAL_LOCKED = 18, /**< Transaktion über WAL-Grenzen verboten */ |
55 | | - BOOT_RECOVERY_REQUESTED = 19, /**< Manueller/Hardware-Ausgelöster Fallback auf Serial Rescue */ |
56 | | - BOOT_ERR_ABI_MISMATCH = 20, /**< HAL ABI-Version eines Structs ist zu alt/inkompatibel */ |
57 | | - BOOT_ERR_DOWNGRADE = 21 /**< Hybrid SVN Check fehlgeschlagen (Anti-Rollback) */ |
| 48 | + BOOT_ERR_NOT_FOUND = 0xF1818181, /**< Erwartetes Image/Metadata nicht gefunden */ |
| 49 | + BOOT_ERR_WDT_TRIGGER = 0xF2929292, /**< Watchdog Timeout simuliert/registriert */ |
| 50 | + BOOT_ERR_INVALID_STATE = 0xF3A3A3A3, /**< State-Machine Fehler (z.B. Delta base_mismatch) */ |
| 51 | + BOOT_ERR_WAL_FULL = 0xF4B4B4B4, /**< Journal Ring blockiert/voll */ |
| 52 | + BOOT_ERR_WAL_LOCKED = 0xF5C5C5C5, /**< Transaktion über WAL-Grenzen verboten */ |
| 53 | + BOOT_RECOVERY_REQUESTED = 0xF6D6D6D6, /**< Manueller/Hardware-Ausgelöster Fallback auf Serial Rescue */ |
| 54 | + BOOT_ERR_ABI_MISMATCH = 0xF7E7E7E7, /**< HAL ABI-Version eines Structs ist zu alt/inkompatibel */ |
| 55 | + BOOT_ERR_DOWNGRADE = 0xF8F8F8F8 /**< Hybrid SVN Check fehlgeschlagen (Anti-Rollback) */ |
58 | 56 | } boot_status_t; |
59 | 57 |
|
60 | 58 | /* --- 2. Hardware Reset Reasons --- */ |
@@ -90,84 +88,24 @@ typedef struct { |
90 | 88 | uint32_t magic; /**< TOOB_MAGIC_HEADER für S0 Validierung */ |
91 | 89 | uint32_t image_size; /**< Gesamte Payload-Größe für XIP Bounds */ |
92 | 90 | uint32_t entry_point; /**< XIP Entry-Vector Offset */ |
93 | | - uint32_t base_fingerprint; /**< 4-Byte SHA256-Hash Prefix für Delta-Bases */ |
| 91 | + uint8_t base_fingerprint[8]; /**< 8-Byte SHA256-Hash Prefix für Delta-Bases (gemäß CDDL) */ |
94 | 92 | } toob_image_header_t; |
95 | 93 |
|
96 | | -/* --- 4. OS-Boundary Structures (libtoob ABI) --- */ |
97 | | - |
98 | | -/** \def TOOB_STATE_TENTATIVE Boot-Zustand des unbestätigten Trial-Boots */ |
99 | | -#define TOOB_STATE_TENTATIVE 0xAAAA5555 |
100 | | - |
101 | | -/** \def TOOB_STATE_COMMITTED Boot-Zustand des gesichterten, bestätigten Boots |
102 | | - */ |
103 | | -#define TOOB_STATE_COMMITTED 0x55AA55AA |
104 | | - |
105 | | -/** |
106 | | - * @brief Shared Memory Struct (.noinit) für Handoff zwischen Bootloader und OS. |
107 | | - * GAP-11: Struct Versioning |
108 | | - * GAP-39: Explizites 8-Byte Alignment zwingend für 64-bit Kernel |
109 | | - * Kompatibilität. |
110 | | - */ |
111 | | -typedef struct __attribute__((aligned(8))) { |
112 | | - uint32_t magic; /**< Always 0x55AA55AA */ |
113 | | - uint32_t struct_version; /**< ABI-Version (z.B. 0x01000000) */ |
114 | | - uint64_t boot_nonce; /**< Deterministische Anti-Replay Nonce für Verify-Call */ |
115 | | - uint32_t active_slot; /**< 0 = Slot A, 1 = Slot B */ |
116 | | - uint32_t reset_reason; /**< Gemappter Grund aus reset_reason_t */ |
117 | | - uint32_t boot_failure_count; /**< Aktueller Stand des Recovery-Counters */ |
118 | | - |
119 | | - /* Wear-Counters (vorab allokiert um Segfaults auf alten Images zu verhindern) */ |
120 | | - uint32_t ext_health_app_erasures; /**< Flash-Erasures auf der App-Partition */ |
121 | | - uint32_t ext_health_staging_erasures; /**< Verschleiß des Staging-Bereichs */ |
122 | | - uint32_t ext_health_wal_erasures; /**< Verschleiß des Ringpuffers */ |
123 | | - uint32_t ext_health_swap_erasures; /**< Verschleiß der Swap-Sektoren */ |
124 | | - |
125 | | - /* Session & Integrity (GAP-F14 / Schicht 4b) */ |
126 | | - uint32_t boot_session_id; /**< Boot-Session Vektor für OS-Tracking */ |
127 | | - uint32_t crc32_trailer; /**< CRC-32 Validierung gegen Handoff-RAM Garbage nach WDT-Resets */ |
128 | | - uint8_t _padding[4]; /**< Padding für striktes 56-Byte Alignment (NASA P10 GAP-39) */ |
129 | | -} toob_handoff_t; |
| 94 | +_Static_assert(sizeof(toob_image_header_t) == 20, "toob_image_header_t ABI Size Mismatch!"); |
130 | 95 |
|
131 | | -/* P10 Size-Safety Asserts auf Handoff-ABI - Bricht bei inkompatiblen |
132 | | - * Compiler-Packs */ |
133 | | -_Static_assert(sizeof(toob_handoff_t) == 56, |
134 | | - "toob_handoff_t ABI Size Mismatch!"); |
135 | | -_Static_assert(sizeof(toob_handoff_t) % 8 == 0, |
136 | | - "toob_handoff_t Alignment Failure!"); |
137 | | - |
138 | | -/** |
139 | | - * @brief Telemetrie & Boot-Diagnostics (gem. toob_telemetry.md) |
140 | | - * Bildet exakt die 8 CBOR-Felder ab. Wird via libtoob in das OS |
141 | | - * projiziert (Zero-Allocation). |
142 | | - */ |
143 | | -typedef struct { |
144 | | - uint32_t boot_duration_ms; /**< Dauer des letzten Bootvorgangs */ |
145 | | - uint32_t edge_recovery_events; /**< Anzahl an Auto-Rollbacks */ |
146 | | - uint32_t hardware_fault_record; /**< Hard-Fault Register/Flags */ |
147 | | - uint32_t vendor_error; /**< HAL spezifischer Error Code */ |
148 | | - uint32_t wdt_kicks; /**< Summe der generierten Watchdog-Kicks */ |
149 | | - uint32_t current_svn; /**< Doublecheck Fix: SVN an das OS weiterleiten */ |
150 | | - uint8_t active_key_index; /**< Genutzter eFuse Key-Slot */ |
151 | | - bool fallback_occurred; /**< Wahrheitswert für OS-Panic Auslösung */ |
152 | | - uint8_t schema_version; /**< CDDL Review Fix: Broker Abwärtskompatibilität */ |
153 | | - uint8_t sbom_digest[32]; /**< SHA-256 Digest des aktiven OS-Images */ |
154 | | - uint8_t _padding[5]; /**< P10 Alignment für den 64-Bit Frame (59 active bytes) */ |
155 | | -} toob_boot_diag_t; |
156 | | - |
157 | | -/* --- 5. P10 Defense Macros --- */ |
| 96 | +/* --- 4. OS-Boundary Structures (libtoob ABI) --- */ |
158 | 97 |
|
159 | | -/** |
160 | | - * @brief Bounded-Loop Assert. |
161 | | - * Beendet bei Ausbruch aus definierten O(1)/O(n) State-Limits sofort mit |
162 | | - * SystemReset. |
163 | | - */ |
164 | | -#define P10_ASSERT(condition) \ |
165 | | - do { \ |
166 | | - if (!(condition)) { \ |
167 | | - /* In Produktion zwingend ein WDT-Reset via Endlos-Loop oder Panic */ \ |
168 | | - while (1) { \ |
169 | | - } \ |
170 | | - } \ |
171 | | - } while (0) |
| 98 | +/* Integriert die externe OS-Boundary, um struct-Redundanzen und ABI-Verletzungen zu eliminieren. */ |
| 99 | +#include "libtoob_types.h" |
| 100 | + |
| 101 | +/* P10 Zero-Dependency Sicherung: Zentraler Translation-Layer Check gegen ABI-Drift der Boundaries */ |
| 102 | +_Static_assert((uint32_t)BOOT_OK == (uint32_t)TOOB_OK, "BOOT_OK and TOOB_OK must share value"); |
| 103 | +_Static_assert((int)RESET_REASON_UNKNOWN == (int)TOOB_RESET_UNKNOWN, "ABI Drift: Unknown Reason"); |
| 104 | +_Static_assert((int)RESET_REASON_POWER_ON == (int)TOOB_RESET_POWER_ON, "ABI Drift: Power On Reason"); |
| 105 | +_Static_assert((int)RESET_REASON_PIN_RESET == (int)TOOB_RESET_PIN, "ABI Drift: Pin Reset Reason"); |
| 106 | +_Static_assert((int)RESET_REASON_WATCHDOG == (int)TOOB_RESET_WATCHDOG, "ABI Drift: Watchdog Reason"); |
| 107 | +_Static_assert((int)RESET_REASON_BROWNOUT == (int)TOOB_RESET_BROWNOUT, "ABI Drift: Brownout Reason"); |
| 108 | +_Static_assert((int)RESET_REASON_SOFTWARE == (int)TOOB_RESET_SOFTWARE, "ABI Drift: Software Reason"); |
| 109 | +_Static_assert((int)RESET_REASON_HARD_FAULT == (int)TOOB_RESET_HARD_FAULT, "ABI Drift: Hard Fault Reason"); |
172 | 110 |
|
173 | 111 | #endif /* TOOB_BOOT_TYPES_H */ |
0 commit comments