https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
		
			
				
	
	
		
			277 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| ;------------------------------------------------------------------------------ ;
 | |
| ; Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
| ; SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| ;
 | |
| ; Module Name:
 | |
| ;
 | |
| ;   SmiEntry.nasm
 | |
| ;
 | |
| ; Abstract:
 | |
| ;
 | |
| ;   Code template of the SMI handler for a particular processor
 | |
| ;
 | |
| ;-------------------------------------------------------------------------------
 | |
| 
 | |
| %include "StuffRsbNasm.inc"
 | |
| 
 | |
| %define MSR_IA32_MISC_ENABLE 0x1A0
 | |
| %define MSR_EFER      0xc0000080
 | |
| %define MSR_EFER_XD   0x800
 | |
| 
 | |
| ;
 | |
| ; Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR
 | |
| ;
 | |
| %define DSC_OFFSET 0xfb00
 | |
| %define DSC_GDTPTR 0x48
 | |
| %define DSC_GDTSIZ 0x50
 | |
| %define DSC_CS 0x14
 | |
| %define DSC_DS 0x16
 | |
| %define DSC_SS 0x18
 | |
| %define DSC_OTHERSEG 0x1a
 | |
| 
 | |
| %define PROTECT_MODE_CS 0x8
 | |
| %define PROTECT_MODE_DS 0x20
 | |
| %define TSS_SEGMENT 0x40
 | |
| 
 | |
| extern ASM_PFX(SmiRendezvous)
 | |
| extern ASM_PFX(FeaturePcdGet (PcdCpuSmmStackGuard))
 | |
| extern ASM_PFX(CpuSmmDebugEntry)
 | |
| extern ASM_PFX(CpuSmmDebugExit)
 | |
| 
 | |
| global ASM_PFX(gcStmSmiHandlerTemplate)
 | |
| global ASM_PFX(gcStmSmiHandlerSize)
 | |
| global ASM_PFX(gcStmSmiHandlerOffset)
 | |
| global ASM_PFX(gStmSmiCr3)
 | |
| global ASM_PFX(gStmSmiStack)
 | |
| global ASM_PFX(gStmSmbase)
 | |
| global ASM_PFX(gStmXdSupported)
 | |
| extern ASM_PFX(gStmSmiHandlerIdtr)
 | |
| 
 | |
| ASM_PFX(gStmSmiCr3)      EQU StmSmiCr3Patch - 4
 | |
| ASM_PFX(gStmSmiStack)    EQU StmSmiStackPatch - 4
 | |
| ASM_PFX(gStmSmbase)      EQU StmSmbasePatch - 4
 | |
| ASM_PFX(gStmXdSupported) EQU StmXdSupportedPatch - 1
 | |
| 
 | |
|     SECTION .text
 | |
| 
 | |
| BITS 16
 | |
| ASM_PFX(gcStmSmiHandlerTemplate):
 | |
| _StmSmiEntryPoint:
 | |
|     mov     bx, _StmGdtDesc - _StmSmiEntryPoint + 0x8000
 | |
|     mov     ax,[cs:DSC_OFFSET + DSC_GDTSIZ]
 | |
|     dec     ax
 | |
|     mov     [cs:bx], ax
 | |
|     mov     eax, [cs:DSC_OFFSET + DSC_GDTPTR]
 | |
|     mov     [cs:bx + 2], eax
 | |
|     mov     ebp, eax                      ; ebp = GDT base
 | |
| o32 lgdt    [cs:bx]                       ; lgdt fword ptr cs:[bx]
 | |
|     mov     ax, PROTECT_MODE_CS
 | |
|     mov     [cs:bx-0x2],ax
 | |
| o32 mov     edi, strict dword 0
 | |
| StmSmbasePatch:
 | |
|     lea     eax, [edi + (@32bit - _StmSmiEntryPoint) + 0x8000]
 | |
|     mov     [cs:bx-0x6],eax
 | |
|     mov     ebx, cr0
 | |
|     and     ebx, 0x9ffafff3
 | |
|     or      ebx, 0x23
 | |
|     mov     cr0, ebx
 | |
|     jmp     dword 0x0:0x0
 | |
| _StmGdtDesc:
 | |
|     DW 0
 | |
|     DD 0
 | |
| 
 | |
| BITS 32
 | |
| @32bit:
 | |
|     mov     ax, PROTECT_MODE_DS
 | |
