1 | /** @file
|
---|
2 | Ia32 arch functions to access IDT vector.
|
---|
3 |
|
---|
4 | Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
|
---|
5 | SPDX-License-Identifier: BSD-2-Clause-Patent
|
---|
6 |
|
---|
7 | **/
|
---|
8 |
|
---|
9 | #include <PeCoffExtraActionLib.h>
|
---|
10 |
|
---|
11 | /**
|
---|
12 | Read IDT entry to check if IDT entries are setup by Debug Agent.
|
---|
13 |
|
---|
14 | @param[in] IdtDescriptor Pointer to IDT Descriptor.
|
---|
15 | @param[in] InterruptType Interrupt type.
|
---|
16 |
|
---|
17 | @retval TRUE IDT entries were setup by Debug Agent.
|
---|
18 | @retval FALSE IDT entries were not setup by Debug Agent.
|
---|
19 |
|
---|
20 | **/
|
---|
21 | BOOLEAN
|
---|
22 | CheckDebugAgentHandler (
|
---|
23 | IN IA32_DESCRIPTOR *IdtDescriptor,
|
---|
24 | IN UINTN InterruptType
|
---|
25 | )
|
---|
26 | {
|
---|
27 | IA32_IDT_GATE_DESCRIPTOR *IdtEntry;
|
---|
28 | UINTN InterruptHandler;
|
---|
29 |
|
---|
30 | IdtEntry = (IA32_IDT_GATE_DESCRIPTOR *)IdtDescriptor->Base;
|
---|
31 | if (IdtEntry == NULL) {
|
---|
32 | return FALSE;
|
---|
33 | }
|
---|
34 |
|
---|
35 | InterruptHandler = IdtEntry[InterruptType].Bits.OffsetLow +
|
---|
36 | (IdtEntry[InterruptType].Bits.OffsetHigh << 16);
|
---|
37 | if ((InterruptHandler >= sizeof (UINT32)) && (*(UINT32 *)(InterruptHandler - sizeof (UINT32)) == AGENT_HANDLER_SIGNATURE)) {
|
---|
38 | return TRUE;
|
---|
39 | } else {
|
---|
40 | return FALSE;
|
---|
41 | }
|
---|
42 | }
|
---|
43 |
|
---|
44 | /**
|
---|
45 | Save IDT entry for INT1 and update it.
|
---|
46 |
|
---|
47 | @param[in] IdtDescriptor Pointer to IDT Descriptor.
|
---|
48 | @param[out] SavedIdtEntry Original IDT entry returned.
|
---|
49 |
|
---|
50 | **/
|
---|
51 | VOID
|
---|
52 | SaveAndUpdateIdtEntry1 (
|
---|
53 | IN IA32_DESCRIPTOR *IdtDescriptor,
|
---|
54 | OUT IA32_IDT_GATE_DESCRIPTOR *SavedIdtEntry
|
---|
55 | )
|
---|
56 | {
|
---|
57 | IA32_IDT_GATE_DESCRIPTOR *IdtEntry;
|
---|
58 | UINT16 CodeSegment;
|
---|
59 | UINTN InterruptHandler;
|
---|
60 |
|
---|
61 | IdtEntry = (IA32_IDT_GATE_DESCRIPTOR *)IdtDescriptor->Base;
|
---|
62 | CopyMem (SavedIdtEntry, &IdtEntry[1], sizeof (IA32_IDT_GATE_DESCRIPTOR));
|
---|
63 |
|
---|
64 | //
|
---|
65 | // Use current CS as the segment selector of interrupt gate in IDT
|
---|
66 | //
|
---|
67 | CodeSegment = AsmReadCs ();
|
---|
68 |
|
---|
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;
|
---|
74 | }
|
---|
75 |
|
---|
76 | /**
|
---|
77 | Restore IDT entry for INT1.
|
---|
78 |
|
---|
79 | @param[in] IdtDescriptor Pointer to IDT Descriptor.
|
---|
80 | @param[in] RestoredIdtEntry IDT entry to be restored.
|
---|
81 |
|
---|
82 | **/
|
---|
83 | VOID
|
---|
84 | RestoreIdtEntry1 (
|
---|
85 | IN IA32_DESCRIPTOR *IdtDescriptor,
|
---|
86 | IN IA32_IDT_GATE_DESCRIPTOR *RestoredIdtEntry
|
---|
87 | )
|
---|
88 | {
|
---|
89 | IA32_IDT_GATE_DESCRIPTOR *IdtEntry;
|
---|
90 |
|
---|
91 | IdtEntry = (IA32_IDT_GATE_DESCRIPTOR *)IdtDescriptor->Base;
|
---|
92 | CopyMem (&IdtEntry[1], RestoredIdtEntry, sizeof (IA32_IDT_GATE_DESCRIPTOR));
|
---|
93 | }
|
---|