aboutsummaryrefslogtreecommitdiff
path: root/prog
diff options
context:
space:
mode:
Diffstat (limited to 'prog')
-rw-r--r--prog/link.ld67
-rw-r--r--prog/src/main.c6
-rw-r--r--prog/src/prog.s.bak (renamed from prog/src/prog.s)0
-rw-r--r--prog/src/startup.s42
4 files changed, 107 insertions, 8 deletions
diff --git a/prog/link.ld b/prog/link.ld
index 98658c3..4cc02ec 100644
--- a/prog/link.ld
+++ b/prog/link.ld
@@ -1,16 +1,67 @@
-OUTPUT_ARCH( "riscv" )
-ENTRY(_start)
+/* Linker script for RISC-V */
+/* Define memory regions */
MEMORY
{
- ROM (rx) : ORIGIN = 0x00010000, LENGTH = 0xF0000 # 0x0001_0000 - 0x000F_FFFF
- RAM (rwx) : ORIGIN = 0x00100000, LENGTH = 0xFEFFFFF # 0x0010_0000 - 0xFF0F_FFFF
+ ROM (rx) : ORIGIN = 0x00010000, LENGTH = 0x400 /* 1024 bytes for ROM */
+ RAM (rwx) : ORIGIN = 0x00100000, LENGTH = 0x400 /* 1024 bytes for RAM */
}
+ENTRY(_start)
+
+/* Define sections */
SECTIONS
{
- .text : { *(.text) } > ROM
- .data : { *(.data) } > RAM
- .bss : { *(.bss) } > RAM
- .stack : { *(.stack) } > RAM
+ /* Code section */
+ .text :
+ {
+ KEEP(*(.init))
+ KEEP(*(.text))
+ KEEP(*(.fini))
+ KEEP(*(.rodata))
+ _etext = .;
+ } > ROM
+
+ /* Initialized data section */
+ .data : AT(_etext)
+ {
+ _sdata = .;
+ KEEP(*(.data))
+ _edata = .;
+ } > RAM
+
+ /* Uninitialized data section */
+ .bss :
+ {
+ _sbss = .;
+ KEEP(*(.bss))
+ KEEP(*(COMMON))
+ _ebss = .;
+ } > RAM
+
+ /* Stack section */
+ .stack (NOLOAD) :
+ {
+ _stack_start = .;
+ . += 0x10; /* Adjust the size as needed */
+ _stack_end = .;
+ } > RAM
+
+ /* Heap section */
+ .heap (NOLOAD) :
+ {
+ _heap_start = .;
+ . += 0x10; /* Adjust the size as needed */
+ _heap_end = .;
+ } > RAM
}
+
+/* Define symbols for memory initialization */
+PROVIDE(_start = 0x00010000);
+PROVIDE(_etext = _etext);
+PROVIDE(_sdata = _sdata);
+PROVIDE(_edata = _edata);
+PROVIDE(_sbss = _sbss);
+PROVIDE(_ebss = _ebss);
+PROVIDE(_sstack = _sstack);
+PROVIDE(_estack = _estack); \ No newline at end of file
diff --git a/prog/src/main.c b/prog/src/main.c
new file mode 100644
index 0000000..1ce067c
--- /dev/null
+++ b/prog/src/main.c
@@ -0,0 +1,6 @@
+
+
+int main(void) {
+ while (1) {
+ }
+}
diff --git a/prog/src/prog.s b/prog/src/prog.s.bak
index 63026c9..63026c9 100644
--- a/prog/src/prog.s
+++ b/prog/src/prog.s.bak
diff --git a/prog/src/startup.s b/prog/src/startup.s
new file mode 100644
index 0000000..7adfb5e
--- /dev/null
+++ b/prog/src/startup.s
@@ -0,0 +1,42 @@
+.section .init
+.globl _start
+_start:
+ /* Set up stack pointer */
+ la sp, _stack_end
+
+ /* Initialize .data section (copy from LMA to VMA) */
+ la t0, _sdata /* VMA start of .data */
+ la t1, _edata /* VMA end of .data */
+ la t2, _etext /* LMA start of .data in flash */
+copy_data:
+ beq t0, t1, clear_bss
+ lw t3, 0(t2)
+ sw t3, 0(t0)
+ addi t0, t0, 4
+ addi t2, t2, 4
+ j copy_data
+
+clear_bss:
+ /* Clear .bss section */
+ la t0, _sbss /* VMA start of .bss */
+ la t1, _ebss /* VMA end of .bss */
+clear_loop:
+ beq t0, t1, init_libc
+ sw x0, 0(t0)
+ addi t0, t0, 4
+ j clear_loop
+
+init_libc:
+ /* Call libc initialization functions */
+ /* call _init */
+
+ /* Call main function */
+ call main
+
+finalize_libc:
+ /* Call libc finalization functions */
+ /* call _fini */
+
+halt:
+ /* Infinite loop after main returns */
+ j halt