aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-10-19 10:00:42 +0200
committerBad Diode <bd@badd10de.dev>2022-10-19 10:00:42 +0200
commit0702260e53a18dacfae58582da8a4d518c3c41ee (patch)
tree51e35f761f6e23fd4f9ce54cfa3d119e2e4bdc64 /src
parent219029f317e20a5248735d7f7bf6bb88ecb95d28 (diff)
downloaduxn64-0702260e53a18dacfae58582da8a4d518c3c41ee.tar.gz
uxn64-0702260e53a18dacfae58582da8a4d518c3c41ee.zip
Replace `spicy` with linker scripts
Diffstat (limited to 'src')
-rw-r--r--src/entry.s16
-rw-r--r--src/linker.ld50
-rw-r--r--src/main.c13
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 @@
1ENTRY(_start)
2
3STACK_SIZE = 8K;
4
5MEMORY {
6 rom (R) : ORIGIN = 0, LENGTH = 64M
7 ram (RWX) : ORIGIN = 0x80000400, LENGTH = 4M - 0x400
8}
9
10SECTIONS {
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}
diff --git a/src/main.c b/src/main.c
index eca114f..53612d6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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
13static OSThread idle_thread; 9static OSThread idle_thread;
14static OSThread main_thread; 10static OSThread main_thread;
15static u8 idle_thread_stack[STACK_SIZE] __attribute__((aligned(8))); 11extern u8 _idle_thread_stack[];
16static u8 main_thread_stack[STACK_SIZE] __attribute__((aligned(8))); 12extern u8 _main_thread_stack[];
17u64 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
281boot(void) { 276boot(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}