aboutsummaryrefslogtreecommitdiff
path: root/02-usart/test_harness/fake_env.c
diff options
context:
space:
mode:
Diffstat (limited to '02-usart/test_harness/fake_env.c')
-rw-r--r--02-usart/test_harness/fake_env.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/02-usart/test_harness/fake_env.c b/02-usart/test_harness/fake_env.c
index 3175317..6a32c99 100644
--- a/02-usart/test_harness/fake_env.c
+++ b/02-usart/test_harness/fake_env.c
@@ -3,17 +3,39 @@
#include <stdlib.h>
#include <assert.h>
-#define DEFINE_MEMORY_SEGMENT(name, start_addr, end_addr) \
- static void* fake_##name = NULL; \
- void* load_fake_##name##__ () \
+struct fakeenv_memseg {
+ const char* name;
+ void* segment;
+};
+
+#define DEFINE_MEMORY_SEGMENT(seg, start_addr, end_addr) \
+ static __attribute((__section__("fakeenv"))) \
+ struct fakeenv_memseg fake_##seg = { \
+ .name = #seg, \
+ .segment = NULL, \
+ }; \
+ void* load_fake_##seg##__ () \
{ \
- if (fake_##name == NULL) { \
- fake_##name = malloc((end_addr) - (start_addr)); \
- assert(fake_##name != NULL); \
+ if (fake_##seg .segment == NULL) { \
+ fake_##seg .segment = malloc((end_addr) - (start_addr)); \
+ assert(fake_##seg .segment != NULL); \
} \
- return fake_##name; \
+ return fake_##seg.segment; \
}
+extern struct fakeenv_memseg __start_fakeenv;
+extern struct fakeenv_memseg __stop_fakeenv;
+
+void wipeout_fake_env()
+{
+ for (struct fakeenv_memseg* iter = &__start_fakeenv;
+ iter < &__stop_fakeenv;
+ ++ iter) {
+ free(iter->segment);
+ iter->segment = NULL;
+ }
+}
+
/* Reset and clock control. */
DEFINE_MEMORY_SEGMENT(rcc, 0x40021000, 0x400210A0)