diff options
author | jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524> | 2009-12-16 23:29:20 +0000 |
---|---|---|
committer | jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524> | 2009-12-16 23:29:20 +0000 |
commit | d6d8e8925fbe83c353ffde27dcf35b77c22ec12d (patch) | |
tree | 8ca5a4073b0003fa3a991b275356b296d4b49354 | |
parent | 0913fadc1af9edf545d5dd4120e0a708dfb73af0 (diff) | |
download | edk2-d6d8e8925fbe83c353ffde27dcf35b77c22ec12d.zip edk2-d6d8e8925fbe83c353ffde27dcf35b77c22ec12d.tar.gz edk2-d6d8e8925fbe83c353ffde27dcf35b77c22ec12d.tar.bz2 |
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
-rw-r--r-- | UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.S | 81 | ||||
-rw-r--r-- | UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.asm | 8 |
2 files changed, 49 insertions, 40 deletions
diff --git a/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.S b/UefiCpuPkg/Library/BaseUefiCpuLib/Ia32/InitializeFpu.S index c4a2f6f..4c74957 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 55244c7..0834733 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
|