From f4a25e813f7ffa624b4868eb19fe13a34c4778ce Mon Sep 17 00:00:00 2001 From: vanjeff Date: Thu, 16 Aug 2012 04:36:24 +0000 Subject: [PATCH] Add validation on ACPI_S3_CONTEXT.S3DebugBufferAddress, moreover only debug tip could override IDT entry for INT3. Signed-off-by: Jeff Fan Reviewed-by: Liming Gao git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13640 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c | 5 ++-- .../BootScriptExecutorDxe/IA32/SetIdtEntry.c | 27 ++++++++++++----- .../BootScriptExecutorDxe/X64/SetIdtEntry.c | 29 ++++++++++--------- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c b/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c index 4e36c8ae64..5a021d2caa 100644 --- a/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c +++ b/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c @@ -2,7 +2,7 @@ This is an implementation of the ACPI S3 Save protocol. This is defined in S3 boot path specification 0.9. -Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions @@ -453,9 +453,10 @@ S3Ready ( ASSERT (AcpiS3Context->BootScriptStackBase != 0); // - // Allocate a code buffer < 4G for S3 debug to load external code + // Allocate a code buffer < 4G for S3 debug to load external code, set invalid code instructions in it. // AcpiS3Context->S3DebugBufferAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocateAcpiNvsMemoryBelow4G (EFI_PAGE_SIZE); + SetMem ((VOID *)(UINTN)AcpiS3Context->S3DebugBufferAddress, EFI_PAGE_SIZE, 0xff); DEBUG((EFI_D_INFO, "AcpiS3Context: AcpiFacsTable is 0x%8x\n", AcpiS3Context->AcpiFacsTable)); DEBUG((EFI_D_INFO, "AcpiS3Context: IdtrProfile is 0x%8x\n", AcpiS3Context->IdtrProfile)); diff --git a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/IA32/SetIdtEntry.c b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/IA32/SetIdtEntry.c index 9f04959cd9..fbdf32b60b 100644 --- a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/IA32/SetIdtEntry.c +++ b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/IA32/SetIdtEntry.c @@ -50,14 +50,25 @@ SetIdtEntry ( // Restore IDT for debug // IdtDescriptor = (IA32_DESCRIPTOR *) (UINTN) (AcpiS3Context->IdtrProfile); - IdtEntry = (INTERRUPT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (3 * sizeof (INTERRUPT_GATE_DESCRIPTOR))); - S3DebugBuffer = (UINTN) (AcpiS3Context->S3DebugBufferAddress); - - IdtEntry->OffsetLow = (UINT16)S3DebugBuffer; - IdtEntry->SegmentSelector = (UINT16)AsmReadCs (); - IdtEntry->Attributes = (UINT16)INTERRUPT_GATE_ATTRIBUTE; - IdtEntry->OffsetHigh = (UINT16)(S3DebugBuffer >> 16); - AsmWriteIdtr (IdtDescriptor); + + // + // Setup the default CPU exception handlers + // + SetupCpuExceptionHandlers (); + + DEBUG_CODE ( + // + // Update IDT entry INT3 if the instruction is valid in it + // + S3DebugBuffer = (UINTN) (AcpiS3Context->S3DebugBufferAddress); + if (*(UINTN *)S3DebugBuffer != (UINTN) -1) { + IdtEntry = (INTERRUPT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (3 * sizeof (INTERRUPT_GATE_DESCRIPTOR))); + IdtEntry->OffsetLow = (UINT16)S3DebugBuffer; + IdtEntry->SegmentSelector = (UINT16)AsmReadCs ();; + IdtEntry->Attributes = (UINT16)INTERRUPT_GATE_ATTRIBUTE; + IdtEntry->OffsetHigh = (UINT16)(S3DebugBuffer >> 16); + } + ); } diff --git a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/SetIdtEntry.c b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/SetIdtEntry.c index 8c34993587..40c27e4f67 100644 --- a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/SetIdtEntry.c +++ b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/SetIdtEntry.c @@ -126,23 +126,24 @@ SetIdtEntry ( // SetupCpuExceptionHandlers (); - // - // Update IDT entry INT3 - // - IdtEntry = (INTERRUPT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (3 * sizeof (INTERRUPT_GATE_DESCRIPTOR))); - S3DebugBuffer = (UINTN) (AcpiS3Context->S3DebugBufferAddress); - - IdtEntry->Offset15To0 = (UINT16)S3DebugBuffer; - IdtEntry->SegmentSelector = (UINT16)AsmReadCs (); - IdtEntry->Attributes = (UINT16)INTERRUPT_GATE_ATTRIBUTE; - IdtEntry->Offset31To16 = (UINT16)(S3DebugBuffer >> 16); - IdtEntry->Offset63To32 = (UINT32)(S3DebugBuffer >> 32); - IdtEntry->Reserved = 0; + DEBUG_CODE ( + // + // Update IDT entry INT3 if the instruction is valid in it + // + S3DebugBuffer = (UINTN) (AcpiS3Context->S3DebugBufferAddress); + if (*(UINTN *)S3DebugBuffer != (UINTN) -1) { + IdtEntry = (INTERRUPT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (3 * sizeof (INTERRUPT_GATE_DESCRIPTOR))); + IdtEntry->Offset15To0 = (UINT16)S3DebugBuffer; + IdtEntry->SegmentSelector = (UINT16)AsmReadCs (); + IdtEntry->Attributes = (UINT16)INTERRUPT_GATE_ATTRIBUTE; + IdtEntry->Offset31To16 = (UINT16)(S3DebugBuffer >> 16); + IdtEntry->Offset63To32 = (UINT32)(S3DebugBuffer >> 32); + IdtEntry->Reserved = 0; + } + ); IdtEntry = (INTERRUPT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (14 * sizeof (INTERRUPT_GATE_DESCRIPTOR))); HookPageFaultHandler (IdtEntry); - - AsmWriteIdtr (IdtDescriptor); } /**