2 Ia32 arch functions to access IDT vector.
4 Copyright (c) 2013, 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 <PeCoffExtraActionLib.h>
18 Read IDT entry to check if IDT entries are setup by Debug Agent.
20 @param[in] IdtDescriptor Pointer to IDT Descriptor.
22 @retval TRUE IDT entries were setup by Debug Agent.
23 @retval FALSE IDT entries were not setuo by Debug Agent.
27 CheckDebugAgentHandler (
28 IN IA32_DESCRIPTOR
*IdtDescriptor
31 IA32_IDT_GATE_DESCRIPTOR
*IdtEntry
;
32 UINTN InterruptHandler
;
34 IdtEntry
= (IA32_IDT_GATE_DESCRIPTOR
*) IdtDescriptor
->Base
;
35 if (IdtEntry
== NULL
) {
39 InterruptHandler
= IdtEntry
[0].Bits
.OffsetLow
+ (IdtEntry
[0].Bits
.OffsetHigh
<< 16);
40 if (InterruptHandler
>= 4 && *(UINT32
*)(InterruptHandler
- 4) == AGENT_HANDLER_SIGNATURE
) {
48 Save IDT entry for INT1 and update it.
50 @param[in] IdtDescriptor Pointer to IDT Descriptor.
51 @param[out] SavedIdtEntry Original IDT entry returned.
55 SaveAndUpdateIdtEntry1 (
56 IN IA32_DESCRIPTOR
*IdtDescriptor
,
57 OUT IA32_IDT_GATE_DESCRIPTOR
*SavedIdtEntry
60 IA32_IDT_GATE_DESCRIPTOR
*IdtEntry
;
62 UINTN InterruptHandler
;
64 IdtEntry
= (IA32_IDT_GATE_DESCRIPTOR
*) IdtDescriptor
->Base
;
65 CopyMem (SavedIdtEntry
, &IdtEntry
[1], sizeof (IA32_IDT_GATE_DESCRIPTOR
));
68 // Use current CS as the segment selector of interrupt gate in IDT
70 CodeSegment
= AsmReadCs ();
72 InterruptHandler
= (UINTN
) &AsmInterruptHandle
;
73 IdtEntry
[1].Bits
.OffsetLow
= (UINT16
)(UINTN
)InterruptHandler
;
74 IdtEntry
[1].Bits
.OffsetHigh
= (UINT16
)((UINTN
)InterruptHandler
>> 16);
75 IdtEntry
[1].Bits
.Selector
= CodeSegment
;
76 IdtEntry
[1].Bits
.GateType
= IA32_IDT_GATE_TYPE_INTERRUPT_32
;
80 Restore IDT entry for INT1.
82 @param[in] IdtDescriptor Pointer to IDT Descriptor.
83 @param[in] RestoredIdtEntry IDT entry to be restored.
88 IN IA32_DESCRIPTOR
*IdtDescriptor
,
89 IN IA32_IDT_GATE_DESCRIPTOR
*RestoredIdtEntry
92 IA32_IDT_GATE_DESCRIPTOR
*IdtEntry
;
94 IdtEntry
= (IA32_IDT_GATE_DESCRIPTOR
*) IdtDescriptor
->Base
;
95 CopyMem (&IdtEntry
[1], RestoredIdtEntry
, sizeof (IA32_IDT_GATE_DESCRIPTOR
));