15 #include "sw/device/lib/testing/test_framework/check.h"
16 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
17 #include "sw/device/lib/testing/test_framework/status.h"
18 #include "sw/device/silicon_creator/lib/manifest_def.h"
22 OTTF_DEFINE_TEST_CONFIG();
26 extern char _bss_start;
28 extern char _data_start;
29 extern char _data_end;
30 extern char _data_init_start;
33 static const uintptr_t bss_start_addr = (uintptr_t)&_bss_start;
34 static const uintptr_t bss_end_addr = (uintptr_t)&_bss_end;
35 static const uintptr_t data_start_addr = (uintptr_t)&_data_start;
36 static const uintptr_t data_end_addr = (uintptr_t)&_data_end;
37 static const uintptr_t data_init_start_addr = (uintptr_t)&_data_init_start;
41 volatile char ensure_data_exists = 42;
42 volatile char ensure_bss_exists;
44 static dif_uart_t uart0;
45 static void init_uart(
void) {
46 CHECK_DIF_OK(dif_uart_init(
48 CHECK(
kUartBaudrate <= UINT32_MAX,
"kUartBaudrate must fit in uint32_t");
50 "kClockFreqPeripheralHz must fit in uint32_t");
71 static void test_crt_section_clear(
void) {
73 extern void crt_section_clear(
void *start,
void *end);
76 const size_t kLen = 32;
82 } kTests[] = {{.start = 0, .end = 0}, {.start = 0, .end = 1},
83 {.start = kLen - 1, .end = kLen}, {.start = 0, .end = kLen - 1},
84 {.start = 1, .end = kLen}, {.start = 0, .end = kLen}};
86 for (
size_t t = 0; t <
ARRAYSIZE(kTests); ++t) {
88 uint32_t section[kLen];
89 const uint32_t kVal = ~0u;
90 for (
size_t i = 0; i < kLen; ++i) {
95 const size_t start = kTests[t].start;
96 const size_t end = kTests[t].end;
97 crt_section_clear(§ion[start], §ion[end]);
100 for (
size_t i = 0; i < kLen; ++i) {
101 const uint32_t expect = i >= start && i < end ? 0 : kVal;
102 CHECK(section[i] == expect,
103 "%s case %u: section[%u] got 0x%08x, want 0x%08x", __func__, t, i,
118 static void test_crt_section_copy(
void) {
120 extern void crt_section_copy(
void *start,
void *end,
void *source);
123 const size_t kLen = 32;
131 } kTests[] = {{.start = 0, .end = 0, .source = 0},
132 {.start = 0, .end = 1, .source = 1},
133 {.start = kLen - 1, .end = kLen, .source = 2},
134 {.start = 0, .end = kLen - 1, .source = 1},
135 {.start = 1, .end = kLen, .source = 1},
136 {.start = 0, .end = kLen, .source = 0},
137 {.start = 0, .end = kLen, .source = 0},
138 {.start = 1, .end = kLen, .source = 0},
139 {.start = 2, .end = kLen, .source = 0},
140 {.start = 3, .end = kLen, .source = 0},
141 {.start = 0, .end = kLen / 2, .source = 0},
142 {.start = 1, .end = kLen / 2, .source = 0},
143 {.start = 2, .end = kLen / 2, .source = 0},
144 {.start = 3, .end = kLen / 2, .source = 0}};
146 for (
size_t t = 0; t <
ARRAYSIZE(kTests); ++t) {
148 uint32_t dst[kLen], src[kLen];
149 for (
size_t i = 0; i < kLen; ++i) {
150 src[i] = (uint32_t)(i) + 1;
155 const size_t start = kTests[t].start;
156 const size_t end = kTests[t].end;
157 const size_t source = kTests[t].source;
158 crt_section_copy(&dst[start], &dst[end], &src[source]);
161 uint32_t val = (uint32_t)(source) + 1;
164 for (
size_t i = 0; i < kLen; ++i) {
165 const uint32_t expect = i >= start && i < end ? val++ : 0;
166 CHECK(dst[i] == expect,
"%s case %u: dst[%u] got 0x%08x, want 0x%08x",
167 __func__, t, i, dst[i], expect);
172 void _ottf_main(
void) {
187 if (&_bss_start > &_bss_end || &_data_start > &_data_end) {
195 char *bss = &_bss_start;
196 ptrdiff_t bss_len = &_bss_end - &_bss_start;
197 int bad_bss_index = -1;
198 for (
int i = 0; i < bss_len; ++i) {
206 char *data = &_data_start;
207 char *data_init = &_data_init_start;
208 ptrdiff_t data_len = &_data_end - &_data_start;
209 int bad_data_index = -1;
210 for (
int i = 0; i < data_len; ++i) {
211 if (data[i] != data_init[i]) {
218 test_status_set(kTestStatusInTest);
224 CHECK(bss_start_addr %
sizeof(uint32_t) == 0,
225 "_bss_start not word-aligned: 0x%08x", bss_start_addr);
226 CHECK(bss_end_addr %
sizeof(uint32_t) == 0,
227 "_bss_end not word-aligned: 0x%08x", bss_end_addr);
228 CHECK(data_start_addr %
sizeof(uint32_t) == 0,
229 "_data_start not word-aligned: 0x%08x", data_start_addr);
230 CHECK(data_end_addr %
sizeof(uint32_t) == 0,
231 "_data_end not word-aligned: 0x%08x", data_end_addr);
232 CHECK(data_init_start_addr %
sizeof(uint32_t) == 0,
233 "_data_init_start not word-aligned: 0x%08x", data_init_start_addr);
235 CHECK(bad_bss_index == -1,
236 "found non-zero .bss byte at *(0x%08x + %d) == 0x%02x", bss_start_addr,
237 bad_bss_index, (uint32_t)bss[bad_bss_index]);
238 CHECK(bad_data_index == -1,
239 "found bad .data byte at *(0x%08x + %d) == 0x%02x", data_start_addr,
240 bad_data_index, (uint32_t)data_init[bad_data_index]);
243 test_crt_section_clear();
244 test_crt_section_copy();
246 test_status_set(kTestStatusPassed);