Table now contains an item named CalculateCrc32.\r
\r
\r
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
//\r
// Global Variables\r
//\r
-EFI_MEMORY_DESCRIPTOR *mVirtualMap = NULL;\r
-UINTN mVirtualMapDescriptorSize;\r
-UINTN mVirtualMapMaxIndex;\r
-VOID *mMyImageBase;\r
+EFI_MEMORY_DESCRIPTOR *mVirtualMap = NULL;\r
+UINTN mVirtualMapDescriptorSize;\r
+UINTN mVirtualMapMaxIndex;\r
+VOID *mMyImageBase;\r
\r
//\r
// The handle onto which the Runtime Architectural Protocol instance is installed\r
//\r
-EFI_HANDLE mRuntimeHandle = NULL;\r
+EFI_HANDLE mRuntimeHandle = NULL;\r
\r
//\r
// The Runtime Architectural Protocol instance produced by this driver\r
//\r
-EFI_RUNTIME_ARCH_PROTOCOL mRuntime = {\r
+EFI_RUNTIME_ARCH_PROTOCOL mRuntime = {\r
INITIALIZE_LIST_HEAD_VARIABLE (mRuntime.ImageHead),\r
INITIALIZE_LIST_HEAD_VARIABLE (mRuntime.EventHead),\r
\r
//\r
// Worker Functions\r
//\r
+\r
/**\r
\r
Calculate the 32-bit CRC in a EFI table using the Runtime Drivers\r
{\r
UINT32 Crc;\r
\r
- Hdr->CRC32 = 0;\r
+ Hdr->CRC32 = 0;\r
\r
- Crc = 0;\r
- RuntimeDriverCalculateCrc32 ((UINT8 *) Hdr, Hdr->HeaderSize, &Crc);\r
+ Crc = 0;\r
+ RuntimeDriverCalculateCrc32 ((UINT8 *)Hdr, Hdr->HeaderSize, &Crc);\r
Hdr->CRC32 = Crc;\r
}\r
\r
IN OUT VOID **ConvertAddress\r
)\r
{\r
- UINTN Address;\r
- UINT64 VirtEndOfRange;\r
- EFI_MEMORY_DESCRIPTOR *VirtEntry;\r
- UINTN Index;\r
+ UINTN Address;\r
+ UINT64 VirtEndOfRange;\r
+ EFI_MEMORY_DESCRIPTOR *VirtEntry;\r
+ UINTN Index;\r
\r
//\r
// Make sure ConvertAddress is a valid pointer\r
if (ConvertAddress == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// Get the address to convert\r
//\r
- Address = (UINTN) *ConvertAddress;\r
+ Address = (UINTN)*ConvertAddress;\r
\r
//\r
// If this is a null pointer, return if it's allowed\r
// platforms. If you get this ASSERT remove the UINTN and do a 64-bit\r
// multiply.\r
//\r
- ASSERT (((UINTN) VirtEntry->NumberOfPages < 0xffffffff) || (sizeof (UINTN) > 4));\r
+ ASSERT (((UINTN)VirtEntry->NumberOfPages < 0xffffffff) || (sizeof (UINTN) > 4));\r
\r
if ((VirtEntry->Attribute & EFI_MEMORY_RUNTIME) == EFI_MEMORY_RUNTIME) {\r
if (Address >= VirtEntry->PhysicalStart) {\r
- VirtEndOfRange = VirtEntry->PhysicalStart + (((UINTN) VirtEntry->NumberOfPages) * EFI_PAGE_SIZE);\r
+ VirtEndOfRange = VirtEntry->PhysicalStart + (((UINTN)VirtEntry->NumberOfPages) * EFI_PAGE_SIZE);\r
if (Address < VirtEndOfRange) {\r
//\r
// Compute new address\r
//\r
- *ConvertAddress = (VOID *) (Address - (UINTN) VirtEntry->PhysicalStart + (UINTN) VirtEntry->VirtualStart);\r
+ *ConvertAddress = (VOID *)(Address - (UINTN)VirtEntry->PhysicalStart + (UINTN)VirtEntry->VirtualStart);\r
return EFI_SUCCESS;\r
}\r
}\r
**/\r
EFI_STATUS\r
RuntimeDriverConvertInternalPointer (\r
- IN OUT VOID **ConvertAddress\r
+ IN OUT VOID **ConvertAddress\r
)\r
{\r
return RuntimeDriverConvertPointer (0x0, ConvertAddress);\r
IN EFI_MEMORY_DESCRIPTOR *VirtualMap\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_RUNTIME_EVENT_ENTRY *RuntimeEvent;\r
- EFI_RUNTIME_IMAGE_ENTRY *RuntimeImage;\r
- LIST_ENTRY *Link;\r
- EFI_PHYSICAL_ADDRESS VirtImageBase;\r
+ EFI_STATUS Status;\r
+ EFI_RUNTIME_EVENT_ENTRY *RuntimeEvent;\r
+ EFI_RUNTIME_IMAGE_ENTRY *RuntimeImage;\r
+ LIST_ENTRY *Link;\r
+ EFI_PHYSICAL_ADDRESS VirtImageBase;\r
\r
//\r
// Can only switch to virtual addresses once the memory map is locked down,\r
if (!mRuntime.AtRuntime || mRuntime.VirtualMode) {\r
return EFI_UNSUPPORTED;\r
}\r
+\r
//\r
// Only understand the original descriptor format\r
//\r
- if (DescriptorVersion != EFI_MEMORY_DESCRIPTOR_VERSION || DescriptorSize < sizeof (EFI_MEMORY_DESCRIPTOR)) {\r
+ if ((DescriptorVersion != EFI_MEMORY_DESCRIPTOR_VERSION) || (DescriptorSize < sizeof (EFI_MEMORY_DESCRIPTOR))) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// We are now committed to go to virtual mode, so lets get to it!\r
//\r
//\r
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_RS_PC_SET_VIRTUAL_ADDRESS_MAP));\r
\r
+ //\r
+ // Report Status Code here since EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event will be signalled.\r
+ //\r
+ REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_VIRTUAL_ADDRESS_CHANGE_EVENT));\r
+\r
//\r
// Signal all the EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE events.\r
// All runtime events are stored in a list in Runtime AP.\r
for (Link = mRuntime.EventHead.ForwardLink; Link != &mRuntime.EventHead; Link = Link->ForwardLink) {\r
RuntimeEvent = BASE_CR (Link, EFI_RUNTIME_EVENT_ENTRY, Link);\r
if ((RuntimeEvent->Type & EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE) == EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE) {\r
+ //\r
+ // Work around the bug in the Platform Init specification (v1.7),\r
+ // reported as Mantis#2017: "EFI_RUNTIME_EVENT_ENTRY.Event" should have\r
+ // type EFI_EVENT, not (EFI_EVENT*). The PI spec documents the field\r
+ // correctly as "The EFI_EVENT returned by CreateEvent()", but the type\r
+ // of the field doesn't match the natural language description. Therefore\r
+ // we need an explicit cast here.\r
+ //\r
RuntimeEvent->NotifyFunction (\r
- RuntimeEvent->Event,\r
+ (EFI_EVENT)RuntimeEvent->Event,\r
RuntimeEvent->NotifyContext\r
);\r
}\r
// We don't want to relocate our selves, as we only run in physical mode.\r
//\r
if (mMyImageBase != RuntimeImage->ImageBase) {\r
-\r
- VirtImageBase = (EFI_PHYSICAL_ADDRESS) (UINTN) RuntimeImage->ImageBase;\r
- Status = RuntimeDriverConvertPointer (0, (VOID **) &VirtImageBase);\r
+ VirtImageBase = (EFI_PHYSICAL_ADDRESS)(UINTN)RuntimeImage->ImageBase;\r
+ Status = RuntimeDriverConvertPointer (0, (VOID **)&VirtImageBase);\r
ASSERT_EFI_ERROR (Status);\r
\r
PeCoffLoaderRelocateImageForRuntime (\r
- (EFI_PHYSICAL_ADDRESS) (UINTN) RuntimeImage->ImageBase,\r
+ (EFI_PHYSICAL_ADDRESS)(UINTN)RuntimeImage->ImageBase,\r
VirtImageBase,\r
- (UINTN) RuntimeImage->ImageSize,\r
+ (UINTN)RuntimeImage->ImageSize,\r
RuntimeImage->RelocationData\r
);\r
\r
- InvalidateInstructionCacheRange (RuntimeImage->ImageBase, (UINTN) RuntimeImage->ImageSize);\r
+ InvalidateInstructionCacheRange (RuntimeImage->ImageBase, (UINTN)RuntimeImage->ImageSize);\r
}\r
}\r
\r
// Convert all the Runtime Services except ConvertPointer() and SetVirtualAddressMap()\r
// and recompute the CRC-32\r
//\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->GetTime);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->SetTime);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->GetWakeupTime);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->SetWakeupTime);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->ResetSystem);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->GetNextHighMonotonicCount);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->GetVariable);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->SetVariable);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->GetNextVariableName);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->QueryVariableInfo);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->UpdateCapsule);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gRT->QueryCapsuleCapabilities);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->GetTime);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->SetTime);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->GetWakeupTime);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->SetWakeupTime);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->ResetSystem);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->GetNextHighMonotonicCount);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->GetVariable);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->SetVariable);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->GetNextVariableName);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->QueryVariableInfo);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->UpdateCapsule);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gRT->QueryCapsuleCapabilities);\r
RuntimeDriverCalculateEfiHdrCrc (&gRT->Hdr);\r
\r
//\r
//\r
// Convert the runtime fields of the EFI System Table and recompute the CRC-32\r
//\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gST->FirmwareVendor);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gST->ConfigurationTable);\r
- RuntimeDriverConvertInternalPointer ((VOID **) &gST->RuntimeServices);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gST->FirmwareVendor);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gST->ConfigurationTable);\r
+ RuntimeDriverConvertInternalPointer ((VOID **)&gST->RuntimeServices);\r
RuntimeDriverCalculateEfiHdrCrc (&gST->Hdr);\r
\r
//\r
EFI_STATUS\r
EFIAPI\r
RuntimeDriverInitialize (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_LOADED_IMAGE_PROTOCOL *MyLoadedImage;\r
+ EFI_STATUS Status;\r
+ EFI_LOADED_IMAGE_PROTOCOL *MyLoadedImage;\r
\r
//\r
// This image needs to be excluded from relocation for virtual mode, so cache\r
Status = gBS->HandleProtocol (\r
ImageHandle,\r
&gEfiLoadedImageProtocolGuid,\r
- (VOID**)&MyLoadedImage\r
+ (VOID **)&MyLoadedImage\r
);\r
ASSERT_EFI_ERROR (Status);\r
mMyImageBase = MyLoadedImage->ImageBase;\r
\r
- //\r
- // Initialize the table used to compute 32-bit CRCs\r
- //\r
- RuntimeDriverInitializeCrc32Table ();\r
-\r
//\r
// Fill in the entries of the EFI Boot Services and EFI Runtime Services Tables\r
//\r