Files
system76-edk2/MdePkg/Library/BaseIoLibIntrinsic/Arm/ArmVirtMmio.asm
Ard Biesheuvel 9cabe9d457 MdePkg/BaseIoLibIntrinsicArmVirt ARM: avoid double word loads and stores
BaseIoLibIntrinsicArmVirt was created to prevent LTO from merging
accesses to MMIO regions, resulting in instructions with multiple
output registers that KVM on ARM cannot emulate (since the exception
syndrome information that KVM relies on can only describe a single
output register)

However, using double word loads on ARM amounts to the same thing,
and so code that relies on doing 64-bit MMIO to regions that are
emulated under KVM (such as the GICv3 TYPER register) will still
suffer from the original issue.

So replace ldrd and strd with equivalent two instruction sequences.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
2018-11-15 04:31:42 -08:00

152 lines
3.9 KiB
NASM

;
; Copyright (c) 2014-2018, Linaro Limited. All rights reserved.
;
; 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.
;
AREA IoLibMmio, CODE, READONLY
EXPORT MmioRead8Internal
EXPORT MmioWrite8Internal
EXPORT MmioRead16Internal
EXPORT MmioWrite16Internal
EXPORT MmioRead32Internal
EXPORT MmioWrite32Internal
EXPORT MmioRead64Internal
EXPORT MmioWrite64Internal
;
; Reads an 8-bit MMIO register.
;
; Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
; returned. This function must guarantee that all MMIO read and write
; operations are serialized.
;
; @param Address The MMIO register to read.
;
; @return The value read.
;
MmioRead8Internal
ldrb r0, [r0]
dmb
bx lr
;
; Writes an 8-bit MMIO register.
;
; Writes the 8-bit MMIO register specified by Address with the value specified
; by Value and returns Value. This function must guarantee that all MMIO read
; and write operations are serialized.
;
; @param Address The MMIO register to write.
; @param Value The value to write to the MMIO register.
;
MmioWrite8Internal
dmb st
strb r1, [r0]
bx lr
;
; Reads a 16-bit MMIO register.
;
; Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
; returned. This function must guarantee that all MMIO read and write
; operations are serialized.
;
; @param Address The MMIO register to read.
;
; @return The value read.
;
MmioRead16Internal
ldrh r0, [r0]
dmb
bx lr
;
; Writes a 16-bit MMIO register.
;
; Writes the 16-bit MMIO register specified by Address with the value specified
; by Value and returns Value. This function must guarantee that all MMIO read
; and write operations are serialized.
;
; @param Address The MMIO register to write.
; @param Value The value to write to the MMIO register.
;
MmioWrite16Internal
dmb st
strh r1, [r0]
bx lr
;
; Reads a 32-bit MMIO register.
;
; Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
; returned. This function must guarantee that all MMIO read and write
; operations are serialized.
;
; @param Address The MMIO register to read.
;
; @return The value read.
;
MmioRead32Internal
ldr r0, [r0]
dmb
bx lr
;
; Writes a 32-bit MMIO register.
;
; Writes the 32-bit MMIO register specified by Address with the value specified
; by Value and returns Value. This function must guarantee that all MMIO read
; and write operations are serialized.
;
; @param Address The MMIO register to write.
; @param Value The value to write to the MMIO register.
;
MmioWrite32Internal
dmb st
str r1, [r0]
bx lr
;
; Reads a 64-bit MMIO register.
;
; Reads the 64-bit MMIO register specified by Address. The 64-bit read value is
; returned. This function must guarantee that all MMIO read and write
; operations are serialized.
;
; @param Address The MMIO register to read.
;
; @return The value read.
;
MmioRead64Internal
ldr r1, [r0, #4]
ldr r0, [r0]
dmb
bx lr
;
; Writes a 64-bit MMIO register.
;
; Writes the 64-bit MMIO register specified by Address with the value specified
; by Value and returns Value. This function must guarantee that all MMIO read
; and write operations are serialized.
;
; @param Address The MMIO register to write.
; @param Value The value to write to the MMIO register.
;
MmioWrite64Internal
dmb st
str r2, [r0]
str r3, [r0, #4]
bx lr
END