From d6d8e8925fbe83c353ffde27dcf35b77c22ec12d Mon Sep 17 00:00:00 2001 From: jljusten Date: Wed, 16 Dec 2009 23:29:20 +0000 Subject: 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 --- .../Library/BaseUefiCpuLib/Ia32/InitializeFpu.S | 81 ++++++++++++---------- .../Library/BaseUefiCpuLib/Ia32/InitializeFpu.asm | 8 ++- 2 files changed, 49 insertions(+), 40 deletions(-) (limited to 'UefiCpuPkg') 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 -- cgit v1.2.3