From: "Lendacky, Thomas" <thomas.lendacky@amd.com>
To: devel@edk2.groups.io
Cc: Jordan Justen <jordan.l.justen@intel.com>,
Laszlo Ersek <lersek@redhat.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Liming Gao <liming.gao@intel.com>,
Eric Dong <eric.dong@intel.com>, Ray Ni <ray.ni@intel.com>,
Brijesh Singh <brijesh.singh@amd.com>,
Anthony Perard <anthony.perard@citrix.com>,
Benjamin You <benjamin.you@intel.com>,
Guo Dong <guo.dong@intel.com>, Julien Grall <julien@xen.org>,
Maurice Ma <maurice.ma@intel.com>, Andrew Fish <afish@apple.com>
Subject: Re: [edk2-devel] [PATCH 1/4] UefiCpuPkg/CpuExceptionHandler: Make XCODE5 changes toolchain specific
Date: Tue, 5 May 2020 13:50:44 -0500 [thread overview]
Message-ID: <0bb8a47d-7172-61dc-c4b7-e123c5bc66e3@amd.com> (raw)
In-Reply-To: <160B00E54624ADAA.10991@groups.io>
On 5/1/20 3:17 PM, Lendacky, Thomas via groups.io wrote:
> BZ: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2340&data=02%7C01%7Cthomas.lendacky%40amd.com%7Ca1268b8e6d554b6c55ca08d7ee0cbf84%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637239610850064292&sdata=soYzRSutJ%2Bepugf2XnzRUpMCLa1GaKoBD%2FX1F4HPCt8%3D&reserved=0
>
> Commit 2db0ccc2d7fe ("UefiCpuPkg: Update CpuExceptionHandlerLib pass
> XCODE5 tool chain") introduced binary patching into the exception handling
> support. CPU exception handling is allowed during SEC and this results in
> binary patching of flash, which should not be done.
>
> Separate the changes from commit 2db0ccc2d7fe into an XCODE5 toolchain
> specific file, Xcode5ExceptionHandlerAsm.nasm, and create new INF files
> for an XCODE5 version of CpuExceptionHandlerLib. Update the UefiCpuPkg.dsc
> file to use the new files when the XCODE5 toolchain is used.
I used the same FILE_GUID for the new INF files as the old ones. I wasn't
sure if they should get new GUIDs or use the same GUID as the original
since only one of the libraries will/should be used at a time.
Let me know if they need new GUIDs and I'll update and repost the series.
Thanks,
Tom
>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
> ---
> UefiCpuPkg/UefiCpuPkg.dsc | 23 +
> .../Xcode5DxeCpuExceptionHandlerLib.inf | 64 +++
> .../Xcode5PeiCpuExceptionHandlerLib.inf | 63 +++
> .../Xcode5SecPeiCpuExceptionHandlerLib.inf | 55 +++
> .../Xcode5SmmCpuExceptionHandlerLib.inf | 59 +++
> .../X64/Xcode5ExceptionHandlerAsm.nasm | 413 ++++++++++++++++++
> 6 files changed, 677 insertions(+)
> create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5DxeCpuExceptionHandlerLib.inf
> create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5PeiCpuExceptionHandlerLib.inf
> create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf
> create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SmmCpuExceptionHandlerLib.inf
> create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/Xcode5ExceptionHandlerAsm.nasm
>
> diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc
> index d28cb5cccb52..ad298011232d 100644
> --- a/UefiCpuPkg/UefiCpuPkg.dsc
> +++ b/UefiCpuPkg/UefiCpuPkg.dsc
> @@ -59,7 +59,11 @@ [LibraryClasses]
>
> [LibraryClasses.common.SEC]
> PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.inf
> +!if $(TOOL_CHAIN_TAG) != "XCODE5"
> CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
> +!else
> + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf
> +!endif
> HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
> PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf
> MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
> @@ -73,12 +77,20 @@ [LibraryClasses.common.PEIM]
>
> [LibraryClasses.IA32.PEIM, LibraryClasses.X64.PEIM]
> PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf
> +!if $(TOOL_CHAIN_TAG) != "XCODE5"
> CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf
> +!else
> + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5PeiCpuExceptionHandlerLib.inf
> +!endif
>
> [LibraryClasses.common.DXE_DRIVER]
> MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> +!if $(TOOL_CHAIN_TAG) != "XCODE5"
> CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
> +!else
> + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5DxeCpuExceptionHandlerLib.inf
> +!endif
> MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
> RegisterCpuFeaturesLib|UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.inf
>
> @@ -86,7 +98,11 @@ [LibraryClasses.common.DXE_SMM_DRIVER]
> SmmServicesTableLib|MdePkg/Library/SmmServicesTableLib/SmmServicesTableLib.inf
> MemoryAllocationLib|MdePkg/Library/SmmMemoryAllocationLib/SmmMemoryAllocationLib.inf
> HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> +!if $(TOOL_CHAIN_TAG) != "XCODE5"
> CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
> +!else
> + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SmmCpuExceptionHandlerLib.inf
> +!endif
>
> [LibraryClasses.common.UEFI_APPLICATION]
> UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
> @@ -122,10 +138,17 @@ [Components.IA32, Components.X64]
> UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.inf
> UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.inf
> UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf
> +!if $(TOOL_CHAIN_TAG) != "XCODE5"
> UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
> UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
> UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
> UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf
> +!else
> + UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5DxeCpuExceptionHandlerLib.inf
> + UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf
> + UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SmmCpuExceptionHandlerLib.inf
> + UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5PeiCpuExceptionHandlerLib.inf
> +!endif
> UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
> UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
> UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.inf
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5DxeCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5DxeCpuExceptionHandlerLib.inf
> new file mode 100644
> index 000000000000..ef37efec6246
> --- /dev/null
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5DxeCpuExceptionHandlerLib.inf
> @@ -0,0 +1,64 @@
> +## @file
> +# CPU Exception Handler library instance for DXE modules.
> +#
> +# Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = Xcode5DxeCpuExceptionHandlerLib
> + MODULE_UNI_FILE = DxeCpuExceptionHandlerLib.uni
> + FILE_GUID = B6E9835A-EDCF-4748-98A8-27D3C722E02D
> + MODULE_TYPE = DXE_DRIVER
> + VERSION_STRING = 1.1
> + LIBRARY_CLASS = CpuExceptionHandlerLib|DXE_CORE DXE_DRIVER UEFI_APPLICATION
> +
> +#
> +# The following information is for reference only and not required by the build tools.
> +#
> +# VALID_ARCHITECTURES = IA32 X64
> +#
> +
> +[Sources.Ia32]
> + Ia32/ExceptionHandlerAsm.nasm
> + Ia32/ExceptionTssEntryAsm.nasm
> + Ia32/ArchExceptionHandler.c
> + Ia32/ArchInterruptDefs.h
> + Ia32/ArchAMDSevVcHandler.c
> +
> +[Sources.X64]
> + X64/Xcode5ExceptionHandlerAsm.nasm
> + X64/ArchExceptionHandler.c
> + X64/ArchInterruptDefs.h
> + X64/ArchAMDSevVcHandler.c
> +
> +[Sources.common]
> + CpuExceptionCommon.h
> + CpuExceptionCommon.c
> + PeiDxeSmmCpuException.c
> + DxeException.c
> + AMDSevVcHandler.c
> + AMDSevVcCommon.h
> +
> +[Pcd]
> + gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard
> + gUefiCpuPkgTokenSpaceGuid.PcdCpuStackSwitchExceptionList
> + gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownGoodStackSize
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + MdeModulePkg/MdeModulePkg.dec
> + UefiCpuPkg/UefiCpuPkg.dec
> +
> +[LibraryClasses]
> + BaseLib
> + SerialPortLib
> + PrintLib
> + SynchronizationLib
> + LocalApicLib
> + PeCoffGetEntryPointLib
> + MemoryAllocationLib
> + DebugLib
> + VmgExitLib
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5PeiCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5PeiCpuExceptionHandlerLib.inf
> new file mode 100644
> index 000000000000..830ed1eb8bad
> --- /dev/null
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5PeiCpuExceptionHandlerLib.inf
> @@ -0,0 +1,63 @@
> +## @file
> +# CPU Exception Handler library instance for PEI module.
> +#
> +# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = Xcode5PeiCpuExceptionHandlerLib
> + MODULE_UNI_FILE = PeiCpuExceptionHandlerLib.uni
> + FILE_GUID = 980DDA67-44A6-4897-99E6-275290B71F9E
> + MODULE_TYPE = PEIM
> + VERSION_STRING = 1.1
> + LIBRARY_CLASS = CpuExceptionHandlerLib|PEI_CORE PEIM
> +
> +#
> +# The following information is for reference only and not required by the build tools.
> +#
> +# VALID_ARCHITECTURES = IA32 X64
> +#
> +
> +[Sources.Ia32]
> + Ia32/ExceptionHandlerAsm.nasm
> + Ia32/ExceptionTssEntryAsm.nasm
> + Ia32/ArchExceptionHandler.c
> + Ia32/ArchInterruptDefs.h
> + Ia32/ArchAMDSevVcHandler.c
> +
> +[Sources.X64]
> + X64/Xcode5ExceptionHandlerAsm.nasm
> + X64/ArchExceptionHandler.c
> + X64/ArchInterruptDefs.h
> + X64/ArchAMDSevVcHandler.c
> +
> +[Sources.common]
> + CpuExceptionCommon.h
> + CpuExceptionCommon.c
> + PeiCpuException.c
> + PeiDxeSmmCpuException.c
> + AMDSevVcHandler.c
> + AMDSevVcCommon.h
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + MdeModulePkg/MdeModulePkg.dec
> + UefiCpuPkg/UefiCpuPkg.dec
> +
> +[LibraryClasses]
> + BaseLib
> + SerialPortLib
> + PrintLib
> + LocalApicLib
> + PeCoffGetEntryPointLib
> + HobLib
> + MemoryAllocationLib
> + SynchronizationLib
> + VmgExitLib
> +
> +[Pcd]
> + gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard # CONSUMES
> +
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf
> new file mode 100644
> index 000000000000..36420be22faa
> --- /dev/null
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf
> @@ -0,0 +1,55 @@
> +## @file
> +# CPU Exception Handler library instance for SEC/PEI modules.
> +#
> +# Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = Xcode5SecPeiCpuExceptionHandlerLib
> + MODULE_UNI_FILE = SecPeiCpuExceptionHandlerLib.uni
> + FILE_GUID = CA4BBC99-DFC6-4234-B553-8B6586B7B113
> + MODULE_TYPE = PEIM
> + VERSION_STRING = 1.1
> + LIBRARY_CLASS = CpuExceptionHandlerLib|SEC PEI_CORE PEIM
> +
> +#
> +# The following information is for reference only and not required by the build tools.
> +#
> +# VALID_ARCHITECTURES = IA32 X64
> +#
> +
> +[Sources.Ia32]
> + Ia32/ExceptionHandlerAsm.nasm
> + Ia32/ExceptionTssEntryAsm.nasm
> + Ia32/ArchExceptionHandler.c
> + Ia32/ArchInterruptDefs.h
> + Ia32/ArchAMDSevVcHandler.c
> +
> +[Sources.X64]
> + X64/Xcode5ExceptionHandlerAsm.nasm
> + X64/ArchExceptionHandler.c
> + X64/ArchInterruptDefs.h
> + X64/ArchAMDSevVcHandler.c
> +
> +[Sources.common]
> + CpuExceptionCommon.h
> + CpuExceptionCommon.c
> + SecPeiCpuException.c
> + AMDSevVcHandler.c
> + AMDSevVcCommon.h
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + MdeModulePkg/MdeModulePkg.dec
> + UefiCpuPkg/UefiCpuPkg.dec
> +
> +[LibraryClasses]
> + BaseLib
> + SerialPortLib
> + PrintLib
> + LocalApicLib
> + PeCoffGetEntryPointLib
> + VmgExitLib
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SmmCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SmmCpuExceptionHandlerLib.inf
> new file mode 100644
> index 000000000000..8f71a45c86d5
> --- /dev/null
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SmmCpuExceptionHandlerLib.inf
> @@ -0,0 +1,59 @@
> +## @file
> +# CPU Exception Handler library instance for SMM modules.
> +#
> +# Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = Xcode5SmmCpuExceptionHandlerLib
> + MODULE_UNI_FILE = SmmCpuExceptionHandlerLib.uni
> + FILE_GUID = 8D2C439B-3981-42ff-9CE5-1B50ECA502D6
> + MODULE_TYPE = DXE_SMM_DRIVER
> + VERSION_STRING = 1.1
> + LIBRARY_CLASS = CpuExceptionHandlerLib|DXE_SMM_DRIVER
> +
> +#
> +# The following information is for reference only and not required by the build tools.
> +#
> +# VALID_ARCHITECTURES = IA32 X64
> +#
> +
> +[Sources.Ia32]
> + Ia32/ExceptionHandlerAsm.nasm
> + Ia32/ExceptionTssEntryAsm.nasm
> + Ia32/ArchExceptionHandler.c
> + Ia32/ArchInterruptDefs.h
> + Ia32/ArchAMDSevVcHandler.c
> +
> +[Sources.X64]
> + X64/Xcode5ExceptionHandlerAsm.nasm
> + X64/ArchExceptionHandler.c
> + X64/ArchInterruptDefs.h
> + X64/ArchAMDSevVcHandler.c
> +
> +[Sources.common]
> + CpuExceptionCommon.h
> + CpuExceptionCommon.c
> + PeiDxeSmmCpuException.c
> + SmmException.c
> + AMDSevVcHandler.c
> + AMDSevVcCommon.h
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + MdeModulePkg/MdeModulePkg.dec
> + UefiCpuPkg/UefiCpuPkg.dec
> +
> +[LibraryClasses]
> + BaseLib
> + SerialPortLib
> + PrintLib
> + SynchronizationLib
> + LocalApicLib
> + PeCoffGetEntryPointLib
> + DebugLib
> + VmgExitLib
> +
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/Xcode5ExceptionHandlerAsm.nasm b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/Xcode5ExceptionHandlerAsm.nasm
> new file mode 100644
> index 000000000000..26cae56cc5cf
> --- /dev/null
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/Xcode5ExceptionHandlerAsm.nasm
> @@ -0,0 +1,413 @@
> +;------------------------------------------------------------------------------ ;
> +; Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>
> +; SPDX-License-Identifier: BSD-2-Clause-Patent
> +;
> +; Module Name:
> +;
> +; ExceptionHandlerAsm.Asm
> +;
> +; Abstract:
> +;
> +; x64 CPU Exception Handler
> +;
> +; Notes:
> +;
> +;------------------------------------------------------------------------------
> +
> +;
> +; CommonExceptionHandler()
> +;
> +
> +%define VC_EXCEPTION 29
> +
> +extern ASM_PFX(mErrorCodeFlag) ; Error code flags for exceptions
> +extern ASM_PFX(mDoFarReturnFlag) ; Do far return flag
> +extern ASM_PFX(CommonExceptionHandler)
> +
> +SECTION .data
> +
> +DEFAULT REL
> +SECTION .text
> +
> +ALIGN 8
> +
> +AsmIdtVectorBegin:
> +%rep 32
> + db 0x6a ; push #VectorNum
> + db ($ - AsmIdtVectorBegin) / ((AsmIdtVectorEnd - AsmIdtVectorBegin) / 32) ; VectorNum
> + push rax
> + mov rax, strict qword 0 ; mov rax, ASM_PFX(CommonInterruptEntry)
> + jmp rax
> +%endrep
> +AsmIdtVectorEnd:
> +
> +HookAfterStubHeaderBegin:
> + db 0x6a ; push
> +@VectorNum:
> + db 0 ; 0 will be fixed
> + push rax
> + mov rax, strict qword 0 ; mov rax, HookAfterStubHeaderEnd
> +JmpAbsoluteAddress:
> + jmp rax
> +HookAfterStubHeaderEnd:
> + mov rax, rsp
> + and sp, 0xfff0 ; make sure 16-byte aligned for exception context
> + sub rsp, 0x18 ; reserve room for filling exception data later
> + push rcx
> + mov rcx, [rax + 8]
> + bt [ASM_PFX(mErrorCodeFlag)], ecx
> + jnc .0
> + push qword [rsp] ; push additional rcx to make stack alignment
> +.0:
> + xchg rcx, [rsp] ; restore rcx, save Exception Number in stack
> + push qword [rax] ; push rax into stack to keep code consistence
> +
> +;---------------------------------------;
> +; CommonInterruptEntry ;
> +;---------------------------------------;
> +; The follow algorithm is used for the common interrupt routine.
> +; Entry from each interrupt with a push eax and eax=interrupt number
> +; Stack frame would be as follows as specified in IA32 manuals:
> +;
> +; +---------------------+ <-- 16-byte aligned ensured by processor
> +; + Old SS +
> +; +---------------------+
> +; + Old RSP +
> +; +---------------------+
> +; + RFlags +
> +; +---------------------+
> +; + CS +
> +; +---------------------+
> +; + RIP +
> +; +---------------------+
> +; + Error Code +
> +; +---------------------+
> +; + Vector Number +
> +; +---------------------+
> +; + RBP +
> +; +---------------------+ <-- RBP, 16-byte aligned
> +; The follow algorithm is used for the common interrupt routine.
> +global ASM_PFX(CommonInterruptEntry)
> +ASM_PFX(CommonInterruptEntry):
> + cli
> + pop rax
> + ;
> + ; All interrupt handlers are invoked through interrupt gates, so
> + ; IF flag automatically cleared at the entry point
> + ;
> + xchg rcx, [rsp] ; Save rcx into stack and save vector number into rcx
> + and rcx, 0xFF
> + cmp ecx, 32 ; Intel reserved vector for exceptions?
> + jae NoErrorCode
> + bt [ASM_PFX(mErrorCodeFlag)], ecx
> + jc HasErrorCode
> +
> +NoErrorCode:
> +
> + ;
> + ; Push a dummy error code on the stack
> + ; to maintain coherent stack map
> + ;
> + push qword [rsp]
> + mov qword [rsp + 8], 0
> +HasErrorCode:
> + push rbp
> + mov rbp, rsp
> + push 0 ; clear EXCEPTION_HANDLER_CONTEXT.OldIdtHandler
> + push 0 ; clear EXCEPTION_HANDLER_CONTEXT.ExceptionDataFlag
> +
> + ;
> + ; Stack:
> + ; +---------------------+ <-- 16-byte aligned ensured by processor
> + ; + Old SS +
> + ; +---------------------+
> + ; + Old RSP +
> + ; +---------------------+
> + ; + RFlags +
> + ; +---------------------+
> + ; + CS +
> + ; +---------------------+
> + ; + RIP +
> + ; +---------------------+
> + ; + Error Code +
> + ; +---------------------+
> + ; + RCX / Vector Number +
> + ; +---------------------+
> + ; + RBP +
> + ; +---------------------+ <-- RBP, 16-byte aligned
> + ;
> +
> + ;
> + ; Since here the stack pointer is 16-byte aligned, so
> + ; EFI_FX_SAVE_STATE_X64 of EFI_SYSTEM_CONTEXT_x64
> + ; is 16-byte aligned
> + ;
> +
> +;; UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax;
> +;; UINT64 R8, R9, R10, R11, R12, R13, R14, R15;
> + push r15
> + push r14
> + push r13
> + push r12
> + push r11
> + push r10
> + push r9
> + push r8
> + push rax
> + push qword [rbp + 8] ; RCX
> + push rdx
> + push rbx
> + push qword [rbp + 48] ; RSP
> + push qword [rbp] ; RBP
> + push rsi
> + push rdi
> +
> +;; UINT64 Gs, Fs, Es, Ds, Cs, Ss; insure high 16 bits of each is zero
> + movzx rax, word [rbp + 56]
> + push rax ; for ss
> + movzx rax, word [rbp + 32]
> + push rax ; for cs
> + mov rax, ds
> + push rax
> + mov rax, es
> + push rax
> + mov rax, fs
> + push rax
> + mov rax, gs
> + push rax
> +
> + mov [rbp + 8], rcx ; save vector number
> +
> +;; UINT64 Rip;
> + push qword [rbp + 24]
> +
> +;; UINT64 Gdtr[2], Idtr[2];
> + xor rax, rax
> + push rax
> + push rax
> + sidt [rsp]
> + mov bx, word [rsp]
> + mov rax, qword [rsp + 2]
> + mov qword [rsp], rax
> + mov word [rsp + 8], bx
> +
> + xor rax, rax
> + push rax
> + push rax
> + sgdt [rsp]
> + mov bx, word [rsp]
> + mov rax, qword [rsp + 2]
> + mov qword [rsp], rax
> + mov word [rsp + 8], bx
> +
> +;; UINT64 Ldtr, Tr;
> + xor rax, rax
> + str ax
> + push rax
> + sldt ax
> + push rax
> +
> +;; UINT64 RFlags;
> + push qword [rbp + 40]
> +
> +;; UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8;
> + mov rax, cr8
> + push rax
> + mov rax, cr4
> + or rax, 0x208
> + mov cr4, rax
> + push rax
> + mov rax, cr3
> + push rax
> + mov rax, cr2
> + push rax
> + xor rax, rax
> + push rax
> + mov rax, cr0
> + push rax
> +
> +;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
> + cmp qword [rbp + 8], VC_EXCEPTION
> + je VcDebugRegs ; For SEV-ES (#VC) Debug registers ignored
> +
> + mov rax, dr7
> + push rax
> + mov rax, dr6
> + push rax
> + mov rax, dr3
> + push rax
> + mov rax, dr2
> + push rax
> + mov rax, dr1
> + push rax
> + mov rax, dr0
> + push rax
> + jmp DrFinish
> +
> +VcDebugRegs:
> +;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7 are skipped for #VC to avoid exception recursion
> + xor rax, rax
> + push rax
> + push rax
> + push rax
> + push rax
> + push rax
> + push rax
> +
> +DrFinish:
> +;; FX_SAVE_STATE_X64 FxSaveState;
> + sub rsp, 512
> + mov rdi, rsp
> + db 0xf, 0xae, 0x7 ;fxsave [rdi]
> +
> +;; UEFI calling convention for x64 requires that Direction flag in EFLAGs is clear
> + cld
> +
> +;; UINT32 ExceptionData;
> + push qword [rbp + 16]
> +
> +;; Prepare parameter and call
> + mov rcx, [rbp + 8]
> + mov rdx, rsp
> + ;
> + ; Per X64 calling convention, allocate maximum parameter stack space
> + ; and make sure RSP is 16-byte aligned
> + ;
> + sub rsp, 4 * 8 + 8
> + call ASM_PFX(CommonExceptionHandler)
> + add rsp, 4 * 8 + 8
> +
> + cli
> +;; UINT64 ExceptionData;
> + add rsp, 8
> +
> +;; FX_SAVE_STATE_X64 FxSaveState;
> +
> + mov rsi, rsp
> + db 0xf, 0xae, 0xE ; fxrstor [rsi]
> + add rsp, 512
> +
> +;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
> +;; Skip restoration of DRx registers to support in-circuit emualators
> +;; or debuggers set breakpoint in interrupt/exception context
> + add rsp, 8 * 6
> +
> +;; UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8;
> + pop rax
> + mov cr0, rax
> + add rsp, 8 ; not for Cr1
> + pop rax
> + mov cr2, rax
> + pop rax
> + mov cr3, rax
> + pop rax
> + mov cr4, rax
> + pop rax
> + mov cr8, rax
> +
> +;; UINT64 RFlags;
> + pop qword [rbp + 40]
> +
> +;; UINT64 Ldtr, Tr;
> +;; UINT64 Gdtr[2], Idtr[2];
> +;; Best not let anyone mess with these particular registers...
> + add rsp, 48
> +
> +;; UINT64 Rip;
> + pop qword [rbp + 24]
> +
> +;; UINT64 Gs, Fs, Es, Ds, Cs, Ss;
> + pop rax
> + ; mov gs, rax ; not for gs
> + pop rax
> + ; mov fs, rax ; not for fs
> + ; (X64 will not use fs and gs, so we do not restore it)
> + pop rax
> + mov es, rax
> + pop rax
> + mov ds, rax
> + pop qword [rbp + 32] ; for cs
> + pop qword [rbp + 56] ; for ss
> +
> +;; UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax;
> +;; UINT64 R8, R9, R10, R11, R12, R13, R14, R15;
> + pop rdi
> + pop rsi
> + add rsp, 8 ; not for rbp
> + pop qword [rbp + 48] ; for rsp
> + pop rbx
> + pop rdx
> + pop rcx
> + pop rax
> + pop r8
> + pop r9
> + pop r10
> + pop r11
> + pop r12
> + pop r13
> + pop r14
> + pop r15
> +
> + mov rsp, rbp
> + pop rbp
> + add rsp, 16
> + cmp qword [rsp - 32], 0 ; check EXCEPTION_HANDLER_CONTEXT.OldIdtHandler
> + jz DoReturn
> + cmp qword [rsp - 40], 1 ; check EXCEPTION_HANDLER_CONTEXT.ExceptionDataFlag
> + jz ErrorCode
> + jmp qword [rsp - 32]
> +ErrorCode:
> + sub rsp, 8
> + jmp qword [rsp - 24]
> +
> +DoReturn:
> + cmp qword [ASM_PFX(mDoFarReturnFlag)], 0 ; Check if need to do far return instead of IRET
> + jz DoIret
> + push rax
> + mov rax, rsp ; save old RSP to rax
> + mov rsp, [rsp + 0x20]
> + push qword [rax + 0x10] ; save CS in new location
> + push qword [rax + 0x8] ; save EIP in new location
> + push qword [rax + 0x18] ; save EFLAGS in new location
> + mov rax, [rax] ; restore rax
> + popfq ; restore EFLAGS
> + DB 0x48 ; prefix to composite "retq" with next "retf"
> + retf ; far return
> +DoIret:
> + iretq
> +
> +;-------------------------------------------------------------------------------------
> +; GetTemplateAddressMap (&AddressMap);
> +;-------------------------------------------------------------------------------------
> +; comments here for definition of address map
> +global ASM_PFX(AsmGetTemplateAddressMap)
> +ASM_PFX(AsmGetTemplateAddressMap):
> + lea rax, [AsmIdtVectorBegin]
> + mov qword [rcx], rax
> + mov qword [rcx + 0x8], (AsmIdtVectorEnd - AsmIdtVectorBegin) / 32
> + lea rax, [HookAfterStubHeaderBegin]
> + mov qword [rcx + 0x10], rax
> +
> +; Fix up CommonInterruptEntry address
> + lea rax, [ASM_PFX(CommonInterruptEntry)]
> + lea rcx, [AsmIdtVectorBegin]
> +%rep 32
> + mov qword [rcx + (JmpAbsoluteAddress - 8 - HookAfterStubHeaderBegin)], rax
> + add rcx, (AsmIdtVectorEnd - AsmIdtVectorBegin) / 32
> +%endrep
> +; Fix up HookAfterStubHeaderEnd
> + lea rax, [HookAfterStubHeaderEnd]
> + lea rcx, [JmpAbsoluteAddress]
> + mov qword [rcx - 8], rax
> +
> + ret
> +
> +;-------------------------------------------------------------------------------------
> +; AsmVectorNumFixup (*NewVectorAddr, VectorNum, *OldVectorAddr);
> +;-------------------------------------------------------------------------------------
> +global ASM_PFX(AsmVectorNumFixup)
> +ASM_PFX(AsmVectorNumFixup):
> + mov rax, rdx
> + mov [rcx + (@VectorNum - HookAfterStubHeaderBegin)], al
> + ret
> +
>
prev parent reply other threads:[~2020-05-05 18:50 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-01 20:17 [PATCH 0/4] XCODE5 toolchain binary patching fix Lendacky, Thomas
2020-05-01 20:17 ` [PATCH 1/4] UefiCpuPkg/CpuExceptionHandler: Make XCODE5 changes toolchain specific Lendacky, Thomas
2020-05-05 21:39 ` [edk2-devel] " Laszlo Ersek
2020-05-05 22:09 ` Lendacky, Thomas
2020-05-01 20:17 ` [PATCH 2/4] UefiPayloadPkg: Use toolchain appropriate CpuExceptionHandlerLib Lendacky, Thomas
2020-05-05 22:19 ` [edk2-devel] " Laszlo Ersek
2020-05-01 20:17 ` [PATCH 3/4] OvmfPkg: " Lendacky, Thomas
2020-05-05 21:49 ` [edk2-devel] " Laszlo Ersek
2020-05-01 20:17 ` [PATCH 4/4] UefiCpuPkg/CpuExceptionHandler: Revert binary patching in standard CpuExceptionHandlerLib Lendacky, Thomas
2020-05-01 20:49 ` [EXTERNAL] [edk2-devel] " Bret Barkelew
2020-05-05 22:15 ` Laszlo Ersek
2020-05-06 14:35 ` Lendacky, Thomas
2020-05-06 14:53 ` Liming Gao
2020-05-06 16:33 ` Laszlo Ersek
2020-05-06 18:07 ` [EXTERNAL] " Bret Barkelew
2020-05-06 19:51 ` Lendacky, Thomas
[not found] ` <160B00E54624ADAA.10991@groups.io>
2020-05-05 18:50 ` Lendacky, Thomas [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0bb8a47d-7172-61dc-c4b7-e123c5bc66e3@amd.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox