]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/SetIdtEntry.c
Use IA32_IDT_GATE_DESCRIPTOR defined in BaseLib instead of local struct INTERRUPT_GAT...
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / BootScriptExecutorDxe / X64 / SetIdtEntry.c
index 40c27e4f678a4d646c3612f9ba1357919c9a4c31..54ea20aa7ecf6b2988dfcb3773899bb540358433 100644 (file)
@@ -15,24 +15,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 #include "ScriptExecute.h"\r
-//\r
-// INTERRUPT_GATE_DESCRIPTOR and SetIdtEntry () are used to setup IDT to do debug\r
-//\r
-\r
-#pragma pack(1)\r
-\r
-typedef struct {\r
-  UINT16    Offset15To0;\r
-  UINT16    SegmentSelector;\r
-  UINT16    Attributes;\r
-  UINT16    Offset31To16;\r
-  UINT32    Offset63To32;\r
-  UINT32    Reserved;\r
-} INTERRUPT_GATE_DESCRIPTOR;\r
-\r
-#define INTERRUPT_GATE_ATTRIBUTE   0x8e00\r
-\r
-#pragma pack()\r
 \r
 #define IA32_PG_P                   BIT0\r
 #define IA32_PG_RW                  BIT1\r
@@ -61,7 +43,7 @@ PageFaultHandlerHook (
 **/\r
 VOID\r
 HookPageFaultHandler (\r
-  IN INTERRUPT_GATE_DESCRIPTOR                     *IdtEntry\r
+  IN IA32_IDT_GATE_DESCRIPTOR                   *IdtEntry\r
   )\r
 {\r
   UINT32         RegEax;\r
@@ -85,13 +67,14 @@ HookPageFaultHandler (
   //\r
   // Set Page Fault entry to catch >4G access\r
   //\r
-  mOriginalHandler = (VOID *)(UINTN)(LShiftU64 (IdtEntry->Offset63To32, 32) + IdtEntry->Offset15To0 + (IdtEntry->Offset31To16 << 16));\r
-  IdtEntry->Offset15To0     = (UINT16)((UINTN)PageFaultHandlerHook);\r
-  IdtEntry->SegmentSelector = (UINT16)AsmReadCs ();\r
-  IdtEntry->Attributes      = (UINT16)INTERRUPT_GATE_ATTRIBUTE;\r
-  IdtEntry->Offset31To16    = (UINT16)((UINTN)PageFaultHandlerHook >> 16);\r
-  IdtEntry->Offset63To32    = (UINT32)((UINTN)PageFaultHandlerHook >> 32);\r
-  IdtEntry->Reserved        = 0;\r
+  mOriginalHandler = (VOID *)(UINTN)(LShiftU64 (IdtEntry->Bits.OffsetUpper, 32) + IdtEntry->Bits.OffsetLow + (IdtEntry->Bits.OffsetHigh << 16));\r
+  IdtEntry->Bits.OffsetLow      = (UINT16)((UINTN)PageFaultHandlerHook);\r
+  IdtEntry->Bits.Selector       = (UINT16)AsmReadCs ();\r
+  IdtEntry->Bits.Reserved_0     = 0;\r
+  IdtEntry->Bits.GateType       = IA32_IDT_GATE_TYPE_INTERRUPT_32;\r
+  IdtEntry->Bits.OffsetHigh     = (UINT16)((UINTN)PageFaultHandlerHook >> 16);\r
+  IdtEntry->Bits.OffsetUpper    = (UINT32)((UINTN)PageFaultHandlerHook >> 32);\r
+  IdtEntry->Bits.Reserved_1     = 0;\r
 \r
   if (mPage1GSupport) {\r
     mS3NvsPageTableAddress = (UINTN)(AsmReadCr3 () & mPhyMask) + EFI_PAGES_TO_SIZE(2);\r
@@ -111,7 +94,7 @@ SetIdtEntry (
   IN ACPI_S3_CONTEXT     *AcpiS3Context\r
   )\r
 {\r
-  INTERRUPT_GATE_DESCRIPTOR                     *IdtEntry;\r
+  IA32_IDT_GATE_DESCRIPTOR                      *IdtEntry;\r
   IA32_DESCRIPTOR                               *IdtDescriptor;\r
   UINTN                                         S3DebugBuffer;\r
 \r
@@ -132,17 +115,18 @@ SetIdtEntry (
     //\r
     S3DebugBuffer = (UINTN) (AcpiS3Context->S3DebugBufferAddress);\r
     if (*(UINTN *)S3DebugBuffer != (UINTN) -1) {\r
-      IdtEntry = (INTERRUPT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (3 * sizeof (INTERRUPT_GATE_DESCRIPTOR)));\r
-      IdtEntry->Offset15To0     = (UINT16)S3DebugBuffer;\r
-      IdtEntry->SegmentSelector = (UINT16)AsmReadCs ();\r
-      IdtEntry->Attributes      = (UINT16)INTERRUPT_GATE_ATTRIBUTE;\r
-      IdtEntry->Offset31To16    = (UINT16)(S3DebugBuffer >> 16);\r
-      IdtEntry->Offset63To32    = (UINT32)(S3DebugBuffer >> 32);\r
-      IdtEntry->Reserved        = 0;\r
+      IdtEntry = (IA32_IDT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (3 * sizeof (IA32_IDT_GATE_DESCRIPTOR)));\r
+      IdtEntry->Bits.OffsetLow      = (UINT16)S3DebugBuffer;\r
+      IdtEntry->Bits.Selector       = (UINT16)AsmReadCs ();\r
+      IdtEntry->Bits.Reserved_0     = 0;\r
+      IdtEntry->Bits.GateType       = IA32_IDT_GATE_TYPE_INTERRUPT_32;\r
+      IdtEntry->Bits.OffsetHigh     = (UINT16)(S3DebugBuffer >> 16);\r
+      IdtEntry->Bits.OffsetUpper    = (UINT32)(S3DebugBuffer >> 32);\r
+      IdtEntry->Bits.Reserved_1     = 0;\r
     }\r
   );\r
 \r
-  IdtEntry = (INTERRUPT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (14 * sizeof (INTERRUPT_GATE_DESCRIPTOR)));\r
+  IdtEntry = (IA32_IDT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (14 * sizeof (IA32_IDT_GATE_DESCRIPTOR)));\r
   HookPageFaultHandler (IdtEntry);\r
 }\r
 \r