]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Save/Restore missing volatile registers (XMM0-5) save/restore in Page Fault handler.
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 28 Nov 2012 04:49:48 +0000 (04:49 +0000)
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 28 Nov 2012 04:49:48 +0000 (04:49 +0000)
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13974 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/SmmBaseHelper/X64/PageFaultHandler.S
EdkCompatibilityPkg/Compatibility/SmmBaseHelper/X64/PageFaultHandler.asm

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
index d1c7bf972df808d4d8f3f311f622a0654fbedcdc..d58a04bcfbcb4b6bb53a94312c7bdc083a11e57f 100644 (file)
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------
 ;
-; Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2010 - 2012, 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
@@ -32,10 +32,28 @@ PageFaultHandlerHook PROC
     push    r9
     push    r10
     push    r11
+
+    add     rsp, -10h * 6 - 8          ; reserve memory to store XMM registers and make address 16-byte alignment
+    movdqa  [rsp], xmm0
+    movdqa  [rsp + 10h], xmm1
+    movdqa  [rsp + 20h], xmm2
+    movdqa  [rsp + 30h], xmm3
+    movdqa  [rsp + 40h], xmm4
+    movdqa  [rsp + 50h], xmm5
+
     add     rsp, -20h
     call    PageFaultHandler
     add     rsp, 20h
-    test    al, al
+
+    movdqa  xmm0, [rsp]
+    movdqa  xmm1, [rsp + 10h] 
+    movdqa  xmm2, [rsp + 20h]
+    movdqa  xmm3, [rsp + 30h]
+    movdqa  xmm4, [rsp + 40h]
+    movdqa  xmm5, [rsp + 50h]
+    add     rsp, 10h * 6 + 8
+    
+    test    al, al                      ; set ZF flag
     pop     r11
     pop     r10
     pop     r9
@@ -43,7 +61,7 @@ PageFaultHandlerHook PROC
     pop     rdx
     pop     rcx
     pop     rax                         ; restore all volatile registers
-    jnz     @F
+    jnz     @F                          ; check ZF flag
     jmp     mOriginalHandler
 @@:
     add     rsp, 08h                    ; skip error code for PF