public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Laszlo Ersek" <lersek@redhat.com>
To: Tom Lendacky <thomas.lendacky@amd.com>, devel@edk2.groups.io
Cc: Jordan Justen <jordan.l.justen@intel.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>,
	Anthony Perard <anthony.perard@citrix.com>,
	Julien Grall <julien@xen.org>,
	Brijesh Singh <brijesh.singh@amd.com>,
	Andrew Fish <afish@apple.com>
Subject: Re: [PATCH v2 1/3] UefiCpuPkg/CpuExceptionHandler: Make XCODE5 changes toolchain specific
Date: Wed, 6 May 2020 21:01:40 +0200	[thread overview]
Message-ID: <5d973f64-22fa-6f83-7b1b-cb97a7efe400@redhat.com> (raw)
In-Reply-To: <5fad89a0bdea4743b13815078e68bcf122c4f63b.1588782781.git.thomas.lendacky@amd.com>

On 05/06/20 18:33, Tom Lendacky wrote:
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2340
> 
> 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 a new SEC INF
> file for the XCODE5 version of CpuExceptionHandlerLib.
> 
> Since binary patching is allowed when running outside of flash, switch
> the Dxe, Pei and Smm versions of the CpuExceptionHandlerLib over to use
> the Xcode5ExceptionHandlerAsm.nasm file to retain current functionality.
> 
> 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                     |   5 +
>  .../DxeCpuExceptionHandlerLib.inf             |   2 +-
>  .../PeiCpuExceptionHandlerLib.inf             |   2 +-
>  .../SmmCpuExceptionHandlerLib.inf             |   2 +-
>  .../Xcode5SecPeiCpuExceptionHandlerLib.inf    |  54 +++
>  .../X64/Xcode5ExceptionHandlerAsm.nasm        | 396 ++++++++++++++++++
>  .../Xcode5SecPeiCpuExceptionHandlerLib.uni    |  17 +
>  7 files changed, 475 insertions(+), 3 deletions(-)
>  create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf
>  create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/Xcode5ExceptionHandlerAsm.nasm
>  create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.uni
> 
> diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc
> index d28cb5cccb52..264e5a787bce 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/Xcode5SecPeiCpuExceptionHandlerLib.inf
> +!else
>    CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
> +!endif
>    HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
>    PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf
>    MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
> @@ -126,6 +130,7 @@ [Components.IA32, Components.X64]
>    UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf

(1) I think this lib instance ("SecPeiCpuExceptionHandlerLib.inf") may
not build with XCODE5 at the end of the series, even in stand-alone
mode. Thus I think it should be conditionalized with

!if $(TOOL_CHAIN_TAG) != "XCODE5"
...
!endif

When using XCODE5, we should only build
"Xcode5SecPeiCpuExceptionHandlerLib.inf"; otherwise, we should build
*both* "SecPeiCpuExceptionHandlerLib.inf" and
"Xcode5SecPeiCpuExceptionHandlerLib.inf".

>    UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
>    UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf
> +  UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf
>    UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
>    UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
>    UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.inf
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
> index e41383573043..61e2ec30b089 100644
> --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
> @@ -28,7 +28,7 @@ [Sources.Ia32]
>    Ia32/ArchInterruptDefs.h
>  
>  [Sources.X64]
> -  X64/ExceptionHandlerAsm.nasm
> +  X64/Xcode5ExceptionHandlerAsm.nasm
>    X64/ArchExceptionHandler.c
>    X64/ArchInterruptDefs.h
>  
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf
> index f31423ac0f91..093374944df6 100644
> --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf
> @@ -28,7 +28,7 @@ [Sources.Ia32]
>    Ia32/ArchInterruptDefs.h
>  
>  [Sources.X64]
> -  X64/ExceptionHandlerAsm.nasm
> +  X64/Xcode5ExceptionHandlerAsm.nasm
>    X64/ArchExceptionHandler.c
>    X64/ArchInterruptDefs.h
>  
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
> index 66c7f59e3c91..2ffbbccc302f 100644
> --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf
> @@ -28,7 +28,7 @@ [Sources.Ia32]
>    Ia32/ArchInterruptDefs.h
>  
>  [Sources.X64]
> -  X64/ExceptionHandlerAsm.nasm
> +  X64/Xcode5ExceptionHandlerAsm.nasm
>    X64/ArchExceptionHandler.c
>    X64/ArchInterruptDefs.h
>  
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf
> new file mode 100644
> index 000000000000..3ed1378d6fa6
> --- /dev/null
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.inf
> @@ -0,0 +1,54 @@
> +## @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

