| ;------------------------------------------------------------------------------ ; | |
| ; Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> | |
| ; SPDX-License-Identifier: BSD-2-Clause-Patent | |
| ; | |
| ; Module Name: | |
| ; | |
| ; SmiException.nasm | |
| ; | |
| ; Abstract: | |
| ; | |
| ; Exception handlers used in SM mode | |
| ; | |
| ;------------------------------------------------------------------------------- | |
| %include "StuffRsbNasm.inc" | |
| 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 | |
| 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: | |
| StuffRsb32 | |
| 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: | |
| StuffRsb32 | |
| rsm |