]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseLib/Ia32/LongJump.nasm
MdePkg/BaseLib: Add Shadow Stack Support for X86.
[mirror_edk2.git] / MdePkg / Library / BaseLib / Ia32 / LongJump.nasm
index 7ef03462eed35401a5341e93b34678db4b59528c..57305d4981f40c201624d43d6e06acb62b11eaf2 100644 (file)
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------\r
 ;\r
-; Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>\r
+; Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
 ; This program and the accompanying materials\r
 ; are licensed and made available under the terms and conditions of the BSD License\r
 ; which accompanies this distribution.  The full text of the license may be found at\r
 ;\r
 ;------------------------------------------------------------------------------\r
 \r
+%include "Nasm.inc"\r
+\r
     SECTION .text\r
 \r
+extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))\r
+\r
 ;------------------------------------------------------------------------------\r
 ; VOID\r
 ; EFIAPI\r
 ;------------------------------------------------------------------------------\r
 global ASM_PFX(InternalLongJump)\r
 ASM_PFX(InternalLongJump):\r
+\r
+    mov     eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))]\r
+    test    eax, eax\r
+    jz      CetDone\r
+    mov     eax, cr4\r
+    bt      eax, 23                ; check if CET is enabled\r
+    jnc     CetDone\r
+\r
+    mov     edx, [esp + 4]         ; edx = JumpBuffer\r
+    mov     edx, [edx + 24]        ; edx = target SSP\r
+    READSSP_EAX\r
+    sub     edx, eax               ; edx = delta\r
+    mov     eax, edx               ; eax = delta\r
+\r
+    shr     eax, 2                 ; eax = delta/sizeof(UINT32)\r
+    INCSSP_EAX\r
+\r
+CetDone:\r
+\r
     pop     eax                         ; skip return address\r
     pop     edx                         ; edx <- JumpBuffer\r
     pop     eax                         ; eax <- Value\r