From aa51ba93a561ac0d8d3b0c999f873d781e372900 Mon Sep 17 00:00:00 2001
From: Harry Liebel <Harry.Liebel@arm.com>
Date: Fri, 28 Jun 2013 15:16:15 +0100
Subject: Add Memory fence for AArch64.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Harry Liebel <Harry.Liebel@arm.com>
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
---
 MdePkg/Library/BaseLib/AArch64/MemoryFence.S |   37 ++++++++++++++++++++++++++
 MdePkg/Library/BaseLib/BaseLib.inf           |    1 +
 2 files changed, 38 insertions(+), 0 deletions(-)
 create mode 100644 MdePkg/Library/BaseLib/AArch64/MemoryFence.S

diff --git a/MdePkg/Library/BaseLib/AArch64/MemoryFence.S b/MdePkg/Library/BaseLib/AArch64/MemoryFence.S
new file mode 100644
index 0000000..2e6ca2c
--- /dev/null
+++ b/MdePkg/Library/BaseLib/AArch64/MemoryFence.S
@@ -0,0 +1,37 @@
+##------------------------------------------------------------------------------
+#
+# MemoryFence() for AArch64
+#
+# Copyright (c) 2013, 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
+ASM_GLOBAL ASM_PFX(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
+#MemoryFence (
+#  VOID
+#  );
+#
+ASM_PFX(MemoryFence):
+    // System wide Data Memory Barrier.
+    dmb sy
+    ret
diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf
index 3e47b55..09f9f33 100644
--- a/MdePkg/Library/BaseLib/BaseLib.inf
+++ b/MdePkg/Library/BaseLib/BaseLib.inf
@@ -482,6 +482,7 @@
   Arm/Unaligned.c
   Math64.c
 
+  AArch64/MemoryFence.S             | GCC
   AArch64/SwitchStack.S             | GCC
   AArch64/EnableInterrupts.S        | GCC
   AArch64/DisableInterrupts.S       | GCC
-- 
1.7.0.4

