https://bugzilla.tianocore.org/show_bug.cgi?id=849 In V2, use "mov rax, strict qword 0" to replace the hard code db. 1. Use lea instruction to get the address instead of mov instruction. 2. Use the dummy address as jmp destination, and add the logic to fix up the address to the absolute address at boot time. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Liming Gao <liming.gao@intel.com> Cc: Andrew Fish <afish@apple.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Michael Kinney <michael.d.kinney@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
		
			
				
	
	
		
			179 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| ;------------------------------------------------------------------------------ ;
 | |
| ; Copyright (c) 2016 - 2018, 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.nasm
 | |
| ;
 | |
| ; Abstract:
 | |
| ;
 | |
| ;   Exception handlers used in SM mode
 | |
| ;
 | |
| ;-------------------------------------------------------------------------------
 | |
| 
 | |
| global  ASM_PFX(gcStmPsd)
 | |
| 
 | |
| extern  ASM_PFX(SmmStmExceptionHandler)
 | |
| extern  ASM_PFX(SmmStmSetup)
 | |
| extern  ASM_PFX(SmmStmTeardown)
 | |
| extern  ASM_PFX(gStmXdSupported)
 | |
| extern  ASM_PFX(gStmSmiHandlerIdtr)
 | |
| 
 | |
| %define MSR_IA32_MISC_ENABLE 0x1A0
 | |
| %define MSR_EFER      0xc0000080
 | |
| %define MSR_EFER_XD   0x800
 | |
| 
 | |
| CODE_SEL          equ 0x38
 | |
| DATA_SEL          equ 0x20
 | |
| TR_SEL            equ 0x40
 | |
| 
 | |
|     SECTION .data
 | |
| 
 | |
| ;
 | |
| ; This structure serves as a template for all processors.
 | |
| ;
 | |
| ASM_PFX(gcStmPsd):
 | |
|             DB      'TXTPSSIG'
 | |
|             DW      PSD_SIZE
 | |
|             DW      1              ; Version
 | |
|             DD      0              ; LocalApicId
 | |
|             DB      0x0F           ; Cr4Pse;Cr4Pae;Intel64Mode;ExecutionDisableOutsideSmrr
 | |
|             DB      0              ; BIOS to STM
 | |
|             DB      0              ; STM to BIOS
 | |
|             DB      0
 | |
|             DW      CODE_SEL
 | |
|             DW      DATA_SEL
 | |
|             DW      DATA_SEL
 | |
|             DW      DATA_SEL
 | |
|             DW      TR_SEL
 | |
|             DW      0
 | |
|             DQ      0              ; SmmCr3
 | |
|             DQ      ASM_PFX(OnStmSetup)
 | |
|             DQ      ASM_PFX(OnStmTeardown)
 | |
|             DQ      0              ; SmmSmiHandlerRip - SMM guest entrypoint
 | |
|             DQ      0              ; SmmSmiHandlerRsp
 | |
|             DQ      0
 | |
|             DD      0
 | |
|             DD      0x80010100     ; RequiredStmSmmRevId
 | |
|             DQ      ASM_PFX(OnException)
 | |
|             DQ      0              ; ExceptionStack
 | |
|             DW      DATA_SEL
 | |
|             DW      0x01F          ; ExceptionFilter
 | |
|             DD      0
 | |
|             DQ      0
 | |
|             DQ      0              ; BiosHwResourceRequirementsPtr
 | |
|             DQ      0              ; AcpiRsdp
 | |
|             DB      0              ; PhysicalAddressBits
 | |
| PSD_SIZE  equ $ -   ASM_PFX(gcStmPsd)
 | |
| 
 | |
|     DEFAULT REL
 | |
|     SECTION .text
 | |
| ;------------------------------------------------------------------------------
 | |
| ; SMM Exception handlers
 | |
| ;------------------------------------------------------------------------------
 | |
| global ASM_PFX(OnException)
 | |
| ASM_PFX(OnException):
 | |
|     mov  rcx, rsp
 | |
|     add  rsp, -0x28
 | |
|     call ASM_PFX(SmmStmExceptionHandler)
 | |
|     add  rsp, 0x28
 | |
|     mov  ebx, eax
 | |
