ICARUS OS (Intelligent Cooperative Architecture for Real-time Unified Systems) 0.1.0
Preemptive Real-Time Operating System for ARM Cortex-M7
Loading...
Searching...
No Matches
cs.c
Go to the documentation of this file.
1
34#include "icarus/icarus.h"
35#include <string.h>
36
37/* ============================================================================
38 * INTERNAL STATE (DTCM)
39 * ========================================================================= */
40
44typedef struct {
45 const uint8_t *addr;
46 uint32_t size;
47 uint16_t baseline;
48 bool enabled;
51
54
57
60
65#define CS_SELFTEST_EXPECTED 0x29B1u
66
67/* ============================================================================
68 * INTERNAL HELPERS (ITCM)
69 * ========================================================================= */
70
76ITCM_FUNC static bool cs_selftest(void) {
77 static const uint8_t vec[] = { '1','2','3','4','5','6','7','8','9' };
78 uint16_t result = crc16_ccitt(vec, 9);
79 return (result == CS_SELFTEST_EXPECTED);
80}
81
82/* ============================================================================
83 * PRIVILEGED IMPLEMENTATIONS
84 * ========================================================================= */
85
91ITCM_FUNC void __cs_init(void) {
92 (void)memset(regions, 0, sizeof(regions));
93 mismatch_cb = NULL;
95}
96
104
118ITCM_FUNC bool __cs_add_region(uint8_t idx, const uint8_t *addr,
119 uint32_t size) {
120 if ((idx >= (uint8_t)CS_MAX_REGIONS) || (addr == NULL) || (size == 0u)) {
121 return false;
122 }
123
124 regions[idx].addr = addr;
125 regions[idx].size = size;
126 regions[idx].baseline = crc16_ccitt(addr, (uint16_t)size);
127 regions[idx].enabled = true;
128 regions[idx].registered = true;
129 return true;
130}
131
137ITCM_FUNC bool __cs_enable(uint8_t idx, bool enabled) {
138 if ((idx >= (uint8_t)CS_MAX_REGIONS) || (!regions[idx].registered)) {
139 return false;
140 }
141 regions[idx].enabled = enabled;
142 return true;
143}
144
152ITCM_FUNC bool __cs_rebaseline(uint8_t idx) {
153 if ((idx >= (uint8_t)CS_MAX_REGIONS) || (!regions[idx].registered)) {
154 return false;
155 }
156 regions[idx].baseline = crc16_ccitt(regions[idx].addr,
157 (uint16_t)regions[idx].size);
158 return true;
159}
160
173 /* CRC engine self-test failure — report immediately */
174 if (!cs_hw_ok) {
175 if (mismatch_cb != NULL) {
176 mismatch_cb(0xFFu, 0u, 0u);
177 }
178 return 1u;
179 }
180
181 uint8_t failures = 0u;
182 for (uint8_t i = 0u; i < (uint8_t)CS_MAX_REGIONS; i++) {
183 if ((!regions[i].registered) || (!regions[i].enabled)) {
184 continue;
185 }
186
187 uint16_t actual = crc16_ccitt(regions[i].addr,
188 (uint16_t)regions[i].size);
189 if (actual != regions[i].baseline) {
190 failures++;
191 if (mismatch_cb != NULL) {
192 mismatch_cb(i, regions[i].baseline, actual);
193 }
194 }
195 }
196 return failures;
197}
198
204ITCM_FUNC bool __cs_get_region(uint8_t idx, cs_region_t *out) {
205 if ((idx >= (uint8_t)CS_MAX_REGIONS) || (out == NULL)) {
206 return false;
207 }
208 if (!regions[idx].registered) {
209 return false;
210 }
211 out->addr = regions[idx].addr;
212 out->size = regions[idx].size;
213 out->baseline = regions[idx].baseline;
214 out->enabled = regions[idx].enabled;
215 return true;
216}
217
223 uint8_t n = 0u;
224 for (uint8_t i = 0u; i < (uint8_t)CS_MAX_REGIONS; i++) {
225 if (regions[i].registered) {
226 n++;
227 }
228 }
229 return n;
230}
231
232/* Public API wrappers are in svc.c (SVC gates for unprivileged access). */
uint16_t crc16_ccitt(const uint8_t *data, uint16_t len)
Compute CRC16-CCITT (poly 0x1021, init 0xFFFF) over a byte buffer.
Definition crc.c:66
bool __cs_enable(uint8_t idx, bool enabled)
Privileged implementation of cs_enable().
Definition cs.c:137
void __cs_set_callback(cs_mismatch_fn fn)
Privileged implementation of cs_set_callback().
Definition cs.c:101
bool __cs_get_region(uint8_t idx, cs_region_t *out)
Privileged implementation of cs_get_region().
Definition cs.c:204
uint8_t __cs_region_count(void)
Privileged implementation of cs_region_count().
Definition cs.c:222
bool __cs_add_region(uint8_t idx, const uint8_t *addr, uint32_t size)
Privileged implementation of cs_add_region().
Definition cs.c:118
void __cs_init(void)
Privileged implementation of cs_init().
Definition cs.c:91
#define CS_SELFTEST_EXPECTED
Known CRC16-CCITT test vector.
Definition cs.c:65
static bool cs_hw_ok
CRC engine self-test result.
Definition cs.c:59
uint8_t __cs_check_all(void)
Privileged implementation of cs_check_all().
Definition cs.c:172
static bool cs_selftest(void)
Run the CRC engine self-test against a known vector.
Definition cs.c:76
static cs_mismatch_fn mismatch_cb
User-supplied mismatch callback.
Definition cs.c:56
bool __cs_rebaseline(uint8_t idx)
Privileged implementation of cs_rebaseline().
Definition cs.c:152
static cs_entry_t regions[8]
Region table — privileged DTCM, zero wait-state.
Definition cs.c:53
void(* cs_mismatch_fn)(uint8_t region_idx, uint16_t expected, uint16_t actual)
Mismatch callback signature.
Definition cs.h:79
#define CS_MAX_REGIONS
Maximum number of monitored memory regions.
Definition cs.h:59
#define DTCM_DATA_PRIV
Definition config.h:156
#define ITCM_FUNC
Definition config.h:155
ICARUS OS - Main API Header.
Per-region entry in the monitor table.
Definition cs.c:44
uint32_t size
Size in bytes.
Definition cs.c:46
const uint8_t * addr
Start address of the monitored region.
Definition cs.c:45
bool registered
True if this slot has been configured.
Definition cs.c:49
uint16_t baseline
Expected CRC16-CCITT.
Definition cs.c:47
bool enabled
True if actively scanned.
Definition cs.c:48
Descriptor for a monitored memory region.
Definition cs.h:85
const uint8_t * addr
Start address of the region.
Definition cs.h:86
bool enabled
True if this region is actively scanned.
Definition cs.h:89
uint32_t size
Size in bytes.
Definition cs.h:87
uint16_t baseline
Expected CRC16-CCITT value.
Definition cs.h:88