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
|