diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /EDK/Foundation/Core/Dxe/Misc | |
download | zprj-master.tar.xz |
Diffstat (limited to 'EDK/Foundation/Core/Dxe/Misc')
-rw-r--r-- | EDK/Foundation/Core/Dxe/Misc/DebugImageInfo.c | 262 | ||||
-rw-r--r-- | EDK/Foundation/Core/Dxe/Misc/DebugImageInfo.h | 129 | ||||
-rw-r--r-- | EDK/Foundation/Core/Dxe/Misc/DebugMask.c | 400 | ||||
-rw-r--r-- | EDK/Foundation/Core/Dxe/Misc/DebugMask.h | 122 | ||||
-rw-r--r-- | EDK/Foundation/Core/Dxe/Misc/InstallConfigurationTable.c | 230 | ||||
-rw-r--r-- | EDK/Foundation/Core/Dxe/Misc/SetWatchdogTimer.c | 84 | ||||
-rw-r--r-- | EDK/Foundation/Core/Dxe/Misc/Stall.c | 79 |
7 files changed, 1306 insertions, 0 deletions
diff --git a/EDK/Foundation/Core/Dxe/Misc/DebugImageInfo.c b/EDK/Foundation/Core/Dxe/Misc/DebugImageInfo.c new file mode 100644 index 0000000..c1a81a3 --- /dev/null +++ b/EDK/Foundation/Core/Dxe/Misc/DebugImageInfo.c @@ -0,0 +1,262 @@ +/*++ + +Copyright (c) 2004 - 2007, 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 +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. + +Module Name: + + DebugImageInfo.c + +Abstract: + + Support functions for managing debug image info table when loading and unloading + images. + +--*/ + +#include "Tiano.h" +#include "DxeCore.h" +#include "DebugImageInfo.h" + + +static EFI_DEBUG_IMAGE_INFO_TABLE_HEADER mDebugInfoTableHeader = { + 0, // volatile UINT32 UpdateStatus; + 0, // UINT32 TableSize; + NULL // EFI_DEBUG_IMAGE_INFO *EfiDebugImageInfoTable; +}; + +static EFI_SYSTEM_TABLE_POINTER *mDebugTable = NULL; + + +VOID +CoreInitializeDebugImageInfoTable ( + VOID + ) +/*++ + +Routine Description: + + Creates and initializes the DebugImageInfo Table. Also creates the configuration + table and registers it into the system table. + +Arguments: + None + +Returns: + NA + +Notes: + This function allocates memory, frees it, and then allocates memory at an + address within the initial allocation. Since this function is called early + in DXE core initialization (before drivers are dispatched), this should not + be a problem. + +--*/ +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS Mem; + UINTN NumberOfPages; + + // + // Allocate boot services memory for the structure. It's required to be aligned on + // a 4M boundary, so allocate a 4M block (plus what we require), free it up, calculate + // a 4M aligned address within the memory we just freed, and then allocate memory at that + // address for our initial structure. + // + NumberOfPages = FOUR_MEG_PAGES + EFI_SIZE_TO_PAGES(sizeof (EFI_SYSTEM_TABLE_POINTER)); + + Status = CoreAllocatePages (AllocateAnyPages, EfiBootServicesData, NumberOfPages , &Mem); + ASSERT_EFI_ERROR (Status); + if (EFI_ERROR(Status)) { + return; + } + Status = CoreFreePages (Mem, NumberOfPages); + ASSERT_EFI_ERROR (Status); + if (EFI_ERROR(Status)) { + return; + } + // + // Now get a 4M aligned address within the memory range we were given. + // Then allocate memory at that address + // + Mem = (Mem + FOUR_MEG_MASK) & (~FOUR_MEG_MASK); + + Status = CoreAllocatePages (AllocateAddress, EfiBootServicesData, NumberOfPages - FOUR_MEG_PAGES, &Mem); + ASSERT_EFI_ERROR (Status); + if (EFI_ERROR(Status)) { + return; + } + // + // We now have a 4M aligned page allocated, so fill in the data structure. + // Ideally we would update the CRC now as well, but the service may not yet be available. + // See comments in the CoreUpdateDebugTableCrc32() function below for details. + // + mDebugTable = (EFI_SYSTEM_TABLE_POINTER *)(UINTN)Mem; + mDebugTable->Signature = EFI_SYSTEM_TABLE_SIGNATURE; + mDebugTable->EfiSystemTableBase = (EFI_PHYSICAL_ADDRESS) (UINTN) gST; + mDebugTable->Crc32 = 0; + Status = CoreInstallConfigurationTable (&gEfiDebugImageInfoTableGuid, &mDebugInfoTableHeader); + ASSERT_EFI_ERROR (Status); +} + +VOID +CoreUpdateDebugTableCrc32 ( + VOID + ) +/*++ + +Routine Description: + + Update the CRC32 in the Debug Table. + Since the CRC32 service is made available by the Runtime driver, we have to + wait for the Runtime Driver to be installed before the CRC32 can be computed. + This function is called elsewhere by the core when the runtime architectural + protocol is produced. + +Arguments: + None + +Returns: + NA + +--*/ +{ + ASSERT(mDebugTable != NULL); + mDebugTable->Crc32 = 0; + gBS->CalculateCrc32 ((VOID *)mDebugTable, sizeof (EFI_SYSTEM_TABLE_POINTER), &mDebugTable->Crc32); +} + +VOID +CoreNewDebugImageInfoEntry ( + IN UINT32 ImageInfoType, + IN EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, + IN EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Adds a new DebugImageInfo structure to the DebugImageInfo Table. Re-Allocates + the table if it's not large enough to accomidate another entry. + +Arguments: + + ImageInfoType - type of debug image information + LoadedImage - pointer to the loaded image protocol for the image being loaded + ImageHandle - image handle for the image being loaded + +Returns: + NA + +--*/ +{ + EFI_DEBUG_IMAGE_INFO *Table; + EFI_DEBUG_IMAGE_INFO *NewTable; + UINTN Index; + UINTN MaxTableIndex; + UINTN TableSize; + + // + // Set the flag indicating that we're in the process of updating the table. + // + mDebugInfoTableHeader.UpdateStatus |= EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS; + + Table = mDebugInfoTableHeader.EfiDebugImageInfoTable; + MaxTableIndex = mDebugInfoTableHeader.TableSize; + + for (Index = 0; Index < MaxTableIndex; Index++) { + if (Table[Index].NormalImage == NULL) { + // + // We have found a free entry so exit the loop + // + break; + } + } + if (Index == MaxTableIndex) { + // + // Table is full, so re-allocate another page for a larger table... + // + TableSize = MaxTableIndex * EFI_DEBUG_TABLE_ENTRY_SIZE; + NewTable = CoreAllocateZeroBootServicesPool (TableSize + EFI_PAGE_SIZE); + if (NewTable == NULL) { + mDebugInfoTableHeader.UpdateStatus &= ~EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS; + return; + } + // + // Copy the old table into the new one + // + EfiCommonLibCopyMem (NewTable, Table, TableSize); + // + // Free the old table + // + CoreFreePool (Table); + // + // Update the table header + // + Table = NewTable; + mDebugInfoTableHeader.EfiDebugImageInfoTable = NewTable; + mDebugInfoTableHeader.TableSize += EFI_PAGE_SIZE / EFI_DEBUG_TABLE_ENTRY_SIZE; + } + // + // Allocate data for new entry + // + Table[Index].NormalImage = CoreAllocateZeroBootServicesPool (sizeof (EFI_DEBUG_IMAGE_INFO_NORMAL)); + if (Table[Index].NormalImage != NULL) { + // + // Update the entry + // + Table[Index].NormalImage->ImageInfoType = ImageInfoType; + Table[Index].NormalImage->LoadedImageProtocolInstance = LoadedImage; + Table[Index].NormalImage->ImageHandle = ImageHandle; + } + mDebugInfoTableHeader.UpdateStatus &= ~EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS; +} + + +VOID +CoreRemoveDebugImageInfoEntry ( + EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Removes and frees an entry from the DebugImageInfo Table. + +Arguments: + + ImageHandle - image handle for the image being unloaded + +Returns: + + NA + +--*/ +{ + EFI_DEBUG_IMAGE_INFO *Table; + UINTN Index; + + mDebugInfoTableHeader.UpdateStatus |= EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS; + + Table = mDebugInfoTableHeader.EfiDebugImageInfoTable; + + for (Index = 0; Index < mDebugInfoTableHeader.TableSize; Index++) { + if (Table[Index].NormalImage != NULL && Table[Index].NormalImage->ImageHandle == ImageHandle) { + // + // Found a match. Free up the record, then NULL the pointer to indicate the slot + // is free. + // + CoreFreePool (Table[Index].NormalImage); + Table[Index].NormalImage = NULL; + break; + } + } + mDebugInfoTableHeader.UpdateStatus &= ~EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS; +} + diff --git a/EDK/Foundation/Core/Dxe/Misc/DebugImageInfo.h b/EDK/Foundation/Core/Dxe/Misc/DebugImageInfo.h new file mode 100644 index 0000000..a4e86e7 --- /dev/null +++ b/EDK/Foundation/Core/Dxe/Misc/DebugImageInfo.h @@ -0,0 +1,129 @@ +/*++ + +Copyright (c) 2004 - 2007, 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 +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. + +Module Name: + + DebugImageInfo.h + +Abstract: + + Support functions for managing debug image info table when loading and unloading + images. + +--*/ + +#ifndef __DEBUG_IMAGE_INFO_H__ +#define __DEBUG_IMAGE_INFO_H__ + +#include EFI_PROTOCOL_DEFINITION(LoadedImage) +#include EFI_GUID_DEFINITION(DebugImageInfoTable) + +#define FOUR_MEG_PAGES 0x400 +#define FOUR_MEG_MASK ((FOUR_MEG_PAGES * EFI_PAGE_SIZE) - 1) + +#define EFI_DEBUG_TABLE_ENTRY_SIZE (sizeof (VOID *)) + +VOID +CoreInitializeDebugImageInfoTable ( + VOID + ) +/*++ + +Routine Description: + + Creates and initializes the DebugImageInfo Table. Also creates the configuration + table and registers it into the system table. + +Arguments: + None + +Returns: + NA + +Notes: + This function allocates memory, frees it, and then allocates memory at an + address within the initial allocation. Since this function is called early + in DXE core initialization (before drivers are dispatched), this should not + be a problem. + +--*/ +; + +VOID +CoreUpdateDebugTableCrc32 ( + VOID + ) +/*++ + +Routine Description: + + Update the CRC32 in the Debug Table. + Since the CRC32 service is made available by the Runtime driver, we have to + wait for the Runtime Driver to be installed before the CRC32 can be computed. + This function is called elsewhere by the core when the runtime architectural + protocol is produced. + +Arguments: + None + +Returns: + NA + +--*/ +; + +VOID +CoreNewDebugImageInfoEntry ( + UINT32 ImageInfoType, + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, + EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Adds a new DebugImageInfo structure to the DebugImageInfo Table. Re-Allocates + the table if it's not large enough to accomidate another entry. + +Arguments: + + ImageInfoType - type of debug image information + LoadedImage - pointer to the loaded image protocol for the image being loaded + ImageHandle - image handle for the image being loaded + +Returns: + NA + +--*/ +; + +VOID +CoreRemoveDebugImageInfoEntry ( + EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Removes and frees an entry from the DebugImageInfo Table. + +Arguments: + + ImageHandle - image handle for the image being unloaded + +Returns: + + NA + +--*/ +; + +#endif diff --git a/EDK/Foundation/Core/Dxe/Misc/DebugMask.c b/EDK/Foundation/Core/Dxe/Misc/DebugMask.c new file mode 100644 index 0000000..c2dee47 --- /dev/null +++ b/EDK/Foundation/Core/Dxe/Misc/DebugMask.c @@ -0,0 +1,400 @@ +/*++ + +Copyright (c) 2004 - 2005, 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 +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. + +Module Name: + + DebugMask.c + +Abstract: + + +--*/ + +#include "Tiano.h" +#include "DxeCore.h" +#include "DebugMask.h" +#include EFI_GUID_DEFINITION (GlobalVariable) + +extern UINTN mErrorLevel; +static VOID *mVariableReadyNotify; + +VOID +UpdateDebugMask ( + EFI_EVENT Event, + VOID *Context + ); + +EFI_STATUS +EFIAPI +GetDebugMask ( + IN EFI_DEBUG_MASK_PROTOCOL *This, // Calling context + IN OUT UINTN *CurrentDebugMask // Ptr to store current debug mask + ) +/*++ + +Routine Description: + DebugMask protocol member function. + Gets the current debug mask for an image, on which this protocol has been installed. + +Arguments: + + This - Indicates calling context + CurrentDebugMask - Ptr to store current debug mask + +Returns: + EFI_SUCCESS - Debug mask is retrieved successfully + EFI_INVALID_PARAMETER - CurrentDebugMask is NULL. + EFI_UNSUPPORTED - The handle on which this protocol is installed is not an image handle. + +--*/ +{ + DEBUG_MASK_PRIVATE_DATA *Private; + // + // Check Parameter + // + if (CurrentDebugMask == NULL){ + return EFI_INVALID_PARAMETER; + } + + // + // Get Private Data + // + Private = DEBUG_MASK_PRIVATE_DATA_FROM_THIS(This); + *CurrentDebugMask = Private->ImageDebugMask; + return EFI_SUCCESS; +} + + +EFI_STATUS +EFIAPI +SetDebugMask ( + IN EFI_DEBUG_MASK_PROTOCOL *This, // Calling context + IN UINTN NewDebugMask // New Debug Mask value to set + ) +/*++ + +Routine Description: + DebugMask protocol member function. + Updates the current debug mask for an image, on which this protocol has been installed. + +Arguments: + + This - Calling context + NewDebugMask - New Debug Mask value to set + +Returns: + EFI_SUCCESS - Debug mask is updated with the new value successfully + EFI_UNSUPPORTED - The handle on which this protocol is installed is not an image handle. + +--*/ +{ + DEBUG_MASK_PRIVATE_DATA *Private; + // + // Set Private Data + // + Private = DEBUG_MASK_PRIVATE_DATA_FROM_THIS(This); + Private->ImageDebugMask = NewDebugMask; + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +SetCoreDebugMask ( + IN EFI_DEBUG_MASK_PROTOCOL *This, // Calling context + IN UINTN NewDebugMask // New Debug Mask value to set + ) +/*++ + +Routine Description: + DebugMask protocol member function. + Updates the current debug mask for core. + +Arguments: + + This - Calling context + NewDebugMask - New Debug Mask value to set + +Returns: + EFI_SUCCESS - Debug mask is updated with the new value successfully + EFI_UNSUPPORTED - The handle on which this protocol is installed is not an image handle. + +--*/ +{ + mErrorLevel = NewDebugMask; + return SetDebugMask(This, NewDebugMask); +} + +EFI_STATUS +InstallDebugMaskProtocol( + IN EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Install debug mask protocol on an image handle. + +Arguments: + + ImageHandle - Image handle which debug mask protocol will install on + +Returns: + + EFI_INVALID_PARAMETER - Invalid image handle + + EFI_OUT_OF_RESOURCES - No enough buffer could be allocated + + EFI_SUCCESS - Debug mask protocol successfully installed + +--*/ +{ + EFI_STATUS Status; + EFI_LOADED_IMAGE_PROTOCOL *LoadImageInterface; + DEBUG_MASK_PRIVATE_DATA *DebugMaskPrivate; + + if (ImageHandle == NULL) { + return EFI_INVALID_PARAMETER; + } + // + // Check Image Handle + // + Status = CoreHandleProtocol ( + ImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID*)&LoadImageInterface + ); + + if (EFI_ERROR (Status)) { + return EFI_INVALID_PARAMETER; + } + // + // Create Pool for Private Data + // + DebugMaskPrivate = CoreAllocateZeroBootServicesPool (sizeof (DEBUG_MASK_PRIVATE_DATA)); + + if (DebugMaskPrivate == NULL) { + return EFI_OUT_OF_RESOURCES; + } + // + // Fill in private data structure + // + DebugMaskPrivate->Signature = DEBUGMASK_PRIVATE_DATA_SIGNATURE; + DebugMaskPrivate->ImageDebugMask = mErrorLevel; + DebugMaskPrivate->DebugMaskInterface.Revision = EFI_DEBUG_MASK_REVISION; + DebugMaskPrivate->DebugMaskInterface.GetDebugMask = GetDebugMask; + DebugMaskPrivate->DebugMaskInterface.SetDebugMask = SetDebugMask; + // + // Install Debug Mask Protocol in Image Handle + // + Status = CoreInstallProtocolInterface ( + &ImageHandle, + &gEfiDebugMaskProtocolGuid, + EFI_NATIVE_INTERFACE, + &(DebugMaskPrivate->DebugMaskInterface) + ); + + return Status; +} + +EFI_STATUS +UninstallDebugMaskProtocol( + IN EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Uninstall debug mask protocol on an image handle. + +Arguments: + + ImageHandle - Image handle which debug mask protocol will uninstall on + +Returns: + + EFI_INVALID_PARAMETER - Invalid image handle + + EFI_SUCCESS - Debug mask protocol successfully uninstalled + +--*/ +{ + EFI_STATUS Status; + EFI_DEBUG_MASK_PROTOCOL *DebugMaskInterface; + DEBUG_MASK_PRIVATE_DATA *DebugMaskPrivate; + + if (ImageHandle == NULL) { + return EFI_INVALID_PARAMETER; + } + // + // Get Protocol from ImageHandle + // + Status = CoreHandleProtocol ( + ImageHandle, + &gEfiDebugMaskProtocolGuid, + (VOID*)&DebugMaskInterface + ); + if (EFI_ERROR (Status)) { + return Status; + } + + DebugMaskPrivate = DEBUG_MASK_PRIVATE_DATA_FROM_THIS(DebugMaskInterface); + // + // Remove Protocol from ImageHandle + // + Status = CoreUninstallProtocolInterface ( + ImageHandle, + &gEfiDebugMaskProtocolGuid, + (VOID*)DebugMaskInterface + ); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Free Private Data Pool + // + Status = CoreFreePool(DebugMaskPrivate); + return Status; +} + +EFI_STATUS +InstallCoreDebugMaskProtocol( + IN EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Install debug mask protocol on core. + +Arguments: + + ImageHandle - Core handle + +Returns: + + EFI_INVALID_PARAMETER - Invalid image handle + + EFI_OUT_OF_RESOURCES - No enough buffer could be allocated + + EFI_SUCCESS - Debug mask protocol successfully installed + +--*/ +{ + EFI_DEBUG_MASK_PROTOCOL *DebugMaskInterface; + EFI_STATUS Status; + EFI_EVENT Event; + + if (ImageHandle == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = InstallDebugMaskProtocol(ImageHandle); + if (EFI_ERROR(Status)) { + return Status; + } + + // + // Check Image Handle + // + Status = CoreHandleProtocol ( + ImageHandle, + &gEfiDebugMaskProtocolGuid, + (VOID*)&DebugMaskInterface + ); + if (EFI_ERROR(Status) || (DebugMaskInterface == NULL)) { + return Status; + } + DebugMaskInterface->SetDebugMask = SetCoreDebugMask; + + Status = CoreCreateEvent ( + EFI_EVENT_NOTIFY_SIGNAL, + EFI_TPL_CALLBACK, + UpdateDebugMask, + mVariableReadyNotify, + &Event + ); + + if (!EFI_ERROR (Status)) { + Status = CoreRegisterProtocolNotify ( + &gEfiVariableArchProtocolGuid, + Event, + &mVariableReadyNotify + ); + } + + return Status; +} + +VOID +UpdateDebugMask ( + EFI_EVENT Event, + VOID *Context + ) +/*++ + +Routine Description: + + Event callback function to update the debug mask when the variable service is ready. + +Arguments: + + Event - The Event + Context - The event's context + +Returns: + + None + +--*/ +{ + UINTN NoHandles; + EFI_STATUS Status; + UINTN DebugMask; + UINTN Index; + UINTN DataSize; + EFI_HANDLE *Buffer; + EFI_DEBUG_MASK_PROTOCOL *DebugMaskProtocol; + + DataSize = sizeof(UINT32); + Status = gRT->GetVariable( + L"EFIDebug", + &gEfiGlobalVariableGuid, + NULL, + &DataSize, + &DebugMask + ); + if (EFI_ERROR(Status)) { + return; + } + + Status = CoreLocateHandleBuffer ( + AllHandles, + &gEfiDebugMaskProtocolGuid, + NULL, + &NoHandles, + &Buffer + ); + if (EFI_ERROR(Status)) { + return; + } + for (Index = 0; Index < NoHandles; Index ++) { + Status = CoreHandleProtocol ( + Buffer[Index], + &gEfiDebugMaskProtocolGuid, + &DebugMaskProtocol + ); + if (EFI_ERROR(Status) || (DebugMaskProtocol == NULL)) { + continue; + } + DebugMaskProtocol->SetDebugMask(DebugMaskProtocol, DebugMask); + } + CoreFreePool(Buffer); +} diff --git a/EDK/Foundation/Core/Dxe/Misc/DebugMask.h b/EDK/Foundation/Core/Dxe/Misc/DebugMask.h new file mode 100644 index 0000000..18dbef5 --- /dev/null +++ b/EDK/Foundation/Core/Dxe/Misc/DebugMask.h @@ -0,0 +1,122 @@ +/*++ + +Copyright (c) 2004 - 2005, 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 +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. + +Module Name: + + DebugMask.h + +Abstract: + + +--*/ + +#ifndef __DEBUG_MASK_INFO_H__ +#define __DEBUG_MASK_INFO_H__ + +#include EFI_PROTOCOL_CONSUMER (DebugMask) + +// +// local type definitions +// +#define DEBUGMASK_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32('D','M','S','K') + +// +// Private structure used by driver +// +typedef struct { + UINT32 Signature; + UINTN ImageDebugMask; + EFI_DEBUG_MASK_PROTOCOL DebugMaskInterface; +}DEBUG_MASK_PRIVATE_DATA; + +#define DEBUG_MASK_PRIVATE_DATA_FROM_THIS(a) \ + CR(a, DEBUG_MASK_PRIVATE_DATA, DebugMaskInterface, DEBUGMASK_PRIVATE_DATA_SIGNATURE) + +// +// Internal DebugMask Procotol Install/Uninstall Function +// +EFI_STATUS +InstallDebugMaskProtocol ( + IN EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Install debug mask protocol on an image handle. + +Arguments: + + ImageHandle - Image handle which debug mask protocol will install on + +Returns: + + EFI_INVALID_PARAMETER - Invalid image handle + + EFI_OUT_OF_RESOURCES - No enough buffer could be allocated + + EFI_SUCCESS - Debug mask protocol successfully installed + +--*/ +; + +// +// Internal DebugMask Procotol Install/Uninstall Function +// +EFI_STATUS +InstallCoreDebugMaskProtocol ( + IN EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Install debug mask protocol on Dxe Core. + +Arguments: + + ImageHandle - Image handle which debug mask protocol will install on + +Returns: + + EFI_INVALID_PARAMETER - Invalid image handle + + EFI_OUT_OF_RESOURCES - No enough buffer could be allocated + + EFI_SUCCESS - Debug mask protocol successfully installed + +--*/ +; + +EFI_STATUS +UninstallDebugMaskProtocol ( + IN EFI_HANDLE ImageHandle + ) +/*++ + +Routine Description: + + Uninstall debug mask protocol on an image handle. + +Arguments: + + ImageHandle - Image handle which debug mask protocol will uninstall on + +Returns: + + EFI_INVALID_PARAMETER - Invalid image handle + + EFI_SUCCESS - Debug mask protocol successfully uninstalled + +--*/ +; + +#endif diff --git a/EDK/Foundation/Core/Dxe/Misc/InstallConfigurationTable.c b/EDK/Foundation/Core/Dxe/Misc/InstallConfigurationTable.c new file mode 100644 index 0000000..8aea9bc --- /dev/null +++ b/EDK/Foundation/Core/Dxe/Misc/InstallConfigurationTable.c @@ -0,0 +1,230 @@ +/*++ + +Copyright (c) 2004 - 2007, 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 +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. + +Module Name: + + InstallConfigurationTable.c + + +Abstract: + + Tiano Miscellaneous Services InstallConfigurationTable service + +--*/ + +#include "Tiano.h" +#include "DxeCore.h" + +#define CONFIG_TABLE_SIZE_INCREASED 0x10 + +UINTN mSystemTableAllocateSize = 0; + + +EFI_STATUS +CoreGetConfigTable ( + IN EFI_GUID *Guid, + OUT VOID **Table + ) +/*++ + +Routine Description: + + Find a config table by name in system table's ConfigurationTable. + +Arguments: + + Guid - The table name to look for + + Table - Pointer of the config table + +Returns: + + EFI_NOT_FOUND - Could not find the table in system table's ConfigurationTable. + + EFI_SUCCESS - Table successfully found. + +--*/ +{ + UINTN Index; + + for (Index = 0; Index < gST->NumberOfTableEntries; Index++) { + if (EfiCompareGuid (Guid, &(gST->ConfigurationTable[Index].VendorGuid))) { + *Table = gST->ConfigurationTable[Index].VendorTable; + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; +} + + +EFI_BOOTSERVICE +EFI_STATUS +EFIAPI +CoreInstallConfigurationTable ( + IN EFI_GUID *Guid, + IN VOID *Table + ) +/*++ + +Routine Description: + + Boot Service called to add, modify, or remove a system configuration table from + the EFI System Table. + +Arguments: + + Guid - Pointer to the GUID for the entry to add, update, or remove + Table - Pointer to the configuration table for the entry to add, update, or + remove, may be NULL. + +Returns: + + EFI_SUCCESS Guid, Table pair added, updated, or removed. + EFI_INVALID_PARAMETER Input GUID not valid. + EFI_NOT_FOUND Attempted to delete non-existant entry + EFI_OUT_OF_RESOURCES Not enough memory available + +--*/ +{ + UINTN Index; + EFI_CONFIGURATION_TABLE *EfiConfigurationTable; + + // + // If Guid is NULL, then this operation cannot be performed + // + if (Guid == NULL) { + return EFI_INVALID_PARAMETER; + } + + EfiConfigurationTable = gST->ConfigurationTable; + + // + // Search all the table for an entry that matches Guid + // + for (Index = 0; Index < gST->NumberOfTableEntries; Index++) { + if (EfiCompareGuid (Guid, &(gST->ConfigurationTable[Index].VendorGuid))) { + break; + } + } + + if (Index < gST->NumberOfTableEntries) { + // + // A match was found, so this is either a modify or a delete operation + // + if (Table != NULL) { + // + // If Table is not NULL, then this is a modify operation. + // Modify the table enty and return. + // + gST->ConfigurationTable[Index].VendorTable = Table; + +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + // + // Signal Configuration Table change + // + CoreNotifySignalList (Guid); +#endif + + return EFI_SUCCESS; + } + + // + // A match was found and Table is NULL, so this is a delete operation. + // + gST->NumberOfTableEntries--; + + // + // Copy over deleted entry + // + EfiCommonLibCopyMem ( + &(EfiConfigurationTable[Index]), + &(gST->ConfigurationTable[Index + 1]), + (gST->NumberOfTableEntries - Index) * sizeof (EFI_CONFIGURATION_TABLE) + ); + + } else { + + // + // No matching GUIDs were found, so this is an add operation. + // + + if (Table == NULL) { + // + // If Table is NULL on an add operation, then return an error. + // + return EFI_NOT_FOUND; + } + + // + // Assume that Index == gST->NumberOfTableEntries + // + if ((Index * sizeof (EFI_CONFIGURATION_TABLE)) >= mSystemTableAllocateSize) { + // + // Allocate a table with one additional entry. + // + mSystemTableAllocateSize += (CONFIG_TABLE_SIZE_INCREASED * sizeof (EFI_CONFIGURATION_TABLE)); + EfiConfigurationTable = CoreAllocateRuntimePool (mSystemTableAllocateSize); + if (EfiConfigurationTable == NULL) { + // + // If a new table could not be allocated, then return an error. + // + return EFI_OUT_OF_RESOURCES; + } + + if (gST->ConfigurationTable != NULL) { + // + // Copy the old table to the new table. + // + EfiCommonLibCopyMem ( + EfiConfigurationTable, + gST->ConfigurationTable, + Index * sizeof (EFI_CONFIGURATION_TABLE) + ); + + // + // Free Old Table + // + CoreFreePool (gST->ConfigurationTable); + } + + // + // Update System Table + // + gST->ConfigurationTable = EfiConfigurationTable; + } + + // + // Fill in the new entry + // + EfiConfigurationTable[Index].VendorGuid = *Guid; + EfiConfigurationTable[Index].VendorTable = Table; + + // + // This is an add operation, so increment the number of table entries + // + gST->NumberOfTableEntries++; + } + + // + // Fix up the CRC-32 in the EFI System Table + // + CalculateEfiHdrCrc (&gST->Hdr); + +#if (EFI_SPECIFICATION_VERSION >= 0x0002000A) + // + // Signal Configuration Table change + // + CoreNotifySignalList (Guid); +#endif + + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Core/Dxe/Misc/SetWatchdogTimer.c b/EDK/Foundation/Core/Dxe/Misc/SetWatchdogTimer.c new file mode 100644 index 0000000..2146137 --- /dev/null +++ b/EDK/Foundation/Core/Dxe/Misc/SetWatchdogTimer.c @@ -0,0 +1,84 @@ +/*++ + +Copyright (c) 2004, 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 +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. + +Module Name: + + SetWatchdogTimer.c + +Abstract: + + Tiano Miscellaneous Services SetWatchdogTimer service implementation + +--*/ + +#include "Tiano.h" +#include "DxeCore.h" + +#define WATCHDOG_TIMER_CALIBRATE_PER_SECOND 10000000 + +EFI_BOOTSERVICE +EFI_STATUS +EFIAPI +CoreSetWatchdogTimer ( + IN UINTN Timeout, + IN UINT64 WatchdogCode, + IN UINTN DataSize, + IN CHAR16 *WatchdogData OPTIONAL + ) +/*++ + +Routine Description: + + Sets the system's watchdog timer. + +Arguments: + + Timeout The number of seconds. Zero disables the timer. + + ///////following three parameters are left for platform specific using + + WatchdogCode The numberic code to log. 0x0 to 0xffff are firmware + DataSize Size of the optional data + WatchdogData Optional Null terminated unicode string followed by binary + data. + +Returns: + + EFI_SUCCESS Timeout has been set + EFI_NOT_AVAILABLE_YET WatchdogTimer is not available yet + EFI_UNSUPPORTED System does not have a timer (currently not used) + EFI_DEVICE_ERROR Could not complete due to hardware error + +--*/ +{ + EFI_STATUS Status; + + // + // Check our architectural protocol + // + if (gWatchdogTimer == NULL) { + return EFI_NOT_AVAILABLE_YET; + } + + // + // Attempt to set the timeout + // + Status = gWatchdogTimer->SetTimerPeriod (gWatchdogTimer, MultU64x32 (Timeout, WATCHDOG_TIMER_CALIBRATE_PER_SECOND)); + + // + // Check for errors + // + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + + return EFI_SUCCESS; +} diff --git a/EDK/Foundation/Core/Dxe/Misc/Stall.c b/EDK/Foundation/Core/Dxe/Misc/Stall.c new file mode 100644 index 0000000..a87f894 --- /dev/null +++ b/EDK/Foundation/Core/Dxe/Misc/Stall.c @@ -0,0 +1,79 @@ +/*++ + +Copyright (c) 2004, 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 +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. + +Module Name: + + Stall.c + +Abstract: + + Tiano Miscellaneous Services Stall service implementation + +--*/ + +// +// Include statements +// + +#include "Tiano.h" +#include "DxeCore.h" + +EFI_BOOTSERVICE +EFI_STATUS +EFIAPI +CoreStall ( + IN UINTN Microseconds + ) +/*++ + +Routine Description: + + Introduces a fine-grained stall. + +Arguments: + + Microseconds The number of microseconds to stall execution + +Returns: + + EFI_SUCCESS - Execution was stalled for at least the requested amount + of microseconds. + + EFI_NOT_AVAILABLE_YET - gMetronome is not available yet + +--*/ +{ + UINT32 Counter; + UINTN Remainder; + + if (gMetronome == NULL) { + return EFI_NOT_AVAILABLE_YET; + } + + // + // Calculate the number of ticks by dividing the number of microseconds by + // the TickPeriod. + // Calcullation is based on 100ns unit. + // + Counter = (UINT32) DivU64x32 ((Microseconds * 10), (UINTN) gMetronome->TickPeriod, &Remainder); + + // + // Call WaitForTick for Counter + 1 ticks to try to guarantee Counter tick + // periods, thus attempting to ensure Microseconds of stall time. + // + if (Remainder != 0) { + Counter++; + } + + gMetronome->WaitForTick (gMetronome, Counter); + + return EFI_SUCCESS; +} |