aboutsummaryrefslogtreecommitdiffstats
path: root/roms/edk2/MdePkg/Library/BaseStackCheckLib
diff options
context:
space:
mode:
Diffstat (limited to 'roms/edk2/MdePkg/Library/BaseStackCheckLib')
-rw-r--r--roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckGcc.c49
-rw-r--r--roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf40
-rw-r--r--roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.uni16
-rw-r--r--roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c9
4 files changed, 114 insertions, 0 deletions
diff --git a/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckGcc.c b/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckGcc.c
new file mode 100644
index 000000000..d3efb8e46
--- /dev/null
+++ b/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckGcc.c
@@ -0,0 +1,49 @@
+/** @file
+ Base Stack Check library for GCC/clang.
+
+ Use -fstack-protector-all compiler flag to make the compiler insert the
+ __stack_chk_guard "canary" value into the stack and check the value prior
+ to exiting the function. If the "canary" is overwritten __stack_chk_fail()
+ is called. This is GCC specific code.
+
+ Copyright (c) 2012, Apple Inc. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+
+/// "canary" value that is inserted by the compiler into the stack frame.
+VOID *__stack_chk_guard = (VOID*)0x0AFF;
+
+// If ASLR was enabled we could use
+//void (*__stack_chk_guard)(void) = __stack_chk_fail;
+
+/**
+ Error path for compiler generated stack "canary" value check code. If the
+ stack canary has been overwritten this function gets called on exit of the
+ function.
+**/
+VOID
+__stack_chk_fail (
+ VOID
+ )
+{
+ UINT8 DebugPropertyMask;
+
+ DEBUG ((DEBUG_ERROR, "STACK FAULT: Buffer Overflow in function %a.\n", __builtin_return_address(0)));
+
+ //
+ // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings even if
+ // BaseDebugLibNull is in use.
+ //
+ DebugPropertyMask = PcdGet8 (PcdDebugPropertyMask);
+ if ((DebugPropertyMask & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) {
+ CpuBreakpoint ();
+ } else if ((DebugPropertyMask & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) {
+ CpuDeadLoop ();
+ }
+}
diff --git a/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf b/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
new file mode 100644
index 000000000..0dc3c4a83
--- /dev/null
+++ b/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
@@ -0,0 +1,40 @@
+## @file
+# Stack Check Library
+#
+# Stack Check Library
+#
+# Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = BaseStackCheckLib
+ MODULE_UNI_FILE = BaseStackCheckLib.uni
+ FILE_GUID = 5f6579f7-b648-4fdb-9f19-4c17e27e8eff
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = NULL
+
+
+#
+# VALID_ARCHITECTURES = ARM AARCH64
+#
+
+[Sources]
+ BaseStackCheckGcc.c | GCC
+ BaseStackCheckGcc.c | RVCT
+ BaseStackCheckNull.c | MSFT
+
+[Packages]
+ MdePkg/MdePkg.dec
+
+[LibraryClasses]
+ BaseLib
+ DebugLib
+
+[Pcd]
+ gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask ## CONSUMES
diff --git a/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.uni b/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.uni
new file mode 100644
index 000000000..03b9d7cd5
--- /dev/null
+++ b/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.uni
@@ -0,0 +1,16 @@
+// /** @file
+// Stack Check Library
+//
+// Stack Check Library
+//
+// Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+// **/
+
+
+#string STR_MODULE_ABSTRACT #language en-US "Stack Check Library"
+
+#string STR_MODULE_DESCRIPTION #language en-US "Stack Check Library"
+
diff --git a/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c b/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c
new file mode 100644
index 000000000..7032b78b3
--- /dev/null
+++ b/roms/edk2/MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c
@@ -0,0 +1,9 @@
+/** @file
+ This file is purely empty as a work around for BaseStackCheck to pass MSVC build.
+
+ Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+extern int __BaseStackCheckNull;