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