Reviewed-by: Eric Dong <eric.d...@intel.com>

> -----Original Message-----
> From: Zhang, Shenglei
> Sent: Tuesday, March 19, 2019 2:59 PM
> To: edk2-devel@lists.01.org
> Cc: Dong, Eric <eric.d...@intel.com>; Ni, Ray <ray...@intel.com>
> Subject: [PATCH v2 01/10] UefiCpuPkg/SmmCpuFeaturesLib: Remove .S files
> for IA32 and X64 arch
> 
> .nasm file has been added for X86 arch. .S assembly code is not required any
> more.
> https://bugzilla.tianocore.org/show_bug.cgi?id=1594
> 
> Cc: Eric Dong <eric.d...@intel.com>
> Cc: Ray Ni <ray...@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Shenglei Zhang <shenglei.zh...@intel.com>
> ---
>  .../Library/SmmCpuFeaturesLib/Ia32/SmiEntry.S | 278 -----------------
>  .../SmmCpuFeaturesLib/Ia32/SmiException.S     | 174 -----------
>  .../SmmCpuFeaturesLibStm.inf                  |   6 -
>  .../Library/SmmCpuFeaturesLib/X64/SmiEntry.S  | 282 ------------------
>  .../SmmCpuFeaturesLib/X64/SmiException.S      | 178 -----------
>  5 files changed, 918 deletions(-)
>  delete mode 100644
> UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.S
>  delete mode 100644
> UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiException.S
>  delete mode 100644
> UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.S
>  delete mode 100644
> UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiException.S
> 
> diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.S
> b/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.S
> deleted file mode 100644
> index 4c0f8c8933..0000000000
> --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.S
> +++ /dev/null
> @@ -1,278 +0,0 @@
> -#------------------------------------------------------------------------------
> -#
> -# Copyright (c) 2009 - 2016, 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 
> -#
> http://opensource.org/licenses/bsd-license.php.
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> -#
> -# Module Name:
> -#
> -#   SmiEntry.S
> -#
> -# Abstract:
> -#
> -#   Code template of the SMI handler for a particular processor
> -#
> -#------------------------------------------------------------------------------
> -
> -ASM_GLOBAL  ASM_PFX(gcStmSmiHandlerTemplate) -ASM_GLOBAL
> ASM_PFX(gcStmSmiHandlerSize) -ASM_GLOBAL
> ASM_PFX(gcStmSmiHandlerOffset) -ASM_GLOBAL  ASM_PFX(gStmSmiCr3) -
> ASM_GLOBAL  ASM_PFX(gStmSmiStack) -ASM_GLOBAL
> ASM_PFX(gStmSmbase) -ASM_GLOBAL  ASM_PFX(gStmXdSupported) -
> ASM_GLOBAL  ASM_PFX(FeaturePcdGet (PcdCpuSmmStackGuard)) -
> ASM_GLOBAL  ASM_PFX(gStmSmiHandlerIdtr)
> -
> -.equ            MSR_IA32_MISC_ENABLE, 0x1A0
> -.equ            MSR_EFER, 0xc0000080
> -.equ            MSR_EFER_XD, 0x800
> -
> -#
> -# Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR -#
> -.equ            DSC_OFFSET, 0xfb00
> -.equ            DSC_GDTPTR, 0x48
> -.equ            DSC_GDTSIZ, 0x50
> -.equ            DSC_CS, 0x14
> -.equ            DSC_DS, 0x16
> -.equ            DSC_SS, 0x18
> -.equ            DSC_OTHERSEG, 0x1A
> -
> -.equ            PROTECT_MODE_CS, 0x08
> -.equ            PROTECT_MODE_DS, 0x20
> -.equ            TSS_SEGMENT,     0x40
> -
> -    .text
> -ASM_PFX(gcStmSmiHandlerTemplate):
> -
> -_StmSmiEntryPoint:
> -    .byte 0xbb                          # mov bx, imm16
> -    .word _StmGdtDesc - _StmSmiEntryPoint + 0x8000
> -    .byte 0x2e,0xa1                     # mov ax, cs:[offset16]
> -    .word DSC_OFFSET + DSC_GDTSIZ
> -    decl    %eax
> -    movl    %eax, %cs:(%edi)            # mov cs:[bx], ax
> -    .byte 0x66,0x2e,0xa1                # mov eax, cs:[offset16]
> -    .word   DSC_OFFSET + DSC_GDTPTR
> -    movw    %ax, %cs:2(%edi)
> -    movw    %ax, %bp                    # ebp = GDT base
> -    .byte 0x66
> -    lgdt    %cs:(%edi)
> -# Patch ProtectedMode Segment
> -    .byte   0xb8                        # mov ax, imm16
> -    .word   PROTECT_MODE_CS             # set AX for segment directly
> -    movl    %eax, %cs:-2(%edi)          # mov cs:[bx - 2], ax
> -# Patch ProtectedMode entry
> -    .byte 0x66, 0xbf                    # mov edi, SMBASE
> -ASM_PFX(gStmSmbase): .space 4
> -    .byte 0x67
> -    lea     ((Start32bit - _StmSmiEntryPoint) + 0x8000)(%edi), %ax
> -    movw     %ax, %cs:-6(%edi)
> -    movl    %cr0, %ebx
> -    .byte 0x66
> -    andl    $0x9ffafff3, %ebx
> -    .byte 0x66
> -    orl     $0x23, %ebx
> -    movl    %ebx, %cr0
> -    .byte 0x66,0xea
> -    .space  4
> -    .space  2
> -_StmGdtDesc:   .space 4
> -            .space 2
> -
> -Start32bit:
> -    movw    $PROTECT_MODE_DS, %ax
> -    movl    %eax,%ds
> -    movl    %eax,%es
> -    movl    %eax,%fs
> -    movl    %eax,%gs
> -    movl    %eax,%ss
> -    .byte   0xbc                          # mov esp, imm32
> -ASM_PFX(gStmSmiStack): .space 4
> -    movl    $ASM_PFX(gStmSmiHandlerIdtr), %eax
> -    lidt    (%eax)
> -    jmp     ProtFlatMode
> -
> -ProtFlatMode:
> -    .byte   0xb8                           # mov eax, imm32
> -ASM_PFX(gStmSmiCr3): .space 4
> -    movl    %eax, %cr3
> -#
> -# Need to test for CR4 specific bit support -#
> -    movl    $1, %eax
> -    cpuid                                  # use CPUID to determine if 
> specific CR4 bits are
> supported
> -    xorl    %eax, %eax                     # Clear EAX
> -    testl   $BIT2, %edx                    # Check for DE capabilities
> -    jz      L8
> -    orl     $BIT3, %eax
> -L8:
> -    testl   $BIT6, %edx                    # Check for PAE capabilities
> -    jz      L9
> -    orl     $BIT5, %eax
> -L9:
> -    testl   $BIT7, %edx                    # Check for MCE capabilities
> -    jz      L10
> -    orl     $BIT6, %eax
> -L10:
> -    testl   $BIT24, %edx                   # Check for FXSR capabilities
> -    jz      L11
> -    orl     $BIT9, %eax
> -L11:
> -    testl   $BIT25, %edx                   # Check for SSE capabilities
> -    jz      L12
> -    orl     $BIT10, %eax
> -L12:                                       # as cr4.PGE is not set here, 
> refresh cr3
> -    movl    %eax, %cr4                     # in PreModifyMtrrs() to flush 
> TLB.
> -
> -    cmpb    $0, ASM_PFX(FeaturePcdGet (PcdCpuSmmStackGuard))
> -    jz      L5
> -# Load TSS
> -    movb    $0x89, (TSS_SEGMENT + 5)(%ebp) # clear busy flag
> -    movl    $TSS_SEGMENT, %eax
> -    ltrw    %ax
> -L5:
> -
> -# enable NXE if supported
> -    .byte   0xb0                           # mov al, imm8
> -ASM_PFX(gStmXdSupported): .byte 1
> -    cmpb    $0, %al
> -    jz      SkipXd
> -#
> -# Check XD disable bit
> -#
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    pushl   %edx                           # save MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx                    # MSR_IA32_MISC_ENABLE[34]
> -    jz      L13
> -    andw    $0x0FFFB, %dx                  # clear XD Disable bit if it is 
> set
> -    wrmsr
> -L13:
> -    movl    $MSR_EFER, %ecx
> -    rdmsr
> -    orw     $MSR_EFER_XD,%ax               # enable NXE
> -    wrmsr
> -    jmp     XdDone
> -SkipXd:
> -    subl    $4, %esp
> -XdDone:
> -
> -    movl    %cr0, %ebx
> -    orl     $0x080010023, %ebx             # enable paging + WP + NE + MP + 
> PE
> -    movl    %ebx, %cr0
> -    leal    DSC_OFFSET(%edi),%ebx
> -    movw    DSC_DS(%ebx),%ax
> -    movl    %eax, %ds
> -    movw    DSC_OTHERSEG(%ebx),%ax
> -    movl    %eax, %es
> -    movl    %eax, %fs
> -    movl    %eax, %gs
> -    movw    DSC_SS(%ebx),%ax
> -    movl    %eax, %ss
> -
> -CommonHandler:
> -    movl    4(%esp), %ebx
> -
> -    pushl   %ebx
> -    movl    $ASM_PFX(CpuSmmDebugEntry), %eax
> -    call    *%eax
> -    addl    $4, %esp
> -
> -    pushl   %ebx
> -    movl    $ASM_PFX(SmiRendezvous), %eax
> -    call    *%eax
> -    addl    $4, %esp
> -
> -    pushl   %ebx
> -    movl    $ASM_PFX(CpuSmmDebugExit), %eax
> -    call    *%eax
> -    addl    $4, %esp
> -
> -    movl    $ASM_PFX(gStmXdSupported), %eax
> -    movb    (%eax), %al
> -    cmpb    $0, %al
> -    jz      L16
> -    popl    %edx                        # get saved 
> MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx
> -    jz      L16
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    orw     $BIT2, %dx                  # set XD Disable bit if it was set 
> before entering
> into SMM
> -    wrmsr
> -
> -L16:
> -    rsm
> -
> -_StmSmiHandler:
> -#
> -# Check XD disable bit
> -#
> -    xorl    %esi, %esi
> -    movl    $ASM_PFX(gStmXdSupported), %eax
> -    movb    (%eax), %al
> -    cmpb    $0, %al
> -    jz      StmXdDone
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    movl    %edx, %esi                     # save MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx                    # MSR_IA32_MISC_ENABLE[34]
> -    jz      L14
> -    andw    $0x0FFFB, %dx                  # clear XD Disable bit if it is 
> set
> -    wrmsr
> -L14:
> -    movl    $MSR_EFER, %ecx
> -    rdmsr
> -    orw     $MSR_EFER_XD,%ax               # enable NXE
> -    wrmsr
> -StmXdDone:
> -    push    %esi
> -
> -    # below step is needed, because STM does not run above code.
> -    # we have to run below code to set IDT/CR0/CR4
> -    movl    $ASM_PFX(gStmSmiHandlerIdtr), %eax
> -    lidt    (%eax)
> -
> -    movl    %cr0, %eax
> -    orl     $0x80010023, %eax           # enable paging + WP + NE + MP + PE
> -    movl    %eax, %cr0
> -#
> -# Need to test for CR4 specific bit support -#
> -    movl    $1, %eax
> -    cpuid                               # use CPUID to determine if specific 
> CR4 bits are
> supported
> -    movl    %cr4, %eax                  # init EAX
> -    testl   $BIT2, %edx                 # Check for DE capabilities
> -    jz      L28
> -    orl     $BIT3, %eax
> -L28:
> -    testl   $BIT6, %edx                 # Check for PAE capabilities
> -    jz      L29
> -    orl     $BIT5, %eax
> -L29:
> -    testl   $BIT7, %edx                 # Check for MCE capabilities
> -    jz      L30
> -    orl     $BIT6, %eax
> -L30:
> -    testl   $BIT24, %edx                # Check for FXSR capabilities
> -    jz      L31
> -    orl     $BIT9, %eax
> -L31:
> -    testl   $BIT25, %edx                # Check for SSE capabilities
> -    jz      L32
> -    orl     $BIT10, %eax
> -L32:                                    # as cr4.PGE is not set here, 
> refresh cr3
> -    movl    %eax, %cr4                  # in PreModifyMtrrs() to flush TLB.
> -    # STM init finish
> -    jmp     CommonHandler
> -
> -
> -ASM_PFX(gcStmSmiHandlerSize)  :  .word      . - _StmSmiEntryPoint
> -ASM_PFX(gcStmSmiHandlerOffset):  .word      _StmSmiHandler -
> _StmSmiEntryPoint
> -
> diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiException.S
> b/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiException.S
> deleted file mode 100644
> index 7d0057af80..0000000000
> --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiException.S
> +++ /dev/null
> @@ -1,174 +0,0 @@
> -#------------------------------------------------------------------------------
> -#
> -# Copyright (c) 2009 - 2016, 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 
> -#
> http://opensource.org/licenses/bsd-license.php.
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> -#
> -# Module Name:
> -#
> -#   SmiException.S
> -#
> -# Abstract:
> -#
> -#   Exception handlers used in SM mode
> -#
> -#------------------------------------------------------------------------------
> -
> -ASM_GLOBAL  ASM_PFX(gcStmPsd)
> -
> -ASM_GLOBAL  ASM_PFX(SmmStmExceptionHandler) -ASM_GLOBAL
> ASM_PFX(SmmStmSetup) -ASM_GLOBAL  ASM_PFX(SmmStmTeardown)
> -
> -.equ  MSR_IA32_MISC_ENABLE, 0x1A0
> -.equ  MSR_EFER,             0xc0000080
> -.equ  MSR_EFER_XD,          0x800
> -
> -.equ  CODE_SEL,          0x08
> -.equ  DATA_SEL,          0x20
> -.equ  TSS_SEL,           0x40
> -
> -    .data
> -
> -ASM_PFX(gcStmPsd):
> -            .ascii  "TXTPSSIG"
> -            .word      PSD_SIZE
> -            .word      1              # Version
> -            .long      0              # LocalApicId
> -            .byte      0x5            #
> Cr4Pse;Cr4Pae;Intel64Mode;ExecutionDisableOutsideSmrr
> -            .byte      0              # BIOS to STM
> -            .byte      0              # STM to BIOS
> -            .byte      0
> -            .word      CODE_SEL
> -            .word      DATA_SEL
> -            .word      DATA_SEL
> -            .word      DATA_SEL
> -            .word      TSS_SEL
> -            .word      0
> -            .quad      0              # SmmCr3
> -            .long      ASM_PFX(_OnStmSetup)
> -            .long      0
> -            .long      ASM_PFX(_OnStmTeardown)
> -            .long      0
> -            .quad      0              # SmmSmiHandlerRip - SMM guest 
> entrypoint
> -            .quad      0              # SmmSmiHandlerRsp
> -            .quad      0
> -            .long      0
> -            .long      0x80010100     # RequiredStmSmmRevId
> -            .long      ASM_PFX(_OnException)
> -            .long      0
> -            .quad      0              # ExceptionStack
> -            .word      DATA_SEL
> -            .word      0x1F           # ExceptionFilter
> -            .long      0
> -            .quad      0
> -            .quad      0              # BiosHwResourceRequirementsPtr
> -            .quad      0              # AcpiRsdp
> -            .byte      0              # PhysicalAddressBits
> -.equ  PSD_SIZE,  . - ASM_PFX(gcStmPsd)
> -
> -    .text
> -
> -#------------------------------------------------------------------------------
> -# SMM Exception handlers
> -#------------------------------------------------------------------------------
> -ASM_GLOBAL ASM_PFX(_OnException)
> -ASM_PFX(_OnException):
> -    movl  %esp, %ecx
> -    pushl %ecx
> -    call  ASM_PFX(SmmStmExceptionHandler)
> -    addl  $4, %esp
> -
> -    movl  %eax, %ebx
> -    movl  $4, %eax
> -    .byte 0xf, 0x1, 0xc1 # VMCALL
> -    jmp .
> -
> -ASM_GLOBAL ASM_PFX(_OnStmSetup)
> -ASM_PFX(_OnStmSetup):
> -#
> -# Check XD disable bit
> -#
> -    xorl    %esi, %esi
> -    movl    $ASM_PFX(gStmXdSupported), %eax
> -    movb    (%eax), %al
> -    cmpb    $0, %al
> -    jz      StmXdDone1
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    movl    %edx, %esi                     # save MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx                    # MSR_IA32_MISC_ENABLE[34]
> -    jz      L13
> -    andw    $0x0FFFB, %dx                  # clear XD Disable bit if it is 
> set
> -    wrmsr
> -L13:
> -    movl    $MSR_EFER, %ecx
> -    rdmsr
> -    orw     $MSR_EFER_XD,%ax               # enable NXE
> -    wrmsr
> -StmXdDone1:
> -    push    %esi
> -
> -  call ASM_PFX(SmmStmSetup)
> -
> -    movl    $ASM_PFX(gStmXdSupported), %eax
> -    movb    (%eax), %al
> -    cmpb    $0, %al
> -    jz      L14
> -    popl    %edx                        # get saved 
> MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx
> -    jz      L14
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    orw     $BIT2, %dx                  # set XD Disable bit if it was set 
> before entering
> into SMM
> -    wrmsr
> -L14:
> -
> -  rsm
> -
> -ASM_GLOBAL ASM_PFX(_OnStmTeardown)
> -ASM_PFX(_OnStmTeardown):
> -#
> -# Check XD disable bit
> -#
> -    xorl    %esi, %esi
> -    movl    $ASM_PFX(gStmXdSupported), %eax
> -    movb    (%eax), %al
> -    cmpb    $0, %al
> -    jz      StmXdDone2
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    movl    %edx, %esi                     # save MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx                    # MSR_IA32_MISC_ENABLE[34]
> -    jz      L15
> -    andw    $0x0FFFB, %dx                  # clear XD Disable bit if it is 
> set
> -    wrmsr
> -L15:
> -    movl    $MSR_EFER, %ecx
> -    rdmsr
> -    orw     $MSR_EFER_XD,%ax               # enable NXE
> -    wrmsr
> -StmXdDone2:
> -    push    %esi
> -
> -  call ASM_PFX(SmmStmTeardown)
> -
> -    movl    $ASM_PFX(gStmXdSupported), %eax
> -    movb    (%eax), %al
> -    cmpb    $0, %al
> -    jz      L16
> -    popl    %edx                        # get saved 
> MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx
> -    jz      L16
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    orw     $BIT2, %dx                  # set XD Disable bit if it was set 
> before entering
> into SMM
> -    wrmsr
> -L16:
> -
> -  rsm
> diff --git
> a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf
> b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf
> index c700644427..7fd0cc5d04 100644
> --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf
> +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf
> @@ -35,9 +35,6 @@
>    Ia32/SmiEntry.nasm
>    Ia32/SmiException.nasm
> 
> -  Ia32/SmiEntry.S
> -  Ia32/SmiException.S
> -
>  [Sources.X64]
>    X64/SmmStmSupport.c
> 
> @@ -45,9 +42,6 @@
>    X64/SmiEntry.nasm
>    X64/SmiException.nasm
> 
> -  X64/SmiEntry.S
> -  X64/SmiException.S
> -
>  [Packages]
>    MdePkg/MdePkg.dec
>    MdeModulePkg/MdeModulePkg.dec
> diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.S
> b/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.S
> deleted file mode 100644
> index 1f9f91ce10..0000000000
> --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.S
> +++ /dev/null
> @@ -1,282 +0,0 @@
> -#------------------------------------------------------------------------------
> -#
> -# Copyright (c) 2009 - 2016, 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 
> -#
> http://opensource.org/licenses/bsd-license.php.
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> -#
> -# Module Name:
> -#
> -#   SmiEntry.S
> -#
> -# Abstract:
> -#
> -#   Code template of the SMI handler for a particular processor
> -#
> -#------------------------------------------------------------------------------
> -
> -ASM_GLOBAL  ASM_PFX(gcStmSmiHandlerTemplate) -ASM_GLOBAL
> ASM_PFX(gcStmSmiHandlerSize) -ASM_GLOBAL
> ASM_PFX(gcStmSmiHandlerOffset) -ASM_GLOBAL  ASM_PFX(gStmSmiCr3) -
> ASM_GLOBAL  ASM_PFX(gStmSmiStack) -ASM_GLOBAL
> ASM_PFX(gStmSmbase) -ASM_GLOBAL  ASM_PFX(gStmXdSupported) -
> ASM_GLOBAL  ASM_PFX(gStmSmiHandlerIdtr)
> -
> -.equ            MSR_IA32_MISC_ENABLE, 0x1A0
> -.equ            MSR_EFER, 0xc0000080
> -.equ            MSR_EFER_XD, 0x800
> -
> -#
> -# Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR -#
> -.equ            DSC_OFFSET, 0xfb00
> -.equ            DSC_GDTPTR, 0x48
> -.equ            DSC_GDTSIZ, 0x50
> -.equ            DSC_CS, 0x14
> -.equ            DSC_DS, 0x16
> -.equ            DSC_SS, 0x18
> -.equ            DSC_OTHERSEG, 0x1a
> -#
> -# Constants relating to CPU State Save Area -#
> -.equ            SSM_DR6,   0xffd0
> -.equ            SSM_DR7,   0xffc8
> -
> -.equ            PROTECT_MODE_CS, 0x08
> -.equ            PROTECT_MODE_DS, 0x20
> -.equ            LONG_MODE_CS, 0x38
> -.equ            TSS_SEGMENT, 0x40
> -.equ            GDT_SIZE, 0x50
> -
> -    .text
> -
> -ASM_PFX(gcStmSmiHandlerTemplate):
> -
> -_StmSmiEntryPoint:
> -    #
> -    # The encoding of BX in 16-bit addressing mode is the same as of RDI in 
> 64-
> -    # bit addressing mode. And that coincidence has been used in the
> following
> -    # "64-bit like" 16-bit code. Be aware that once RDI is referenced as a
> -    # base address register, it is actually BX that is referenced.
> -    #
> -    .byte 0xbb                          # mov bx, imm16
> -    .word _StmGdtDesc - _StmSmiEntryPoint + 0x8000
> -    #
> -    # fix GDT descriptor
> -    #
> -    .byte 0x2e,0xa1                     # mov ax, cs:[offset16]
> -    .word      DSC_OFFSET + DSC_GDTSIZ
> -    .byte 0x48                          # dec ax
> -    .byte 0x2e
> -    movl    %eax, (%rdi)                # mov cs:[bx], ax
> -    .byte 0x66,0x2e,0xa1                # mov eax, cs:[offset16]
> -    .word      DSC_OFFSET + DSC_GDTPTR
> -    .byte 0x2e
> -    movw    %ax, 2(%rdi)
> -    .byte 0x66,0x2e
> -    lgdt    (%rdi)
> -    #
> -    # Patch ProtectedMode Segment
> -    #
> -    .byte 0xb8
> -    .word PROTECT_MODE_CS
> -    .byte 0x2e
> -    movl    %eax, -2(%rdi)
> -    #
> -    # Patch ProtectedMode entry
> -    #
> -    .byte 0x66, 0xbf                    # mov edi, SMBASE
> -ASM_PFX(gStmSmbase): .space 4
> -    lea     ((ProtectedMode - _StmSmiEntryPoint) + 0x8000)(%edi), %ax
> -    .byte 0x2e
> -    movw    %ax, -6(%rdi)
> -    #
> -    # Switch into ProtectedMode
> -    #
> -    movq    %cr0, %rbx
> -    .byte 0x66
> -    andl    $0x9ffafff3, %ebx
> -    .byte 0x66
> -    orl     $0x00000023, %ebx
> -
> -    movq    %rbx, %cr0
> -    .byte 0x66, 0xea
> -    .space 6
> -
> -_StmGdtDesc:    .space  6
> -
> -ProtectedMode:
> -    movw    $PROTECT_MODE_DS, %ax
> -    movl    %eax, %ds
> -    movl    %eax, %es
> -    movl    %eax, %fs
> -    movl    %eax, %gs
> -    movl    %eax, %ss
> -    .byte   0xbc                       # mov esp, imm32
> -ASM_PFX(gStmSmiStack):   .space  4
> -    jmp     ProtFlatMode
> -
> -ProtFlatMode:
> -    .byte   0xb8
> -ASM_PFX(gStmSmiCr3):    .space  4
> -    movq    %rax, %cr3
> -    movl    $0x668,%eax                 # as cr4.PGE is not set here, 
> refresh cr3
> -    movq    %rax, %cr4                  # in PreModifyMtrrs() to flush TLB.
> -# Load TSS
> -    subl    $8, %esp                    # reserve room in stack
> -    sgdt    (%rsp)
> -    movl    2(%rsp), %eax               # eax = GDT base
> -    addl    $8, %esp
> -    movb    $0x89, %dl
> -    movb    %dl, (TSS_SEGMENT + 5)(%rax) # clear busy flag
> -    movl    $TSS_SEGMENT, %eax
> -    ltr     %ax
> -
> -# enable NXE if supported
> -    .byte   0xb0                        # mov al, imm8
> -ASM_PFX(gStmXdSupported): .byte 1
> -    cmpb    $0, %al
> -    jz      SkipXd
> -#
> -# Check XD disable bit
> -#
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    subl    $4, %esp
> -    pushq   %rdx                       # save MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx                # MSR_IA32_MISC_ENABLE[34]
> -    jz      L13
> -    andw    $0x0FFFB, %dx              # clear XD Disable bit if it is set
> -    wrmsr
> -L13:
> -    movl    $MSR_EFER, %ecx
> -    rdmsr
> -    orw     $MSR_EFER_XD,%ax            # enable NXE
> -    wrmsr
> -    jmp     XdDone
> -SkipXd:
> -    subl    $8, %esp
> -XdDone:
> -
> -    #
> -    # Switch to LongMode
> -    #
> -    pushq    $LONG_MODE_CS                # push cs hardcore here
> -    call     Base                         # push return address for retf 
> later
> -Base:
> -    addl    $(LongMode - Base), (%rsp)  # offset for far retf, seg is the 
> 1st arg
> -
> -    movl    $MSR_EFER, %ecx
> -    rdmsr
> -    orb     $1,%ah                      # enable LME
> -    wrmsr
> -    movq    %cr0, %rbx
> -    orl     $0x080010023, %ebx          # enable paging + WP + NE + MP + PE
> -    movq    %rbx, %cr0
> -    retf
> -LongMode:                               # long mode (64-bit code) starts here
> -    movabsq $ASM_PFX(gStmSmiHandlerIdtr), %rax
> -    lidt    (%rax)
> -    lea     (DSC_OFFSET)(%rdi), %ebx
> -    movw    DSC_DS(%rbx), %ax
> -    movl    %eax,%ds
> -    movw    DSC_OTHERSEG(%rbx), %ax
> -    movl    %eax,%es
> -    movl    %eax,%fs
> -    movl    %eax,%gs
> -    movw    DSC_SS(%rbx), %ax
> -    movl    %eax,%ss
> -
> -CommonHandler:
> -    movq    8(%rsp), %rbx
> -    # Save FP registers
> -
> -    subq    $0x200, %rsp
> -    .byte   0x48                        # FXSAVE64
> -    fxsave  (%rsp)
> -
> -    addq    $-0x20, %rsp
> -
> -    movq    %rbx, %rcx
> -    movabsq $ASM_PFX(CpuSmmDebugEntry), %rax
> -    call    *%rax
> -
> -    movq    %rbx, %rcx
> -    movabsq $ASM_PFX(SmiRendezvous), %rax
> -    call    *%rax
> -
> -    movq    %rbx, %rcx
> -    movabsq $ASM_PFX(CpuSmmDebugExit), %rax
> -    call    *%rax
> -
> -    addq    $0x20, %rsp
> -
> -    #
> -    # Restore FP registers
> -    #
> -    .byte   0x48                        # FXRSTOR64
> -    fxrstor (%rsp)
> -
> -    addq    $0x200, %rsp
> -
> -    movabsq $ASM_PFX(gStmXdSupported), %rax
> -    movb    (%rax), %al
> -    cmpb    $0, %al
> -    jz      L16
> -    popq    %rdx                        # get saved 
> MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx
> -    jz      L16
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    orw     $BIT2, %dx                  # set XD Disable bit if it was set 
> before entering
> into SMM
> -    wrmsr
> -
> -L16:
> -    rsm
> -
> -_StmSmiHandler:
> -#
> -# Check XD disable bit
> -#
> -    xorq    %r8, %r8
> -    movabsq $ASM_PFX(gStmXdSupported), %rax
> -    movb    (%rax), %al
> -    cmpb    $0, %al
> -    jz      StmXdDone
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    movq    %rdx, %r8                  # save MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx                # MSR_IA32_MISC_ENABLE[34]
> -    jz      L14
> -    andw    $0x0FFFB, %dx              # clear XD Disable bit if it is set
> -    wrmsr
> -L14:
> -    movl    $MSR_EFER, %ecx
> -    rdmsr
> -    orw     $MSR_EFER_XD,%ax            # enable NXE
> -    wrmsr
> -StmXdDone:
> -    pushq   %r8
> -
> -    # below step is needed, because STM does not run above code.
> -    # we have to run below code to set IDT/CR0/CR4
> -    movabsq $ASM_PFX(gStmSmiHandlerIdtr), %rax
> -    lidt    (%rax)
> -
> -    movq    %cr0, %rax
> -    orl     $0x80010023, %eax
> -    movq    %rax, %cr0
> -    movq    %cr4, %rax
> -    movl    $0x668, %eax                # as cr4.PGE is not set here, 
> refresh cr3
> -    movq    %rax, %cr4                  # in PreModifyMtrrs() to flush TLB.
> -    # STM init finish
> -    jmp     CommonHandler
> -
> -ASM_PFX(gcStmSmiHandlerSize)  :  .word      . - _StmSmiEntryPoint
> -ASM_PFX(gcStmSmiHandlerOffset):  .word      _StmSmiHandler -
> _StmSmiEntryPoint
> diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiException.S
> b/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiException.S
> deleted file mode 100644
> index 4d0cd9ac6f..0000000000
> --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiException.S
> +++ /dev/null
> @@ -1,178 +0,0 @@
> -#------------------------------------------------------------------------------
> -#
> -# Copyright (c) 2009 - 2016, 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 
> -#
> http://opensource.org/licenses/bsd-license.php.
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> -#
> -# Module Name:
> -#
> -#   SmiException.S
> -#
> -# Abstract:
> -#
> -#   Exception handlers used in SM mode
> -#
> -#------------------------------------------------------------------------------
> -
> -ASM_GLOBAL  ASM_PFX(gcStmPsd)
> -
> -ASM_GLOBAL  ASM_PFX(SmmStmExceptionHandler) -ASM_GLOBAL
> ASM_PFX(SmmStmSetup) -ASM_GLOBAL  ASM_PFX(SmmStmTeardown)
> -
> -.equ  CODE_SEL,             0x38
> -.equ  DATA_SEL,             0x20
> -.equ  TR_SEL,               0x40
> -
> -.equ  MSR_IA32_MISC_ENABLE, 0x1A0
> -.equ  MSR_EFER,             0x0c0000080
> -.equ  MSR_EFER_XD,          0x0800
> -
> -    .data
> -
> -#
> -# This structure serves as a template for all processors.
> -#
> -ASM_PFX(gcStmPsd):
> -            .ascii     "TXTPSSIG"
> -            .word      PSD_SIZE
> -            .word      1              # Version
> -            .long      0              # LocalApicId
> -            .byte      0xF            #
> Cr4Pse;Cr4Pae;Intel64Mode;ExecutionDisableOutsideSmrr
> -            .byte      0              # BIOS to STM
> -            .byte      0              # STM to BIOS
> -            .byte      0
> -            .word      CODE_SEL
> -            .word      DATA_SEL
> -            .word      DATA_SEL
> -            .word      DATA_SEL
> -            .word      TR_SEL
> -            .word      0
> -            .quad      0              # SmmCr3
> -            .quad      ASM_PFX(_OnStmSetup)
> -            .quad      ASM_PFX(_OnStmTeardown)
> -            .quad      0              # SmmSmiHandlerRip - SMM guest 
> entrypoint
> -            .quad      0              # SmmSmiHandlerRsp
> -            .quad      0
> -            .long      0
> -            .long      0x80010100     # RequiredStmSmmRevId
> -            .quad      ASM_PFX(_OnException)
> -            .quad      0              # ExceptionStack
> -            .word      DATA_SEL
> -            .word      0x1F           # ExceptionFilter
> -            .long      0
> -            .quad      0
> -            .quad      0              # BiosHwResourceRequirementsPtr
> -            .quad      0              # AcpiRsdp
> -            .byte      0              # PhysicalAddressBits
> -.equ  PSD_SIZE,  . - ASM_PFX(gcStmPsd)
> -
> -    .text
> -#------------------------------------------------------------------------------
> -# SMM Exception handlers
> -#------------------------------------------------------------------------------
> -
> -ASM_GLOBAL ASM_PFX(_OnException)
> -ASM_PFX(_OnException):
> -    movq %rsp, %rcx
> -    subq $0x28, %rsp
> -    call ASM_PFX(SmmStmExceptionHandler)
> -    addq $0x28, %rsp
> -    movl %eax, %ebx
> -    movl $4, %eax
> -    .byte  0xf, 0x1, 0xc1 # VMCALL
> -    jmp .
> -
> -ASM_GLOBAL ASM_PFX(_OnStmSetup)
> -ASM_PFX(_OnStmSetup):
> -#
> -# Check XD disable bit
> -#
> -    xorq    %r8, %r8
> -    movabsq $ASM_PFX(gStmXdSupported), %rax
> -    movb    (%rax), %al
> -    cmpb    $0, %al
> -    jz      StmXdDone1
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    movq    %rdx, %r8                  # save MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx                # MSR_IA32_MISC_ENABLE[34]
> -    jz      L13
> -    andw    $0x0FFFB, %dx              # clear XD Disable bit if it is set
> -    wrmsr
> -L13:
> -    movl    $MSR_EFER, %ecx
> -    rdmsr
> -    orw     $MSR_EFER_XD,%ax            # enable NXE
> -    wrmsr
> -StmXdDone1:
> -    pushq   %r8
> -
> -  subq $0x20, %rsp
> -  call ASM_PFX(SmmStmSetup)
> -  addq 0x20, %rsp
> -
> -    movabsq $ASM_PFX(gStmXdSupported), %rax
> -    movb    (%rax), %al
> -    cmpb    $0, %al
> -    jz      L14
> -    popq    %rdx                        # get saved 
> MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx
> -    jz      L14
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    orw     $BIT2, %dx                  # set XD Disable bit if it was set 
> before entering
> into SMM
> -    wrmsr
> -L14:
> -
> -  rsm
> -
> -ASM_GLOBAL ASM_PFX(_OnStmTeardown)
> -ASM_PFX(_OnStmTeardown):
> -#
> -# Check XD disable bit
> -#
> -    xorq    %r8, %r8
> -    movabsq $ASM_PFX(gStmXdSupported), %rax
> -    movb    (%rax), %al
> -    cmpb    $0, %al
> -    jz      StmXdDone2
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    movq    %rdx, %r8                  # save MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx                # MSR_IA32_MISC_ENABLE[34]
> -    jz      L15
> -    andw    $0x0FFFB, %dx              # clear XD Disable bit if it is set
> -    wrmsr
> -L15:
> -    movl    $MSR_EFER, %ecx
> -    rdmsr
> -    orw     $MSR_EFER_XD,%ax            # enable NXE
> -    wrmsr
> -StmXdDone2:
> -    pushq   %r8
> -
> -  subq $0x20, %rsp
> -  call ASM_PFX(SmmStmTeardown)
> -  addq $0x20, %rsp
> -
> -    movabsq $ASM_PFX(gStmXdSupported), %rax
> -    movb    (%rax), %al
> -    cmpb    $0, %al
> -    jz      L16
> -    popq    %rdx                        # get saved 
> MSR_IA32_MISC_ENABLE[63-32]
> -    testl   $BIT2, %edx
> -    jz      L16
> -    movl    $MSR_IA32_MISC_ENABLE, %ecx
> -    rdmsr
> -    orw     $BIT2, %dx                  # set XD Disable bit if it was set 
> before entering
> into SMM
> -    wrmsr
> -L16:
> -
> -  rsm
> -
> --
> 2.18.0.windows.1

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

Reply via email to