IntHandlerFuncs.c 2.8 KB

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