| o16 mov     ds, ax
 | |
| o16 mov     es, ax
 | |
| o16 mov     fs, ax
 | |
| o16 mov     gs, ax
 | |
| o16 mov     ss, ax
 | |
|     mov     esp, strict dword 0
 | |
| StmSmiStackPatch:
 | |
|     mov     eax, ASM_PFX(gStmSmiHandlerIdtr)
 | |
|     lidt    [eax]
 | |
|     jmp     ProtFlatMode
 | |
| 
 | |
| ProtFlatMode:
 | |
|     mov eax, strict dword 0
 | |
| StmSmiCr3Patch:
 | |
|     mov     cr3, eax
 | |
| ;
 | |
| ; Need to test for CR4 specific bit support
 | |
| ;
 | |
|     mov     eax, 1
 | |
|     cpuid                               ; use CPUID to determine if specific CR4 bits are supported
 | |
|     xor     eax, eax                    ; Clear EAX
 | |
|     test    edx, BIT2                   ; Check for DE capabilities
 | |
|     jz      .0
 | |
|     or      eax, BIT3
 | |
| .0:
 | |
|     test    edx, BIT6                   ; Check for PAE capabilities
 | |
|     jz      .1
 | |
|     or      eax, BIT5
 | |
| .1:
 | |
|     test    edx, BIT7                   ; Check for MCE capabilities
 | |
|     jz      .2
 | |
|     or      eax, BIT6
 | |
| .2:
 | |
|     test    edx, BIT24                  ; Check for FXSR capabilities
 | |
|     jz      .3
 | |
|     or      eax, BIT9
 | |
| .3:
 | |
|     test    edx, BIT25                  ; Check for SSE capabilities
 | |
|     jz      .4
 | |
|     or      eax, BIT10
 | |
| .4:                                     ; as cr4.PGE is not set here, refresh cr3
 | |
|     mov     cr4, eax                    ; in PreModifyMtrrs() to flush TLB.
 | |
| 
 | |
|     cmp     byte [dword ASM_PFX(FeaturePcdGet (PcdCpuSmmStackGuard))], 0
 | |
|     jz      .6
 | |
| ; Load TSS
 | |
|     mov     byte [ebp + TSS_SEGMENT + 5], 0x89 ; clear busy flag
 | |
|     mov     eax, TSS_SEGMENT
 | |
|     ltr     ax
 | |
| .6:
 | |
| 
 | |
| ; enable NXE if supported
 | |
|     mov     al, strict byte 1
 | |
| StmXdSupportedPatch:
 | |
|     cmp     al, 0
 | |
|     jz      @SkipXd
 | |
| ;
 | |
| ; Check XD disable bit
 | |
| ;
 | |
|     mov     ecx, MSR_IA32_MISC_ENABLE
 | |
|     rdmsr
 | |
|     push    edx                        ; save MSR_IA32_MISC_ENABLE[63-32]
 | |
|     test    edx, BIT2                  ; MSR_IA32_MISC_ENABLE[34]
 | |
|     jz      .5
 | |
|     and     dx, 0xFFFB                 ; clear XD Disable bit if it is set
 | |
|     wrmsr
 | |
| .5:
 | |
|     mov     ecx, MSR_EFER
 | |
|     rdmsr
 | |
|     or      ax, MSR_EFER_XD             ; enable NXE
 | |
|     wrmsr
 | |
|     jmp     @XdDone
 | |
| @SkipXd:
 | |
|     sub     esp, 4
 | |
| @XdDone:
 | |
| 
 | |
|     mov     ebx, cr0
 | |
|     or      ebx, 0x80010023             ; enable paging + WP + NE + MP + PE
 | |
|     mov     cr0, ebx
 | |
|     lea     ebx, [edi + DSC_OFFSET]
 | |
|     mov     ax, [ebx + DSC_DS]
 | |
|     mov     ds, eax
 | |
|     mov     ax, [ebx + DSC_OTHERSEG]
 | |
|     mov     es, eax
 | |
|     mov     fs, eax
 | |
|     mov     gs, eax
 | |
|     mov     ax, [ebx + DSC_SS]
 | |
|     mov     ss, eax
 | |
| 
 | |
| CommonHandler:
 | |
|     mov     ebx, [esp + 4]                  ; CPU Index
 | |
|     push    ebx
 | |
|     mov     eax, ASM_PFX(CpuSmmDebugEntry)
 | |
