The AArch64 DAIF bits are different for reading (mrs) versus writing (msr). The bitmask definitions assumed they were the same causing incorrect results when trying to determine the current interrupt state through GetInterruptState. The logic for interpreting the DAIF read data using the csel instruction was also incorrect and is fixed. Replaced the magic numbers in DisableInterrupts.S and EnableInterrupts.S with definitions for the DAIF write (daifset/daifclr) IRQ field. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eugene Cohen <eugene@hp.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
37 lines
1.1 KiB
ArmAsm
37 lines
1.1 KiB
ArmAsm
#------------------------------------------------------------------------------
|
|
#
|
|
# DisableInterrupts() for AArch64
|
|
#
|
|
# Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
|
|
# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
|
# Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>
|
|
# This program and the accompanying materials
|
|
# are licensed and made available under the terms and conditions of the BSD License
|
|
# which accompanies this distribution. The full text of the license may be found at
|
|
# http://opensource.org/licenses/bsd-license.php.
|
|
#
|
|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
#
|
|
#------------------------------------------------------------------------------
|
|
|
|
.text
|
|
.p2align 2
|
|
GCC_ASM_EXPORT(DisableInterrupts)
|
|
|
|
.set DAIF_WR_IRQ_BIT, (1 << 1)
|
|
|
|
#/**
|
|
# Disables CPU interrupts.
|
|
#
|
|
#**/
|
|
#VOID
|
|
#EFIAPI
|
|
#DisableInterrupts (
|
|
# VOID
|
|
# );
|
|
#
|
|
ASM_PFX(DisableInterrupts):
|
|
msr daifset, #DAIF_WR_IRQ_BIT
|
|
ret
|