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
|
.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
la t0, __bss_start
la t1, __bss_end
beq t0, t1, 2f
1:
sw zero, 0(t0)
addi t0, t0, 4
bltu t0, t1, 1b
2:
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
|