|     call    eax
 | |
|     add     esp, 4
 | |
| 
 | |
|     push    ebx
 | |
|     mov     eax, ASM_PFX(SmiRendezvous)
 | |
|     call    eax
 | |
|     add     esp, 4
 | |
| 
 | |
|     push    ebx
 | |
|     mov     eax, ASM_PFX(CpuSmmDebugExit)
 | |
|     call    eax
 | |
|     add     esp, 4
 | |
| 
 | |
|     mov     eax, ASM_PFX(gStmXdSupported)
 | |
|     mov     al, [eax]
 | |
|     cmp     al, 0
 | |
|     jz      .7
 | |
|     pop     edx                       ; get saved MSR_IA32_MISC_ENABLE[63-32]
 | |
|     test    edx, BIT2
 | |
|     jz      .7
 | |
|     mov     ecx, MSR_IA32_MISC_ENABLE
 | |
|     rdmsr
 | |
|     or      dx, BIT2                  ; set XD Disable bit if it was set before entering into SMM
 | |
|     wrmsr
 | |
| 
 | |
| .7:
 | |
|     StuffRsb32
 | |
|     rsm
 | |
| 
 | |
| 
 | |
| _StmSmiHandler:
 | |
| ;
 | |
| ; Check XD disable bit
 | |
| ;
 | |
|     xor     esi, esi
 | |
|     mov     eax, ASM_PFX(gStmXdSupported)
 | |
|     mov     al, [eax]
 | |
|     cmp     al, 0
 | |
|     jz      @StmXdDone
 | |
|     mov     ecx, MSR_IA32_MISC_ENABLE
 | |
|     rdmsr
 | |
|     mov     esi, edx                   ; save MSR_IA32_MISC_ENABLE[63-32]
 | |
|     test    edx, BIT2                  ; MSR_IA32_MISC_ENABLE[34]
 | |
|     jz      .5
 | |
|     and     dx, 0xFFFB                 ; clear XD Disable bit if it is set
 | |
|     wrmsr
 | |
| .5:
 | |
|     mov     ecx, MSR_EFER
 | |
|     rdmsr
 | |
|     or      ax, MSR_EFER_XD             ; 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
 | |
|     mov     eax, ASM_PFX(gStmSmiHandlerIdtr)
 | |
|     lidt    [eax]
 | |
| 
 | |
|     mov     eax, cr0
 | |
|     or      eax, 0x80010023             ; enable paging + WP + NE + MP + PE
 | |
|     mov     cr0, eax
 | |
| ;
 | |
| ; Need to test for CR4 specific bit support
 | |
| ;
 | |
|     mov     eax, 1
 | |
|     cpuid                               ; use CPUID to determine if specific CR4 bits are supported
 | |
|     mov     eax, cr4                    ; init EAX
 | |
|     test    edx, BIT2                   ; Check for DE capabilities
 | |
|     jz      .0
 | |
|     or      eax, BIT3
 | |
| .0:
 | |
|     test    edx, BIT6                   ; Check for PAE capabilities
 | |
|     jz      .1
 | |
|     or      eax, BIT5
 | |
| .1:
 | |
|     test    edx, BIT7                   ; Check for MCE capabilities
 | |
|     jz      .2
 | |
|     or      eax, BIT6
 | |
| .2:
 | |
|     test    edx, BIT24                  ; Check for FXSR capabilities
 | |
|     jz      .3
 | |
|     or      eax, BIT9
 | |
| .3:
 | |
|     test    edx, BIT25                  ; Check for SSE capabilities
 | |
|     jz      .4
 | |
|     or      eax, BIT10
 | |
| .4:                                     ; as cr4.PGE is not set here, refresh cr3
 | |
|     mov     cr4, eax                    ; in PreModifyMtrrs() to flush TLB.
 | |
|     ; STM init finish
 | |
|     jmp     CommonHandler
 | |
| 
 | |
| ASM_PFX(gcStmSmiHandlerSize)   : DW        $ - _StmSmiEntryPoint
 | |
| ASM_PFX(gcStmSmiHandlerOffset) : DW        _StmSmiHandler - _StmSmiEntryPoint
 | |
| 
 | |
| global ASM_PFX(SmmCpuFeaturesLibStmSmiEntryFixupAddress)
 | |
| ASM_PFX(SmmCpuFeaturesLibStmSmiEntryFixupAddress):
 | |
|     ret
 |