aboutsummaryrefslogtreecommitdiff
path: root/prog/src/startup.s
blob: 963c2880c1e8be44a8cf94af40dd40f9f7e9d572 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
.section .init
.globl _start
_start:

prog:
/*
    la t0, 4
    la t1, 1

    sw t1, 0(t0)

    la t0, 0x00100000
    li t1, 1
    sw t1, 0(t0)
    lw t2, 0(t0)

    
    j halt

*/
    /* 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