117 lines
3.2 KiB
Plaintext
117 lines
3.2 KiB
Plaintext
.section .text
|
|
|
|
#define PAGE_SHIFT 12
|
|
#define PT_SHIFT (PAGE_SHIFT - 3)
|
|
#define PT_BASE(level) (PAGE_SHIFT + PT_SHIFT * (level))
|
|
|
|
#define MAKE_PWCL(Dir2_width, Dir2_base, Dirl_width, Dirl_base, PTwidth, PTbase) \
|
|
((Dir2_width) << 25) | ((Dir2_base) << 20) | ((Dirl_width) << 15) | \
|
|
((Dirl_base) << 10) | ((PTwidth) << 5) | ((PTbase) << 0)
|
|
|
|
#define MAKE_PWCH(Dir4_width, Dir4_base, Dir3_width, Dir3_base) \
|
|
((Dir4_width) << 18) | ((Dir4_base) << 12) | ((Dir3_width) << 6) | \
|
|
((Dir3_base) << 0)
|
|
|
|
#define CSR_CRMD 0x00
|
|
#define CSR_EENTRY 0xc
|
|
#define CSR_PGDL 0x19
|
|
#define CSR_PGDH 0x1a
|
|
#define CSR_PGD 0x1b
|
|
#define CSR_PWCL 0x1c
|
|
#define CSR_PWCH 0x1d
|
|
#define CSR_STLBPS 0x1e
|
|
#define CSR_TLBRENTRY 0x88
|
|
#define CSR_TLBRSAVE 0x8b
|
|
#define CSR_TLBREHI 0x8e
|
|
#define CSR_MERRENTRY 0x93
|
|
#define CSR_DMW0 0x180
|
|
#define CSR_DMW1 0x181
|
|
#define CSR_DMW2 0x182
|
|
#define CSR_DMW3 0x183
|
|
|
|
.global loongarch_spinup
|
|
loongarch_spinup:
|
|
li.d $t0, 0b010001 // MAT=01, PLV1..3=0, PLV0=1
|
|
csrwr $t0, CSR_DMW0
|
|
csrwr $zero, CSR_DMW1
|
|
csrwr $zero, CSR_DMW2
|
|
csrwr $zero, CSR_DMW3
|
|
|
|
li.d $t0, 0b010110000 // DATF=01, DATM=01, PG=1, DA=0, IE=0, PLV=00
|
|
csrwr $t0, CSR_CRMD
|
|
|
|
invtlb 0, $zero, $zero
|
|
li.d $t0, PAGE_SHIFT
|
|
csrwr $t0, CSR_STLBPS
|
|
csrwr $t0, CSR_TLBREHI
|
|
|
|
csrwr $a2, CSR_PGDL
|
|
csrwr $a3, CSR_PGDH
|
|
|
|
li.d $t0, MAKE_PWCL(PT_SHIFT, PT_BASE(2), PT_SHIFT, PT_BASE(1), PT_SHIFT, PT_BASE(0))
|
|
csrwr $t0, CSR_PWCL
|
|
li.d $t0, MAKE_PWCH(0, 0, PT_SHIFT, PT_BASE(3))
|
|
csrwr $t0, CSR_PWCH
|
|
|
|
la $t0, loongarch_handle_refill
|
|
csrwr $t0, CSR_TLBRENTRY
|
|
|
|
#define CSR_EUEN 0x02
|
|
#define CSR_ECFG 0x04
|
|
|
|
csrwr $zero, CSR_EENTRY
|
|
csrwr $zero, CSR_MERRENTRY
|
|
csrwr $zero, CSR_EUEN
|
|
csrwr $zero, CSR_ECFG
|
|
|
|
move $t0, $a0
|
|
move $sp, $a1
|
|
|
|
move $ra, $zero
|
|
move $tp, $zero
|
|
move $a0, $zero
|
|
move $a1, $zero
|
|
move $a2, $zero
|
|
move $a3, $zero
|
|
move $a4, $zero
|
|
move $a5, $zero
|
|
move $a6, $zero
|
|
move $a7, $zero
|
|
move $t1, $zero
|
|
move $t2, $zero
|
|
move $t3, $zero
|
|
move $t4, $zero
|
|
move $t5, $zero
|
|
move $t6, $zero
|
|
move $t7, $zero
|
|
move $t8, $zero
|
|
move $r21, $zero
|
|
move $fp, $zero
|
|
move $s0, $zero
|
|
move $s1, $zero
|
|
move $s2, $zero
|
|
move $s3, $zero
|
|
move $s4, $zero
|
|
move $s5, $zero
|
|
move $s6, $zero
|
|
move $s7, $zero
|
|
move $s8, $zero
|
|
|
|
jirl $zero, $t0, 0
|
|
|
|
.global loongarch_handle_refill
|
|
.align 12
|
|
loongarch_handle_refill:
|
|
csrwr $t0, CSR_TLBRSAVE
|
|
csrrd $t0, CSR_PGD
|
|
lddir $t0, $t0, 3
|
|
lddir $t0, $t0, 2
|
|
lddir $t0, $t0, 1
|
|
ldpte $t0, 0
|
|
ldpte $t0, 1
|
|
tlbfill
|
|
csrrd $t0, CSR_TLBRSAVE
|
|
ertn
|
|
|
|
.section .note.GNU-stack,"",%progbits
|