HI Mike
Current gXdSupported is defined in C code. I am not able to refer it directly 
in protected mode asm directly.
One possible way is to define AsmXdSupported variable in protected mode ASM, 
then we can let C code back fill the data value.
Like what we did for gSmiStack and gSmiCr3. Do you think it is better solution?

Agree. I will use MACRO instead of hardcode 0xc0000080 and 0x800.

Agree. I will remove unused ActivateXd().



-----Original Message-----
From: Kinney, Michael D 
Sent: Thursday, November 26, 2015 1:28 AM
To: Yao, Jiewen; [email protected]; Kinney, Michael D
Cc: Fan, Jeff
Subject: RE: [patch] UefiCpuPkg/PiSmmCpu: Move XD enable to ASM before paging 
enable.

Jiewen,

Doing 2 CPUID instructions in every SMI looks expensive.

We have global mXdSupported.  Can we change that to gXdSupported and detect 
support in driver entry and use this BOOLEAN flag in assembly code to determine 
if the MSR_EFER need to be updated?

Also, please use MSR_EFER and MSR_EFER_XD defines instead of hard coded 
0xc0000080 and 0x800 values.

Also, if you are not calling C function ActivateXd() anymore, this function 
should be removed from SmmProfile.c and SmmProfile.h

Thanks,

Mike

> -----Original Message-----
> From: Yao, Jiewen
> Sent: Wednesday, November 25, 2015 12:57 AM
> To: [email protected]
> Cc: Yao, Jiewen <[email protected]>; Fan, Jeff <[email protected]>; 
> Kinney, Michael D <[email protected]>
> Subject: [patch] UefiCpuPkg/PiSmmCpu: Move XD enable to ASM before paging 
> enable.
> 
> There might be page table set SMM data region be XD.
> So we have to enable XD before enable paging. Or #PF might be generated.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: "Yao, Jiewen" <[email protected]>
> Cc: "Fan, Jeff" <[email protected]>
> Cc: "Kinney, Michael D" <[email protected]>
> ---
>  UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S   | 18 ++++++++++++++++++
>  UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm | 18 ++++++++++++++++++
>  UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c       |  7 -------
>  UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S    | 20 +++++++++++++++++++-
>  UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm  | 20 +++++++++++++++++++-
>  5 files changed, 74 insertions(+), 9 deletions(-)
> 
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S 
> b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S
> index fbaa072..7e1787c 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S
> @@ -122,6 +122,24 @@ L11:
>      orl     $BIT10, %eax
>  L12:                                       # as cr4.PGE is not set here, 
> refresh cr3
>      movl    %eax, %cr4                     # in PreModifyMtrrs() to flush 
> TLB.
> +
> +#
> +# Need to test for XD support
> +#
> +    movl    $0x80000000, %eax
> +    cpuid
> +    cmpl    $0x80000000, %eax
> +    jbe     L13
> +    movl    $0x80000001, %eax
> +    cpuid
> +    testl   $BIT20, %edx
> +    jz      L13
> +    movl    $0xc0000080, %ecx
> +    rdmsr
> +    orb     $8,%ah                         # enable NXE
> +    wrmsr
> +L13:
> +
>      movl    %cr0, %ebx
>      orl     $0x080000000, %ebx             # enable paging
>      movl    %ebx, %cr0
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm 
> b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm
> index 8a12927..e6af344 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm
> @@ -128,6 +128,24 @@ gSmiCr3     DD      ?
>      or      eax, BIT10
>  @@:                                     ; as cr4.PGE is not set here, 
> refresh cr3
>      mov     cr4, eax                    ; in PreModifyMtrrs() to flush TLB.
> +
> +;
> +; Need to test for XD support
> +;
> +    mov     eax, 080000000h
> +    cpuid
> +    cmp     eax, 080000000h
> +    jbe     @f
> +    mov     eax, 080000001h
> +    cpuid
> +    test    edx, BIT20
> +    jz      @f
> +    mov     ecx, 0c0000080h
> +    rdmsr
> +    or      ah, 8                       ; enable NXE
> +    wrmsr
> +@@:
> +
>      mov     ebx, cr0
>      or      ebx, 080000000h             ; enable paging
>      mov     cr0, ebx
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c 
> b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> index 031a5fe..26c9a0f 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> @@ -1075,13 +1075,6 @@ SmiRendezvous (
>        InitializeSpinLock (&mSmmMpSyncData->CpuData[CpuIndex].Busy);
>      }
> 
> -    //
> -    // Try to enable NX
> -    //
> -    if (mXdSupported) {
> -      ActivateXd ();
> -    }
> -
>      if (FeaturePcdGet (PcdCpuSmmProfileEnable)) {
>        ActivateSmmProfile (CpuIndex);
>      }
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S 
> b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S
> index b488b74..1d40819 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S
> @@ -139,9 +139,27 @@ ASM_PFX(gSmiCr3):    .space  4
>      call     Base                         # push return address for retf 
> later
>  Base:
>      addl    $(LongMode - Base), (%rsp)  # offset for far retf, seg is the 
> 1st arg
> +
> +#
> +# Need to test for XD support
> +#
> +    movl    $0x80000000, %eax
> +    cpuid
> +    cmpl    $0x80000000, %eax
> +    jbe     NxeDone
> +    movl    $0x80000001, %eax
> +    cpuid
> +    testl   $BIT20, %edx
> +    jz      NxeDone
> +    movl    $0xc0000080, %ecx
> +    rdmsr
> +    orb     $8,%ah                      # enable NXE
> +    wrmsr
> +NxeDone:
> +
>      movl    $0xc0000080, %ecx
>      rdmsr
> -    orb     $1,%ah
> +    orb     $1,%ah                      # enable LME
>      wrmsr
>      movq    %cr0, %rbx
>      btsl    $31, %ebx
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm 
> b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm
> index 4f5c03c..6e1d3f1 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm
> @@ -135,9 +135,27 @@ gSmiCr3     DD      ?
>      call    Base                       ; push return address for retf later
>  Base:
>      add     dword ptr [rsp], @LongMode - Base; offset for far retf, seg is 
> the 1st arg
> +
> +;
> +; Need to test for XD support
> +;
> +    mov     eax, 080000000h
> +    cpuid
> +    cmp     eax, 080000000h
> +    jbe     @f
> +    mov     eax, 080000001h
> +    cpuid
> +    test    edx, BIT20
> +    jz      @f
> +    mov     ecx, 0c0000080h
> +    rdmsr
> +    or      ah, 8                      ; enable NXE
> +    wrmsr
> +@@:
> +
>      mov     ecx, 0c0000080h
>      rdmsr
> -    or      ah, 1
> +    or      ah, 1                      ; enable LME
>      wrmsr
>      mov     rbx, cr0
>      bts     ebx, 31
> --
> 1.9.5.msysgit.0

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

Reply via email to