\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
**/\r
VOID\r
HookPageFaultHandler (\r
- IN INTERRUPT_GATE_DESCRIPTOR *IdtEntry\r
+ IN IA32_IDT_GATE_DESCRIPTOR *IdtEntry\r
)\r
{\r
UINT32 RegEax;\r
//\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
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
//\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