]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c
SourceLevelDebugPkg/DebugAgent.c: Consume PeCoffSerachImageBase()
[mirror_edk2.git] / UefiCpuPkg / Library / CpuExceptionHandlerLib / X64 / ArchExceptionHandler.c
CommitLineData
8f07f895 1/** @file\r
e3644786 2 x64 CPU Exception Handler.\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
8f07f895 20\r
e41aad15
JF
21 @param IdtEntry Pointer to IDT entry to be updated.\r
22 @param InterruptHandler IDT handler value.\r
8f07f895 23**/\r
24VOID\r
e41aad15
JF
25ArchUpdateIdtEntry (\r
26 IN IA32_IDT_GATE_DESCRIPTOR *IdtEntry,\r
27 IN UINTN InterruptHandler\r
8f07f895 28 )\r
29{\r
e41aad15
JF
30 IdtEntry->Bits.OffsetLow = (UINT16)(UINTN)InterruptHandler;\r
31 IdtEntry->Bits.OffsetHigh = (UINT16)((UINTN)InterruptHandler >> 16);\r
32 IdtEntry->Bits.OffsetUpper = (UINT32)((UINTN)InterruptHandler >> 32); \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
45 )\r
46{\r
47 return IdtEntry->Bits.OffsetLow + (((UINTN) IdtEntry->Bits.OffsetHigh) << 16) +\r
48 (((UINTN) IdtEntry->Bits.OffsetUpper) << 32);\r
49}\r
8f07f895 50\r
e41aad15
JF
51/**\r
52 Save CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case.\r
53\r
81b21fc2
JF
54 @param[in] ExceptionType Exception type.\r
55 @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
56 @param[in] ExceptionHandlerData Pointer to exception handler data.\r
e41aad15
JF
57**/\r
58VOID\r
59ArchSaveExceptionContext (\r
81b21fc2
JF
60 IN UINTN ExceptionType,\r
61 IN EFI_SYSTEM_CONTEXT SystemContext,\r
62 IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData\r
e41aad15
JF
63 )\r
64{\r
65 IA32_EFLAGS32 Eflags;\r
81b21fc2
JF
66 RESERVED_VECTORS_DATA *ReservedVectors;\r
67\r
68 ReservedVectors = ExceptionHandlerData->ReservedVectors;\r
8f07f895 69 //\r
e41aad15 70 // Save Exception context in global variable\r
8f07f895 71 //\r
81b21fc2
JF
72 ReservedVectors[ExceptionType].OldSs = SystemContext.SystemContextX64->Ss;\r
73 ReservedVectors[ExceptionType].OldSp = SystemContext.SystemContextX64->Rsp;\r
74 ReservedVectors[ExceptionType].OldFlags = SystemContext.SystemContextX64->Rflags;\r
75 ReservedVectors[ExceptionType].OldCs = SystemContext.SystemContextX64->Cs;\r
76 ReservedVectors[ExceptionType].OldIp = SystemContext.SystemContextX64->Rip;\r
77 ReservedVectors[ExceptionType].ExceptionData = SystemContext.SystemContextX64->ExceptionData;\r
8f07f895 78 //\r
e41aad15 79 // Clear IF flag to avoid old IDT handler enable interrupt by IRET\r
8f07f895 80 //\r
e41aad15
JF
81 Eflags.UintN = SystemContext.SystemContextX64->Rflags;\r
82 Eflags.Bits.IF = 0; \r
83 SystemContext.SystemContextX64->Rflags = Eflags.UintN;\r
84 //\r
85 // Modify the EIP in stack, then old IDT handler will return to the stub code\r
86 //\r
81b21fc2 87 SystemContext.SystemContextX64->Rip = (UINTN) ReservedVectors[ExceptionType].HookAfterStubHeaderCode;\r
8f07f895 88}\r
89\r
90/**\r
e41aad15 91 Restore CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case.\r
8f07f895 92\r
368c54e7
JF
93 @param[in] ExceptionType Exception type.\r
94 @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
95 @param[in] ExceptionHandlerData Pointer to exception handler data.\r
8f07f895 96**/\r
97VOID\r
e41aad15 98ArchRestoreExceptionContext (\r
368c54e7
JF
99 IN UINTN ExceptionType,\r
100 IN EFI_SYSTEM_CONTEXT SystemContext,\r
101 IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData\r
e41aad15
JF
102 )\r
103{\r
368c54e7
JF
104 RESERVED_VECTORS_DATA *ReservedVectors;\r
105\r
106 ReservedVectors = ExceptionHandlerData->ReservedVectors;\r
107 SystemContext.SystemContextX64->Ss = ReservedVectors[ExceptionType].OldSs;\r
108 SystemContext.SystemContextX64->Rsp = ReservedVectors[ExceptionType].OldSp;\r
109 SystemContext.SystemContextX64->Rflags = ReservedVectors[ExceptionType].OldFlags;\r
110 SystemContext.SystemContextX64->Cs = ReservedVectors[ExceptionType].OldCs;\r
111 SystemContext.SystemContextX64->Rip = ReservedVectors[ExceptionType].OldIp;\r
112 SystemContext.SystemContextX64->ExceptionData = ReservedVectors[ExceptionType].ExceptionData;\r
e41aad15
JF
113}\r
114\r
115/**\r
3f25e6ea 116 Display CPU information.\r
e41aad15
JF
117\r
118 @param ExceptionType Exception type.\r
119 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
120**/\r
121VOID\r
1b2f7b3e
JF
122EFIAPI\r
123DumpCpuContext (\r
e41aad15 124 IN EFI_EXCEPTION_TYPE ExceptionType,\r
8f07f895 125 IN EFI_SYSTEM_CONTEXT SystemContext\r
126 )\r
127{\r
8f07f895 128 InternalPrintMessage (\r
a51ee144 129 "!!!! X64 Exception Type - %02x(%a) CPU Apic ID - %08x !!!!\n",\r
8f07f895 130 ExceptionType,\r
a51ee144 131 GetExceptionNameStr (ExceptionType),\r
8f07f895 132 GetApicId ()\r
133 );\r
1b2f7b3e
JF
134 if ((mErrorCodeFlag & (1 << ExceptionType)) != 0) {\r
135 InternalPrintMessage (\r
136 "ExceptionData - %016lx",\r
137 SystemContext.SystemContextX64->ExceptionData\r
138 );\r
139 if (ExceptionType == EXCEPT_IA32_PAGE_FAULT) {\r
140 InternalPrintMessage (\r
141 " I:%x R:%x U:%x W:%x P:%x PK:%x S:%x",\r
142 (SystemContext.SystemContextX64->ExceptionData & IA32_PF_EC_ID) != 0,\r
143 (SystemContext.SystemContextX64->ExceptionData & IA32_PF_EC_RSVD) != 0,\r
144 (SystemContext.SystemContextX64->ExceptionData & IA32_PF_EC_US) != 0,\r
145 (SystemContext.SystemContextX64->ExceptionData & IA32_PF_EC_WR) != 0,\r
146 (SystemContext.SystemContextX64->ExceptionData & IA32_PF_EC_P) != 0,\r
147 (SystemContext.SystemContextX64->ExceptionData & IA32_PF_EC_PK) != 0,\r
148 (SystemContext.SystemContextX64->ExceptionData & IA32_PF_EC_SGX) != 0\r
149 );\r
150 }\r
151 InternalPrintMessage ("\n");\r
152 }\r
8f07f895 153 InternalPrintMessage (\r
154 "RIP - %016lx, CS - %016lx, RFLAGS - %016lx\n",\r
155 SystemContext.SystemContextX64->Rip,\r
156 SystemContext.SystemContextX64->Cs,\r
157 SystemContext.SystemContextX64->Rflags\r
158 );\r
8f07f895 159 InternalPrintMessage (\r
160 "RAX - %016lx, RCX - %016lx, RDX - %016lx\n",\r
161 SystemContext.SystemContextX64->Rax,\r
162 SystemContext.SystemContextX64->Rcx,\r
163 SystemContext.SystemContextX64->Rdx\r
164 );\r
165 InternalPrintMessage (\r
166 "RBX - %016lx, RSP - %016lx, RBP - %016lx\n",\r
167 SystemContext.SystemContextX64->Rbx,\r
168 SystemContext.SystemContextX64->Rsp,\r
169 SystemContext.SystemContextX64->Rbp\r
170 );\r
171 InternalPrintMessage (\r
172 "RSI - %016lx, RDI - %016lx\n",\r
173 SystemContext.SystemContextX64->Rsi,\r
174 SystemContext.SystemContextX64->Rdi\r
175 );\r
176 InternalPrintMessage (\r
177 "R8 - %016lx, R9 - %016lx, R10 - %016lx\n",\r
178 SystemContext.SystemContextX64->R8,\r
179 SystemContext.SystemContextX64->R9,\r
180 SystemContext.SystemContextX64->R10\r
181 );\r
182 InternalPrintMessage (\r
183 "R11 - %016lx, R12 - %016lx, R13 - %016lx\n",\r
184 SystemContext.SystemContextX64->R11,\r
185 SystemContext.SystemContextX64->R12,\r
186 SystemContext.SystemContextX64->R13\r
187 );\r
188 InternalPrintMessage (\r
189 "R14 - %016lx, R15 - %016lx\n",\r
190 SystemContext.SystemContextX64->R14,\r
191 SystemContext.SystemContextX64->R15\r
192 );\r
193 InternalPrintMessage (\r
194 "DS - %016lx, ES - %016lx, FS - %016lx\n",\r
195 SystemContext.SystemContextX64->Ds,\r
196 SystemContext.SystemContextX64->Es,\r
197 SystemContext.SystemContextX64->Fs\r
198 );\r
199 InternalPrintMessage (\r
200 "GS - %016lx, SS - %016lx\n",\r
201 SystemContext.SystemContextX64->Gs,\r
202 SystemContext.SystemContextX64->Ss\r
203 );\r
204 InternalPrintMessage (\r
205 "CR0 - %016lx, CR2 - %016lx, CR3 - %016lx\n",\r
206 SystemContext.SystemContextX64->Cr0,\r
207 SystemContext.SystemContextX64->Cr2,\r
208 SystemContext.SystemContextX64->Cr3\r
209 );\r
210 InternalPrintMessage (\r
211 "CR4 - %016lx, CR8 - %016lx\n",\r
212 SystemContext.SystemContextX64->Cr4,\r
213 SystemContext.SystemContextX64->Cr8\r
214 );\r
215 InternalPrintMessage (\r
216 "DR0 - %016lx, DR1 - %016lx, DR2 - %016lx\n",\r
217 SystemContext.SystemContextX64->Dr0,\r
218 SystemContext.SystemContextX64->Dr1,\r
219 SystemContext.SystemContextX64->Dr2\r
220 );\r
221 InternalPrintMessage (\r
222 "DR3 - %016lx, DR6 - %016lx, DR7 - %016lx\n",\r
223 SystemContext.SystemContextX64->Dr3,\r
224 SystemContext.SystemContextX64->Dr6,\r
225 SystemContext.SystemContextX64->Dr7\r
226 );\r
227 InternalPrintMessage (\r
228 "GDTR - %016lx %016lx, LDTR - %016lx\n",\r
229 SystemContext.SystemContextX64->Gdtr[0],\r
230 SystemContext.SystemContextX64->Gdtr[1],\r
231 SystemContext.SystemContextX64->Ldtr\r
232 );\r
233 InternalPrintMessage (\r
234 "IDTR - %016lx %016lx, TR - %016lx\n",\r
235 SystemContext.SystemContextX64->Idtr[0],\r
236 SystemContext.SystemContextX64->Idtr[1],\r
237 SystemContext.SystemContextX64->Tr\r
238 );\r
239 InternalPrintMessage (\r
240 "FXSAVE_STATE - %016lx\n",\r
241 &SystemContext.SystemContextX64->FxSaveState\r
242 );\r
1b2f7b3e 243}\r
8f07f895 244\r
1b2f7b3e
JF
245/**\r
246 Display CPU information.\r
247\r
248 @param ExceptionType Exception type.\r
249 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
250**/\r
251VOID\r
252DumpImageAndCpuContent (\r
253 IN EFI_EXCEPTION_TYPE ExceptionType,\r
254 IN EFI_SYSTEM_CONTEXT SystemContext\r
255 )\r
256{\r
257 DumpCpuContext (ExceptionType, SystemContext);\r
8f07f895 258 //\r
1b2f7b3e 259 // Dump module image base and module entry point by RIP\r
8f07f895 260 //\r
1b2f7b3e 261 DumpModuleImageInfo (SystemContext.SystemContextX64->Rip);\r
8f07f895 262}\r