summaryrefslogtreecommitdiff
path: root/kernel/start.S
blob: ecec47b66a626fef76d309c37794884dcc5c74d8 (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
.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