mirror of https://github.com/acidanthera/audk.git
UefiCpuPkg: PiSmmCpuDxeSmm skip MSR_IA32_MISC_ENABLE manipulation on AMD
AMD does not support MSR_IA32_MISC_ENABLE. Accessing that register causes and exception on AMD processors. If Execution Disable is supported, but if the processor is an AMD processor, skip manipulating MSR_IA32_MISC_ENABLE[34] XD Disable bit. Cc: Eric Dong <eric.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Garrett Kirkendall <garrett.kirkendall@amd.com> Message-Id: <20200622131825.1352-5-Garrett.Kirkendall@amd.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Tested-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Eric Dong <eric.dong@intel.com>
This commit is contained in:
parent
df667535ed
commit
bdafda8c45
|
@ -1,5 +1,6 @@
|
||||||
;------------------------------------------------------------------------------ ;
|
;------------------------------------------------------------------------------ ;
|
||||||
; Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
|
; Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||||
|
; Copyright (c) 2020, AMD Incorporated. All rights reserved.<BR>
|
||||||
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
;
|
;
|
||||||
; Module Name:
|
; Module Name:
|
||||||
|
@ -59,6 +60,7 @@ global ASM_PFX(gPatchSmiStack)
|
||||||
global ASM_PFX(gPatchSmbase)
|
global ASM_PFX(gPatchSmbase)
|
||||||
extern ASM_PFX(mXdSupported)
|
extern ASM_PFX(mXdSupported)
|
||||||
global ASM_PFX(gPatchXdSupported)
|
global ASM_PFX(gPatchXdSupported)
|
||||||
|
global ASM_PFX(gPatchMsrIa32MiscEnableSupported)
|
||||||
extern ASM_PFX(gSmiHandlerIdtr)
|
extern ASM_PFX(gSmiHandlerIdtr)
|
||||||
|
|
||||||
extern ASM_PFX(mCetSupported)
|
extern ASM_PFX(mCetSupported)
|
||||||
|
@ -153,17 +155,30 @@ ASM_PFX(gPatchSmiCr3):
|
||||||
ASM_PFX(gPatchXdSupported):
|
ASM_PFX(gPatchXdSupported):
|
||||||
cmp al, 0
|
cmp al, 0
|
||||||
jz @SkipXd
|
jz @SkipXd
|
||||||
|
|
||||||
|
; If MSR_IA32_MISC_ENABLE is supported, clear XD Disable bit
|
||||||
|
mov al, strict byte 1 ; source operand may be patched
|
||||||
|
ASM_PFX(gPatchMsrIa32MiscEnableSupported):
|
||||||
|
cmp al, 1
|
||||||
|
jz MsrIa32MiscEnableSupported
|
||||||
|
|
||||||
|
; MSR_IA32_MISC_ENABLE not supported
|
||||||
|
xor edx, edx
|
||||||
|
push edx ; don't try to restore the XD Disable bit just before RSM
|
||||||
|
jmp EnableNxe
|
||||||
|
|
||||||
;
|
;
|
||||||
; Check XD disable bit
|
; Check XD disable bit
|
||||||
;
|
;
|
||||||
|
MsrIa32MiscEnableSupported:
|
||||||
mov ecx, MSR_IA32_MISC_ENABLE
|
mov ecx, MSR_IA32_MISC_ENABLE
|
||||||
rdmsr
|
rdmsr
|
||||||
push edx ; save MSR_IA32_MISC_ENABLE[63-32]
|
push edx ; save MSR_IA32_MISC_ENABLE[63-32]
|
||||||
test edx, BIT2 ; MSR_IA32_MISC_ENABLE[34]
|
test edx, BIT2 ; MSR_IA32_MISC_ENABLE[34]
|
||||||
jz .5
|
jz EnableNxe
|
||||||
and dx, 0xFFFB ; clear XD Disable bit if it is set
|
and dx, 0xFFFB ; clear XD Disable bit if it is set
|
||||||
wrmsr
|
wrmsr
|
||||||
.5:
|
EnableNxe:
|
||||||
mov ecx, MSR_EFER
|
mov ecx, MSR_EFER
|
||||||
rdmsr
|
rdmsr
|
||||||
or ax, MSR_EFER_XD ; enable NXE
|
or ax, MSR_EFER_XD ; enable NXE
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
Enable SMM profile.
|
Enable SMM profile.
|
||||||
|
|
||||||
Copyright (c) 2012 - 2019, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2012 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||||
Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
|
Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.<BR>
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
@ -1015,6 +1015,13 @@ CheckFeatureSupported (
|
||||||
mXdSupported = FALSE;
|
mXdSupported = FALSE;
|
||||||
PatchInstructionX86 (gPatchXdSupported, mXdSupported, 1);
|
PatchInstructionX86 (gPatchXdSupported, mXdSupported, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (StandardSignatureIsAuthenticAMD ()) {
|
||||||
|
//
|
||||||
|
// AMD processors do not support MSR_IA32_MISC_ENABLE
|
||||||
|
//
|
||||||
|
PatchInstructionX86 (gPatchMsrIa32MiscEnableSupported, FALSE, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mBtsSupported) {
|
if (mBtsSupported) {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
SMM profile internal header file.
|
SMM profile internal header file.
|
||||||
|
|
||||||
Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
|
Copyright (c) 2020, AMD Incorporated. All rights reserved.<BR>
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -13,6 +14,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
#include <Library/DxeServicesTableLib.h>
|
#include <Library/DxeServicesTableLib.h>
|
||||||
#include <Library/CpuLib.h>
|
#include <Library/CpuLib.h>
|
||||||
|
#include <Library/UefiCpuLib.h>
|
||||||
#include <IndustryStandard/Acpi.h>
|
#include <IndustryStandard/Acpi.h>
|
||||||
|
|
||||||
#include "SmmProfileArch.h"
|
#include "SmmProfileArch.h"
|
||||||
|
@ -99,6 +101,7 @@ extern SMM_S3_RESUME_STATE *mSmmS3ResumeState;
|
||||||
extern UINTN gSmiExceptionHandlers[];
|
extern UINTN gSmiExceptionHandlers[];
|
||||||
extern BOOLEAN mXdSupported;
|
extern BOOLEAN mXdSupported;
|
||||||
X86_ASSEMBLY_PATCH_LABEL gPatchXdSupported;
|
X86_ASSEMBLY_PATCH_LABEL gPatchXdSupported;
|
||||||
|
X86_ASSEMBLY_PATCH_LABEL gPatchMsrIa32MiscEnableSupported;
|
||||||
extern UINTN *mPFEntryCount;
|
extern UINTN *mPFEntryCount;
|
||||||
extern UINT64 (*mLastPFEntryValue)[MAX_PF_ENTRY_COUNT];
|
extern UINT64 (*mLastPFEntryValue)[MAX_PF_ENTRY_COUNT];
|
||||||
extern UINT64 *(*mLastPFEntryPointer)[MAX_PF_ENTRY_COUNT];
|
extern UINT64 *(*mLastPFEntryPointer)[MAX_PF_ENTRY_COUNT];
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
;------------------------------------------------------------------------------ ;
|
;------------------------------------------------------------------------------ ;
|
||||||
; Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
|
; Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||||
|
; Copyright (c) 2020, AMD Incorporated. All rights reserved.<BR>
|
||||||
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
;
|
;
|
||||||
; Module Name:
|
; Module Name:
|
||||||
|
@ -67,6 +68,7 @@ extern ASM_PFX(CpuSmmDebugExit)
|
||||||
global ASM_PFX(gPatchSmbase)
|
global ASM_PFX(gPatchSmbase)
|
||||||
extern ASM_PFX(mXdSupported)
|
extern ASM_PFX(mXdSupported)
|
||||||
global ASM_PFX(gPatchXdSupported)
|
global ASM_PFX(gPatchXdSupported)
|
||||||
|
global ASM_PFX(gPatchMsrIa32MiscEnableSupported)
|
||||||
global ASM_PFX(gPatchSmiStack)
|
global ASM_PFX(gPatchSmiStack)
|
||||||
global ASM_PFX(gPatchSmiCr3)
|
global ASM_PFX(gPatchSmiCr3)
|
||||||
global ASM_PFX(gPatch5LevelPagingNeeded)
|
global ASM_PFX(gPatch5LevelPagingNeeded)
|
||||||
|
@ -152,18 +154,32 @@ SkipEnable5LevelPaging:
|
||||||
ASM_PFX(gPatchXdSupported):
|
ASM_PFX(gPatchXdSupported):
|
||||||
cmp al, 0
|
cmp al, 0
|
||||||
jz @SkipXd
|
jz @SkipXd
|
||||||
|
|
||||||
|
; If MSR_IA32_MISC_ENABLE is supported, clear XD Disable bit
|
||||||
|
mov al, strict byte 1 ; source operand may be patched
|
||||||
|
ASM_PFX(gPatchMsrIa32MiscEnableSupported):
|
||||||
|
cmp al, 1
|
||||||
|
jz MsrIa32MiscEnableSupported
|
||||||
|
|
||||||
|
; MSR_IA32_MISC_ENABLE not supported
|
||||||
|
sub esp, 4
|
||||||
|
xor rdx, rdx
|
||||||
|
push rdx ; don't try to restore the XD Disable bit just before RSM
|
||||||
|
jmp EnableNxe
|
||||||
|
|
||||||
;
|
;
|
||||||
; Check XD disable bit
|
; Check XD disable bit
|
||||||
;
|
;
|
||||||
|
MsrIa32MiscEnableSupported:
|
||||||
mov ecx, MSR_IA32_MISC_ENABLE
|
mov ecx, MSR_IA32_MISC_ENABLE
|
||||||
rdmsr
|
rdmsr
|
||||||
sub esp, 4
|
sub esp, 4
|
||||||
push rdx ; save MSR_IA32_MISC_ENABLE[63-32]
|
push rdx ; save MSR_IA32_MISC_ENABLE[63-32]
|
||||||
test edx, BIT2 ; MSR_IA32_MISC_ENABLE[34]
|
test edx, BIT2 ; MSR_IA32_MISC_ENABLE[34]
|
||||||
jz .0
|
jz EnableNxe
|
||||||
and dx, 0xFFFB ; clear XD Disable bit if it is set
|
and dx, 0xFFFB ; clear XD Disable bit if it is set
|
||||||
wrmsr
|
wrmsr
|
||||||
.0:
|
EnableNxe:
|
||||||
mov ecx, MSR_EFER
|
mov ecx, MSR_EFER
|
||||||
rdmsr
|
rdmsr
|
||||||
or ax, MSR_EFER_XD ; enable NXE
|
or ax, MSR_EFER_XD ; enable NXE
|
||||||
|
|
Loading…
Reference in New Issue