]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Move RuntimeDxe to /Core of MdeModulePkg.
authoryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 19 Jul 2007 08:36:30 +0000 (08:36 +0000)
committeryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 19 Jul 2007 08:36:30 +0000 (08:36 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3363 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/RuntimeDxe/Crc32.c [new file with mode: 0644]
MdeModulePkg/Core/RuntimeDxe/Runtime.c [new file with mode: 0644]
MdeModulePkg/Core/RuntimeDxe/Runtime.h [new file with mode: 0644]
MdeModulePkg/Core/RuntimeDxe/Runtime.msa [new file with mode: 0644]
MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf [new file with mode: 0644]
MdeModulePkg/MdeModulePkg.dsc
Nt32Pkg/Nt32Pkg.dsc
Nt32Pkg/Nt32Pkg.fdf

diff --git a/MdeModulePkg/Core/RuntimeDxe/Crc32.c b/MdeModulePkg/Core/RuntimeDxe/Crc32.c
new file mode 100644 (file)
index 0000000..910738e
--- /dev/null
@@ -0,0 +1,150 @@
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation                                                         \r
+All rights reserved. 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
+\r
+Module Name:\r
+\r
+  Crc32.c\r
+\r
+Abstract:\r
+\r
+  CalculateCrc32 Boot Services as defined in DXE CIS.\r
+\r
+  This Boot Services is in the Runtime Driver because this service is\r
+  also required by SetVirtualAddressMap() when the EFI System Table and\r
+  EFI Runtime Services Table are converted from physical address to \r
+  virtual addresses.  This requires that the 32-bit CRC be recomputed.\r
+\r
+Revision History:\r
+\r
+--*/\r
+\r
+//\r
+// The package level header files this module uses\r
+//\r
+#include <PiDxe.h>\r
+\r
+UINT32  mCrcTable[256];\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDriverCalculateCrc32 (\r
+  IN  VOID    *Data,\r
+  IN  UINTN   DataSize,\r
+  OUT UINT32  *CrcOut\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Calculate CRC32 for target data\r
+\r
+Arguments:\r
+\r
+  Data     - The target data.\r
+  DataSize - The target data size.\r
+  CrcOut   - The CRC32 for target data.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - The CRC32 for target data is calculated successfully.\r
+  EFI_INVALID_PARAMETER - Some parameter is not valid, so the CRC32 is not \r
+                          calculated.\r
+\r
+--*/\r
+{\r
+  UINT32  Crc;\r
+  UINTN   Index;\r
+  UINT8   *Ptr;\r
+\r
+  if (Data == NULL || DataSize == 0 || CrcOut == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Crc = 0xffffffff;\r
+  for (Index = 0, Ptr = Data; Index < DataSize; Index++, Ptr++) {\r
+    Crc = (Crc >> 8) ^ mCrcTable[(UINT8) Crc ^ *Ptr];\r
+  }\r
+\r
+  *CrcOut = Crc ^ 0xffffffff;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+UINT32\r
+ReverseBits (\r
+  UINT32  Value\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Reverse bits for 32bit data.\r
+\r
+Arguments:\r
+\r
+  Value - the data to be reversed.\r
+\r
+Returns:\r
+\r
+  UINT32 data reversed.\r
+\r
+--*/\r
+{\r
+  UINTN   Index;\r
+  UINT32  NewValue;\r
+\r
+  NewValue = 0;\r
+  for (Index = 0; Index < 32; Index++) {\r
+    if (Value & (1 << Index)) {\r
+      NewValue = NewValue | (1 << (31 - Index));\r
+    }\r
+  }\r
+\r
+  return NewValue;\r
+}\r
+\r
+VOID\r
+RuntimeDriverInitializeCrc32Table (\r
+  VOID\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Initialize CRC32 table.\r
+\r
+Arguments:\r
+\r
+  None.\r
+\r
+Returns:\r
+\r
+  None.\r
+\r
+--*/\r
+{\r
+  UINTN   TableEntry;\r
+  UINTN   Index;\r
+  UINT32  Value;\r
+\r
+  for (TableEntry = 0; TableEntry < 256; TableEntry++) {\r
+    Value = ReverseBits ((UINT32) TableEntry);\r
+    for (Index = 0; Index < 8; Index++) {\r
+      if (Value & 0x80000000) {\r
+        Value = (Value << 1) ^ 0x04c11db7;\r
+      } else {\r
+        Value = Value << 1;\r
+      }\r
+    }\r
+\r
+    mCrcTable[TableEntry] = ReverseBits (Value);\r
+  }\r
+}\r
diff --git a/MdeModulePkg/Core/RuntimeDxe/Runtime.c b/MdeModulePkg/Core/RuntimeDxe/Runtime.c
new file mode 100644 (file)
index 0000000..74d93f5
--- /dev/null
@@ -0,0 +1,456 @@
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. 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
+\r
+Module Name:\r
+\r
+  Runtime.c\r
+\r
+Abstract:\r
+\r
+  Runtime Architectural Protocol as defined in the DXE CIS\r
+\r
+  This code is used to produce the EFI runtime virtual switch over\r
+\r
+  THIS IS VERY DANGEROUS CODE BE VERY CAREFUL IF YOU CHANGE IT\r
+\r
+  The transition for calling EFI Runtime functions in physical mode to calling\r
+  them in virtual mode is very very complex. Every pointer in needs to be\r
+  converted from physical mode to virtual mode. Be very careful walking linked\r
+  lists! Then to make it really hard the code it's self needs be relocated into\r
+  the new virtual address space.\r
+\r
+  So here is the concept. The code in this module will never ever be called in\r
+  virtual mode. This is the code that collects the information needed to convert\r
+  to virtual mode (DXE core registers runtime stuff with this code). Since this\r
+  code is used to fixup all runtime images, it CAN NOT fix it's self up. So some\r
+  code has to stay behind and that is us.\r
+\r
+  Also you need to be careful about when you allocate memory, as once we are in\r
+  runtime (including our EVT_SIGNAL_EXIT_BOOT_SERVICES event) you can no longer\r
+  allocate memory.\r
+\r
+  Any runtime driver that gets loaded before us will not be callable in virtual\r
+  mode. This is due to the fact that the DXE core can not register the info\r
+  needed with us. This is good, since it keeps the code in this file from\r
+  getting registered.\r
+\r
+\r
+Revision History:\r
+\r
+  - Move the CalculateCrc32 function from Runtime Arch Protocol to Boot Service.\r
+  Runtime Arch Protocol definition no longer contains CalculateCrc32. Boot Service\r
+  Table now contains an item named CalculateCrc32.\r
+\r
+--*/\r
+\r
+#include "Runtime.h"\r
+\r
+//\r
+// Global Variables\r
+//\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
+\r
+//\r
+// The Runtime Architectural Protocol instance produced by this driver\r
+//\r
+EFI_RUNTIME_ARCH_PROTOCOL     mRuntime = {\r
+  INITIALIZE_LIST_HEAD_VARIABLE (mRuntime.ImageHead),\r
+  INITIALIZE_LIST_HEAD_VARIABLE (mRuntime.EventHead),\r
+\r
+  //\r
+  // Make sure Size != sizeof (EFI_MEMORY_DESCRIPTOR). This will\r
+  // prevent people from having pointer math bugs in their code.\r
+  // now you have to use *DescriptorSize to make things work.\r
+  //\r
+  sizeof (EFI_MEMORY_DESCRIPTOR) + sizeof (UINT64) - (sizeof (EFI_MEMORY_DESCRIPTOR) % sizeof (UINT64)),\r
+  EFI_MEMORY_DESCRIPTOR_VERSION,\r
+  0,\r
+  NULL,\r
+  NULL,\r
+  FALSE,\r
+  FALSE\r
+};\r
+\r
+//\r
+// Worker Functions\r
+//\r
+STATIC\r
+VOID\r
+RuntimeDriverCalculateEfiHdrCrc (\r
+  IN OUT EFI_TABLE_HEADER  *Hdr\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Calcualte the 32-bit CRC in a EFI table using the Runtime Drivers\r
+  internal function.  The EFI Boot Services Table can not be used because\r
+  the EFI Boot Services Table was destroyed at ExitBootServices()\r
+\r
+Arguments:\r
+\r
+  Hdr  - Pointer to an EFI standard header\r
+\r
+Returns:\r
+\r
+  None\r
+\r
+--*/\r
+{\r
+  UINT32  Crc;\r
+\r
+  Hdr->CRC32  = 0;\r
+\r
+  Crc         = 0;\r
+  RuntimeDriverCalculateCrc32 ((UINT8 *) Hdr, Hdr->HeaderSize, &Crc);\r
+  Hdr->CRC32 = Crc;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDriverConvertPointer (\r
+  IN     UINTN  DebugDisposition,\r
+  IN OUT VOID   **ConvertAddress\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Determines the new virtual address that is to be used on subsequent memory accesses.\r
+\r
+Arguments:\r
+\r
+  DebugDisposition    - Supplies type information for the pointer being converted.\r
+  ConvertAddress      - A pointer to a pointer that is to be fixed to be the value needed\r
+                        for the new virtual address mappings being applied.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS             - The pointer pointed to by Address was modified.\r
+  EFI_NOT_FOUND           - The pointer pointed to by Address was not found to be part\r
+                            of the current memory map. This is normally fatal.\r
+  EFI_INVALID_PARAMETER   - One of the parameters has an invalid value.\r
+\r
+--*/\r
+{\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
+  //\r
+  if (ConvertAddress == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
+  // Get the address to convert\r
+  //\r
+  Address = (UINTN) *ConvertAddress;\r
+\r
+  //\r
+  // If this is a null pointer, return if it's allowed\r
+  //\r
+  if (Address == 0) {\r
+    if (DebugDisposition & EFI_OPTIONAL_POINTER) {\r
+      return EFI_SUCCESS;\r
+    }\r
+\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  VirtEntry             = mVirtualMap;\r
+  for (Index = 0; Index < mVirtualMapMaxIndex; Index++) {\r
+    //\r
+    // To prevent the inclusion of 64-bit math functions a UINTN was placed in\r
+    //  front of VirtEntry->NumberOfPages to cast it to a 32-bit thing on IA-32\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
+\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
+        if (Address < VirtEndOfRange) {\r
+          //\r
+          // Compute new address\r
+          //\r
+          *ConvertAddress = (VOID *) (Address - (UINTN) VirtEntry->PhysicalStart + (UINTN) VirtEntry->VirtualStart);\r
+          return EFI_SUCCESS;\r
+        }\r
+      }\r
+    }\r
+\r
+    VirtEntry = NextMemoryDescriptor (VirtEntry, mVirtualMapDescriptorSize);\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+RuntimeDriverConvertInternalPointer (\r
+  IN OUT VOID   **ConvertAddress\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Determines the new virtual address that is to be used on subsequent memory accesses\r
+  for internal pointers.\r
+\r
+Arguments:\r
+\r
+  ConvertAddress  - A pointer to a pointer that is to be fixed to be the value needed\r
+                    for the new virtual address mappings being applied.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS             - The pointer pointed to by Address was modified.\r
+  EFI_NOT_FOUND           - The pointer pointed to by Address was not found to be part\r
+                            of the current memory map. This is normally fatal.\r
+  EFI_INVALID_PARAMETER   - One of the parameters has an invalid value.\r
+\r
+--*/\r
+{\r
+  return RuntimeDriverConvertPointer (0x0, ConvertAddress);\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDriverSetVirtualAddressMap (\r
+  IN UINTN                  MemoryMapSize,\r
+  IN UINTN                  DescriptorSize,\r
+  IN UINT32                 DescriptorVersion,\r
+  IN EFI_MEMORY_DESCRIPTOR  *VirtualMap\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Changes the runtime addressing mode of EFI firmware from physical to virtual.\r
+\r
+Arguments:\r
+\r
+  MemoryMapSize     - The size in bytes of VirtualMap.\r
+  DescriptorSize    - The size in bytes of an entry in the VirtualMap.\r
+  DescriptorVersion - The version of the structure entries in VirtualMap.\r
+  VirtualMap        - An array of memory descriptors which contain new virtual\r
+                      address mapping information for all runtime ranges.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - The virtual address map has been applied.\r
+  EFI_UNSUPPORTED       - EFI firmware is not at runtime, or the EFI firmware is already in\r
+                          virtual address mapped mode.\r
+  EFI_INVALID_PARAMETER - DescriptorSize or DescriptorVersion is invalid.\r
+  EFI_NO_MAPPING        - A virtual address was not supplied for a range in the memory\r
+                          map that requires a mapping.\r
+  EFI_NOT_FOUND         - A virtual address was supplied for an address that is not found\r
+                          in the memory map.\r
+\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
+\r
+  //\r
+  // Can only switch to virtual addresses once the memory map is locked down,\r
+  // and can only set it once\r
+  //\r
+  if (!mRuntime.AtRuntime || mRuntime.VirtualMode) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  //\r
+  // Only understand the original descriptor format\r
+  //\r
+  if (DescriptorVersion != EFI_MEMORY_DESCRIPTOR_VERSION || DescriptorSize < sizeof (EFI_MEMORY_DESCRIPTOR)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
+  // We are now committed to go to virtual mode, so lets get to it!\r
+  //\r
+  mRuntime.VirtualMode = TRUE;\r
+\r
+  //\r
+  // ConvertPointer() needs this mVirtualMap to do the conversion. So set up\r
+  // globals we need to parse the virtual address map.\r
+  //\r
+  mVirtualMapDescriptorSize = DescriptorSize;\r
+  mVirtualMapMaxIndex       = MemoryMapSize / DescriptorSize;\r
+  mVirtualMap               = VirtualMap;\r
+\r
+  //\r
+  // Currently the bug in StatusCode/RuntimeLib has been fixed, it will\r
+  // check whether in Runtime or not (this is judged by looking at\r
+  // mEfiAtRuntime global So this ReportStatusCode will work\r
+  //\r
+  REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdStatusCodeValueSetVirtualAddressMap));\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
+  //\r
+  for (Link = mRuntime.EventHead.ForwardLink; Link != &mRuntime.EventHead; Link = Link->ForwardLink) {\r
+    RuntimeEvent = _CR (Link, EFI_RUNTIME_EVENT_ENTRY, Link);\r
+    if ((RuntimeEvent->Type & EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE) == EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE) {\r
+      RuntimeEvent->NotifyFunction (\r
+                      RuntimeEvent->Event,\r
+                      RuntimeEvent->NotifyContext\r
+                      );\r
+    }\r
+  }\r
+\r
+  //\r
+  // Relocate runtime images. All runtime images are stored in a list in Runtime AP.\r
+  //\r
+  for (Link = mRuntime.ImageHead.ForwardLink; Link != &mRuntime.ImageHead; Link = Link->ForwardLink) {\r
+    RuntimeImage = _CR (Link, EFI_RUNTIME_IMAGE_ENTRY, Link);\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
+      ASSERT_EFI_ERROR (Status);\r
+\r
+      PeCoffLoaderRelocateImageForRuntime (\r
+        (EFI_PHYSICAL_ADDRESS) (UINTN) RuntimeImage->ImageBase,\r
+        VirtImageBase,\r
+        (UINTN) RuntimeImage->ImageSize,\r
+        RuntimeImage->RelocationData\r
+        );\r
+\r
+      InvalidateInstructionCacheRange (RuntimeImage->ImageBase, (UINTN)RuntimeImage->ImageSize);\r
+    }\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
+  RuntimeDriverCalculateEfiHdrCrc (&gRT->Hdr);\r
+\r
+  //\r
+  // BugBug: PI requires System Configuration Tables Conversion.\r
+  // Currently, we do not implement it.\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
+  RuntimeDriverCalculateEfiHdrCrc (&gST->Hdr);\r
+\r
+  //\r
+  // At this point, gRT and gST are physical pointers, but the contents of these tables\r
+  // have been converted to runtime.\r
+  //\r
+  //\r
+  // mVirtualMap is only valid during SetVirtualAddressMap() call\r
+  //\r
+  mVirtualMap = NULL;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDriverInitialize (\r
+  IN EFI_HANDLE                            ImageHandle,\r
+  IN EFI_SYSTEM_TABLE                      *SystemTable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Install Runtime AP. This code includes the EfiDriverLib, but it functions at\r
+  RT in physical mode. The only Lib services are gBS, gRT, and the DEBUG and\r
+  ASSERT macros (they do ReportStatusCode).\r
+\r
+Arguments:\r
+  (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
+\r
+Returns:\r
+\r
+  EFI_SUCEESS - Runtime Driver Architectural Protocol Installed\r
+\r
+  Other       - Return value from gBS->InstallMultipleProtocolInterfaces\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                Status;\r
+  EFI_LOADED_IMAGE_PROTOCOL *MyLoadedImage;\r
+\r
+  //\r
+  // This image needs to be exclued from relocation for virtual mode, so cache\r
+  // a copy of the Loaded Image protocol to test later.\r
+  //\r
+  Status = gBS->HandleProtocol (\r
+                  ImageHandle,\r
+                  &gEfiLoadedImageProtocolGuid,\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
+  gBS->CalculateCrc32       = RuntimeDriverCalculateCrc32;\r
+  gRT->SetVirtualAddressMap = RuntimeDriverSetVirtualAddressMap;\r
+  gRT->ConvertPointer       = RuntimeDriverConvertPointer;\r
+\r
+  //\r
+  // Install the Runtime Architectural Protocol onto a new handle\r
+  //\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &mRuntimeHandle,\r
+                  &gEfiRuntimeArchProtocolGuid,\r
+                  &mRuntime,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/MdeModulePkg/Core/RuntimeDxe/Runtime.h b/MdeModulePkg/Core/RuntimeDxe/Runtime.h
new file mode 100644 (file)
index 0000000..7154b53
--- /dev/null
@@ -0,0 +1,184 @@
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation                                                         \r
+All rights reserved. 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
+\r
+Module Name:\r
+\r
+  Runtime.h\r
+\r
+Abstract:\r
+\r
+  Runtime Architectural Protocol as defined in the DXE CIS\r
+\r
+  This code is used to produce the EFI runtime architectural protocol.\r
+\r
+--*/\r
+\r
+#ifndef _RUNTIME_H_\r
+#define _RUNTIME_H_\r
+\r
+#include <PiDxe.h>\r
+#include <Protocol/LoadedImage.h>\r
+#include <Protocol/Runtime.h>\r
+#include <Protocol/UgaIo.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/ReportStatusCodeLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiRuntimeServicesTableLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/CacheMaintenanceLib.h>\r
+#include <Library/PeCoffLib.h>\r
+#include <Library/PcdLib.h>\r
+\r
+\r
+//\r
+// Function Prototypes\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDriverCalculateCrc32 (\r
+  IN  VOID    *Data,\r
+  IN  UINTN   DataSize,\r
+  OUT UINT32  *CrcOut\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Calculate CRC32 for target data\r
+\r
+Arguments:\r
+\r
+  Data     - The target data.\r
+  DataSize - The target data size.\r
+  CrcOut   - The CRC32 for target data.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - The CRC32 for target data is calculated successfully.\r
+  EFI_INVALID_PARAMETER - Some parameter is not valid, so the CRC32 is not \r
+                          calculated.\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDriverConvertPointer (\r
+  IN     UINTN  DebugDisposition,\r
+  IN OUT VOID   **ConvertAddress\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Determines the new virtual address that is to be used on subsequent memory accesses.\r
+\r
+Arguments:\r
+  \r
+  DebugDisposition    - Supplies type information for the pointer being converted.\r
+  ConvertAddress      - A pointer to a pointer that is to be fixed to be the value needed\r
+                        for the new virtual address mappings being applied.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS             - The pointer pointed to by Address was modified.\r
+  EFI_NOT_FOUND           - The pointer pointed to by Address was not found to be part\r
+                            of the current memory map. This is normally fatal.\r
+  EFI_INVALID_PARAMETER   - One of the parameters has an invalid value.\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDriverSetVirtualAddressMap (\r
+  IN UINTN                  MemoryMapSize,\r
+  IN UINTN                  DescriptorSize,\r
+  IN UINT32                 DescriptorVersion,\r
+  IN EFI_MEMORY_DESCRIPTOR  *VirtualMap\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Changes the runtime addressing mode of EFI firmware from physical to virtual.\r
+\r
+Arguments:\r
+  \r
+  MemoryMapSize     - The size in bytes of VirtualMap.\r
+  DescriptorSize    - The size in bytes of an entry in the VirtualMap.\r
+  DescriptorVersion - The version of the structure entries in VirtualMap.\r
+  VirtualMap        - An array of memory descriptors which contain new virtual\r
+                      address mapping information for all runtime ranges.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - The virtual address map has been applied.\r
+  EFI_UNSUPPORTED       - EFI firmware is not at runtime, or the EFI firmware is already in\r
+                          virtual address mapped mode.\r
+  EFI_INVALID_PARAMETER - DescriptorSize or DescriptorVersion is invalid.\r
+  EFI_NO_MAPPING        - A virtual address was not supplied for a range in the memory\r
+                          map that requires a mapping.\r
+  EFI_NOT_FOUND         - A virtual address was supplied for an address that is not found\r
+                          in the memory map.\r
+\r
+--*/\r
+;\r
+\r
+VOID\r
+RuntimeDriverInitializeCrc32Table (\r
+  VOID\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Initialize CRC32 table.\r
+\r
+Arguments:\r
+\r
+  None.\r
+\r
+Returns:\r
+\r
+  None.\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDriverInitialize (\r
+  IN EFI_HANDLE                            ImageHandle,\r
+  IN EFI_SYSTEM_TABLE                      *SystemTable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Install Runtime AP. This code includes the EfiRuntimeLib, but it only \r
+  functions at RT in physical mode. \r
+\r
+Arguments:\r
+  \r
+  ImageHandle   - Image handle of this driver.\r
+  SystemTable   - Pointer to the EFI System Table.\r
+\r
+Returns:\r
+\r
+  EFI_SUCEESS - Runtime Driver Architectural Protocol installed.\r
+\r
+--*/\r
+;\r
+\r
+#endif\r
diff --git a/MdeModulePkg/Core/RuntimeDxe/Runtime.msa b/MdeModulePkg/Core/RuntimeDxe/Runtime.msa
new file mode 100644 (file)
index 0000000..207b44c
--- /dev/null
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
+  <MsaHeader>\r
+    <ModuleName>Runtime</ModuleName>\r
+    <ModuleType>DXE_RUNTIME_DRIVER</ModuleType>\r
+    <GuidValue>B601F8C4-43B7-4784-95B1-F4226CB40CEE</GuidValue>\r
+    <Version>1.0</Version>\r
+    <Abstract>Component description file for Runtime module.</Abstract>\r
+    <Description>This module is used to produce the EFI runtime virtual switch over services.</Description>\r
+    <Copyright>Copyright (c) 2006 - 2007, Intel Corporation</Copyright>\r
+    <License>All rights reserved. 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
+      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.</License>\r
+    <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
+  </MsaHeader>\r
+  <ModuleDefinitions>\r
+    <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>\r
+    <BinaryModule>false</BinaryModule>\r
+    <OutputFileBasename>Runtime</OutputFileBasename>\r
+  </ModuleDefinitions>\r
+  <LibraryClassDefinitions>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>BaseLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>UefiDriverEntryPoint</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED" RecommendedInstanceGuid="bda39d3a-451b-4350-8266-81ab10fa0523">\r
+      <Keyword>DebugLib</Keyword>\r
+      <HelpText>Recommended libary Instance is PeiDxeDebugLibReportStatusCode instance in MdePkg.</HelpText>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>ReportStatusCodeLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>BaseMemoryLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>UefiRuntimeServicesTableLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>UefiBootServicesTableLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>CacheMaintenanceLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>PeCoffLib</Keyword>\r
+    </LibraryClass>\r
+  </LibraryClassDefinitions>\r
+  <SourceFiles>\r
+    <Filename>Runtime.dxs</Filename>\r
+    <Filename>Runtime.c</Filename>\r
+    <Filename>Runtime.h</Filename>\r
+    <Filename>Crc32.c</Filename>\r
+  </SourceFiles>\r
+  <PackageDependencies>\r
+    <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
+    <Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/>\r
+  </PackageDependencies>\r
+  <Protocols>\r
+    <Protocol Usage="ALWAYS_CONSUMED">\r
+      <ProtocolCName>gEfiLoadedImageProtocolGuid</ProtocolCName>\r
+    </Protocol>\r
+    <Protocol Usage="ALWAYS_PRODUCED">\r
+      <ProtocolCName>gEfiRuntimeArchProtocolGuid</ProtocolCName>\r
+    </Protocol>\r
+  </Protocols>\r
+  <SystemTables>\r
+    <SystemTableCNames Usage="SOMETIMES_CONSUMED">\r
+      <SystemTableCName>gEfiUgaIoProtocolGuid</SystemTableCName>\r
+    </SystemTableCNames>\r
+    <SystemTableCNames Usage="SOMETIMES_CONSUMED">\r
+      <SystemTableCName>gEfiCapsuleGuid</SystemTableCName>\r
+    </SystemTableCNames>\r
+  </SystemTables>\r
+  <Externs>\r
+    <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
+    <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
+    <Extern>\r
+      <ModuleEntryPoint>RuntimeDriverInitialize</ModuleEntryPoint>\r
+    </Extern>\r
+  </Externs>\r
+</ModuleSurfaceArea>
\ No newline at end of file
diff --git a/MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf b/MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
new file mode 100644 (file)
index 0000000..282daa9
--- /dev/null
@@ -0,0 +1,63 @@
+#/** @file\r
+# Component description file for Runtime module.\r
+#\r
+# This module is used to produce the EFI runtime virtual switch over services.\r
+# Copyright (c) 2006 - 2007, Intel Corporation\r
+#\r
+#  All rights reserved. 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
+#  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
+#\r
+#\r
+#**/\r
+\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = RuntimeDxe\r
+  FILE_GUID                      = B601F8C4-43B7-4784-95B1-F4226CB40CEE\r
+  MODULE_TYPE                    = DXE_RUNTIME_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  EDK_RELEASE_VERSION            = 0x00020000\r
+  EFI_SPECIFICATION_VERSION      = 0x00020000\r
+\r
+  ENTRY_POINT                    = RuntimeDriverInitialize\r
+\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
+#\r
+\r
+[Sources.common]\r
+  Crc32.c\r
+  Runtime.h\r
+  Runtime.c\r
\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+\r
+[LibraryClasses]\r
+  PeCoffLib\r
+  CacheMaintenanceLib\r
+  UefiBootServicesTableLib\r
+  UefiRuntimeServicesTableLib\r
+  BaseMemoryLib\r
+  ReportStatusCodeLib\r
+  DebugLib\r
+  UefiDriverEntryPoint\r
+  BaseLib\r
+\r
+[Guids]\r
+\r
+[Protocols]\r
+  gEfiRuntimeArchProtocolGuid                   # PROTOCOL ALWAYS_PRODUCED\r
+  gEfiLoadedImageProtocolGuid                   # PROTOCOL ALWAYS_CONSUMED\r
+\r
+[PcdsFixedAtBuild.common]\r
+  PcdStatusCodeValueSetVirtualAddressMap|gEfiMdePkgTokenSpaceGuid\r
+  \r
+[depex]\r
+  TRUE  
\ No newline at end of file
index c505adfe099434e6f793b1037321b54fd34430e0..1415a365d9456b3aacd3fe2e65001dba50ab1880 100644 (file)
   $(WORKSPACE)/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf\r
   $(WORKSPACE)/MdeModulePkg/Universal/MemoryTest/BaseMemoryTestPei/BaseMemoryTestPei.inf\r
   $(WORKSPACE)/MdeModulePkg/Universal/FirmwareVolume/Crc32SectionExtractDxe/Crc32SectionExtractDxe.inf\r
   $(WORKSPACE)/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf\r
   $(WORKSPACE)/MdeModulePkg/Universal/MemoryTest/BaseMemoryTestPei/BaseMemoryTestPei.inf\r
   $(WORKSPACE)/MdeModulePkg/Universal/FirmwareVolume/Crc32SectionExtractDxe/Crc32SectionExtractDxe.inf\r
-  $(WORKSPACE)/MdeModulePkg/Universal/RuntimeDxe/Runtime.inf\r
+  $(WORKSPACE)/MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
 \r
   $(WORKSPACE)/MdeModulePkg/Universal/WatchDogTimerDxe/WatchDogTimer.inf\r
   $(WORKSPACE)/MdeModulePkg/Universal/VariablePei/VariablePei.inf\r
 \r
   $(WORKSPACE)/MdeModulePkg/Universal/WatchDogTimerDxe/WatchDogTimer.inf\r
   $(WORKSPACE)/MdeModulePkg/Universal/VariablePei/VariablePei.inf\r
index 4421862d0343e2632c5c9d7dc3a1a0463af41366..19774bfa854756c77c4c3c2a2673e6a990954bdc 100644 (file)
   $(WORKSPACE)/Nt32Pkg/MetronomeDxe/MetronomeDxe.inf\r
   $(WORKSPACE)/Nt32Pkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf  \r
   $(WORKSPACE)/Nt32Pkg/ResetRuntimeDxe/ResetRuntimeDxe.inf\r
   $(WORKSPACE)/Nt32Pkg/MetronomeDxe/MetronomeDxe.inf\r
   $(WORKSPACE)/Nt32Pkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf  \r
   $(WORKSPACE)/Nt32Pkg/ResetRuntimeDxe/ResetRuntimeDxe.inf\r
-  $(WORKSPACE)/MdeModulePkg/Universal/RuntimeDxe/Runtime.inf\r
+  $(WORKSPACE)/MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
   $(WORKSPACE)/Nt32Pkg/FvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf\r
   $(WORKSPACE)/MdeModulePkg/Universal/SecurityStubDxe/SecurityStub.inf\r
   $(WORKSPACE)/IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r
   $(WORKSPACE)/Nt32Pkg/FvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf\r
   $(WORKSPACE)/MdeModulePkg/Universal/SecurityStubDxe/SecurityStub.inf\r
   $(WORKSPACE)/IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r
index 0e195db644e6738567e08dfd21c1145e63963ce9..b2ff56895f352a33d627f7d425b2b50f745eef11 100644 (file)
@@ -132,7 +132,7 @@ INF  $(WORKSPACE)/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 INF  $(WORKSPACE)/Nt32Pkg/MetronomeDxe/MetronomeDxe.inf\r
 INF  $(WORKSPACE)/Nt32Pkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf\r
 INF  $(WORKSPACE)/Nt32Pkg/ResetRuntimeDxe/ResetRuntimeDxe.inf\r
 INF  $(WORKSPACE)/Nt32Pkg/MetronomeDxe/MetronomeDxe.inf\r
 INF  $(WORKSPACE)/Nt32Pkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf\r
 INF  $(WORKSPACE)/Nt32Pkg/ResetRuntimeDxe/ResetRuntimeDxe.inf\r
-INF  $(WORKSPACE)/MdeModulePkg/Universal/RuntimeDxe/Runtime.inf\r
+INF  $(WORKSPACE)/MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
 INF  $(WORKSPACE)/Nt32Pkg/FvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf\r
 INF  $(WORKSPACE)/MdeModulePkg/Universal/SecurityStubDxe/SecurityStub.inf\r
 INF  $(WORKSPACE)/IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r
 INF  $(WORKSPACE)/Nt32Pkg/FvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf\r
 INF  $(WORKSPACE)/MdeModulePkg/Universal/SecurityStubDxe/SecurityStub.inf\r
 INF  $(WORKSPACE)/IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r