From: Michael Kinney Date: Mon, 27 Apr 2015 19:54:52 +0000 (+0000) Subject: UefiCpuPkg/CpuExceptionHandlerLib: Support IA32 processors without DE or FXSAVE/FXRESTOR X-Git-Tag: edk2-stable201903~9993 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=087c67d0a0847f61b70fa565361ff88fe80e46e5 UefiCpuPkg/CpuExceptionHandlerLib: Support IA32 processors without DE or FXSAVE/FXRESTOR Use CPUID Leaf 01 to detect support for debug extensions and FXSAVE/FXRESTOR instructions. Do not enable those features in CR4 if they are not supported. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Michael Kinney Reviewed-by: Jordan Justen Reviewed-by: Jeff Fan git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17221 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf index 85e01aad1e..316ed55b2a 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf @@ -1,7 +1,7 @@ ## @file # CPU Exception Handler library instance for DXE modules. # -# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2013 - 2015, 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 @@ -18,7 +18,7 @@ MODULE_UNI_FILE = DxeCpuExceptionHandlerLib.uni FILE_GUID = B6E9835A-EDCF-4748-98A8-27D3C722E02D MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 + VERSION_STRING = 1.1 LIBRARY_CLASS = CpuExceptionHandlerLib|DXE_CORE DXE_DRIVER UEFI_APPLICATION # diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ExceptionHandlerAsm.S b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ExceptionHandlerAsm.S index 627f3e513c..3676809b4b 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ExceptionHandlerAsm.S +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ExceptionHandlerAsm.S @@ -1,6 +1,6 @@ #------------------------------------------------------------------------------ #* -#* Copyright (c) 2012 - 2013, Intel Corporation. All rights reserved.
+#* Copyright (c) 2012 - 2015, 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 @@ -447,10 +447,25 @@ ErrorCodeAndVectorOnStack: pushl %eax #; UINT32 Cr0, Cr1, Cr2, Cr3, Cr4; +## insure FXSAVE/FXRSTOR is enabled in CR4... +## ... while we're at it, make sure DE is also enabled... + mov $1, %eax + pushl %ebx # temporarily save value of ebx on stack + cpuid # use CPUID to determine if FXSAVE/FXRESTOR + # and DE are supported + popl %ebx # retore value of ebx that was overwritten + # by CPUID movl %cr4, %eax - orl $0x208, %eax + pushl %eax # push cr4 firstly + testl $BIT24, %edx # Test for FXSAVE/FXRESTOR support + jz L1 + orl $BIT9, %eax # Set CR4.OSFXSR +L1: + testl $BIT2, %edx # Test for Debugging Extensions support + jz L2 + orl $BIT3, %eax # Set CR4.DE +L2: movl %eax, %cr4 - pushl %eax movl %cr3, %eax pushl %eax movl %cr2, %eax @@ -477,7 +492,11 @@ ErrorCodeAndVectorOnStack: #; FX_SAVE_STATE_IA32 FxSaveState; subl $512, %esp movl %esp, %edi + testl $BIT24, %edx # Test for FXSAVE/FXRESTOR support. + # edx still contains result from CPUID above + jz L3 .byte 0x0f, 0x0ae, 0x07 #fxsave [edi] +L3: #; UEFI calling convention for IA32 requires that Direction flag in EFLAGs is clear cld @@ -503,7 +522,13 @@ ErrorCodeAndVectorOnStack: #; FX_SAVE_STATE_IA32 FxSaveState; movl %esp, %esi + movl $1, %eax + cpuid # use CPUID to determine if FXSAVE/FXRESTOR + # are supported + testl $BIT24, %edx # Test for FXSAVE/FXRESTOR support + jz L4 .byte 0x0f, 0x0ae, 0x0e # fxrstor [esi] +L4: addl $512, %esp #; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7; diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ExceptionHandlerAsm.asm b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ExceptionHandlerAsm.asm index 3ff01b2a0c..12bbec0690 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ExceptionHandlerAsm.asm +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ExceptionHandlerAsm.asm @@ -1,5 +1,5 @@ ;------------------------------------------------------------------------------ ; -; Copyright (c) 2012 - 2013, Intel Corporation. All rights reserved.
+; Copyright (c) 2012 - 2015, 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 @@ -250,10 +250,22 @@ ErrorCodeAndVectorOnStack: push eax ;; UINT32 Cr0, Cr1, Cr2, Cr3, Cr4; + mov eax, 1 + push ebx ; temporarily save value of ebx on stack + cpuid ; use CPUID to determine if FXSAVE/FXRESTOR and DE + ; are supported + pop ebx ; retore value of ebx that was overwritten by CPUID mov eax, cr4 - or eax, 208h + push eax ; push cr4 firstly + test edx, BIT24 ; Test for FXSAVE/FXRESTOR support + jz @F + or eax, BIT9 ; Set CR4.OSFXSR +@@: + test edx, BIT2 ; Test for Debugging Extensions support + jz @F + or eax, BIT3 ; Set CR4.DE +@@: mov cr4, eax - push eax mov eax, cr3 push eax mov eax, cr2 @@ -280,7 +292,11 @@ ErrorCodeAndVectorOnStack: ;; FX_SAVE_STATE_IA32 FxSaveState; sub esp, 512 mov edi, esp + test edx, BIT24 ; Test for FXSAVE/FXRESTOR support. + ; edx still contains result from CPUID above + jz @F db 0fh, 0aeh, 07h ;fxsave [edi] +@@: ;; UEFI calling convention for IA32 requires that Direction flag in EFLAGs is clear cld @@ -307,7 +323,13 @@ ErrorCodeAndVectorOnStack: ;; FX_SAVE_STATE_IA32 FxSaveState; mov esi, esp + mov eax, 1 + cpuid ; use CPUID to determine if FXSAVE/FXRESTOR + ; are supported + test edx, BIT24 ; Test for FXSAVE/FXRESTOR support + jz @F db 0fh, 0aeh, 0eh ; fxrstor [esi] +@@: add esp, 512 ;; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7; diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf index 0530a15024..951a6fe62c 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf @@ -1,7 +1,7 @@ ## @file # CPU Exception Handler library instance for SEC/PEI modules. # -# Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2012 - 2015, 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 @@ -18,7 +18,7 @@ MODULE_UNI_FILE = SecPeiCpuExceptionHandlerLib.uni FILE_GUID = CA4BBC99-DFC6-4234-B553-8B6586B7B113 MODULE_TYPE = PEIM - VERSION_STRING = 1.0 + VERSION_STRING = 1.1 LIBRARY_CLASS = CpuExceptionHandlerLib|SEC PEI_CORE PEIM # diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf index 582fc8a9cf..59f2d4d26d 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf @@ -1,7 +1,7 @@ ## @file # CPU Exception Handler library instance for SMM modules. # -# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2013 - 2015, 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 @@ -18,7 +18,7 @@ MODULE_UNI_FILE = SmmCpuExceptionHandlerLib.uni FILE_GUID = 8D2C439B-3981-42ff-9CE5-1B50ECA502D6 MODULE_TYPE = DXE_SMM_DRIVER - VERSION_STRING = 1.0 + VERSION_STRING = 1.1 LIBRARY_CLASS = CpuExceptionHandlerLib|DXE_SMM_DRIVER #