mirror of https://github.com/acidanthera/audk.git
177 lines
5.1 KiB
NASM
177 lines
5.1 KiB
NASM
;------------------------------------------------------------------------------ ;
|
|
; 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.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 0x08
|
|
DATA_SEL equ 0x20
|
|
TSS_SEL equ 0x40
|
|
|
|
SECTION .data
|
|
|
|
ASM_PFX(gcStmPsd):
|
|
DB 'TXTPSSIG'
|
|
DW PSD_SIZE
|
|
DW 1 ; Version
|
|
DD 0 ; LocalApicId
|
|
DB 0x05 ; 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 TSS_SEL
|
|
DW 0
|
|
DQ 0 ; SmmCr3
|
|
DD ASM_PFX(OnStmSetup)
|
|
DD 0
|
|
DD ASM_PFX(OnStmTeardown)
|
|
DD 0
|
|
DQ 0 ; SmmSmiHandlerRip - SMM guest entrypoint
|
|
DQ 0 ; SmmSmiHandlerRsp
|
|
DQ 0
|
|
DD 0
|
|
DD 0x80010100 ; RequiredStmSmmRevId
|
|
DD ASM_PFX(OnException)
|
|
DD 0
|
|
DQ 0 ; ExceptionStack
|
|
DW DATA_SEL
|
|
DW 0x01F ; ExceptionFilter
|
|
DD 0
|
|
DD 0
|
|
DD 0
|
|
DQ 0 ; BiosHwResourceRequirementsPtr
|
|
DQ 0 ; AcpiRsdp
|
|
DB 0 ; PhysicalAddressBits
|
|
PSD_SIZE equ $ - ASM_PFX(gcStmPsd)
|
|
|
|
SECTION .text
|
|
;------------------------------------------------------------------------------
|
|
; SMM Exception handlers
|
|
;------------------------------------------------------------------------------
|
|
global ASM_PFX(OnException)
|
|
ASM_PFX(OnException):
|
|
mov ecx, esp
|
|
push ecx
|
|
call ASM_PFX(SmmStmExceptionHandler)
|
|
add esp, 4
|
|
|
|
mov ebx, eax
|
|
mov eax, 4
|
|
DB 0x0f, 0x01, 0x0c1 ; VMCALL
|
|
jmp $
|
|
|
|
global ASM_PFX(OnStmSetup)
|
|
ASM_PFX(OnStmSetup):
|
|
;
|
|
; Check XD disable bit
|
|
;
|
|
xor esi, esi
|
|
mov eax, ASM_PFX(gStmXdSupported)
|
|
mov al, [eax]
|
|
cmp al, 0
|
|
jz @StmXdDone1
|
|
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 .51
|
|
and dx, 0xFFFB ; clear XD Disable bit if it is set
|
|
wrmsr
|
|
.51:
|
|
mov ecx, MSR_EFER
|
|
rdmsr
|
|
or ax, MSR_EFER_XD ; enable NXE
|
|
wrmsr
|
|
@StmXdDone1:
|
|
push esi
|
|
|
|
call ASM_PFX(SmmStmSetup)
|
|
|
|
mov eax, ASM_PFX(gStmXdSupported)
|
|
mov al, [eax]
|
|
cmp al, 0
|
|
jz .71
|
|
pop edx ; get saved MSR_IA32_MISC_ENABLE[63-32]
|
|
test edx, BIT2
|
|
jz .71
|
|
mov ecx, MSR_IA32_MISC_ENABLE
|
|
rdmsr
|
|
or dx, BIT2 ; set XD Disable bit if it was set before entering into SMM
|
|
wrmsr
|
|
|
|
.71:
|
|
rsm
|
|
|
|
global ASM_PFX(OnStmTeardown)
|
|
ASM_PFX(OnStmTeardown):
|
|
;
|
|
; Check XD disable bit
|
|
;
|
|
xor esi, esi
|
|
mov eax, ASM_PFX(gStmXdSupported)
|
|
mov al, [eax]
|
|
cmp al, 0
|
|
jz @StmXdDone2
|
|
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 .52
|
|
and dx, 0xFFFB ; clear XD Disable bit if it is set
|
|
wrmsr
|
|
.52:
|
|
mov ecx, MSR_EFER
|
|
rdmsr
|
|
or ax, MSR_EFER_XD ; enable NXE
|
|
wrmsr
|
|
@StmXdDone2:
|
|
push esi
|
|
|
|
call ASM_PFX(SmmStmTeardown)
|
|
|
|
mov eax, ASM_PFX(gStmXdSupported)
|
|
mov al, [eax]
|
|
cmp al, 0
|
|
jz .72
|
|
pop edx ; get saved MSR_IA32_MISC_ENABLE[63-32]
|
|
test edx, BIT2
|
|
jz .72
|
|
mov ecx, MSR_IA32_MISC_ENABLE
|
|
rdmsr
|
|
or dx, BIT2 ; set XD Disable bit if it was set before entering into SMM
|
|
wrmsr
|
|
|
|
.72:
|
|
rsm
|
|
|