Reviewed-by: Giri P Mudusuru <giri.p.mudus...@intel.com>

Fix typo Rellocate to Relocate

Thanks,
-Giri 

> -----Original Message-----
> From: Fan, Jeff
> Sent: Thursday, July 21, 2016 8:14 PM
> To: edk2-devel@lists.01.org
> Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Tian, Feng
> <feng.t...@intel.com>; Mudusuru, Giri P <giri.p.mudus...@intel.com>; Laszlo
> Ersek <ler...@redhat.com>
> Subject: [Patch v2 07/40] UefiCpuPkg/MpInitLib: Add AsmRellocateApLoop()
> assembly code
> 
> AsmRellocateApLoop() is used to place APs into MWAIT-loop if MonitorMwait
> feature is supported before hand-off to OS, or place APs into HLT-loop if
> MonitorMwait feature is not supported.
> 
> If the current mode is long mode, we will switch APs to protected mode
> before placing APs in MWAIT-loop or HLT-loop. Thus, once APs wakeup from
> loop, APs needn't the page table that may be crashed by OS.
> 
> Cc: Michael Kinney <michael.d.kin...@intel.com>
> Cc: Feng Tian <feng.t...@intel.com>
> Cc: Giri P Mudusuru <giri.p.mudus...@intel.com>
> Cc: Laszlo Ersek <ler...@redhat.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jeff Fan <jeff....@intel.com>
> ---
>  UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 24 ++++++++++++
>  UefiCpuPkg/Library/MpInitLib/MpLib.h           | 21 ++++++++++
>  UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm  | 53
> ++++++++++++++++++++++++++
>  3 files changed, 98 insertions(+)
> 
> diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
> b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
> index 338c9a2..a289f24 100644
> --- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
> +++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
> @@ -168,3 +168,27 @@ CProcedureInvoke:
>      jmp        $                 ; Never reach here
>  RendezvousFunnelProcEnd:
> 
> +;-------------------------------------------------------------------------------------
> +;  AsmRellocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment);
> +;-------------------------------------------------------------------------------------
> +global ASM_PFX(AsmRellocateApLoop)
> +ASM_PFX(AsmRellocateApLoop):
> +AsmRellocateApLoopStart:
> +    cmp        byte [esp + 4], 1
> +    jnz        HltLoop
> +MwaitLoop:
> +    mov        eax, esp
> +    xor        ecx, ecx
> +    xor        edx, edx
> +    monitor
> +    mov        eax, [esp + 8]    ; Mwait Cx, Target C-State per eax[7:4]
> +    shl        eax, 4
> +    mwait
> +    jmp        MwaitLoop
> +HltLoop:
> +    cli
> +    hlt
> +    jmp        HltLoop
> +    ret
> +AsmRellocateApLoopEnd:
> +
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> index 28a3cd4..ffa12af 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> @@ -60,5 +60,26 @@ typedef struct {
>  } MP_CPU_EXCHANGE_INFO;
> 
>  #pragma pack()
> +/**
> +  Assembly code to place AP into safe loop mode.
> +
> +  Place AP into targeted C-State if mwait-monitor is supported, otherwise
> +  place AP into hlt state.
> +  Place AP in protected mode if the current is long mode. Due to AP maybe
> +  wakeup by some hardware event. It could avoid accessing page table that
> +  may not available during booting to OS.
> +
> +  @param[in] MwaitSupport    TRUE indicates mwait-monitor is supported.
> +                             FALSE indicates mwait-monitor is not supported.
> +  @param[in] ApTargetCState  Target C-State value.
> +  @param[in] PmCodeSegment   Proteced mode code segement value.
> +**/
> +typedef
> +VOID
> +(EFIAPI * ASM_RELLOCATE_AP_LOOP) (
> +  IN BOOLEAN                 MwaitSupport,
> +  IN UINTN                   ApTargetCState,
> +  IN UINTN                   PmCodeSegment
> +  );
>  #endif
> 
> diff --git a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
> b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
> index b26325f..ff413be 100644
> --- a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
> +++ b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
> @@ -176,3 +176,56 @@ CProcedureInvoke:
> 
>  RendezvousFunnelProcEnd:
> 
> +;-------------------------------------------------------------------------------------
> +;  AsmRellocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment);
> +;-------------------------------------------------------------------------------------
> +global ASM_PFX(AsmRellocateApLoop)
> +ASM_PFX(AsmRellocateApLoop):
> +AsmRellocateApLoopStart:
> +    push       rcx
> +    push       rdx
> +
> +    lea        rsi, [PmEntry]    ; rsi <- The start address of transition 
> code
> +
> +    push       r8
> +    push       rsi
> +    DB         0x48
> +    retf
> +BITS 32
> +PmEntry:
> +    mov        eax, cr0
> +    btr        eax, 31           ; Clear CR0.PG
> +    mov        cr0, eax          ; Disable paging and caches
> +
> +    mov        ebx, edx          ; Save EntryPoint to rbx, for rdmsr will 
> overwrite rdx
> +    mov        ecx, 0xc0000080
> +    rdmsr
> +    and        ah, ~ 1           ; Clear LME
> +    wrmsr
> +    mov        eax, cr4
> +    and        al, ~ (1 << 5)    ; Clear PAE
> +    mov        cr4, eax
> +
> +    pop        edx
> +    add        esp, 4
> +    pop        ecx,
> +    add        esp, 4
> +    cmp        cl, 1              ; Check mwait-monitor support
> +    jnz        HltLoop
> +    mov        ebx, edx           ; Save C-State to ebx
> +MwaitLoop:
> +    mov        eax, esp           ; Set Monitor Address
> +    xor        ecx, ecx           ; ecx = 0
> +    xor        edx, edx           ; edx = 0
> +    monitor
> +    shl        ebx, 4
> +    mov        eax, ebx           ; Mwait Cx, Target C-State per eax[7:4]
> +    mwait
> +    jmp        MwaitLoop
> +HltLoop:
> +    cli
> +    hlt
> +    jmp        HltLoop
> +    ret
> +BITS 64
> +AsmRellocateApLoopEnd:
> --
> 2.7.4.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to