Removed use of pre-initialized global data in this file as it was causing problems...
[mirror_edk2.git] / UefiCpuPkg / Library / BaseUefiCpuLib / X64 / InitializeFpu.S
index 3d1556daa2d5116a8361a61e4ca1e98357d2b112..bf8d1c13e46cc650b71a6a7515289c4fa9816075 100644 (file)
@@ -1,6 +1,6 @@
 #------------------------------------------------------------------------------
 #*
-#*   Copyright 2009, Intel Corporation
+#*   Copyright 2009 - 2010, Intel Corporation
 #*   All rights reserved. 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
 #*
 #------------------------------------------------------------------------------
 
-
-#\r
-# Float control word initial value: \r
-# all exceptions masked, double-precision, round-to-nearest\r
-#\r
-ASM_PFX(mFpuControlWord): .word     0x027F\r
-#\r
-# Multimedia-extensions control word:\r
-# all exceptions masked, round-to-nearest, flush to zero for masked underflow\r
-#\r
-ASM_PFX(mMmxControlWord): .long     0x01F80\r
-
 #
-# Initializes floating point units for requirement of UEFI specification.\r
-#\r
-# This function initializes floating-point control word to 0x027F (all exceptions\r
-# masked,double-precision, round-to-nearest) and multimedia-extensions control word\r
-# (if supported) to 0x1F80 (all exceptions masked, round-to-nearest, flush to zero\r
+# Initializes floating point units for requirement of UEFI specification.
+#
+# This function initializes floating-point control word to 0x027F (all exceptions
+# masked,double-precision, round-to-nearest) and multimedia-extensions control word
+# (if supported) to 0x1F80 (all exceptions masked, round-to-nearest, flush to zero
 # for masked underflow).
 #
 ASM_GLOBAL ASM_PFX(InitializeFloatingPointUnits)
 ASM_PFX(InitializeFloatingPointUnits):
 
-    #\r
-    # Initialize floating point units\r
-    #\r
-    finit\r
-    fldcw   ASM_PFX(mFpuControlWord)\r
+    #
+    # Initialize floating point units
+    #
+    finit
+    
+    #
+    # Float control word initial value: 
+    # all exceptions masked, double-precision, round-to-nearest
+    #
+    pushq   $0x027F
+    lea     (%rsp), %rax 
+    fldcw   (%rax)
+    popq    %rax
     
     #
     # Set OSFXSR bit 9 in CR4
@@ -47,8 +43,15 @@ ASM_PFX(InitializeFloatingPointUnits):
     movq    %cr4, %rax 
     or      $200, %rax
     movq    %rax, %cr4
-    
-    ldmxcsr ASM_PFX(mMmxControlWord)
+
+    #
+    # Multimedia-extensions control word:
+    # all exceptions masked, round-to-nearest, flush to zero for masked underflow
+    #    
+    pushq   $0x01F80
+    lea     (%rsp), %rax
+    ldmxcsr (%rax)
+    popq    %rax
     
     ret