diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index 8cc086983d..1eb842384e 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -5111,6 +5111,21 @@ CpuDeadLoop ( VOID ); + +/** + Uses as a barrier to stop speculative execution. + + Ensures that no later instruction will execute speculatively, until all prior + instructions have completed. + +**/ +VOID +EFIAPI +SpeculationBarrier ( + VOID + ); + + #if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) /// /// IA32 and x64 Specific Functions. diff --git a/MdePkg/Library/BaseLib/Arm/SpeculationBarrier.c b/MdePkg/Library/BaseLib/Arm/SpeculationBarrier.c new file mode 100644 index 0000000000..8a6165a102 --- /dev/null +++ b/MdePkg/Library/BaseLib/Arm/SpeculationBarrier.c @@ -0,0 +1,30 @@ +/** @file + SpeculationBarrier() function for ARM. + + Copyright (C) 2018, Intel Corporation. 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. + +**/ + + +/** + Uses as a barrier to stop speculative execution. + + Ensures that no later instruction will execute speculatively, until all prior + instructions have completed. + +**/ +VOID +EFIAPI +SpeculationBarrier ( + VOID + ) +{ +} diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index b84e58324c..d195c5417b 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -336,6 +336,7 @@ X86DisablePaging32.c X86RdRand.c X86PatchInstruction.c + X86SpeculationBarrier.c [Sources.X64] X64/Thunk16.nasm @@ -515,6 +516,7 @@ X86DisablePaging32.c X86RdRand.c X86PatchInstruction.c + X86SpeculationBarrier.c X64/GccInline.c | GCC X64/Thunk16.S | XCODE X64/SwitchStack.nasm| GCC @@ -543,12 +545,14 @@ Ebc/CpuBreakpoint.c Ebc/SetJumpLongJump.c Ebc/SwitchStack.c + Ebc/SpeculationBarrier.c Unaligned.c Math64.c [Sources.ARM] Arm/InternalSwitchStack.c Arm/Unaligned.c + Arm/SpeculationBarrier.c Math64.c | RVCT Math64.c | MSFT @@ -582,6 +586,7 @@ [Sources.AARCH64] Arm/InternalSwitchStack.c Arm/Unaligned.c + Arm/SpeculationBarrier.c Math64.c AArch64/MemoryFence.S | GCC diff --git a/MdePkg/Library/BaseLib/Ebc/SpeculationBarrier.c b/MdePkg/Library/BaseLib/Ebc/SpeculationBarrier.c new file mode 100644 index 0000000000..8fa4c204f8 --- /dev/null +++ b/MdePkg/Library/BaseLib/Ebc/SpeculationBarrier.c @@ -0,0 +1,30 @@ +/** @file + SpeculationBarrier() function for EBC. + + Copyright (C) 2018, Intel Corporation. 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. + +**/ + + +/** + Uses as a barrier to stop speculative execution. + + Ensures that no later instruction will execute speculatively, until all prior + instructions have completed. + +**/ +VOID +EFIAPI +SpeculationBarrier ( + VOID + ) +{ +} diff --git a/MdePkg/Library/BaseLib/X86SpeculationBarrier.c b/MdePkg/Library/BaseLib/X86SpeculationBarrier.c new file mode 100644 index 0000000000..03deca8489 --- /dev/null +++ b/MdePkg/Library/BaseLib/X86SpeculationBarrier.c @@ -0,0 +1,32 @@ +/** @file + SpeculationBarrier() function for IA32 and x64. + + Copyright (C) 2018, Intel Corporation. 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. + +**/ + +#include + +/** + Uses as a barrier to stop speculative execution. + + Ensures that no later instruction will execute speculatively, until all prior + instructions have completed. + +**/ +VOID +EFIAPI +SpeculationBarrier ( + VOID + ) +{ + AsmLfence (); +}