]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Use IA32_IDT_GATE_DESCRIPTOR defined in BaseLib instead of local struct INTERRUPT_GAT...
authorlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 16 Nov 2012 01:24:31 +0000 (01:24 +0000)
committerlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 16 Nov 2012 01:24:31 +0000 (01:24 +0000)
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13948 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/IA32/SetIdtEntry.c
MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/SetIdtEntry.c

index fbdf32b60b02db00059f25a2c14d0f533fc57b57..04eba0d75678d843edd7679f5f760a485f5b3216 100644 (file)
@@ -15,22 +15,7 @@ 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  OffsetLow;\r
-  UINT16  SegmentSelector;\r
-  UINT16  Attributes;\r
-  UINT16  OffsetHigh;\r
-} INTERRUPT_GATE_DESCRIPTOR;\r
-\r
-#define INTERRUPT_GATE_ATTRIBUTE   0x8e00\r
-\r
-#pragma pack()\r
 /**\r
   Set a IDT entry for interrupt vector 3 for debug purpose.\r
 \r
@@ -42,7 +27,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
@@ -63,11 +48,12 @@ 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->OffsetLow       = (UINT16)S3DebugBuffer;\r
-      IdtEntry->SegmentSelector = (UINT16)AsmReadCs ();;\r
-      IdtEntry->Attributes      = (UINT16)INTERRUPT_GATE_ATTRIBUTE;\r
-      IdtEntry->OffsetHigh      = (UINT16)(S3DebugBuffer >> 16);\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
     }\r
   );\r
 }\r
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