]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/X64/ProcessorAsms.Asm
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Pei / PeiLib / X64 / ProcessorAsms.Asm
index b6be0b2f60e544b6b11ac587f0ee7fba0bfc556d..418400c15a14269c044b91f2e3efc9375171d2e2 100644 (file)
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------\r
 ;\r
-; Copyright (c) 2005 - 2007, Intel Corporation. All rights reserved.<BR>\r
+; Copyright (c) 2005 - 2010, 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
@@ -73,6 +73,8 @@ _r13            QWORD           ?
 _r14            QWORD           ?\r
 _r15            QWORD           ?\r
 _rip            QWORD           ?\r
+_MxCsr          DWORD           ?\r
+_XmmBuffer      DB              160 DUP (?)\r
 _EFI_JUMP_BUFFER                ENDS\r
 \r
 EFI_JUMP_BUFFER         TYPEDEF         _EFI_JUMP_BUFFER\r
@@ -116,6 +118,19 @@ TransferControlSetJump  PROC
   mov   (EFI_JUMP_BUFFER PTR [rdx])._r13, r13\r
   mov   (EFI_JUMP_BUFFER PTR [rdx])._r14, r14\r
   mov   (EFI_JUMP_BUFFER PTR [rdx])._r15, r15\r
+  ; save non-volatile fp registers\r
+  stmxcsr    (EFI_JUMP_BUFFER PTR [rdx])._MxCsr\r
+  lea   rax, (EFI_JUMP_BUFFER PTR [rdx])._XmmBuffer\r
+  movdqu [rax], xmm6\r
+  movdqu [rax + 10h], xmm7\r
+  movdqu [rax + 20h], xmm8\r
+  movdqu [rax + 30h], xmm9\r
+  movdqu [rax + 40h], xmm10\r
+  movdqu [rax + 50h], xmm11\r
+  movdqu [rax + 60h], xmm12\r
+  movdqu [rax + 70h], xmm13\r
+  movdqu [rax + 80h], xmm14\r
+  movdqu [rax + 90h], xmm15\r
   mov   rax, QWORD PTR [rsp+0]\r
   mov   (EFI_JUMP_BUFFER PTR [rdx])._rip, rax\r
   mov   rax, EFI_SUCCESS  \r
@@ -134,6 +149,19 @@ TransferControlSetJump      ENDP
 ;\r
 PUBLIC  TransferControlLongJump\r
 TransferControlLongJump  PROC  \r
+  ; load non-volatile fp registers\r
+  ldmxcsr    (EFI_JUMP_BUFFER PTR [rdx])._MxCsr\r
+  lea   rax, (EFI_JUMP_BUFFER PTR [rdx])._XmmBuffer\r
+  movdqu xmm6, [rax]\r
+  movdqu xmm7, [rax + 10h]\r
+  movdqu xmm8, [rax + 20h]\r
+  movdqu xmm9, [rax + 30h]\r
+  movdqu xmm10, [rax + 40h]\r
+  movdqu xmm11, [rax + 50h]\r
+  movdqu xmm12, [rax + 60h]\r
+  movdqu xmm13, [rax + 70h]\r
+  movdqu xmm14, [rax + 80h]\r
+  movdqu xmm15, [rax + 90h]\r
   ; set return from SetJump to EFI_WARN_RETURN_FROM_LONG_JUMP\r
   mov   rax, EFI_WARN_RETURN_FROM_LONG_JUMP          \r
   mov   rbx, (EFI_JUMP_BUFFER PTR [rdx])._rbx\r