]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c
Import two CPU Exception Handler Library instances: SecPeiCpuExceptionHandler.inf...
[mirror_edk2.git] / UefiCpuPkg / Library / CpuExceptionHandlerLib / Ia32 / ArchExceptionHandler.c
CommitLineData
8f07f895 1/** @file\r
2 IA32 CPU Exception Hanlder functons.\r
3\r
4 Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>\r
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
18 Internal function to setup CPU exception handlers.\r
19\r
20**/\r
21VOID\r
22InternalSetupCpuExceptionHandlers (\r
23 VOID\r
24 )\r
25{\r
26 IA32_DESCRIPTOR IdtDescriptor;\r
27 UINTN IdtSize;\r
28 EXCEPTION_HANDLER_TEMPLATE_MAP TemplateMap;\r
29 UINT16 CodeSegment;\r
30 IA32_IDT_GATE_DESCRIPTOR *IdtEntry;\r
31 UINTN Index;\r
32 UINTN InterruptHandler;;\r
33\r
34 //\r
35 // Read IDT descriptor and calculate IDT size\r
36 //\r
37 AsmReadIdtr (&IdtDescriptor);\r
38 IdtSize = (IdtDescriptor.Limit + 1) / sizeof (IA32_IDT_GATE_DESCRIPTOR);\r
39 if (IdtSize > CPU_EXCEPTION_NUM) {\r
40 //\r
41 // CPU exeption library only setup CPU_EXCEPTION_NUM exception handler at most\r
42 //\r
43 IdtSize = CPU_EXCEPTION_NUM;\r
44 }\r
45\r
46 //\r
47 // Use current CS as the segment selector of interrupt gate in IDT\r
48 //\r
49 CodeSegment = AsmReadCs ();\r
50 IdtEntry = (IA32_IDT_GATE_DESCRIPTOR *) IdtDescriptor.Base;\r
51\r
52 GetTemplateAddressMap (&TemplateMap);\r
53\r
54 for (Index = 0; Index < IdtSize; Index ++) {\r
55 InterruptHandler = TemplateMap.ExceptionStart + Index * TemplateMap.ExceptionStubHeaderSize;\r
56 IdtEntry[Index].Bits.OffsetLow = (UINT16)(UINTN)InterruptHandler;\r
57 IdtEntry[Index].Bits.OffsetHigh = (UINT16)((UINTN)InterruptHandler >> 16);\r
58 IdtEntry[Index].Bits.Selector = CodeSegment;\r
59 IdtEntry[Index].Bits.GateType = IA32_IDT_GATE_TYPE_INTERRUPT_32;\r
60 }\r
61}\r
62\r
63/**\r
64 Dump CPU content information.\r
65\r
66 @param ExceptionType Exception type.\r
67 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
68**/\r
69VOID\r
70DumpCpuContent (\r
71 IN UINTN ExceptionType,\r
72 IN EFI_SYSTEM_CONTEXT SystemContext\r
73 )\r
74{\r
75 UINTN ImageBase;\r
76 UINTN EntryPoint;\r
77\r
78 InternalPrintMessage (\r
79 "!!!! IA32 Exception Type - %08x CPU Apic ID - %08x !!!!\n",\r
80 ExceptionType,\r
81 GetApicId ()\r
82 );\r
83 InternalPrintMessage (\r
84 "EIP - %08x, CS - %08x, EFLAGS - %08x\n",\r
85 SystemContext.SystemContextIa32->Eip,\r
86 SystemContext.SystemContextIa32->Cs,\r
87 SystemContext.SystemContextIa32->Eflags\r
88 );\r
89 if ((mErrorCodeFlag & (1 << ExceptionType)) != 0) {\r
90 InternalPrintMessage (\r
91 "ExceptionData - %08x\n",\r
92 SystemContext.SystemContextIa32->ExceptionData\r
93 );\r
94 }\r
95 InternalPrintMessage (\r
96 "EAX - %08x, ECX - %08x, EDX - %08x, EBX - %08x\n",\r
97 SystemContext.SystemContextIa32->Eax,\r
98 SystemContext.SystemContextIa32->Ecx,\r
99 SystemContext.SystemContextIa32->Edx,\r
100 SystemContext.SystemContextIa32->Ebx\r
101 );\r
102 InternalPrintMessage (\r
103 "ESP - %08x, EBP - %08x, ESI - %08x, EDI - %08x\n",\r
104 SystemContext.SystemContextIa32->Esp,\r
105 SystemContext.SystemContextIa32->Ebp,\r
106 SystemContext.SystemContextIa32->Esi,\r
107 SystemContext.SystemContextIa32->Edi\r
108 );\r
109 InternalPrintMessage (\r
110 "DS - %08x, ES - %08x, FS - %08x, GS - %08x, SS - %08x\n",\r
111 SystemContext.SystemContextIa32->Ds,\r
112 SystemContext.SystemContextIa32->Es,\r
113 SystemContext.SystemContextIa32->Fs,\r
114 SystemContext.SystemContextIa32->Gs,\r
115 SystemContext.SystemContextIa32->Ss\r
116 );\r
117 InternalPrintMessage (\r
118 "CR0 - %08x, CR2 - %08x, CR3 - %08x, CR4 - %08x\n",\r
119 SystemContext.SystemContextIa32->Cr0,\r
120 SystemContext.SystemContextIa32->Cr2,\r
121 SystemContext.SystemContextIa32->Cr3,\r
122 SystemContext.SystemContextIa32->Cr4\r
123 );\r
124 InternalPrintMessage (\r
125 "DR0 - %08x, DR1 - %08x, DR2 - %08x, DR3 - %08x\n",\r
126 SystemContext.SystemContextIa32->Dr0,\r
127 SystemContext.SystemContextIa32->Dr1,\r
128 SystemContext.SystemContextIa32->Dr2,\r
129 SystemContext.SystemContextIa32->Dr3\r
130 );\r
131 InternalPrintMessage (\r
132 "DR6 - %08x, DR7 - %08x\n",\r
133 SystemContext.SystemContextIa32->Dr6,\r
134 SystemContext.SystemContextIa32->Dr7\r
135 );\r
136 InternalPrintMessage (\r
137 "GDTR - %08x %08x, IDTR - %08x %08x\n",\r
138 SystemContext.SystemContextIa32->Gdtr[0],\r
139 SystemContext.SystemContextIa32->Gdtr[1],\r
140 SystemContext.SystemContextIa32->Idtr[0],\r
141 SystemContext.SystemContextIa32->Idtr[1]\r
142 );\r
143 InternalPrintMessage (\r
144 "LDTR - %08x, TR - %08x\n",\r
145 SystemContext.SystemContextIa32->Ldtr,\r
146 SystemContext.SystemContextIa32->Tr\r
147 );\r
148 InternalPrintMessage (\r
149 "FXSAVE_STATE - %08x\n",\r
150 &SystemContext.SystemContextIa32->FxSaveState\r
151 );\r
152\r
153 //\r
154 // Find module image base and module entry point by RIP\r
155 //\r
156 ImageBase = FindModuleImageBase (SystemContext.SystemContextIa32->Eip, &EntryPoint);\r
157 if (ImageBase != 0) {\r
158 InternalPrintMessage (\r
159 " (ImageBase=%08x, EntryPoint=%08x) !!!!\n",\r
160 ImageBase,\r
161 EntryPoint\r
162 );\r
163 }\r
164}\r