2 Ia32 arch functions to access IDT vector.
4 Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include <PeCoffExtraActionLib.h>
12 Read IDT entry to check if IDT entries are setup by Debug Agent.
14 @param[in] IdtDescriptor Pointer to IDT Descriptor.
15 @param[in] InterruptType Interrupt type.
17 @retval TRUE IDT entries were setup by Debug Agent.
18 @retval FALSE IDT entries were not setuo by Debug Agent.
22 CheckDebugAgentHandler (
23 IN IA32_DESCRIPTOR
*IdtDescriptor
,
24 IN UINTN InterruptType
27 IA32_IDT_GATE_DESCRIPTOR
*IdtEntry
;
28 UINTN InterruptHandler
;
30 IdtEntry
= (IA32_IDT_GATE_DESCRIPTOR
*)IdtDescriptor
->Base
;
31 if (IdtEntry
== NULL
) {
35 InterruptHandler
= IdtEntry
[InterruptType
].Bits
.OffsetLow
+
36 (IdtEntry
[InterruptType
].Bits
.OffsetHigh
<< 16);
37 if ((InterruptHandler
>= sizeof (UINT32
)) && (*(UINT32
*)(InterruptHandler
- sizeof (UINT32
)) == AGENT_HANDLER_SIGNATURE
)) {
45 Save IDT entry for INT1 and update it.
47 @param[in] IdtDescriptor Pointer to IDT Descriptor.
48 @param[out] SavedIdtEntry Original IDT entry returned.
52 SaveAndUpdateIdtEntry1 (
53 IN IA32_DESCRIPTOR
*IdtDescriptor
,
54 OUT IA32_IDT_GATE_DESCRIPTOR
*SavedIdtEntry
57 IA32_IDT_GATE_DESCRIPTOR
*IdtEntry
;
59 UINTN InterruptHandler
;
61 IdtEntry
= (IA32_IDT_GATE_DESCRIPTOR
*)IdtDescriptor
->Base
;
62 CopyMem (SavedIdtEntry
, &IdtEntry
[1], sizeof (IA32_IDT_GATE_DESCRIPTOR
));
65 // Use current CS as the segment selector of interrupt gate in IDT
67 CodeSegment
= AsmReadCs ();
69 InterruptHandler
= (UINTN
)&AsmInterruptHandle
;
70 IdtEntry
[1].Bits
.OffsetLow
= (UINT16
)(UINTN
)InterruptHandler
;
71 IdtEntry
[1].Bits
.OffsetHigh
= (UINT16
)((UINTN
)InterruptHandler
>> 16);
72 IdtEntry
[1].Bits
.Selector
= CodeSegment
;
73 IdtEntry
[1].Bits
.GateType
= IA32_IDT_GATE_TYPE_INTERRUPT_32
;
77 Restore IDT entry for INT1.
79 @param[in] IdtDescriptor Pointer to IDT Descriptor.
80 @param[in] RestoredIdtEntry IDT entry to be restored.
85 IN IA32_DESCRIPTOR
*IdtDescriptor
,
86 IN IA32_IDT_GATE_DESCRIPTOR
*RestoredIdtEntry
89 IA32_IDT_GATE_DESCRIPTOR
*IdtEntry
;
91 IdtEntry
= (IA32_IDT_GATE_DESCRIPTOR
*)IdtDescriptor
->Base
;
92 CopyMem (&IdtEntry
[1], RestoredIdtEntry
, sizeof (IA32_IDT_GATE_DESCRIPTOR
));