;------------------------------------------------------------------------------ ; | |
; 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.asm | |
; | |
; Abstract: | |
; | |
; Exception handlers used in SM mode | |
; | |
;------------------------------------------------------------------------------- | |
EXTERNDEF gcStmPsd:BYTE | |
EXTERNDEF SmmStmExceptionHandler:PROC | |
EXTERNDEF SmmStmSetup:PROC | |
EXTERNDEF SmmStmTeardown:PROC | |
EXTERNDEF gStmXdSupported:BYTE | |
CODE_SEL EQU 38h | |
DATA_SEL EQU 20h | |
TR_SEL EQU 40h | |
MSR_IA32_MISC_ENABLE EQU 1A0h | |
MSR_EFER EQU 0c0000080h | |
MSR_EFER_XD EQU 0800h | |
.data | |
; | |
; This structure serves as a template for all processors. | |
; | |
gcStmPsd LABEL BYTE | |
DB 'TXTPSSIG' | |
DW PSD_SIZE | |
DW 1 ; Version | |
DD 0 ; LocalApicId | |
DB 0Fh ; 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 _OnStmSetup | |
DQ _OnStmTeardown | |
DQ 0 ; SmmSmiHandlerRip - SMM guest entrypoint | |
DQ 0 ; SmmSmiHandlerRsp | |
DQ 0 | |
DD 0 | |
DD 80010100h ; RequiredStmSmmRevId | |
DQ _OnException | |
DQ 0 ; ExceptionStack | |
DW DATA_SEL | |
DW 01Fh ; ExceptionFilter | |
DD 0 | |
DQ 0 | |
DQ 0 ; BiosHwResourceRequirementsPtr | |
DQ 0 ; AcpiRsdp | |
DB 0 ; PhysicalAddressBits | |
PSD_SIZE = $ - offset gcStmPsd | |
.code | |
;------------------------------------------------------------------------------ | |
; SMM Exception handlers | |
;------------------------------------------------------------------------------ | |
_OnException PROC | |
mov rcx, rsp | |
add rsp, -28h | |
call SmmStmExceptionHandler | |
add rsp, 28h | |
mov ebx, eax | |
mov eax, 4 | |
DB 0fh, 01h, 0c1h ; VMCALL | |
jmp $ | |
_OnException ENDP | |
_OnStmSetup PROC | |
; | |
; Check XD disable bit | |
; | |
xor r8, r8 | |
mov rax, offset 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 @f | |
and dx, 0FFFBh ; clear XD Disable bit if it is set | |
wrmsr | |
@@: | |
mov ecx, MSR_EFER | |
rdmsr | |
or ax, MSR_EFER_XD ; enable NXE | |
wrmsr | |
@StmXdDone1: | |
push r8 | |
add rsp, -20h | |
call SmmStmSetup | |
add rsp, 20h | |
mov rax, offset ASM_PFX(gStmXdSupported) | |
mov al, [rax] | |
cmp al, 0 | |
jz @f | |
pop rdx ; get saved MSR_IA32_MISC_ENABLE[63-32] | |
test edx, BIT2 | |
jz @f | |
mov ecx, MSR_IA32_MISC_ENABLE | |
rdmsr | |
or dx, BIT2 ; set XD Disable bit if it was set before entering into SMM | |
wrmsr | |
@@: | |
rsm | |
_OnStmSetup ENDP | |
_OnStmTeardown PROC | |
; | |
; Check XD disable bit | |
; | |
xor r8, r8 | |
mov rax, offset 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 @f | |
and dx, 0FFFBh ; clear XD Disable bit if it is set | |
wrmsr | |
@@: | |
mov ecx, MSR_EFER | |
rdmsr | |
or ax, MSR_EFER_XD ; enable NXE | |
wrmsr | |
@StmXdDone2: | |
push r8 | |
add rsp, -20h | |
call SmmStmTeardown | |
add rsp, 20h | |
mov rax, offset ASM_PFX(gStmXdSupported) | |
mov al, [rax] | |
cmp al, 0 | |
jz @f | |
pop rdx ; get saved MSR_IA32_MISC_ENABLE[63-32] | |
test edx, BIT2 | |
jz @f | |
mov ecx, MSR_IA32_MISC_ENABLE | |
rdmsr | |
or dx, BIT2 ; set XD Disable bit if it was set before entering into SMM | |
wrmsr | |
@@: | |
rsm | |
_OnStmTeardown ENDP | |
END |