aboutsummaryrefslogtreecommitdiff
path: root/loader_stage1.c
diff options
context:
space:
mode:
Diffstat (limited to 'loader_stage1.c')
-rw-r--r--loader_stage1.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/loader_stage1.c b/loader_stage1.c
index d209c15..aca439c 100644
--- a/loader_stage1.c
+++ b/loader_stage1.c
@@ -2,24 +2,25 @@
#include <stdint.h>
#include <global.h>
-char *const stage2_addr = ((void*) 0x4000);
+#define STAGE2_ADDR ((volatile char*) 0x4000)
-// there's one tricky thing about embedding file in executable;
-// mainly, symbols are visible to c code as extern chars, but the actual
+// There's one tricky thing about managing executable's own code.
+// Mainly, symbols are visible to c code as extern chars, but the actual
// values are their adresses... see the code below
extern char
- _binary_loader_stage2_img_start,
- _binary_loader_stage2_img_end,
- _binary_loader_stage2_img_size;
+ __stage2_start,
+ __stage2_end,
+ __stage2_size;
+__attribute__((section(".text.stage1main")))
void kernel_main(uint32_t r0, uint32_t r1, uint32_t atags)
{
- // stage2 of the bootloader is a blob embedded in executable;
+ // stage2 of the bootloader is part of executable;
// copy it over to it's destination place
// TODO implement a memcpy() somewhere and use it instead of loops
- for (size_t i = 0; i < (size_t) &_binary_loader_stage2_img_size; i++)
- stage2_addr[i] = (&_binary_loader_stage2_img_start)[i];
+ for (size_t i = 0; i < (size_t) &__stage2_size; i++)
+ STAGE2_ADDR[i] = (&__stage2_start)[i];
// jump to stage2
- ((void(*)(uint32_t, uint32_t, uint32_t))stage2_addr)(r0, r1, atags);
+ ((void(*)(uint32_t, uint32_t, uint32_t))STAGE2_ADDR)(r0, r1, atags);
}