diff options
Diffstat (limited to '02-usart/test_harness/fake_env.c')
-rw-r--r-- | 02-usart/test_harness/fake_env.c | 36 |
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) |