Variable service driver includes a call to AsmLfence. To reuse this
driver on AArch64 based platforms, add an implementation of AsmLfence
that acts as a wrapper on the AArch64 specific MemoryFence function.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jagadeesh Ujja <[email protected]>
---
 MdePkg/Include/Library/BaseLib.h             | 10 +++++
 MdePkg/Library/BaseLib/AArch64/AsmLfence.S   | 42 ++++++++++++++++++++
 MdePkg/Library/BaseLib/AArch64/AsmLfence.asm | 41 +++++++++++++++++++
 MdePkg/Library/BaseLib/BaseLib.inf           |  2 +
 4 files changed, 95 insertions(+)

diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h
index 8cc0869..595cf90 100644
--- a/MdePkg/Include/Library/BaseLib.h
+++ b/MdePkg/Include/Library/BaseLib.h
@@ -126,6 +126,16 @@ typedef struct {
 
 #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
 
+/**
+  Performs a serializing operation on all load-from-memory instructions that
+  were issued prior the AsmLfence function.
+**/
+VOID
+EFIAPI
+AsmLfence (
+  VOID
+  );
+
 #endif  // defined (MDE_CPU_AARCH64)
 
 
diff --git a/MdePkg/Library/BaseLib/AArch64/AsmLfence.S 
b/MdePkg/Library/BaseLib/AArch64/AsmLfence.S
new file mode 100644
index 0000000..2fd804b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/AArch64/AsmLfence.S
@@ -0,0 +1,42 @@
+##------------------------------------------------------------------------------
+#
+# AsmLfence() for AArch64
+#
+# Copyright (c) 2013-2018, ARM Ltd. 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.
+#
+##------------------------------------------------------------------------------
+
+.text
+.p2align 2
+
+GCC_ASM_EXPORT(AsmLfence)
+
+# IMPORT
+GCC_ASM_IMPORT(MemoryFence)
+
+#/**
+#  Used to serialize load and store operations.
+#
+#  All loads and stores that proceed calls to this function are guaranteed to 
be
+#  globally visible when this function returns.
+#
+#**/
+#VOID
+#EFIAPI
+#AsmLfence (
+#  VOID
+#  );
+#
+ASM_PFX(AsmLfence):
+    stp   x29, x30, [sp, #-16]!
+    bl MemoryFence
+    ldp   x29, x30, [sp], #0x10
+    ret
diff --git a/MdePkg/Library/BaseLib/AArch64/AsmLfence.asm 
b/MdePkg/Library/BaseLib/AArch64/AsmLfence.asm
new file mode 100644
index 0000000..7dd5659
--- /dev/null
+++ b/MdePkg/Library/BaseLib/AArch64/AsmLfence.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; AsmLfence() for AArch64
+;
+; Copyright (c) 2013-2018, ARM Ltd. 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.
+;
+;------------------------------------------------------------------------------
+
+  EXPORT AsmLfence
+  AREA BaseLib_LowLevel, CODE, READONLY
+  # IMPORT
+  GCC_ASM_IMPORT(MemoryFence)
+
+;/**
+;  Used to serialize load and store operations.
+;
+;  All loads and stores that proceed calls to this function are guaranteed to 
be
+;  globally visible when this function returns.
+;
+;**/
+;VOID
+;EFIAPI
+;AsmLfence (
+;  VOID
+;  );
+;
+AsmLfence
+    stp   x29, x30, [sp, #-16]!
+    bl MemoryFence
+    ldp   x29, x30, [sp], #0x10
+    ret
+
+  END
diff --git a/MdePkg/Library/BaseLib/BaseLib.inf 
b/MdePkg/Library/BaseLib/BaseLib.inf
index b84e583..b7d7bcb 100644
--- a/MdePkg/Library/BaseLib/BaseLib.inf
+++ b/MdePkg/Library/BaseLib/BaseLib.inf
@@ -585,6 +585,7 @@
   Math64.c
 
   AArch64/MemoryFence.S             | GCC
+  AArch64/AsmLfence.S               | GCC
   AArch64/SwitchStack.S             | GCC
   AArch64/EnableInterrupts.S        | GCC
   AArch64/DisableInterrupts.S       | GCC
@@ -593,6 +594,7 @@
   AArch64/CpuBreakpoint.S           | GCC
 
   AArch64/MemoryFence.asm           | MSFT
+  AArch64/AsmLfence.asm             | MSFT
   AArch64/SwitchStack.asm           | MSFT
   AArch64/EnableInterrupts.asm      | MSFT
   AArch64/DisableInterrupts.asm     | MSFT
-- 
2.7.4

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to