diff options
Diffstat (limited to 'rtl/gfx/firmware/start.S')
| -rw-r--r-- | rtl/gfx/firmware/start.S | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/rtl/gfx/firmware/start.S b/rtl/gfx/firmware/start.S new file mode 100644 index 0000000..c696119 --- /dev/null +++ b/rtl/gfx/firmware/start.S @@ -0,0 +1,64 @@ +.section .text.init.enter +.global _start + +_start: + li t0, 0x4a7a7b0c + beq a0, t0, _magic_ok + ret + +_magic_ok: + lui t0, %hi(__img_start) + addi t0, t0, %lo(__img_start) + la t1, __img_start + la t2, _early_copy_end + sub t2, t2, t1 + +_early_copy_loop: + lw t3, 0(t1) + sw t3, 0(t0) + addi t0, t0, 4 + addi t1, t1, 4 + addi t2, t2, -4 + bgtz t2, _early_copy_loop + + lui t2, %hi(_running_on_ram) + addi t2, t2, %lo(_running_on_ram) + jr t2 + +_running_on_ram: + la t2, __img_end + sub t2, t2, t0 + +_full_copy_loop: + lw t3, 0(t1) + lw t4, 4(t1) + lw t5, 8(t1) + lw t6, 12(t1) + sw t3, 0(t0) + sw t4, 4(t0) + sw t5, 8(t0) + sw t6, 12(t0) + addi t0, t0, 16 + addi t1, t1, 16 + addi t2, t2, -16 + bgtz t2, _full_copy_loop + +.balign 4 +_early_copy_end: + la t0, __bss_start + la t2, __bss_end + sub t2, t2, t0 + +_clear_bss_loop: + sw zero, 0(t0) + sw zero, 4(t0) + sw zero, 8(t0) + sw zero, 12(t0) + addi t0, t0, 16 + addi t2, t2, -16 + bgtz t2, _clear_bss_loop + +_start_done: + la sp, __stack + call main + j . |
