summaryrefslogtreecommitdiffstats
path: root/MdePkg/Library/BaseLib/Ia32/SetJump.c
diff options
context:
space:
mode:
Diffstat (limited to 'MdePkg/Library/BaseLib/Ia32/SetJump.c')
-rw-r--r--MdePkg/Library/BaseLib/Ia32/SetJump.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/MdePkg/Library/BaseLib/Ia32/SetJump.c b/MdePkg/Library/BaseLib/Ia32/SetJump.c
index 652d45d53b..d608fd9ccb 100644
--- a/MdePkg/Library/BaseLib/Ia32/SetJump.c
+++ b/MdePkg/Library/BaseLib/Ia32/SetJump.c
@@ -1,7 +1,7 @@
/** @file
Implementation of SetJump() on IA-32.
- Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
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
@@ -62,6 +62,32 @@ SetJump (
pop ecx
pop ecx
mov edx, [esp]
+
+ xor eax, eax
+ mov [edx + 24], eax ; save 0 to SSP
+
+ mov eax, [PcdGet32 (PcdControlFlowEnforcementPropertyMask)]
+ test eax, eax
+ jz CetDone
+ _emit 0x0F
+ _emit 0x20
+ _emit 0xE0 ; mov eax, cr4
+ bt eax, 23 ; check if CET is enabled
+ jnc CetDone
+
+ mov eax, 1
+ _emit 0xF3
+ _emit 0x0F
+ _emit 0xAE
+ _emit 0xE8 ; INCSSP EAX to read original SSP
+ _emit 0xF3
+ _emit 0x0F
+ _emit 0x1E
+ _emit 0xC8 ; READSSP EAX
+ mov [edx + 0x24], eax ; save SSP
+
+CetDone:
+
mov [edx], ebx
mov [edx + 4], esi
mov [edx + 8], edi