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>
152 lines
3.9 KiB
NASM
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
|