mirror of https://github.com/acidanthera/audk.git
52 lines
1.4 KiB
ArmAsm
52 lines
1.4 KiB
ArmAsm
#------------------------------------------------------------------------------
|
|
#
|
|
# TLB refill exception handler
|
|
#
|
|
# Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR>
|
|
#
|
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
#
|
|
#-----------------------------------------------------------------------------
|
|
|
|
#include <Register/LoongArch64/Csr.h>
|
|
|
|
ASM_GLOBAL ASM_PFX(HandleTlbRefillStart)
|
|
ASM_GLOBAL ASM_PFX(HandleTlbRefillEnd)
|
|
|
|
#
|
|
# Refill the page table.
|
|
# @param VOID
|
|
# @retval VOID
|
|
#
|
|
ASM_PFX(HandleTlbRefillStart):
|
|
csrwr $t0, LOONGARCH_CSR_TLBRSAVE
|
|
csrrd $t0, LOONGARCH_CSR_PWCTL1
|
|
srli.d $t0, $t0, 18
|
|
andi $t0, $t0, 0x3F
|
|
bnez $t0, Level5
|
|
csrrd $t0, LOONGARCH_CSR_PWCTL1
|
|
srli.d $t0, $t0, 6
|
|
andi $t0, $t0, 0x3F
|
|
bnez $t0, Level4
|
|
csrrd $t0, LOONGARCH_CSR_PGD
|
|
b Level3
|
|
Level5:
|
|
csrrd $t0, LOONGARCH_CSR_PGD
|
|
lddir $t0, $t0, 4 #Put pud BaseAddress into T0
|
|
lddir $t0, $t0, 3 #Put pud BaseAddress into T0
|
|
b Level3
|
|
Level4:
|
|
csrrd $t0, LOONGARCH_CSR_PGD
|
|
lddir $t0, $t0, 3 #Put pud BaseAddress into T0
|
|
Level3:
|
|
lddir $t0, $t0, 2 #Put pmd BaseAddress into T0
|
|
lddir $t0, $t0, 1 #Put pte BaseAddress into T0
|
|
ldpte $t0, 0
|
|
ldpte $t0, 1
|
|
tlbfill // refill hi, lo0, lo1
|
|
csrrd $t0, LOONGARCH_CSR_TLBRSAVE
|
|
ertn
|
|
ASM_PFX(HandleTlbRefillEnd):
|
|
|
|
.end
|