diff options
author | Bad Diode <bd@badd10de.dev> | 2022-10-19 10:00:42 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-10-19 10:00:42 +0200 |
commit | 0702260e53a18dacfae58582da8a4d518c3c41ee (patch) | |
tree | 51e35f761f6e23fd4f9ce54cfa3d119e2e4bdc64 /src | |
parent | 219029f317e20a5248735d7f7bf6bb88ecb95d28 (diff) | |
download | uxn64-0702260e53a18dacfae58582da8a4d518c3c41ee.tar.gz uxn64-0702260e53a18dacfae58582da8a4d518c3c41ee.zip |
Replace `spicy` with linker scripts
Diffstat (limited to 'src')
-rw-r--r-- | src/entry.s | 16 | ||||
-rw-r--r-- | src/linker.ld | 50 | ||||
-rw-r--r-- | src/main.c | 13 |
3 files changed, 70 insertions, 9 deletions
diff --git a/src/entry.s b/src/entry.s new file mode 100644 index 0000000..3ff60ba --- /dev/null +++ b/src/entry.s | |||
@@ -0,0 +1,16 @@ | |||
1 | # Entry point for the ROM image. | ||
2 | .section .text.entry | ||
3 | .global _start | ||
4 | _start: | ||
5 | |||
6 | # Set up the stack | ||
7 | la $sp, _boot_stack | ||
8 | |||
9 | # Zero BSS. | ||
10 | la $a0, _bss_start | ||
11 | la $a1, _bss_end | ||
12 | subu $a1, $a1, $a0 | ||
13 | jal bzero | ||
14 | |||
15 | # Jump to C entry point. | ||
16 | j boot | ||
diff --git a/src/linker.ld b/src/linker.ld new file mode 100644 index 0000000..91bd28a --- /dev/null +++ b/src/linker.ld | |||
@@ -0,0 +1,50 @@ | |||
1 | ENTRY(_start) | ||
2 | |||
3 | STACK_SIZE = 8K; | ||
4 | |||
5 | MEMORY { | ||
6 | rom (R) : ORIGIN = 0, LENGTH = 64M | ||
7 | ram (RWX) : ORIGIN = 0x80000400, LENGTH = 4M - 0x400 | ||
8 | } | ||
9 | |||
10 | SECTIONS { | ||
11 | .header : { | ||
12 | LONG(0x80371240) | ||
13 | LONG(0x0000000f) | ||
14 | LONG(0x80000400) | ||
15 | LONG(0x0000144c) | ||
16 | . = 0x1000; | ||
17 | } >rom | ||
18 | |||
19 | .text : { | ||
20 | _text_start = .; | ||
21 | *(.text.entry) | ||
22 | *(.text .text.*) | ||
23 | *(.rodata .rodata.*) | ||
24 | *(.data .data.*) | ||
25 | _text_end = .; | ||
26 | } >ram AT>rom | ||
27 | |||
28 | .bss (NOLOAD) : ALIGN(16) { | ||
29 | _bss_start = .; | ||
30 | *(.bss .bss.*) | ||
31 | *(COMMON) | ||
32 | *(.scommon .scommon.*) | ||
33 | _bss_end = .; | ||
34 | } >ram | ||
35 | |||
36 | .stack (NOLOAD) : ALIGN(16) { | ||
37 | . += STACK_SIZE; | ||
38 | . = ALIGN(8); | ||
39 | _boot_stack = .; | ||
40 | _main_thread_stack = .; | ||
41 | |||
42 | . += STACK_SIZE; | ||
43 | . = ALIGN(8); | ||
44 | _idle_thread_stack = .; | ||
45 | } >ram | ||
46 | |||
47 | /DISCARD/ : { | ||
48 | *(*) | ||
49 | } | ||
50 | } | ||
@@ -2,19 +2,14 @@ | |||
2 | 2 | ||
3 | #include "types.h" | 3 | #include "types.h" |
4 | 4 | ||
5 | // Get a pointer to the start (top) of a stack. | ||
6 | #define STACK_START(stack) ((stack) + sizeof((stack))) | ||
7 | |||
8 | // | 5 | // |
9 | // Threads and stacks. | 6 | // Threads and stacks. |
10 | // | 7 | // |
11 | 8 | ||
12 | #define STACK_SIZE 8 * 1024 | ||
13 | static OSThread idle_thread; | 9 | static OSThread idle_thread; |
14 | static OSThread main_thread; | 10 | static OSThread main_thread; |
15 | static u8 idle_thread_stack[STACK_SIZE] __attribute__((aligned(8))); | 11 | extern u8 _idle_thread_stack[]; |
16 | static u8 main_thread_stack[STACK_SIZE] __attribute__((aligned(8))); | 12 | extern u8 _main_thread_stack[]; |
17 | u64 boot_stack[STACK_SIZE / sizeof(u64)] __attribute__((aligned(8))); | ||
18 | 13 | ||
19 | // | 14 | // |
20 | // Message buffers and queues. | 15 | // Message buffers and queues. |
@@ -268,7 +263,7 @@ idle_proc(void *arg) { | |||
268 | osCreatePiManager((OSPri)OS_PRIORITY_PIMGR, &pi_msg_queue, pi_msg, NUM_PI_MSGS); | 263 | osCreatePiManager((OSPri)OS_PRIORITY_PIMGR, &pi_msg_queue, pi_msg, NUM_PI_MSGS); |
269 | 264 | ||
270 | // Create main thread. | 265 | // Create main thread. |
271 | osCreateThread(&main_thread, 3, main_proc, NULL, STACK_START(main_thread_stack), 10); | 266 | osCreateThread(&main_thread, 3, main_proc, NULL, _main_thread_stack, 10); |
272 | osStartThread(&main_thread); | 267 | osStartThread(&main_thread); |
273 | 268 | ||
274 | // Become the idle thread. | 269 | // Become the idle thread. |
@@ -281,6 +276,6 @@ void | |||
281 | boot(void) { | 276 | boot(void) { |
282 | osInitialize(); | 277 | osInitialize(); |
283 | rom_handle = osCartRomInit(); | 278 | rom_handle = osCartRomInit(); |
284 | osCreateThread(&idle_thread, 1, idle_proc, NULL, STACK_START(idle_thread_stack), 10); | 279 | osCreateThread(&idle_thread, 1, idle_proc, NULL, _idle_thread_stack, 10); |
285 | osStartThread(&idle_thread); | 280 | osStartThread(&idle_thread); |
286 | } | 281 | } |