]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c
UefiCpuPkg/CpuExceptionHandlerLib: Add DumpCpuContext() implementation
[mirror_edk2.git] / UefiCpuPkg / Library / CpuExceptionHandlerLib / Ia32 / ArchExceptionHandler.c
CommitLineData
8f07f895 1/** @file\r
e3644786 2 IA32 CPU Exception Handler functons.\r
8f07f895 3\r
1b2f7b3e 4 Copyright (c) 2012 - 2017, Intel Corporation. All rights reserved.<BR>\r
8f07f895 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "CpuExceptionCommon.h"\r
16\r
17/**\r
e41aad15
JF
18 Return address map of exception handler template so that C code can generate\r
19 exception tables.\r
20\r
21 @param IdtEntry Pointer to IDT entry to be updated.\r
22 @param InterruptHandler IDT handler value.\r
8f07f895 23\r
24**/\r
25VOID\r
e41aad15
JF
26ArchUpdateIdtEntry (\r
27 IN IA32_IDT_GATE_DESCRIPTOR *IdtEntry,\r
28 IN UINTN InterruptHandler\r
29 )\r
30{\r
31 IdtEntry->Bits.OffsetLow = (UINT16)(UINTN)InterruptHandler;\r
32 IdtEntry->Bits.OffsetHigh = (UINT16)((UINTN)InterruptHandler >> 16);\r
33 IdtEntry->Bits.GateType = IA32_IDT_GATE_TYPE_INTERRUPT_32;\r
34}\r
35\r
36/**\r
37 Read IDT handler value from IDT entry.\r
38\r
39 @param IdtEntry Pointer to IDT entry to be read.\r
40\r
41**/\r
42UINTN\r
43ArchGetIdtHandler (\r
44 IN IA32_IDT_GATE_DESCRIPTOR *IdtEntry\r
8f07f895 45 )\r
46{\r
e41aad15
JF
47 return (UINTN)IdtEntry->Bits.OffsetLow + (((UINTN)IdtEntry->Bits.OffsetHigh) << 16);\r
48}\r
49\r
50/**\r
51 Save CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case.\r
8f07f895 52\r
81b21fc2
JF
53 @param[in] ExceptionType Exception type.\r
54 @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
55 @param[in] ExceptionHandlerData Pointer to exception handler data.\r
e41aad15
JF
56**/\r
57VOID\r
58ArchSaveExceptionContext (\r
81b21fc2
JF
59 IN UINTN ExceptionType,\r
60 IN EFI_SYSTEM_CONTEXT SystemContext,\r
61 IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData\r
e41aad15
JF
62 )\r
63{\r
64 IA32_EFLAGS32 Eflags;\r
81b21fc2
JF
65 RESERVED_VECTORS_DATA *ReservedVectors;\r
66\r
67 ReservedVectors = ExceptionHandlerData->ReservedVectors;\r
8f07f895 68 //\r
e41aad15 69 // Save Exception context in global variable\r
8f07f895 70 //\r
81b21fc2
JF
71 ReservedVectors[ExceptionType].OldFlags = SystemContext.SystemContextIa32->Eflags;\r
72 ReservedVectors[ExceptionType].OldCs = SystemContext.SystemContextIa32->Cs;\r
73 ReservedVectors[ExceptionType].OldIp = SystemContext.SystemContextIa32->Eip;\r
74 ReservedVectors[ExceptionType].ExceptionData = SystemContext.SystemContextIa32->ExceptionData;\r
e41aad15
JF
75 //\r
76 // Clear IF flag to avoid old IDT handler enable interrupt by IRET\r
8f07f895 77 //\r
e41aad15
JF
78 Eflags.UintN = SystemContext.SystemContextIa32->Eflags;\r
79 Eflags.Bits.IF = 0; \r
80 SystemContext.SystemContextIa32->Eflags = Eflags.UintN;\r
8f07f895 81 //\r
e41aad15
JF
82 // Modify the EIP in stack, then old IDT handler will return to the stub code\r
83 //\r
81b21fc2 84 SystemContext.SystemContextIa32->Eip = (UINTN) ReservedVectors[ExceptionType].HookAfterStubHeaderCode;\r
e41aad15 85}\r
8f07f895 86\r
e41aad15
JF
87/**\r
88 Restore CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case.\r
8f07f895 89\r
368c54e7
JF
90 @param[in] ExceptionType Exception type.\r
91 @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
92 @param[in] ExceptionHandlerData Pointer to exception handler data.\r
e41aad15
JF
93**/\r
94VOID\r
95ArchRestoreExceptionContext (\r
368c54e7
JF
96 IN UINTN ExceptionType,\r
97 IN EFI_SYSTEM_CONTEXT SystemContext,\r
98 IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData\r
e41aad15
JF
99 )\r
100{\r
368c54e7
JF
101 RESERVED_VECTORS_DATA *ReservedVectors;\r
102\r
103 ReservedVectors = ExceptionHandlerData->ReservedVectors;\r
104 SystemContext.SystemContextIa32->Eflags = ReservedVectors[ExceptionType].OldFlags;\r
105 SystemContext.SystemContextIa32->Cs = ReservedVectors[ExceptionType].OldCs;\r
106 SystemContext.SystemContextIa32->Eip = ReservedVectors[ExceptionType].OldIp;\r
107 SystemContext.SystemContextIa32->ExceptionData = ReservedVectors[ExceptionType].ExceptionData;\r
8f07f895 108}\r
109\r
110/**\r
1b2f7b3e 111 Display processor context.\r
8f07f895 112\r
1b2f7b3e
JF
113 @param[in] ExceptionType Exception type.\r
114 @param[in] SystemContext Processor context to be display.\r
8f07f895 115**/\r
116VOID\r
1b2f7b3e
JF
117EFIAPI\r
118DumpCpuContext (\r
e41aad15 119 IN EFI_EXCEPTION_TYPE ExceptionType,\r
8f07f895 120 IN EFI_SYSTEM_CONTEXT SystemContext\r
121 )\r
122{\r
8f07f895 123 InternalPrintMessage (\r
a51ee144 124 "!!!! IA32 Exception Type - %02x(%a) CPU Apic ID - %08x !!!!\n",\r
8f07f895 125 ExceptionType,\r
a51ee144 126 GetExceptionNameStr (ExceptionType),\r
8f07f895 127 GetApicId ()\r
128 );\r
1b2f7b3e
JF
129 if ((mErrorCodeFlag & (1 << ExceptionType)) != 0) {\r
130 InternalPrintMessage (\r
131 "ExceptionData - %08x",\r
132 SystemContext.SystemContextIa32->ExceptionData\r
133 );\r
134 if (ExceptionType == EXCEPT_IA32_PAGE_FAULT) {\r
135 InternalPrintMessage (\r
136 " I:%x R:%x U:%x W:%x P:%x PK:%x S:%x",\r
137 (SystemContext.SystemContextIa32->ExceptionData & IA32_PF_EC_ID) != 0,\r
138 (SystemContext.SystemContextIa32->ExceptionData & IA32_PF_EC_RSVD) != 0,\r
139 (SystemContext.SystemContextIa32->ExceptionData & IA32_PF_EC_US) != 0,\r
140 (SystemContext.SystemContextIa32->ExceptionData & IA32_PF_EC_WR) != 0,\r
141 (SystemContext.SystemContextIa32->ExceptionData & IA32_PF_EC_P) != 0,\r
142 (SystemContext.SystemContextIa32->ExceptionData & IA32_PF_EC_PK) != 0,\r
143 (SystemContext.SystemContextIa32->ExceptionData & IA32_PF_EC_SGX) != 0\r
144 );\r
145 }\r
146 InternalPrintMessage ("\n");\r
147 }\r
8f07f895 148 InternalPrintMessage (\r
149 "EIP - %08x, CS - %08x, EFLAGS - %08x\n",\r
150 SystemContext.SystemContextIa32->Eip,\r
151 SystemContext.SystemContextIa32->Cs,\r
152 SystemContext.SystemContextIa32->Eflags\r
153 );\r
8f07f895 154 InternalPrintMessage (\r
155 "EAX - %08x, ECX - %08x, EDX - %08x, EBX - %08x\n",\r
156 SystemContext.SystemContextIa32->Eax,\r
157 SystemContext.SystemContextIa32->Ecx,\r
158 SystemContext.SystemContextIa32->Edx,\r
159 SystemContext.SystemContextIa32->Ebx\r
160 );\r
161 InternalPrintMessage (\r
162 "ESP - %08x, EBP - %08x, ESI - %08x, EDI - %08x\n",\r
163 SystemContext.SystemContextIa32->Esp,\r
164 SystemContext.SystemContextIa32->Ebp,\r
165 SystemContext.SystemContextIa32->Esi,\r
166 SystemContext.SystemContextIa32->Edi\r
167 );\r
168 InternalPrintMessage (\r
169 "DS - %08x, ES - %08x, FS - %08x, GS - %08x, SS - %08x\n",\r
170 SystemContext.SystemContextIa32->Ds,\r
171 SystemContext.SystemContextIa32->Es,\r
172 SystemContext.SystemContextIa32->Fs,\r
173 SystemContext.SystemContextIa32->Gs,\r
174 SystemContext.SystemContextIa32->Ss\r
175 );\r
176 InternalPrintMessage (\r
177 "CR0 - %08x, CR2 - %08x, CR3 - %08x, CR4 - %08x\n",\r
178 SystemContext.SystemContextIa32->Cr0,\r
179 SystemContext.SystemContextIa32->Cr2,\r
180 SystemContext.SystemContextIa32->Cr3,\r
181 SystemContext.SystemContextIa32->Cr4\r
182 );\r
183 InternalPrintMessage (\r
184 "DR0 - %08x, DR1 - %08x, DR2 - %08x, DR3 - %08x\n",\r
185 SystemContext.SystemContextIa32->Dr0,\r
186 SystemContext.SystemContextIa32->Dr1,\r
187 SystemContext.SystemContextIa32->Dr2,\r
188 SystemContext.SystemContextIa32->Dr3\r
189 );\r
190 InternalPrintMessage (\r
191 "DR6 - %08x, DR7 - %08x\n",\r
192 SystemContext.SystemContextIa32->Dr6,\r
193 SystemContext.SystemContextIa32->Dr7\r
194 );\r
195 InternalPrintMessage (\r
196 "GDTR - %08x %08x, IDTR - %08x %08x\n",\r
197 SystemContext.SystemContextIa32->Gdtr[0],\r
198 SystemContext.SystemContextIa32->Gdtr[1],\r
199 SystemContext.SystemContextIa32->Idtr[0],\r
200 SystemContext.SystemContextIa32->Idtr[1]\r
201 );\r
202 InternalPrintMessage (\r
203 "LDTR - %08x, TR - %08x\n",\r
204 SystemContext.SystemContextIa32->Ldtr,\r
205 SystemContext.SystemContextIa32->Tr\r
206 );\r
207 InternalPrintMessage (\r
208 "FXSAVE_STATE - %08x\n",\r
209 &SystemContext.SystemContextIa32->FxSaveState\r
210 );\r
1b2f7b3e
JF
211}\r
212\r
213/**\r
214 Display CPU information.\r
8f07f895 215\r
1b2f7b3e
JF
216 @param ExceptionType Exception type.\r
217 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
218**/\r
219VOID\r
220DumpImageAndCpuContent (\r
221 IN EFI_EXCEPTION_TYPE ExceptionType,\r
222 IN EFI_SYSTEM_CONTEXT SystemContext\r
223 )\r
224{\r
225 DumpCpuContext (ExceptionType, SystemContext);\r
8f07f895 226 //\r
1b2f7b3e 227 // Dump module image base and module entry point by EIP\r
8f07f895 228 //\r
1b2f7b3e 229 DumpModuleImageInfo (SystemContext.SystemContextIa32->Eip);\r
8f07f895 230}\r