From e7af83aece81c891deeda826526fffa194dc0256 Mon Sep 17 00:00:00 2001 From: vanjeff Date: Sat, 27 Feb 2010 17:04:12 +0000 Subject: [PATCH] 1. Refine debug agent library. 2. DxeCore and DxeIpl consume debug agent library. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10119 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Core/Dxe/DxeMain.h | 1 + MdeModulePkg/Core/Dxe/DxeMain.inf | 1 + MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c | 15 ++++++---- MdeModulePkg/Core/DxeIplPeim/DxeIpl.h | 29 ++++++++++--------- MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf | 13 +++++---- .../Core/DxeIplPeim/Ia32/DxeLoadFunc.c | 15 +++++++--- MdeModulePkg/Include/Library/DebugAgentLib.h | 13 ++++++--- .../DebugAgentLibNull/DebugAgentLibNull.c | 11 ++++--- 8 files changed, 61 insertions(+), 37 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/DxeMain.h b/MdeModulePkg/Core/Dxe/DxeMain.h index da56c88fd7..5c17b02d53 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain.h +++ b/MdeModulePkg/Core/Dxe/DxeMain.h @@ -81,6 +81,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include +#include // diff --git a/MdeModulePkg/Core/Dxe/DxeMain.inf b/MdeModulePkg/Core/Dxe/DxeMain.inf index 6d5f6f5071..2f50ed0223 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain.inf +++ b/MdeModulePkg/Core/Dxe/DxeMain.inf @@ -89,6 +89,7 @@ ReportStatusCodeLib TimerLib DxeServicesLib + DebugAgentLib [Guids] gEfiEventMemoryMapChangeGuid ## CONSUMES ## Event diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c index 77c4227c30..2f72670c2a 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c +++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c @@ -215,8 +215,8 @@ EFI_DECOMPRESS_PROTOCOL gEfiDecompress = { }; // -// For Loading modules at fixed address feature, the configuration table is to cache the top address below which to load -// Runtime code&boot time code +// For Loading modules at fixed address feature, the configuration table is to cache the top address below which to load +// Runtime code&boot time code // GLOBAL_REMOVE_IF_UNREFERENCED EFI_LOAD_FIXED_ADDRESS_CONFIGURATION_TABLE gLoadModuleAtFixAddressConfigurationTable = {0, 0}; @@ -241,6 +241,11 @@ DxeMain ( EFI_PHYSICAL_ADDRESS MemoryBaseAddress; UINT64 MemoryLength; + // + // Initialize Debug Agent to support source level debug in DXE phase + // + InitializeDebugAgent (DEBUG_AGENT_INIT_DXE, HobStart); + // // Initialize Memory Services // @@ -294,11 +299,11 @@ DxeMain ( // Status = CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid, &gMemoryTypeInformation); ASSERT_EFI_ERROR (Status); - + // - // If Loading modules At fixed address feature is enabled, install Load moduels at fixed address + // If Loading modules At fixed address feature is enabled, install Load moduels at fixed address // Configuration Table so that user could easily to retrieve the top address to load Dxe and PEI - // Code and Tseg base to load SMM driver. + // Code and Tseg base to load SMM driver. // if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0) { Status = CoreInstallConfigurationTable (&gLoadFixedAddressConfigurationTableGuid, &gLoadModuleAtFixAddressConfigurationTable); diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h index 1240ce6c2b..8f3538e4d1 100644 --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h @@ -2,7 +2,7 @@ Master header file for DxeIpl PEIM. All source files in this module should include this file for common definitions. -Copyright (c) 2006 - 2009, Intel Corporation.
+Copyright (c) 2006 - 2010, Intel Corporation.
All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -45,13 +45,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include +#include #define STACK_SIZE 0x20000 #define BSP_STORE_SIZE 0x4000 // -// This PPI is installed to indicate the end of the PEI usage of memory +// This PPI is installed to indicate the end of the PEI usage of memory // extern CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi; @@ -61,7 +62,7 @@ extern CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi; instance that contains DxeCore. @return FileHandle of DxeCore to load DxeCore. - + **/ EFI_PEI_FILE_HANDLE DxeIplFindDxeCore ( @@ -70,13 +71,13 @@ DxeIplFindDxeCore ( /** - Main entry point to last PEIM - + Main entry point to last PEIM + @param This Entry point for DXE IPL PPI @param PeiServices General purpose services available to every PEIM. @param HobList Address to the Pei HOB list - - @return EFI_SUCCESS DXE core was successfully loaded. + + @return EFI_SUCCESS DXE core was successfully loaded. @return EFI_OUT_OF_RESOURCES There are not enough resources to load DXE core. **/ @@ -156,7 +157,7 @@ UpdateStackHob ( output buffer. If the input section's GuidedSectionHeader. Attributes field has the - EFI_GUIDED_SECTION_AUTH_STATUS_VALID + EFI_GUIDED_SECTION_AUTH_STATUS_VALID bit as clear, AuthenticationStatus must return zero. These bits reflect the @@ -166,14 +167,14 @@ UpdateStackHob ( EFI_SUCCESS, the value of AuthenticationStatus is undefined. - + @retval EFI_SUCCESS The InputSection was successfully processed and the section contents were returned. - + @retval EFI_OUT_OF_RESOURCES The system has insufficient resources to process the request. - + @retval EFI_INVALID_PARAMETER The GUID in InputSection does not match this instance of the GUIDed Section Extraction PPI. @@ -196,7 +197,7 @@ CustomGuidedSectionExtract ( This function looks up the compression type field in the input section and applies the appropriate compression algorithm to compress the section to a callee allocated buffer. - + @param This Points to this instance of the EFI_PEI_DECOMPRESS_PEI PPI. @param CompressionSection Points to the compressed section. @@ -204,14 +205,14 @@ CustomGuidedSectionExtract ( sections. @param OutputSize Holds the returned size of the decompress section streams. - + @retval EFI_SUCCESS The section was decompressed successfully. OutputBuffer contains the resulting data and OutputSize contains the resulting size. **/ EFI_STATUS -EFIAPI +EFIAPI Decompress ( IN CONST EFI_PEI_DECOMPRESS_PPI *This, IN CONST EFI_COMPRESSION_SECTION *CompressionSection, diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf index 0fcaf44f57..c3dd5f6719 100644 --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf @@ -1,6 +1,6 @@ ## @file # Last PEIM executed in PEI phase to load DXE Core from a Firmware Volume. -# +# # This module produces a special PPI named the DXE Initial Program Load (IPL) # PPI to discover and dispatch the DXE Foundation and components that are # needed to run the DXE Foundation. @@ -10,10 +10,10 @@ # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license.php -# +# # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# +# ## [Defines] @@ -72,6 +72,7 @@ BaseLib PeimEntryPoint DebugLib + DebugAgentLib [Ppis] gEfiDxeIplPpiGuid ## PRODUCES @@ -96,11 +97,11 @@ gEfiPeiMemoryDiscoveredPpiGuid AND gEfiPeiLoadFilePpiGuid # -# [BootMode] +# [BootMode] # S3_RESUME ## SOMETIMES_CONSUMES # RECOVERY ## SOMETIMES_CONSUMES # -# +# # [Hob] # ## # # New Stack HoB @@ -114,4 +115,4 @@ # # BSP Stack HOB for IPF # MEMORY_ALLOCATION ## PRODUCES # -# +# diff --git a/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c index 7e99ac5e02..29ff8416a2 100644 --- a/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c +++ b/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c @@ -15,6 +15,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "DxeIpl.h" #include "VirtualMemory.h" +#define IDT_ENTRY_COUNT 33 + // // Global Descriptor Table (GDT) // @@ -40,7 +42,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST IA32_DESCRIPTOR gGdt = { }; GLOBAL_REMOVE_IF_UNREFERENCED IA32_DESCRIPTOR gLidtDescriptor = { - sizeof (X64_IDT_GATE_DESCRIPTOR) * 32 - 1, + sizeof (X64_IDT_GATE_DESCRIPTOR) * IDT_ENTRY_COUNT - 1, 0 }; @@ -118,13 +120,13 @@ HandOffToDxeCore ( Status = PeiServicesAllocatePages ( EfiBootServicesData, - EFI_SIZE_TO_PAGES((SizeOfTemplate + sizeof (X64_IDT_GATE_DESCRIPTOR)) * 32), + EFI_SIZE_TO_PAGES((SizeOfTemplate + sizeof (X64_IDT_GATE_DESCRIPTOR)) * IDT_ENTRY_COUNT), &VectorAddress ); ASSERT_EFI_ERROR (Status); - IdtTable = (X64_IDT_GATE_DESCRIPTOR *) (UINTN) (VectorAddress + SizeOfTemplate * 32); - for (Index = 0; Index < 32; Index++) { + IdtTable = (X64_IDT_GATE_DESCRIPTOR *) (UINTN) (VectorAddress + SizeOfTemplate * IDT_ENTRY_COUNT); + for (Index = 0; Index < IDT_ENTRY_COUNT; Index++) { IdtTable[Index].Ia32IdtEntry.Bits.GateType = 0x8e; IdtTable[Index].Ia32IdtEntry.Bits.Reserved_0 = 0; IdtTable[Index].Ia32IdtEntry.Bits.Selector = SYS_CODE64_SEL; @@ -142,6 +144,11 @@ HandOffToDxeCore ( gLidtDescriptor.Base = (UINTN) IdtTable; + // + // Disable interrupt of Debug timer, since new IDT table cannot handle it. + // + SaveAndSetDebugTimerInterrupt (FALSE); + AsmWriteIdtr (&gLidtDescriptor); // diff --git a/MdeModulePkg/Include/Library/DebugAgentLib.h b/MdeModulePkg/Include/Library/DebugAgentLib.h index 9a5c57e8de..a5c311482d 100644 --- a/MdeModulePkg/Include/Library/DebugAgentLib.h +++ b/MdeModulePkg/Include/Library/DebugAgentLib.h @@ -19,7 +19,8 @@ #define DEBUG_AGENT_INIT_POSTMEM_SEC 2 #define DEBUG_AGENT_INIT_DXE 3 #define DEBUG_AGENT_INIT_SMM 4 -#define DEBUG_AGENT_INIT_SMI 5 +#define DEBUG_AGENT_INIT_ENTER_SMI 5 +#define DEBUG_AGENT_INIT_EXIT_SMI 6 /** Initialize debug agent. @@ -38,17 +39,21 @@ InitializeDebugAgent ( ); /** - Enable/Disable the interrupt of debug timer. + Enable/Disable the interrupt of debug timer and return the interrupt state + prior to the operation. If EnableStatus is TRUE, enable the interrupt of debug timer. If EnableStatus is FALSE, disable the interrupt of debug timer. @param[in] EnableStatus Enable/Disable. + @retval TRUE Debug timer interrupt were enabled on entry to this call. + @retval FALSE Debug timer interrupt were disabled on entry to this call. + **/ -VOID +BOOLEAN EFIAPI -SetDebugTimerInterrupt ( +SaveAndSetDebugTimerInterrupt ( IN BOOLEAN EnableStatus ); diff --git a/MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.c b/MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.c index cf945d01ad..58c756d4d4 100644 --- a/MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.c +++ b/MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.c @@ -32,20 +32,23 @@ InitializeDebugAgent ( } /** - Enable/Disable the interrupt of debug timer. + Enable/Disable the interrupt of debug timer and return the interrupt state + prior to the operation. If EnableStatus is TRUE, enable the interrupt of debug timer. If EnableStatus is FALSE, disable the interrupt of debug timer. @param[in] EnableStatus Enable/Disable. + @return FALSE always. + **/ -VOID +BOOLEAN EFIAPI -SetDebugTimerInterrupt ( +SaveAndSetDebugTimerInterrupt ( IN BOOLEAN EnableStatus ) { - + return FALSE; } -- 2.39.2