]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c
Refine the sample for action, should not use text two part.
[mirror_edk2.git] / UefiCpuPkg / Library / CpuExceptionHandlerLib / Ia32 / ArchExceptionHandler.c
CommitLineData
8f07f895 1/** @file\r
2 IA32 CPU Exception Hanlder functons.\r
3\r
e41aad15 4 Copyright (c) 2012 - 2013, 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
e41aad15
JF
53 @param ExceptionType Exception type.\r
54 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
55\r
56**/\r
57VOID\r
58ArchSaveExceptionContext (\r
59 IN UINTN ExceptionType,\r
60 IN EFI_SYSTEM_CONTEXT SystemContext \r
61 )\r
62{\r
63 IA32_EFLAGS32 Eflags;\r
8f07f895 64 //\r
e41aad15 65 // Save Exception context in global variable\r
8f07f895 66 //\r
e41aad15
JF
67 mReservedVectors[ExceptionType].OldFlags = SystemContext.SystemContextIa32->Eflags;\r
68 mReservedVectors[ExceptionType].OldCs = SystemContext.SystemContextIa32->Cs;\r
69 mReservedVectors[ExceptionType].OldIp = SystemContext.SystemContextIa32->Eip;\r
70 mReservedVectors[ExceptionType].ExceptionData = SystemContext.SystemContextIa32->ExceptionData;\r
71 //\r
72 // Clear IF flag to avoid old IDT handler enable interrupt by IRET\r
8f07f895 73 //\r
e41aad15
JF
74 Eflags.UintN = SystemContext.SystemContextIa32->Eflags;\r
75 Eflags.Bits.IF = 0; \r
76 SystemContext.SystemContextIa32->Eflags = Eflags.UintN;\r
8f07f895 77 //\r
e41aad15
JF
78 // Modify the EIP in stack, then old IDT handler will return to the stub code\r
79 //\r
80 SystemContext.SystemContextIa32->Eip = (UINTN) mReservedVectors[ExceptionType].HookAfterStubHeaderCode;\r
81}\r
8f07f895 82\r
e41aad15
JF
83/**\r
84 Restore CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case.\r
8f07f895 85\r
e41aad15
JF
86 @param ExceptionType Exception type.\r
87 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
88**/\r
89VOID\r
90ArchRestoreExceptionContext (\r
91 IN UINTN ExceptionType,\r
92 IN EFI_SYSTEM_CONTEXT SystemContext \r
93 )\r
94{\r
95 SystemContext.SystemContextIa32->Eflags = mReservedVectors[ExceptionType].OldFlags;\r
96 SystemContext.SystemContextIa32->Cs = mReservedVectors[ExceptionType].OldCs;\r
97 SystemContext.SystemContextIa32->Eip = mReservedVectors[ExceptionType].OldIp;\r
98 SystemContext.SystemContextIa32->ExceptionData = mReservedVectors[ExceptionType].ExceptionData;\r
8f07f895 99}\r
100\r
101/**\r
3f25e6ea 102 Display CPU information.\r
8f07f895 103\r
104 @param ExceptionType Exception type.\r
105 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
106**/\r
107VOID\r
108DumpCpuContent (\r
e41aad15 109 IN EFI_EXCEPTION_TYPE ExceptionType,\r
8f07f895 110 IN EFI_SYSTEM_CONTEXT SystemContext\r
111 )\r
112{\r
113 UINTN ImageBase;\r
114 UINTN EntryPoint;\r
115\r
116 InternalPrintMessage (\r
117 "!!!! IA32 Exception Type - %08x CPU Apic ID - %08x !!!!\n",\r
118 ExceptionType,\r
119 GetApicId ()\r
120 );\r
121 InternalPrintMessage (\r
122 "EIP - %08x, CS - %08x, EFLAGS - %08x\n",\r
123 SystemContext.SystemContextIa32->Eip,\r
124 SystemContext.SystemContextIa32->Cs,\r
125 SystemContext.SystemContextIa32->Eflags\r
126 );\r
127 if ((mErrorCodeFlag & (1 << ExceptionType)) != 0) {\r
128 InternalPrintMessage (\r
129 "ExceptionData - %08x\n",\r
130 SystemContext.SystemContextIa32->ExceptionData\r
131 );\r
132 }\r
133 InternalPrintMessage (\r
134 "EAX - %08x, ECX - %08x, EDX - %08x, EBX - %08x\n",\r
135 SystemContext.SystemContextIa32->Eax,\r
136 SystemContext.SystemContextIa32->Ecx,\r
137 SystemContext.SystemContextIa32->Edx,\r
138 SystemContext.SystemContextIa32->Ebx\r
139 );\r
140 InternalPrintMessage (\r
141 "ESP - %08x, EBP - %08x, ESI - %08x, EDI - %08x\n",\r
142 SystemContext.SystemContextIa32->Esp,\r
143 SystemContext.SystemContextIa32->Ebp,\r
144 SystemContext.SystemContextIa32->Esi,\r
145 SystemContext.SystemContextIa32->Edi\r
146 );\r
147 InternalPrintMessage (\r
148 "DS - %08x, ES - %08x, FS - %08x, GS - %08x, SS - %08x\n",\r
149 SystemContext.SystemContextIa32->Ds,\r
150 SystemContext.SystemContextIa32->Es,\r
151 SystemContext.SystemContextIa32->Fs,\r
152 SystemContext.SystemContextIa32->Gs,\r
153 SystemContext.SystemContextIa32->Ss\r
154 );\r
155 InternalPrintMessage (\r
156 "CR0 - %08x, CR2 - %08x, CR3 - %08x, CR4 - %08x\n",\r
157 SystemContext.SystemContextIa32->Cr0,\r
158 SystemContext.SystemContextIa32->Cr2,\r
159 SystemContext.SystemContextIa32->Cr3,\r
160 SystemContext.SystemContextIa32->Cr4\r
161 );\r
162 InternalPrintMessage (\r
163 "DR0 - %08x, DR1 - %08x, DR2 - %08x, DR3 - %08x\n",\r
164 SystemContext.SystemContextIa32->Dr0,\r
165 SystemContext.SystemContextIa32->Dr1,\r
166 SystemContext.SystemContextIa32->Dr2,\r
167 SystemContext.SystemContextIa32->Dr3\r
168 );\r
169 InternalPrintMessage (\r
170 "DR6 - %08x, DR7 - %08x\n",\r
171 SystemContext.SystemContextIa32->Dr6,\r
172 SystemContext.SystemContextIa32->Dr7\r
173 );\r
174 InternalPrintMessage (\r
175 "GDTR - %08x %08x, IDTR - %08x %08x\n",\r
176 SystemContext.SystemContextIa32->Gdtr[0],\r
177 SystemContext.SystemContextIa32->Gdtr[1],\r
178 SystemContext.SystemContextIa32->Idtr[0],\r
179 SystemContext.SystemContextIa32->Idtr[1]\r
180 );\r
181 InternalPrintMessage (\r
182 "LDTR - %08x, TR - %08x\n",\r
183 SystemContext.SystemContextIa32->Ldtr,\r
184 SystemContext.SystemContextIa32->Tr\r
185 );\r
186 InternalPrintMessage (\r
187 "FXSAVE_STATE - %08x\n",\r
188 &SystemContext.SystemContextIa32->FxSaveState\r
189 );\r
190\r
191 //\r
192 // Find module image base and module entry point by RIP\r
193 //\r
194 ImageBase = FindModuleImageBase (SystemContext.SystemContextIa32->Eip, &EntryPoint);\r
195 if (ImageBase != 0) {\r
196 InternalPrintMessage (\r
197 " (ImageBase=%08x, EntryPoint=%08x) !!!!\n",\r
198 ImageBase,\r
199 EntryPoint\r
200 );\r
201 }\r
202}\r