summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg/Library/BaseUefiCpuLib
diff options
context:
space:
mode:
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>2009-12-16 23:29:20 +0000
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>2009-12-16 23:29:20 +0000
commitd6d8e8925fbe83c353ffde27dcf35b77c22ec12d (patch)
tree8ca5a4073b0003fa3a991b275356b296d4b49354 /UefiCpuPkg/Library/BaseUefiCpuLib
parent0913fadc1af9edf545d5dd4120e0a708dfb73af0 (diff)
downloadedk2-d6d8e8925fbe83c353ffde27dcf35b77c22ec12d.tar.gz
edk2-d6d8e8925fbe83c353ffde27dcf35b77c22ec12d.tar.bz2
edk2-d6d8e8925fbe83c353ffde27dcf35b77c22ec12d.zip
BaseUefiCpuLib: Preserve EBX register in InitializeFloatingPointUnits
The EBX register should be preserved for the IA32 C calling convention. The use of the CPUID instruction was modifying the EBX register, so we push and pop EBX. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9573 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'UefiCpuPkg/Library/BaseUefiCpuLib')
-rw-r--r--UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.S81
-rw-r--r--UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.asm8
2 files changed, 49 insertions, 40 deletions
diff --git a/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.S b/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.S
index c4a2f6fb83..4c74957f04 100644
--- a/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.S
+++ b/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.S
@@ -1,19 +1,19 @@
-#------------------------------------------------------------------------------
-#*
-#* Copyright 2009, 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
-#* http://opensource.org/licenses/bsd-license.php
-#*
-#* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-#* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#*
-#*
-#------------------------------------------------------------------------------
-
-
-
+#------------------------------------------------------------------------------
+#*
+#* Copyright 2009, 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
+#* http://opensource.org/licenses/bsd-license.php
+#*
+#* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#*
+#*
+#------------------------------------------------------------------------------
+
+
+
#
# Float control word initial value:
# all exceptions masked, double-precision, round-to-nearest
@@ -23,18 +23,21 @@ ASM_PFX(mFpuControlWord): .word 0x027F
# Multimedia-extensions control word:
# all exceptions masked, round-to-nearest, flush to zero for masked underflow
#
-ASM_PFX(mMmxControlWord): .long 0x01F80
-
-#
+ASM_PFX(mMmxControlWord): .long 0x01F80
+
+#
# 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):
+# for masked underflow).
+#
+ASM_GLOBAL ASM_PFX(InitializeFloatingPointUnits)
+ASM_PFX(InitializeFloatingPointUnits):
+
+ pushl %ebx
+
#
# Initialize floating point units
#
@@ -49,22 +52,24 @@ ASM_PFX(InitializeFloatingPointUnits):
cpuid
btl $25, %edx
jnc Done
-
- #
- # Set OSFXSR bit 9 in CR4
- #
- movl %cr4, %eax
- or $200, %eax
- movl %eax, %cr4
-
+
+ #
+ # Set OSFXSR bit 9 in CR4
+ #
+ movl %cr4, %eax
+ or $200, %eax
+ movl %eax, %cr4
+
#
# The processor should support SSE instruction and we can use
# ldmxcsr instruction
#
- ldmxcsr ASM_PFX(mMmxControlWord)
-
-Done:
- ret
-
-#END
-
+ ldmxcsr ASM_PFX(mMmxControlWord)
+
+Done:
+ popl %ebx
+
+ ret
+
+#END
+
diff --git a/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.asm b/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.asm
index 55244c72a9..083473311e 100644
--- a/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.asm
+++ b/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.asm
@@ -30,15 +30,18 @@ mMmxControlWord DD 01F80h
.xmm
.code
-;
+;
; 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).
+; for masked underflow).
;
InitializeFloatingPointUnits PROC PUBLIC
+
+ push ebx
+
;
; Initialize floating point units
;
@@ -67,6 +70,7 @@ InitializeFloatingPointUnits PROC PUBLIC
;
ldmxcsr mMmxControlWord
Done:
+ pop ebx
ret