]> git.proxmox.com Git - mirror_edk2.git/blame - SourceLevelDebugPkg/Library/PeCoffExtraActionLibDebug/X64/IntHandlerFuncs.c
SourceLevelDebugPkg: Fix spelling errors
[mirror_edk2.git] / SourceLevelDebugPkg / Library / PeCoffExtraActionLibDebug / X64 / IntHandlerFuncs.c
CommitLineData
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 21BOOLEAN\r
b422b62c 22CheckDebugAgentHandler (\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
52VOID\r
53SaveAndUpdateIdtEntry1 (\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
85VOID\r
86RestoreIdtEntry1 (\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