]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiException.nasm
UefiCpuPkg: Merge StuffRsb.inc files into one in UefiCpuPkg/Include
[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
09119a00
MK
3; This program and the accompanying materials\r
4; are licensed and made available under the terms and conditions of the BSD License\r
5; which accompanies this distribution. The full text of the license may be found at\r
6; http://opensource.org/licenses/bsd-license.php.\r
7;\r
8; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
9; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
10;\r
11; Module Name:\r
12;\r
13; SmiException.nasm\r
14;\r
15; Abstract:\r
16;\r
17; Exception handlers used in SM mode\r
18;\r
19;-------------------------------------------------------------------------------\r
20\r
ada4a003 21%include "StuffRsbNasm.inc"\r
0df50560 22\r
09119a00
MK
23global ASM_PFX(gcStmPsd)\r
24\r
25extern ASM_PFX(SmmStmExceptionHandler)\r
26extern ASM_PFX(SmmStmSetup)\r
27extern ASM_PFX(SmmStmTeardown)\r
28extern ASM_PFX(gStmXdSupported)\r
29extern ASM_PFX(gStmSmiHandlerIdtr)\r
30\r
31%define MSR_IA32_MISC_ENABLE 0x1A0\r
32%define MSR_EFER 0xc0000080\r
33%define MSR_EFER_XD 0x800\r
34\r
35CODE_SEL equ 0x08\r
36DATA_SEL equ 0x20\r
37TSS_SEL equ 0x40\r
38\r
39 SECTION .data\r
40\r
41ASM_PFX(gcStmPsd):\r
42 DB 'TXTPSSIG'\r
43 DW PSD_SIZE\r
44 DW 1 ; Version\r
45 DD 0 ; LocalApicId\r
46 DB 0x05 ; Cr4Pse;Cr4Pae;Intel64Mode;ExecutionDisableOutsideSmrr\r
47 DB 0 ; BIOS to STM\r
48 DB 0 ; STM to BIOS\r
49 DB 0\r
50 DW CODE_SEL\r
51 DW DATA_SEL\r
52 DW DATA_SEL\r
53 DW DATA_SEL\r
54 DW TSS_SEL\r
55 DW 0\r
56 DQ 0 ; SmmCr3\r
57 DD ASM_PFX(OnStmSetup)\r
58 DD 0\r
59 DD ASM_PFX(OnStmTeardown)\r
60 DD 0\r
61 DQ 0 ; SmmSmiHandlerRip - SMM guest entrypoint\r
62 DQ 0 ; SmmSmiHandlerRsp\r
63 DQ 0\r
64 DD 0\r
65 DD 0x80010100 ; RequiredStmSmmRevId\r
66 DD ASM_PFX(OnException)\r
67 DD 0\r
68 DQ 0 ; ExceptionStack\r
69 DW DATA_SEL\r
70 DW 0x01F ; ExceptionFilter\r
71 DD 0\r
72 DD 0\r
73 DD 0\r
74 DQ 0 ; BiosHwResourceRequirementsPtr\r
75 DQ 0 ; AcpiRsdp\r
76 DB 0 ; PhysicalAddressBits\r
77PSD_SIZE equ $ - ASM_PFX(gcStmPsd)\r
78\r
79 SECTION .text\r
80;------------------------------------------------------------------------------\r
81; SMM Exception handlers\r
82;------------------------------------------------------------------------------\r
83global ASM_PFX(OnException)\r
84ASM_PFX(OnException):\r
85 mov ecx, esp\r
86 push ecx\r
87 call ASM_PFX(SmmStmExceptionHandler)\r
88 add esp, 4\r
89\r
90 mov ebx, eax\r
91 mov eax, 4\r
4c34a8ea 92 vmcall\r
09119a00
MK
93 jmp $\r
94\r
95global ASM_PFX(OnStmSetup)\r
96ASM_PFX(OnStmSetup):\r
97;\r
98; Check XD disable bit\r
99;\r
100 xor esi, esi\r
101 mov eax, ASM_PFX(gStmXdSupported)\r
102 mov al, [eax]\r
103 cmp al, 0\r
104 jz @StmXdDone1\r
105 mov ecx, MSR_IA32_MISC_ENABLE\r
106 rdmsr\r
107 mov esi, edx ; save MSR_IA32_MISC_ENABLE[63-32]\r
108 test edx, BIT2 ; MSR_IA32_MISC_ENABLE[34]\r
109 jz .51\r
110 and dx, 0xFFFB ; clear XD Disable bit if it is set\r
111 wrmsr\r
112.51:\r
113 mov ecx, MSR_EFER\r
114 rdmsr\r
115 or ax, MSR_EFER_XD ; enable NXE\r
116 wrmsr\r
117@StmXdDone1:\r
118 push esi\r
119\r
120 call ASM_PFX(SmmStmSetup)\r
121\r
122 mov eax, ASM_PFX(gStmXdSupported)\r
123 mov al, [eax]\r
124 cmp al, 0\r
125 jz .71\r
126 pop edx ; get saved MSR_IA32_MISC_ENABLE[63-32]\r
127 test edx, BIT2\r
128 jz .71\r
129 mov ecx, MSR_IA32_MISC_ENABLE\r
130 rdmsr\r
131 or dx, BIT2 ; set XD Disable bit if it was set before entering into SMM\r
132 wrmsr\r
133\r
134.71:\r
0df50560
HW
135 StuffRsb32\r
136 rsm\r
09119a00
MK
137\r
138global ASM_PFX(OnStmTeardown)\r
139ASM_PFX(OnStmTeardown):\r
140;\r
141; Check XD disable bit\r
142;\r
143 xor esi, esi\r
144 mov eax, ASM_PFX(gStmXdSupported)\r
145 mov al, [eax]\r
146 cmp al, 0\r
147 jz @StmXdDone2\r
148 mov ecx, MSR_IA32_MISC_ENABLE\r
149 rdmsr\r
150 mov esi, edx ; save MSR_IA32_MISC_ENABLE[63-32]\r
151 test edx, BIT2 ; MSR_IA32_MISC_ENABLE[34]\r
152 jz .52\r
153 and dx, 0xFFFB ; clear XD Disable bit if it is set\r
154 wrmsr\r
155.52:\r
156 mov ecx, MSR_EFER\r
157 rdmsr\r
158 or ax, MSR_EFER_XD ; enable NXE\r
159 wrmsr\r
160@StmXdDone2:\r
161 push esi\r
162\r
163 call ASM_PFX(SmmStmTeardown)\r
164\r
165 mov eax, ASM_PFX(gStmXdSupported)\r
166 mov al, [eax]\r
167 cmp al, 0\r
168 jz .72\r
169 pop edx ; get saved MSR_IA32_MISC_ENABLE[63-32]\r
170 test edx, BIT2\r
171 jz .72\r
172 mov ecx, MSR_IA32_MISC_ENABLE\r
173 rdmsr\r
174 or dx, BIT2 ; set XD Disable bit if it was set before entering into SMM\r
175 wrmsr\r
176\r
177.72:\r
0df50560
HW
178 StuffRsb32\r
179 rsm\r