]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/SmmBaseHelper/X64/PageFaultHandler.S
Save/Restore missing volatile registers (XMM0-5) save/restore in Page Fault handler.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / SmmBaseHelper / X64 / PageFaultHandler.S
index d14b9114d8f47264101bcb60c628970bad3843c2..f1b5ad7adb1296858190bdc247e98749093fcc5d 100644 (file)
@@ -1,6 +1,6 @@
 #------------------------------------------------------------------------------\r
 #\r
-# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2006 - 2012, 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
@@ -28,10 +28,28 @@ ASM_PFX(PageFaultHandlerHook):
     pushq    %r9\r
     pushq    %r10\r
     pushq    %r11\r
+\r
+    addq     $-0x68, %rsp                 # reserve memory to store XMM registers and make address 16-byte alignment\r
+    movdqa   %xmm0, 0(%rsp) \r
+    movdqa   %xmm1, 0x10(%rsp)\r
+    movdqa   %xmm2, 0x20(%rsp)\r
+    movdqa   %xmm3, 0x30(%rsp)\r
+    movdqa   %xmm4, 0x40(%rsp)\r
+    movdqa   %xmm5, 0x50(%rsp)\r
+\r
     addq     $-0x20, %rsp\r
     call     ASM_PFX(PageFaultHandler)\r
     addq     $0x20, %rsp\r
-    testb    %al, %al\r
+\r
+    movdqa   0(%rsp), %xmm0\r
+    movdqa   0x10(%rsp), %xmm1\r
+    movdqa   0x20(%rsp), %xmm2\r
+    movdqa   0x30(%rsp), %xmm3\r
+    movdqa   0x40(%rsp), %xmm4\r
+    movdqa   0x50(%rsp), %xmm5\r
+    addq     $0x68, %rsp\r
+\r
+    testb    %al, %al                     # set ZF flag\r
     popq     %r11\r
     popq     %r10\r
     popq     %r9\r
@@ -39,7 +57,7 @@ ASM_PFX(PageFaultHandlerHook):
     popq     %rdx\r
     popq     %rcx\r
     popq     %rax                         # restore all volatile registers\r
-    jnz      L1\r
+    jnz      L1                           # check ZF flag\r
 #ifdef __APPLE__\r
     int      $3\r
 #else\r