mirror of
https://github.com/acidanthera/audk.git
synced 2025-08-18 08:08:09 +02:00
AsmMacroIoLib.h and AsmMacroIoLibV8.h are used by the CompilerIntrinsicsLib, which is moving to MdePkg. These functions provide standard definitions for ARM/AARCH64 assembly code, respectively, and so are moved to the arch directories in MdePkg to avoid MdePkg having a dependency on ArmPkg. Now that the files are in Arm/ and AArch64/ directories, the filenames are changed to AsmMacroLib.h as we can distinguish the architecture from the path. AsmMacroIoLib.inc is unused and so is removed. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Oliver Smith-Denny <osde@linux.microsoft.com>
186 lines
4.1 KiB
ArmAsm
186 lines
4.1 KiB
ArmAsm
#------------------------------------------------------------------------------
|
|
#
|
|
# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
|
# Copyright (c) 2011 - 2016, ARM Limited. All rights reserved.
|
|
# Copyright (c) 2016, Linaro Limited. All rights reserved.
|
|
#
|
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
#
|
|
#------------------------------------------------------------------------------
|
|
|
|
#include <AsmMacroLib.h>
|
|
|
|
.set DAIF_RD_FIQ_BIT, (1 << 6)
|
|
.set DAIF_RD_IRQ_BIT, (1 << 7)
|
|
|
|
.set SCTLR_ELx_M_BIT_POS, (0)
|
|
|
|
ASM_FUNC(ArmReadMidr)
|
|
mrs x0, midr_el1 // Read from Main ID Register (MIDR)
|
|
ret
|
|
|
|
ASM_FUNC(ArmCacheInfo)
|
|
mrs x0, ctr_el0 // Read from Cache Type Regiter (CTR)
|
|
ret
|
|
|
|
ASM_FUNC(ArmGetInterruptState)
|
|
mrs x0, daif
|
|
tst w0, #DAIF_RD_IRQ_BIT // Check if IRQ is enabled. Enabled if 0 (Z=1)
|
|
cset w0, eq // if Z=1 return 1, else 0
|
|
ret
|
|
|
|
ASM_FUNC(ArmGetFiqState)
|
|
mrs x0, daif
|
|
tst w0, #DAIF_RD_FIQ_BIT // Check if FIQ is enabled. Enabled if 0 (Z=1)
|
|
cset w0, eq // if Z=1 return 1, else 0
|
|
ret
|
|
|
|
ASM_FUNC(ArmWriteCpacr)
|
|
msr cpacr_el1, x0 // Coprocessor Access Control Reg (CPACR)
|
|
ret
|
|
|
|
ASM_FUNC(ArmWriteAuxCr)
|
|
EL1_OR_EL2(x1)
|
|
1:msr actlr_el1, x0 // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3
|
|
ret
|
|
2:msr actlr_el2, x0 // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3
|
|
ret
|
|
|
|
ASM_FUNC(ArmReadAuxCr)
|
|
EL1_OR_EL2(x1)
|
|
1:mrs x0, actlr_el1 // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3
|
|
ret
|
|
2:mrs x0, actlr_el2 // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3
|
|
ret
|
|
|
|
ASM_FUNC(ArmSetTTBR0)
|
|
EL1_OR_EL2(x1)
|
|
1:msr ttbr0_el1, x0 // Translation Table Base Reg 0 (TTBR0)
|
|
b 4f
|
|
2:msr ttbr0_el2, x0 // Translation Table Base Reg 0 (TTBR0)
|
|
4:isb
|
|
ret
|
|
|
|
ASM_FUNC(ArmGetTTBR0BaseAddress)
|
|
EL1_OR_EL2(x1)
|
|
1:mrs x0, ttbr0_el1
|
|
b 3f
|
|
2:mrs x0, ttbr0_el2
|
|
3:and x0, x0, 0xFFFFFFFFFFFF /* Look at bottom 48 bits */
|
|
isb
|
|
ret
|
|
|
|
ASM_FUNC(ArmGetTCR)
|
|
EL1_OR_EL2(x1)
|
|
1:mrs x0, tcr_el1
|
|
b 4f
|
|
2:mrs x0, tcr_el2
|
|
4:isb
|
|
ret
|
|
|
|
ASM_FUNC(ArmSetTCR)
|
|
EL1_OR_EL2(x1)
|
|
1:msr tcr_el1, x0
|
|
b 4f
|
|
2:msr tcr_el2, x0
|
|
4:isb
|
|
ret
|
|
|
|
ASM_FUNC(ArmGetMAIR)
|
|
EL1_OR_EL2(x1)
|
|
1:mrs x0, mair_el1
|
|
b 4f
|
|
2:mrs x0, mair_el2
|
|
4:isb
|
|
ret
|
|
|
|
ASM_FUNC(ArmSetMAIR)
|
|
EL1_OR_EL2(x1)
|
|
1:msr mair_el1, x0
|
|
b 4f
|
|
2:msr mair_el2, x0
|
|
4:isb
|
|
ret
|
|
|
|
|
|
//
|
|
//VOID
|
|
//ArmUpdateTranslationTableEntry (
|
|
// IN VOID *TranslationTableEntry // X0
|
|
// IN VOID *MVA // X1
|
|
// );
|
|
ASM_FUNC(ArmUpdateTranslationTableEntry)
|
|
dsb nshst
|
|
lsr x1, x1, #12
|
|
EL1_OR_EL2(x2)
|
|
1: tlbi vaae1, x1 // TLB Invalidate VA , EL1
|
|
mrs x2, sctlr_el1
|
|
b 4f
|
|
2: tlbi vae2, x1 // TLB Invalidate VA , EL2
|
|
mrs x2, sctlr_el2
|
|
4: tbnz x2, SCTLR_ELx_M_BIT_POS, 5f
|
|
dc ivac, x0 // invalidate in Dcache if MMU is still off
|
|
5: dsb nsh
|
|
isb
|
|
ret
|
|
|
|
ASM_FUNC(ArmInvalidateTlb)
|
|
EL1_OR_EL2(x0)
|
|
1: tlbi vmalle1
|
|
b 4f
|
|
2: tlbi alle2
|
|
4: dsb sy
|
|
isb
|
|
ret
|
|
|
|
ASM_FUNC(ArmCallWFE)
|
|
wfe
|
|
ret
|
|
|
|
ASM_FUNC(ArmCallSEV)
|
|
sev
|
|
ret
|
|
|
|
ASM_FUNC(ArmReadCpuActlr)
|
|
mrs x0, S3_1_c15_c2_0
|
|
ret
|
|
|
|
ASM_FUNC(ArmWriteCpuActlr)
|
|
msr S3_1_c15_c2_0, x0
|
|
dsb sy
|
|
isb
|
|
ret
|
|
|
|
ASM_FUNC(ArmReadSctlr)
|
|
EL1_OR_EL2(x1)
|
|
1:mrs x0, sctlr_el1
|
|
ret
|
|
2:mrs x0, sctlr_el2
|
|
ret
|
|
|
|
ASM_FUNC(ArmWriteSctlr)
|
|
EL1_OR_EL2(x1)
|
|
1:msr sctlr_el1, x0
|
|
ret
|
|
2:msr sctlr_el2, x0
|
|
ret
|
|
|
|
ASM_FUNC(ArmGetPhysicalAddressBits)
|
|
mrs x0, id_aa64mmfr0_el1
|
|
adr x1, .LPARanges
|
|
and x0, x0, #0xf
|
|
ldrb w0, [x1, x0]
|
|
ret
|
|
|
|
//
|
|
// Bits 0..3 of the AA64MFR0_EL1 system register encode the size of the
|
|
// physical address space support on this CPU:
|
|
// 0 == 32 bits, 1 == 36 bits, etc etc
|
|
// 7 and up are reserved
|
|
//
|
|
.LPARanges:
|
|
.byte 32, 36, 40, 42, 44, 48, 52, 0
|
|
.byte 0, 0, 0, 0, 0, 0, 0, 0
|
|
|
|
ASM_FUNCTION_REMOVE_IF_UNREFERENCED
|