]> git.proxmox.com Git - mirror_edk2.git/blob - SourceLevelDebugPkg/Library/PeCoffExtraActionLibDebug/Ia32/IntHandlerFuncs.c
80bafca41be605129010bf4d321b4f3a963ef750
[mirror_edk2.git] / SourceLevelDebugPkg / Library / PeCoffExtraActionLibDebug / Ia32 / IntHandlerFuncs.c
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 setuo 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 }