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