summaryrefslogtreecommitdiff
path: root/kernel/riscv/start.S
blob: aa35916e522fc5b3acf0fe2664c631446798d267 (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
.section .text._start
.global _start
.type _start, @function
.type _syscall_start, @function
.type _syscall_exit, @function

.extern user_regs

_start:
    csrw sstatus, zero
    csrw sie, zero

    la t0, _syscall_start
    csrw stvec, t0

    la sp, __stack_top
    # Copy .data
    la t0, __data_load
    la t1, __data_start
    la t2, __data_end

1:
    beq t1, t2, 2f
    lw t3, 0(t0)
    sw t3, 0(t1)
    addi t0, t0, 4
    addi t1, t1, 4
    j 1b
    
2:
    # Zero .bss
    la t0, __bss_start
    la t1, __bss_end
3:
    beq t0, t1, 4f
    sw zero, 0(t0)
    addi t0, t0, 4
    j 3b
4:
    call kernel_main
    wfi

_syscall_start:
    csrw sscratch, x1
    la x1, user_regs

    sw x2, 4(x1)
    sw x3, 8(x1)
    sw x4, 12(x1)
    sw x5, 16(x1)
    sw x6, 20(x1)
    sw x7, 24(x1)
    sw x8, 28(x1)
    sw x9, 32(x1)
    sw x10, 36(x1)
    sw x11, 40(x1)
    sw x12, 44(x1)
    sw x13, 48(x1)
    sw x14, 52(x1)
    sw x15, 56(x1)
    sw x16, 60(x1)
    sw x17, 64(x1)
    sw x18, 68(x1)
    sw x19, 72(x1)
    sw x20, 76(x1)
    sw x21, 80(x1)
    sw x22, 84(x1)
    sw x23, 88(x1)
    sw x24, 92(x1)
    sw x25, 96(x1)
    sw x26, 100(x1)
    sw x27, 104(x1)
    sw x28, 108(x1)
    sw x29, 112(x1)
    sw x30, 116(x1)
    sw x31, 120(x1)

    csrr t0, sscratch
    sw t0, 0(x1)
    
    jal kernel_trap

_syscall_exit:
    csrw sscratch, x1
    la x1, user_regs

    lw x2, 4(x1)
    lw x3, 8(x1)
    lw x4, 12(x1)
    lw x5, 16(x1)
    lw x6, 20(x1)
    lw x7, 24(x1)
    lw x8, 28(x1)
    lw x9, 32(x1)
    lw x10, 36(x1)
    lw x11, 40(x1)
    lw x12, 44(x1)
    lw x13, 48(x1)
    lw x14, 52(x1)
    lw x15, 56(x1)
    lw x16, 60(x1)
    lw x17, 64(x1)
    lw x18, 68(x1)
    lw x19, 72(x1)
    lw x20, 76(x1)
    lw x21, 80(x1)
    lw x22, 84(x1)
    lw x23, 88(x1)
    lw x24, 92(x1)
    lw x25, 96(x1)
    lw x26, 100(x1)
    lw x27, 104(x1)
    lw x28, 108(x1)
    lw x29, 112(x1)
    lw x30, 116(x1)
    lw x31, 120(x1)

    csrr x1, sscratch

    sret