|     mov  eax, 4
 | |
|     vmcall
 | |
|     jmp $
 | |
| 
 | |
| global ASM_PFX(OnStmSetup)
 | |
| ASM_PFX(OnStmSetup):
 | |
| ;
 | |
| ; Check XD disable bit
 | |
| ;
 | |
|     xor     r8, r8
 | |
|     lea     rax, [ASM_PFX(gStmXdSupported)]
 | |
|     mov     al, [rax]
 | |
|     cmp     al, 0
 | |
|     jz      @StmXdDone1
 | |
|     mov     ecx, MSR_IA32_MISC_ENABLE
 | |
|     rdmsr
 | |
|     mov     r8, rdx                    ; save MSR_IA32_MISC_ENABLE[63-32]
 | |
|     test    edx, BIT2                  ; MSR_IA32_MISC_ENABLE[34]
 | |
|     jz      .01
 | |
|     and     dx, 0xFFFB                 ; clear XD Disable bit if it is set
 | |
|     wrmsr
 | |
| .01:
 | |
|     mov     ecx, MSR_EFER
 | |
|     rdmsr
 | |
|     or      ax, MSR_EFER_XD            ; enable NXE
 | |
|     wrmsr
 | |
| @StmXdDone1:
 | |
|     push    r8
 | |
| 
 | |
|   add  rsp, -0x20
 | |
|   call ASM_PFX(SmmStmSetup)
 | |
|   add  rsp, 0x20
 | |
| 
 | |
|     lea     rax, [ASM_PFX(gStmXdSupported)]
 | |
|     mov     al, [rax]
 | |
|     cmp     al, 0
 | |
|     jz      .11
 | |
|     pop     rdx                       ; get saved MSR_IA32_MISC_ENABLE[63-32]
 | |
|     test    edx, BIT2
 | |
|     jz      .11
 | |
|     mov     ecx, MSR_IA32_MISC_ENABLE
 | |
|     rdmsr
 | |
|     or      dx, BIT2                  ; set XD Disable bit if it was set before entering into SMM
 | |
|     wrmsr
 | |
| 
 | |
| .11:
 | |
|   rsm
 | |
| 
 | |
| global ASM_PFX(OnStmTeardown)
 | |
| ASM_PFX(OnStmTeardown):
 | |
| ;
 | |
| ; Check XD disable bit
 | |
| ;
 | |
|     xor     r8, r8
 | |
|     lea     rax, [ASM_PFX(gStmXdSupported)]
 | |
|     mov     al, [rax]
 | |
|     cmp     al, 0
 | |
|     jz      @StmXdDone2
 | |
|     mov     ecx, MSR_IA32_MISC_ENABLE
 | |
|     rdmsr
 | |
|     mov     r8, rdx                    ; save MSR_IA32_MISC_ENABLE[63-32]
 | |
|     test    edx, BIT2                  ; MSR_IA32_MISC_ENABLE[34]
 | |
|     jz      .02
 | |
|     and     dx, 0xFFFB                 ; clear XD Disable bit if it is set
 | |
|     wrmsr
 | |
| .02:
 | |
|     mov     ecx, MSR_EFER
 | |
|     rdmsr
 | |
|     or      ax, MSR_EFER_XD            ; enable NXE
 | |
|     wrmsr
 | |
| @StmXdDone2:
 | |
|     push    r8
 | |
| 
 | |
|   add  rsp, -0x20
 | |
|   call ASM_PFX(SmmStmTeardown)
 | |
|   add  rsp, 0x20
 | |
| 
 | |
|     lea     rax, [ASM_PFX(gStmXdSupported)]
 | |
|     mov     al, [rax]
 | |
|     cmp     al, 0
 | |
|     jz      .12
 | |
|     pop     rdx                       ; get saved MSR_IA32_MISC_ENABLE[63-32]
 | |
|     test    edx, BIT2
 | |
|     jz      .12
 | |
|     mov     ecx, MSR_IA32_MISC_ENABLE
 | |
|     rdmsr
 | |
|     or      dx, BIT2                  ; set XD Disable bit if it was set before entering into SMM
 | |
|     wrmsr
 | |
| 
 | |
| .12:
 | |
|   rsm
 |