mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-06 13:24:23 +02:00
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 <michael.d.kinney@intel.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Jeff Fan <jeff.fan@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17221 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
5f72e68c90
commit
087c67d0a0
@ -1,7 +1,7 @@
|
|||||||
## @file
|
## @file
|
||||||
# CPU Exception Handler library instance for DXE modules.
|
# CPU Exception Handler library instance for DXE modules.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# 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
|
# which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -18,7 +18,7 @@
|
|||||||
MODULE_UNI_FILE = DxeCpuExceptionHandlerLib.uni
|
MODULE_UNI_FILE = DxeCpuExceptionHandlerLib.uni
|
||||||
FILE_GUID = B6E9835A-EDCF-4748-98A8-27D3C722E02D
|
FILE_GUID = B6E9835A-EDCF-4748-98A8-27D3C722E02D
|
||||||
MODULE_TYPE = DXE_DRIVER
|
MODULE_TYPE = DXE_DRIVER
|
||||||
VERSION_STRING = 1.0
|
VERSION_STRING = 1.1
|
||||||
LIBRARY_CLASS = CpuExceptionHandlerLib|DXE_CORE DXE_DRIVER UEFI_APPLICATION
|
LIBRARY_CLASS = CpuExceptionHandlerLib|DXE_CORE DXE_DRIVER UEFI_APPLICATION
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
#*
|
#*
|
||||||
#* Copyright (c) 2012 - 2013, Intel Corporation. All rights reserved.<BR>
|
#* Copyright (c) 2012 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
#* This program and the accompanying materials
|
#* This program and the accompanying materials
|
||||||
#* are licensed and made available under the terms and conditions of the BSD License
|
#* 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
|
#* which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -447,10 +447,25 @@ ErrorCodeAndVectorOnStack:
|
|||||||
pushl %eax
|
pushl %eax
|
||||||
|
|
||||||
#; UINT32 Cr0, Cr1, Cr2, Cr3, Cr4;
|
#; 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
|
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
|
movl %eax, %cr4
|
||||||
pushl %eax
|
|
||||||
movl %cr3, %eax
|
movl %cr3, %eax
|
||||||
pushl %eax
|
pushl %eax
|
||||||
movl %cr2, %eax
|
movl %cr2, %eax
|
||||||
@ -477,7 +492,11 @@ ErrorCodeAndVectorOnStack:
|
|||||||
#; FX_SAVE_STATE_IA32 FxSaveState;
|
#; FX_SAVE_STATE_IA32 FxSaveState;
|
||||||
subl $512, %esp
|
subl $512, %esp
|
||||||
movl %esp, %edi
|
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]
|
.byte 0x0f, 0x0ae, 0x07 #fxsave [edi]
|
||||||
|
L3:
|
||||||
|
|
||||||
#; UEFI calling convention for IA32 requires that Direction flag in EFLAGs is clear
|
#; UEFI calling convention for IA32 requires that Direction flag in EFLAGs is clear
|
||||||
cld
|
cld
|
||||||
@ -503,7 +522,13 @@ ErrorCodeAndVectorOnStack:
|
|||||||
|
|
||||||
#; FX_SAVE_STATE_IA32 FxSaveState;
|
#; FX_SAVE_STATE_IA32 FxSaveState;
|
||||||
movl %esp, %esi
|
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]
|
.byte 0x0f, 0x0ae, 0x0e # fxrstor [esi]
|
||||||
|
L4:
|
||||||
addl $512, %esp
|
addl $512, %esp
|
||||||
|
|
||||||
#; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
|
#; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
;------------------------------------------------------------------------------ ;
|
;------------------------------------------------------------------------------ ;
|
||||||
; Copyright (c) 2012 - 2013, Intel Corporation. All rights reserved.<BR>
|
; Copyright (c) 2012 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
; This program and the accompanying materials
|
; This program and the accompanying materials
|
||||||
; are licensed and made available under the terms and conditions of the BSD License
|
; 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
|
; which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -250,10 +250,22 @@ ErrorCodeAndVectorOnStack:
|
|||||||
push eax
|
push eax
|
||||||
|
|
||||||
;; UINT32 Cr0, Cr1, Cr2, Cr3, Cr4;
|
;; 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
|
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
|
mov cr4, eax
|
||||||
push eax
|
|
||||||
mov eax, cr3
|
mov eax, cr3
|
||||||
push eax
|
push eax
|
||||||
mov eax, cr2
|
mov eax, cr2
|
||||||
@ -280,7 +292,11 @@ ErrorCodeAndVectorOnStack:
|
|||||||
;; FX_SAVE_STATE_IA32 FxSaveState;
|
;; FX_SAVE_STATE_IA32 FxSaveState;
|
||||||
sub esp, 512
|
sub esp, 512
|
||||||
mov edi, esp
|
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]
|
db 0fh, 0aeh, 07h ;fxsave [edi]
|
||||||
|
@@:
|
||||||
|
|
||||||
;; UEFI calling convention for IA32 requires that Direction flag in EFLAGs is clear
|
;; UEFI calling convention for IA32 requires that Direction flag in EFLAGs is clear
|
||||||
cld
|
cld
|
||||||
@ -307,7 +323,13 @@ ErrorCodeAndVectorOnStack:
|
|||||||
|
|
||||||
;; FX_SAVE_STATE_IA32 FxSaveState;
|
;; FX_SAVE_STATE_IA32 FxSaveState;
|
||||||
mov esi, esp
|
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]
|
db 0fh, 0aeh, 0eh ; fxrstor [esi]
|
||||||
|
@@:
|
||||||
add esp, 512
|
add esp, 512
|
||||||
|
|
||||||
;; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
|
;; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
## @file
|
## @file
|
||||||
# CPU Exception Handler library instance for SEC/PEI modules.
|
# CPU Exception Handler library instance for SEC/PEI modules.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2012 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# 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
|
# which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -18,7 +18,7 @@
|
|||||||
MODULE_UNI_FILE = SecPeiCpuExceptionHandlerLib.uni
|
MODULE_UNI_FILE = SecPeiCpuExceptionHandlerLib.uni
|
||||||
FILE_GUID = CA4BBC99-DFC6-4234-B553-8B6586B7B113
|
FILE_GUID = CA4BBC99-DFC6-4234-B553-8B6586B7B113
|
||||||
MODULE_TYPE = PEIM
|
MODULE_TYPE = PEIM
|
||||||
VERSION_STRING = 1.0
|
VERSION_STRING = 1.1
|
||||||
LIBRARY_CLASS = CpuExceptionHandlerLib|SEC PEI_CORE PEIM
|
LIBRARY_CLASS = CpuExceptionHandlerLib|SEC PEI_CORE PEIM
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
## @file
|
## @file
|
||||||
# CPU Exception Handler library instance for SMM modules.
|
# CPU Exception Handler library instance for SMM modules.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# 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
|
# which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -18,7 +18,7 @@
|
|||||||
MODULE_UNI_FILE = SmmCpuExceptionHandlerLib.uni
|
MODULE_UNI_FILE = SmmCpuExceptionHandlerLib.uni
|
||||||
FILE_GUID = 8D2C439B-3981-42ff-9CE5-1B50ECA502D6
|
FILE_GUID = 8D2C439B-3981-42ff-9CE5-1B50ECA502D6
|
||||||
MODULE_TYPE = DXE_SMM_DRIVER
|
MODULE_TYPE = DXE_SMM_DRIVER
|
||||||
VERSION_STRING = 1.0
|
VERSION_STRING = 1.1
|
||||||
LIBRARY_CLASS = CpuExceptionHandlerLib|DXE_SMM_DRIVER
|
LIBRARY_CLASS = CpuExceptionHandlerLib|DXE_SMM_DRIVER
|
||||||
|
|
||||||
#
|
#
|
||||||
|
Loading…
x
Reference in New Issue
Block a user