:: limine / common / lib / spinup.asm_loongarch64 3.2 KB raw

1
.section .text
2
3
#define PAGE_SHIFT      12
4
#define PT_SHIFT        (PAGE_SHIFT - 3)
5
#define PT_BASE(level)  (PAGE_SHIFT + PT_SHIFT * (level))
6
7
#define MAKE_PWCL(Dir2_width, Dir2_base, Dirl_width, Dirl_base, PTwidth, PTbase) \
8
        ((Dir2_width) << 25) | ((Dir2_base) << 20) | ((Dirl_width) << 15) | \
9
        ((Dirl_base) << 10) | ((PTwidth) << 5) | ((PTbase) << 0)
10
11
#define MAKE_PWCH(Dir4_width, Dir4_base, Dir3_width, Dir3_base) \
12
        ((Dir4_width) << 18) | ((Dir4_base) << 12) | ((Dir3_width) << 6) | \
13
        ((Dir3_base) << 0)
14
15
#define CSR_CRMD        0x00
16
#define CSR_EENTRY      0xc
17
#define CSR_PGDL        0x19
18
#define CSR_PGDH        0x1a
19
#define CSR_PGD         0x1b
20
#define CSR_PWCL        0x1c
21
#define CSR_PWCH        0x1d
22
#define CSR_STLBPS      0x1e
23
#define CSR_TLBRENTRY   0x88
24
#define CSR_TLBRSAVE    0x8b
25
#define CSR_TLBREHI     0x8e
26
#define CSR_MERRENTRY   0x93
27
#define CSR_DMW0        0x180
28
#define CSR_DMW1        0x181
29
#define CSR_DMW2        0x182
30
#define CSR_DMW3        0x183
31
32
.global loongarch_spinup
33
loongarch_spinup:
34
        li.d    $t0, 0b010001           // MAT=01, PLV1..3=0, PLV0=1
35
        csrwr   $t0, CSR_DMW0
36
        csrwr   $zero, CSR_DMW1
37
        csrwr   $zero, CSR_DMW2
38
        csrwr   $zero, CSR_DMW3
39
40
        li.d    $t0, 0b010110000        // DATF=01, DATM=01, PG=1, DA=0, IE=0, PLV=00
41
        csrwr   $t0, CSR_CRMD
42
43
        invtlb  0, $zero, $zero
44
        li.d    $t0, PAGE_SHIFT
45
        csrwr   $t0, CSR_STLBPS
46
        csrwr   $t0, CSR_TLBREHI
47
48
        csrwr   $a2, CSR_PGDL
49
        csrwr   $a3, CSR_PGDH
50
51
        li.d    $t0, MAKE_PWCL(PT_SHIFT, PT_BASE(2), PT_SHIFT, PT_BASE(1), PT_SHIFT, PT_BASE(0))
52
        csrwr   $t0, CSR_PWCL
53
        li.d    $t0, MAKE_PWCH(0, 0, PT_SHIFT, PT_BASE(3))
54
        csrwr   $t0, CSR_PWCH
55
56
        la      $t0, loongarch_handle_refill
57
        csrwr   $t0, CSR_TLBRENTRY
58
59
#define CSR_EUEN        0x02
60
#define CSR_ECFG        0x04
61
62
        csrwr   $zero, CSR_EENTRY
63
        csrwr   $zero, CSR_MERRENTRY
64
        csrwr   $zero, CSR_EUEN
65
        csrwr   $zero, CSR_ECFG
66
67
        move    $t0, $a0
68
        move    $sp, $a1
69
70
        move    $ra, $zero
71
        move    $tp, $zero
72
        move    $a0, $zero
73
        move    $a1, $zero
74
        move    $a2, $zero
75
        move    $a3, $zero
76
        move    $a4, $zero
77
        move    $a5, $zero
78
        move    $a6, $zero
79
        move    $a7, $zero
80
        move    $t1, $zero
81
        move    $t2, $zero
82
        move    $t3, $zero
83
        move    $t4, $zero
84
        move    $t5, $zero
85
        move    $t6, $zero
86
        move    $t7, $zero
87
        move    $t8, $zero
88
        move    $r21, $zero
89
        move    $fp, $zero
90
        move    $s0, $zero
91
        move    $s1, $zero
92
        move    $s2, $zero
93
        move    $s3, $zero
94
        move    $s4, $zero
95
        move    $s5, $zero
96
        move    $s6, $zero
97
        move    $s7, $zero
98
        move    $s8, $zero
99
100
        jirl    $zero, $t0, 0
101
102
.global loongarch_handle_refill
103
.align 12
104
loongarch_handle_refill:
105
        csrwr   $t0, CSR_TLBRSAVE
106
        csrrd   $t0, CSR_PGD
107
        lddir   $t0, $t0, 3
108
        lddir   $t0, $t0, 2
109
        lddir   $t0, $t0, 1
110
        ldpte   $t0, 0
111
        ldpte   $t0, 1
112
        tlbfill
113
        csrrd   $t0, CSR_TLBRSAVE
114
        ertn
115
116
.section .note.GNU-stack,"",%progbits
tab: 248 wrap: offon