(2) This is a customized copy of "SecPeiCpuExceptionHandlerLib.inf"; I
think you should prepend your (C) notice.

> +#
> +#  This is the XCODE5 variant of the SEC/PEI CpuExceptionHandlerLib. This
> +#  variant performs binary patching to fix up addresses that allow the
> +#  XCODE5 toolchain to be used.
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = Xcode5SecPeiCpuExceptionHandlerLib
> +  MODULE_UNI_FILE                = Xcode5SecPeiCpuExceptionHandlerLib.uni
> +  FILE_GUID                      = 49C481AF-1621-42F3-8FA1-27C64143E304
> +  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
> +
> +[Sources.X64]
> +  X64/Xcode5ExceptionHandlerAsm.nasm
> +  X64/ArchExceptionHandler.c
> +  X64/ArchInterruptDefs.h
> +
> +[Sources.common]
> +  CpuExceptionCommon.h
> +  CpuExceptionCommon.c
> +  SecPeiCpuException.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  UefiCpuPkg/UefiCpuPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  SerialPortLib
> +  PrintLib
> +  LocalApicLib
> +  PeCoffGetEntryPointLib
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/Xcode5ExceptionHandlerAsm.nasm b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/Xcode5ExceptionHandlerAsm.nasm
> new file mode 100644
> index 000000000000..19198f273137
> --- /dev/null
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/Xcode5ExceptionHandlerAsm.nasm
> @@ -0,0 +1,396 @@
> +;------------------------------------------------------------------------------ ;
> +; Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>
> +; SPDX-License-Identifier: BSD-2-Clause-Patent

This is identical to "ExceptionHandlerAsm.nasm", so I agree a new (C)
notice is not needed.

> +;
> +; Module Name:
> +;
> +;   ExceptionHandlerAsm.Asm
> +;
> +; Abstract:
> +;
> +;   x64 CPU Exception Handler
> +;
> +; Notes:
> +;
> +;------------------------------------------------------------------------------
> +
> +;
> +; CommonExceptionHandler()
> +;
> +
> +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;
> +    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
> +
> +;; 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
> +
> diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.uni b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.uni
> new file mode 100644
> index 000000000000..be69992cef09
> --- /dev/null
> +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Xcode5SecPeiCpuExceptionHandlerLib.uni
> @@ -0,0 +1,17 @@
> +// /** @file
> +// XCODE5 CPU Exception Handler library instance for SEC/PEI modules.
> +//
> +// CPU Exception Handler library instance for SEC/PEI modules when built
> +// using the XCODE5 toolchain.
> +//
> +// Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved.<BR>
> +//
> +// SPDX-License-Identifier: BSD-2-Clause-Patent
> +//
> +// **/
> +
> +
> +#string STR_MODULE_ABSTRACT             #language en-US "CPU Exception Handler library instance for SEC/PEI modules with the XCODE5 toolchain."
> +
> +#string STR_MODULE_DESCRIPTION          #language en-US "CPU Exception Handler library instance for SEC/PEI modules with the XCODE5 toolchain."
> +
> 

(3) This is a brand new file; I think you should prepend your (C) notice.

Meta-hint: with patches like this, it sometimes makes sense to format
the series for posting with "--find-copies-harder".

With (1) through (3) updated:

Reviewed-by: Laszlo Ersek <lersek@redhat.com>

Thanks,
Laszlo


  reply	other threads:[~2020-05-06 19:02 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-06 16:32 [PATCH v2 0/3] XCODE5 toolchain binary patching fix Lendacky, Thomas
2020-05-06 16:33 ` [PATCH v2 1/3] UefiCpuPkg/CpuExceptionHandler: Make XCODE5 changes toolchain specific Lendacky, Thomas
2020-05-06 19:01   ` Laszlo Ersek [this message]
2020-05-06 20:37     ` [edk2-devel] " Lendacky, Thomas
2020-05-06 16:33 ` [PATCH v2 2/3] OvmfPkg: Use toolchain appropriate CpuExceptionHandlerLib Lendacky, Thomas
2020-05-06 19:04   ` Laszlo Ersek
2020-05-06 16:33 ` [PATCH v2 3/3] UefiCpuPkg/CpuExceptionHandler: Revert CpuExceptionHandler binary patching Lendacky, Thomas
2020-05-06 19:31   ` Laszlo Ersek
2020-05-06 19:53 ` [PATCH v2 0/3] XCODE5 toolchain binary patching fix Laszlo Ersek

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=5d973f64-22fa-6f83-7b1b-cb97a7efe400@redhat.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