Jeff,

I agree.  I thought of a 2nd method to pass the address through the 
structure that is shared between the C and assembly code.  I will
work on a 2nd version of the patch that is both XIP and PIE compatible.

Mike

> -----Original Message-----
> From: Fan, Jeff
> Sent: Sunday, May 21, 2017 8:10 PM
> To: Kinney, Michael D <[email protected]>; [email protected]
> Cc: Andrew Fish <[email protected]>
> Subject: RE: [Patch] UefiCpuPkg/MpInitLib: Fix X64 XCODE5/NASM compatibility 
> issues
> 
> Mike,
> 
> This piece of code will be shared for CPU PEI/DXE MP driver. If PEI is 64bit, 
> this
> piece of code maybe located on FLASH.
> 
> We cannot change the value in InitialzeFloatingPointUnitsAddress if the code 
> located
> on FALSH in AsmGetAddressMap().
> 
> We need to update the InitialzeFloatingPointUnitsAddress after this piece of 
> code
> copied into AP reset vector in memory
> in BackupAndPrepareWakeupBuffer().
> 
> Thanks!
> Jeff
> 
> -----Original Message-----
> From: Kinney, Michael D
> Sent: Monday, May 22, 2017 3:05 AM
> To: [email protected]
> Cc: Andrew Fish; Fan, Jeff; Kinney, Michael D
> Subject: [Patch] UefiCpuPkg/MpInitLib: Fix X64 XCODE5/NASM compatibility 
> issues
> 
> https://bugzilla.tianocore.org/show_bug.cgi?id=565
> 
> Fix NASM compatibility issues with XCODE5 tool chain.
> The XCODE5 tool chain for X64 builds using PIE (Position Independent 
> Executable).  For
> most assembly sources using PIE mode does not cause any issues.
> 
> However, if assembly code is copied to a different address (such as AP 
> startup code in
> the MpInitLib), then the
> X64 assembly source must be implemented to be compatible with PIE mode that 
> uses RIP
> relative addressing.
> 
> The specific changes in this patch are:
> 
> * Use LEA instruction instead of MOV instruction to lookup
>   the addresses of functions.
> 
> * The assembly function RendezvousFunnelProc() is copied
>   below 1MB so it can be executed as part of the MpInitLib
>   AP startup sequence.  RendezvousFunnelProc() calls the
>   external function InitializeFloatingPointUnits().  The
>   absolute address of InitializeFloatingPointUnits() must
>   resolved and saved to a data element that is part of
>   RendezvousFunnelProc()  before RendezvousFunnelProc() is
>   copied below 1MB.  This work is done in AsmGetAddressMap().
> 
> Cc: Andrew Fish <[email protected]>
> Cc: Jeff Fan <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Michael D Kinney <[email protected]>
> ---
>  UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm | 20 ++++++++++++++++----
>  1 file changed, 16 insertions(+), 4 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
> b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
> index fa54d01..c943a09 100644
> --- a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
> +++ b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
> @@ -1,5 +1,5 @@
>  
> ;------------------------------------------------------------------------------
>  ; -;
> Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
> +; Copyright (c) 2015 - 2017, Intel Corporation. All rights
> +reserved.<BR>
>  ; This program and the accompanying materials  ; 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 @@ -201,7 +201,8 
> @@
> CProcedureInvoke:
>      push       rbp
>      mov        rbp, rsp
> 
> -    mov        rax, ASM_PFX(InitializeFloatingPointUnits)
> +    lea        rax, [InitialzeFloatingPointUnitsAddress]
> +    mov        rax, qword [rax]
>      sub        rsp, 20h
>      call       rax               ; Call assembly function to initialize FPU 
> per UEFI
> spec
>      add        rsp, 20h
> @@ -219,6 +220,10 @@ CProcedureInvoke:
>      add        rsp, 20h
>      jmp        $                 ; Should never reach here
> 
> +InitialzeFloatingPointUnitsAddress:
> +    DQ 0                         ; Provide storage for absolute adddress of
> +                                 ; the InitializeFloatingPointUnits()
> +function
> +
>  RendezvousFunnelProcEnd:
> 
>  
> ;------------------------------------------------------------------------------------
> -
> @@ -282,11 +287,18 @@ AsmRelocateApLoopEnd:
>  
> ;------------------------------------------------------------------------------------
> -
>  global ASM_PFX(AsmGetAddressMap)
>  ASM_PFX(AsmGetAddressMap):
> -    mov        rax, ASM_PFX(RendezvousFunnelProc)
> +    ; Save absolute address of InitializeFloatingPointUnits() in data element
> +    ; within the RendezvousFunnelProc template.  This provides the address of
> +    ; the InitializeFloatingPointUnits() function to the RendezvousFunnelProc
> +    ; after it has been copied below 1MB
> +    lea        rax, [ASM_PFX(InitializeFloatingPointUnits)]
> +    mov        qword [InitialzeFloatingPointUnitsAddress], rax
> +
> +    lea        rax, [ASM_PFX(RendezvousFunnelProc)]
>      mov        qword [rcx], rax
>      mov        qword [rcx +  8h], LongModeStart - RendezvousFunnelProcStart
>      mov        qword [rcx + 10h], RendezvousFunnelProcEnd - 
> RendezvousFunnelProcStart
> -    mov        rax, ASM_PFX(AsmRelocateApLoop)
> +    lea        rax, [ASM_PFX(AsmRelocateApLoop)]
>      mov        qword [rcx + 18h], rax
>      mov        qword [rcx + 20h], AsmRelocateApLoopEnd - 
> AsmRelocateApLoopStart
>      ret
> --
> 2.6.3.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to