2 IA32 CPU Exception Hanlder functons.
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
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.
15 #include "CpuExceptionCommon.h"
18 Internal function to setup CPU exception handlers.
22 InternalSetupCpuExceptionHandlers (
26 IA32_DESCRIPTOR IdtDescriptor
;
28 EXCEPTION_HANDLER_TEMPLATE_MAP TemplateMap
;
30 IA32_IDT_GATE_DESCRIPTOR
*IdtEntry
;
32 UINTN InterruptHandler
;;
35 // Read IDT descriptor and calculate IDT size
37 AsmReadIdtr (&IdtDescriptor
);
38 IdtSize
= (IdtDescriptor
.Limit
+ 1) / sizeof (IA32_IDT_GATE_DESCRIPTOR
);
39 if (IdtSize
> CPU_EXCEPTION_NUM
) {
41 // CPU exeption library only setup CPU_EXCEPTION_NUM exception handler at most
43 IdtSize
= CPU_EXCEPTION_NUM
;
47 // Use current CS as the segment selector of interrupt gate in IDT
49 CodeSegment
= AsmReadCs ();
50 IdtEntry
= (IA32_IDT_GATE_DESCRIPTOR
*) IdtDescriptor
.Base
;
52 GetTemplateAddressMap (&TemplateMap
);
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
;
64 Dump CPU content information.
66 @param ExceptionType Exception type.
67 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.
71 IN UINTN ExceptionType
,
72 IN EFI_SYSTEM_CONTEXT SystemContext
78 InternalPrintMessage (
79 "!!!! IA32 Exception Type - %08x CPU Apic ID - %08x !!!!\n",
83 InternalPrintMessage (
84 "EIP - %08x, CS - %08x, EFLAGS - %08x\n",
85 SystemContext
.SystemContextIa32
->Eip
,
86 SystemContext
.SystemContextIa32
->Cs
,
87 SystemContext
.SystemContextIa32
->Eflags
89 if ((mErrorCodeFlag
& (1 << ExceptionType
)) != 0) {
90 InternalPrintMessage (
91 "ExceptionData - %08x\n",
92 SystemContext
.SystemContextIa32
->ExceptionData
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
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
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
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
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
131 InternalPrintMessage (
132 "DR6 - %08x, DR7 - %08x\n",
133 SystemContext
.SystemContextIa32
->Dr6
,
134 SystemContext
.SystemContextIa32
->Dr7
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]
143 InternalPrintMessage (
144 "LDTR - %08x, TR - %08x\n",
145 SystemContext
.SystemContextIa32
->Ldtr
,
146 SystemContext
.SystemContextIa32
->Tr
148 InternalPrintMessage (
149 "FXSAVE_STATE - %08x\n",
150 &SystemContext
.SystemContextIa32
->FxSaveState
154 // Find module image base and module entry point by RIP
156 ImageBase
= FindModuleImageBase (SystemContext
.SystemContextIa32
->Eip
, &EntryPoint
);
157 if (ImageBase
!= 0) {
158 InternalPrintMessage (
159 " (ImageBase=%08x, EntryPoint=%08x) !!!!\n",