Jiewen,

Yes.  That is a good solution to declare global in assembly for this case.

Mike

> -----Original Message-----
> From: Yao, Jiewen
> Sent: Wednesday, November 25, 2015 2:17 PM
> To: Kinney, Michael D <[email protected]>; [email protected]
> Cc: Fan, Jeff <[email protected]>
> Subject: RE: [patch] UefiCpuPkg/PiSmmCpu: Move XD enable to ASM before paging 
> enable.
> 
> 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