]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiException.nasm
UefiCpuPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / UefiCpuPkg / Library / SmmCpuFeaturesLib / Ia32 / SmiException.nasm
CommitLineData
09119a00 1;------------------------------------------------------------------------------ ;\r
0df50560 2; Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
0acd8697 3; SPDX-License-Identifier: BSD-2-Clause-Patent\r
09119a00
MK
4;\r
5; Module Name:\r
6;\r
7; SmiException.nasm\r
8;\r
9; Abstract:\r
10;\r
11; Exception handlers used in SM mode\r
12;\r
13;-------------------------------------------------------------------------------\r
14\r
ada4a003 15%include "StuffRsbNasm.inc"\r
0df50560 16\r
09119a00
MK
17global ASM_PFX(gcStmPsd)\r
18\r
19extern ASM_PFX(SmmStmExceptionHandler)\r
20extern ASM_PFX(SmmStmSetup)\r
21extern ASM_PFX(SmmStmTeardown)\r
22extern ASM_PFX(gStmXdSupported)\r
23extern ASM_PFX(gStmSmiHandlerIdtr)\r
24\r
25%define MSR_IA32_MISC_ENABLE 0x1A0\r
26%define MSR_EFER 0xc0000080\r
27%define MSR_EFER_XD 0x800\r
28\r
29CODE_SEL equ 0x08\r
30DATA_SEL equ 0x20\r
31TSS_SEL equ 0x40\r
32\r
33 SECTION .data\r
34\r
35ASM_PFX(gcStmPsd):\r
36 DB 'TXTPSSIG'\r
37 DW PSD_SIZE\r
38 DW 1 ; Version\r
39 DD 0 ; LocalApicId\r
40 DB 0x05 ; Cr4Pse;Cr4Pae;Intel64Mode;ExecutionDisableOutsideSmrr\r
41 DB 0 ; BIOS to STM\r
42 DB 0 ; STM to BIOS\r
43 DB 0\r
44 DW CODE_SEL\r
45 DW DATA_SEL\r
46 DW DATA_SEL\r
47 DW DATA_SEL\r
48 DW TSS_SEL\r
49 DW 0\r
50 DQ 0 ; SmmCr3\r
51 DD ASM_PFX(OnStmSetup)\r
52 DD 0\r
53 DD ASM_PFX(OnStmTeardown)\r
54 DD 0\r
55 DQ 0 ; SmmSmiHandlerRip - SMM guest entrypoint\r
56 DQ 0 ; SmmSmiHandlerRsp\r
57 DQ 0\r
58 DD 0\r
59 DD 0x80010100 ; RequiredStmSmmRevId\r
60 DD ASM_PFX(OnException)\r
61 DD 0\r
62 DQ 0 ; ExceptionStack\r
63 DW DATA_SEL\r
64 DW 0x01F ; ExceptionFilter\r
65 DD 0\r
66 DD 0\r
67 DD 0\r
68 DQ 0 ; BiosHwResourceRequirementsPtr\r
69 DQ 0 ; AcpiRsdp\r
70 DB 0 ; PhysicalAddressBits\r
71PSD_SIZE equ $ - ASM_PFX(gcStmPsd)\r
72\r
73 SECTION .text\r
74;------------------------------------------------------------------------------\r
75; SMM Exception handlers\r
76;------------------------------------------------------------------------------\r
77global ASM_PFX(OnException)\r
78ASM_PFX(OnException):\r
79 mov ecx, esp\r
80 push ecx\r
81 call ASM_PFX(SmmStmExceptionHandler)\r
82 add esp, 4\r
83\r
84 mov ebx, eax\r
85 mov eax, 4\r
4c34a8ea 86 vmcall\r
09119a00
MK
87 jmp $\r
88\r
89global ASM_PFX(OnStmSetup)\r
90ASM_PFX(OnStmSetup):\r
91;\r
92; Check XD disable bit\r
93;\r
94 xor esi, esi\r
95 mov eax, ASM_PFX(gStmXdSupported)\r
96 mov al, [eax]\r
97 cmp al, 0\r
98 jz @StmXdDone1\r
99 mov ecx, MSR_IA32_MISC_ENABLE\r
100 rdmsr\r
101 mov esi, edx ; save MSR_IA32_MISC_ENABLE[63-32]\r
102 test edx, BIT2 ; MSR_IA32_MISC_ENABLE[34]\r
103 jz .51\r
104 and dx, 0xFFFB ; clear XD Disable bit if it is set\r
105 wrmsr\r
106.51:\r
107 mov ecx, MSR_EFER\r
108 rdmsr\r
109 or ax, MSR_EFER_XD ; enable NXE\r
110 wrmsr\r
111@StmXdDone1:\r
112 push esi\r
113\r
114 call ASM_PFX(SmmStmSetup)\r
115\r
116 mov eax, ASM_PFX(gStmXdSupported)\r
117 mov al, [eax]\r
118 cmp al, 0\r
119 jz .71\r
120 pop edx ; get saved MSR_IA32_MISC_ENABLE[63-32]\r
121 test edx, BIT2\r
122 jz .71\r
123 mov ecx, MSR_IA32_MISC_ENABLE\r
124 rdmsr\r
125 or dx, BIT2 ; set XD Disable bit if it was set before entering into SMM\r
126 wrmsr\r
127\r
128.71:\r
0df50560
HW
129 StuffRsb32\r
130 rsm\r
09119a00
MK
131\r
132global ASM_PFX(OnStmTeardown)\r
133ASM_PFX(OnStmTeardown):\r
134;\r
135; Check XD disable bit\r
136;\r
137 xor esi, esi\r
138 mov eax, ASM_PFX(gStmXdSupported)\r
139 mov al, [eax]\r
140 cmp al, 0\r
141 jz @StmXdDone2\r
142 mov ecx, MSR_IA32_MISC_ENABLE\r
143 rdmsr\r
144 mov esi, edx ; save MSR_IA32_MISC_ENABLE[63-32]\r
145 test edx, BIT2 ; MSR_IA32_MISC_ENABLE[34]\r
146 jz .52\r
147 and dx, 0xFFFB ; clear XD Disable bit if it is set\r
148 wrmsr\r
149.52:\r
150 mov ecx, MSR_EFER\r
151 rdmsr\r
152 or ax, MSR_EFER_XD ; enable NXE\r
153 wrmsr\r
154@StmXdDone2:\r
155 push esi\r
156\r
157 call ASM_PFX(SmmStmTeardown)\r
158\r
159 mov eax, ASM_PFX(gStmXdSupported)\r
160 mov al, [eax]\r
161 cmp al, 0\r
162 jz .72\r
163 pop edx ; get saved MSR_IA32_MISC_ENABLE[63-32]\r
164 test edx, BIT2\r
165 jz .72\r
166 mov ecx, MSR_IA32_MISC_ENABLE\r
167 rdmsr\r
168 or dx, BIT2 ; set XD Disable bit if it was set before entering into SMM\r
169 wrmsr\r
170\r
171.72:\r
0df50560
HW
172 StuffRsb32\r
173 rsm\r