public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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&amp;data=02%7C01%7Cthomas.lendacky%40amd.com%7Ca1268b8e6d554b6c55ca08d7ee0cbf84%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637239610850064292&amp;sdata=soYzRSutJ%2Bepugf2XnzRUpMCLa1GaKoBD%2FX1F4HPCt8%3D&amp;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
> +
> 

      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