--- /dev/null
+/*++\r
+\r
+Copyright (c) 2006 - 2007, 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
+ BaseMemoryTest.c\r
+ \r
+Abstract:\r
+ \r
+ The PEI memory test support\r
+\r
+--*/\r
+\r
+//\r
+// The package level header files this module uses\r
+//\r
+#include <PiPei.h>\r
+#include <FrameworkPei.h>\r
+//\r
+// The protocols, PPI and GUID defintions for this module\r
+//\r
+#include <Ppi/BaseMemoryTest.h>\r
+//\r
+// The Library classes this module consumes\r
+//\r
+#include <Library/DebugLib.h>\r
+#include <Library/PeimEntryPoint.h>\r
+#include <Library/ReportStatusCodeLib.h>\r
+\r
+#include <BaseMemoryTest.h>\r
+\r
+static PEI_BASE_MEMORY_TEST_PPI mPeiBaseMemoryTestPpi = { BaseMemoryTest };\r
+\r
+static EFI_PEI_PPI_DESCRIPTOR PpiListPeiBaseMemoryTest = {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+ &gPeiBaseMemoryTestPpiGuid,\r
+ &mPeiBaseMemoryTestPpi\r
+};\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+PeiBaseMemoryTestInit (\r
+ IN EFI_FFS_FILE_HEADER *FfsHeader,\r
+ IN EFI_PEI_SERVICES **PeiServices\r
+ )\r
+/*++\r
+Description:\r
+\r
+ Entry point function of BaseMemoryTestInit Peim.\r
+\r
+Arguments:\r
+\r
+ PeiServices - General purpose services available to every PEIM.\r
+ FfsHeader - Ffs header pointer\r
+\r
+Returns:\r
+\r
+ Status - Result of InstallPpi\r
+\r
+--*/ \r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = (**PeiServices).InstallPpi (PeiServices, &PpiListPeiBaseMemoryTest);\r
+\r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BaseMemoryTest (\r
+ IN EFI_PEI_SERVICES **PeiServices,\r
+ IN PEI_BASE_MEMORY_TEST_PPI *This,\r
+ IN EFI_PHYSICAL_ADDRESS BeginAddress,\r
+ IN UINT64 MemoryLength,\r
+ IN PEI_MEMORY_TEST_OP Operation,\r
+ OUT EFI_PHYSICAL_ADDRESS *ErrorAddress\r
+ )\r
+/*++\r
+Description:\r
+\r
+ Test base memory.\r
+\r
+Arguments:\r
+\r
+ PeiServices - General purpose services available to every PEIM.\r
+ This - Pei memory test PPI pointer.\r
+ BeginAddress - Beginning of the memory address to be checked.\r
+ MemoryLength - Bytes of memory range to be checked.\r
+ Operation - Type of memory check operation to be performed.\r
+ ErrorAddress - Return the address of the error memory address.\r
+ ErrorAddress - Address which has error when checked.\r
+\r
+Returns:\r
+\r
+ Status - Result of InstallPpi\r
+\r
+--*/ \r
+{\r
+ UINT32 TestPattern;\r
+ EFI_PHYSICAL_ADDRESS TempAddress;\r
+ UINT32 SpanSize;\r
+\r
+ REPORT_STATUS_CODE (\r
+ EFI_PROGRESS_CODE,\r
+ EFI_COMPUTING_UNIT_MEMORY + EFI_CU_MEMORY_PC_TEST\r
+ );\r
+\r
+ TestPattern = TEST_PATTERN;\r
+ SpanSize = 0;\r
+\r
+ //\r
+ // Make sure we don't try and test anything above the max physical address range\r
+ //\r
+ ASSERT (BeginAddress + MemoryLength < EFI_MAX_ADDRESS);\r
+\r
+ switch (Operation) {\r
+ case Extensive:\r
+ SpanSize = 0x4;\r
+ break;\r
+\r
+ case Sparse:\r
+ case Quick:\r
+ SpanSize = COVER_SPAN;\r
+ break;\r
+\r
+ case Ignore:\r
+ goto Done;\r
+ break;\r
+ }\r
+ //\r
+ // Write the test pattern into memory range\r
+ //\r
+ TempAddress = BeginAddress;\r
+ while (TempAddress < BeginAddress + MemoryLength) {\r
+ (*(UINT32 *) (UINTN) TempAddress) = TestPattern;\r
+ TempAddress += SpanSize;\r
+ }\r
+ //\r
+ // Read pattern from memory and compare it\r
+ //\r
+ TempAddress = BeginAddress;\r
+ while (TempAddress < BeginAddress + MemoryLength) {\r
+ if ((*(UINT32 *) (UINTN) TempAddress) != TestPattern) {\r
+ *ErrorAddress = TempAddress;\r
+ REPORT_STATUS_CODE (\r
+ EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED,\r
+ EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_UNCORRECTABLE\r
+ );\r
+\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+\r
+ TempAddress += SpanSize;\r
+ }\r
+\r
+Done:\r
+ return EFI_SUCCESS;\r
+}\r
--- /dev/null
+/*++\r
+\r
+Copyright (c) 2006 - 2007, 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
+ BaseMemoryTest.h\r
+ \r
+Abstract:\r
+\r
+ Tiano PEIM to provide a PEI memory test service.\r
+\r
+--*/\r
+\r
+#ifndef _PEI_BASE_MEMORY_TEST_H_\r
+#define _PEI_BASE_MEMORY_TEST_H_\r
+\r
+//\r
+// Some global define\r
+//\r
+#define COVER_SPAN 0x40000\r
+#define TEST_PATTERN 0x5A5A5A5A\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+PeiBaseMemoryTestInit (\r
+ IN EFI_FFS_FILE_HEADER *FfsHeader,\r
+ IN EFI_PEI_SERVICES **PeiServices\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ FfsHeader - TODO: add argument description\r
+ PeiServices - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BaseMemoryTest (\r
+ IN EFI_PEI_SERVICES **PeiServices,\r
+ IN PEI_BASE_MEMORY_TEST_PPI *This,\r
+ IN EFI_PHYSICAL_ADDRESS BeginAddress,\r
+ IN UINT64 MemoryLength,\r
+ IN PEI_MEMORY_TEST_OP Operation,\r
+ OUT EFI_PHYSICAL_ADDRESS *ErrorAddress\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ PeiServices - TODO: add argument description\r
+ This - TODO: add argument description\r
+ BeginAddress - TODO: add argument description\r
+ MemoryLength - TODO: add argument description\r
+ Operation - TODO: add argument description\r
+ ErrorAddress - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+#endif\r
--- /dev/null
+#/** @file\r
+# Component description file for PeiBaseMemoryTestInit module.\r
+#\r
+# This driver provides memory test ppi for memory test in Pei Phase.\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
+#\r
+# Defines Section - statements that will be processed to create a Makefile.\r
+#\r
+################################################################################\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = PeiBaseMemoryTestInit\r
+ FILE_GUID = 736EB068-8C01-47c5-964B-1C57BD5D4D64\r
+ MODULE_TYPE = PEIM\r
+ VERSION_STRING = 1.0\r
+ EDK_RELEASE_VERSION = 0x00020000\r
+ EFI_SPECIFICATION_VERSION = 0x00020000\r
+\r
+ ENTRY_POINT = PeiBaseMemoryTestInit\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
+#\r
+\r
+################################################################################\r
+#\r
+# Sources Section - list of files that are required for the build to succeed.\r
+#\r
+################################################################################\r
+\r
+[Sources.common]\r
+ BaseMemoryTest.c\r
+ BaseMemoryTest.h\r
+\r
+\r
+################################################################################\r
+#\r
+# Includes Section - list of Include locations that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+################################################################################\r
+#\r
+# Package Dependency Section - list of Package files that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+\r
+\r
+################################################################################\r
+#\r
+# Library Class Section - list of Library Classes that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+[LibraryClasses]\r
+ ReportStatusCodeLib\r
+ PeimEntryPoint\r
+ DebugLib\r
+\r
+\r
+################################################################################\r
+#\r
+# PPI C Name Section - list of PPI and PPI Notify C Names that this module\r
+# uses or produces.\r
+#\r
+################################################################################\r
+\r
+[Ppis]\r
+ gPeiBaseMemoryTestPpiGuid # PPI ALWAYS_PRODUCED\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
+ <MsaHeader>\r
+ <ModuleName>PeiBaseMemoryTestInit</ModuleName>\r
+ <ModuleType>PEIM</ModuleType>\r
+ <GuidValue>736EB068-8C01-47c5-964B-1C57BD5D4D64</GuidValue>\r
+ <Version>1.0</Version>\r
+ <Abstract>Component description file for PeiBaseMemoryTestInit module.</Abstract>\r
+ <Description>This driver provides memory test ppi for memory test in Pei Phase.</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>PeiBaseMemoryTestInit</OutputFileBasename>\r
+ </ModuleDefinitions>\r
+ <LibraryClassDefinitions>\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>PeimEntryPoint</Keyword>\r
+ </LibraryClass>\r
+ <LibraryClass Usage="ALWAYS_CONSUMED">\r
+ <Keyword>ReportStatusCodeLib</Keyword>\r
+ </LibraryClass>\r
+ </LibraryClassDefinitions>\r
+ <SourceFiles>\r
+ <Filename>BaseMemoryTest.h</Filename>\r
+ <Filename>BaseMemoryTest.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
+ <PPIs>\r
+ <Ppi Usage="ALWAYS_PRODUCED">\r
+ <PpiCName>gPeiBaseMemoryTestPpiGuid</PpiCName>\r
+ </Ppi>\r
+ </PPIs>\r
+ <Externs>\r
+ <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
+ <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
+ <Extern>\r
+ <ModuleEntryPoint>PeiBaseMemoryTestInit</ModuleEntryPoint>\r
+ </Extern>\r
+ </Externs>\r
+</ModuleSurfaceArea>
\ No newline at end of file
--- /dev/null
+/*++\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
--- /dev/null
+/*++\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
+//\r
+// The package level header files this module uses\r
+//\r
+#include <PiDxe.h>\r
+#include <FrameworkDxe.h>\r
+//\r
+// The protocols, PPI and GUID defintions for this module\r
+//\r
+#include <Protocol/LoadedImage.h>\r
+#include <Protocol/Runtime.h>\r
+#include <Protocol/UgaIo.h>\r
+\r
+//\r
+// The Library classes this module consumes\r
+//\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
+\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
+ VOID *PlabelConvertAddress;\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
+ PlabelConvertAddress = NULL;\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 (\r
+ EFI_PROGRESS_CODE,\r
+ (EFI_SOFTWARE_EFI_BOOT_SERVICE | EFI_SW_RS_PC_SET_VIRTUAL_ADDRESS_MAP)\r
+ );\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
--- /dev/null
+/*++\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
+//\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
--- /dev/null
+#/** @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
+#\r
+# Defines Section - statements that will be processed to create a Makefile.\r
+#\r
+################################################################################\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = Runtime\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
+# The following information is for reference only and not required by the build tools.\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
+#\r
+\r
+################################################################################\r
+#\r
+# Sources Section - list of files that are required for the build to succeed.\r
+#\r
+################################################################################\r
+\r
+[Sources.common]\r
+ Crc32.c\r
+ Runtime.h\r
+ Runtime.c\r
+ \r
+\r
+################################################################################\r
+#\r
+# Includes Section - list of Include locations that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+[Includes]\r
+\r
+################################################################################\r
+#\r
+# Package Dependency Section - list of Package files that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+\r
+\r
+################################################################################\r
+#\r
+# Library Class Section - list of Library Classes that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+[LibraryClasses]\r
+ PeCoffLib\r
+ CacheMaintenanceLib\r
+ UefiBootServicesTableLib\r
+ UefiRuntimeServicesTableLib\r
+ BaseMemoryLib\r
+ ReportStatusCodeLib\r
+ DebugLib\r
+ UefiDriverEntryPoint\r
+ BaseLib\r
+\r
+\r
+################################################################################\r
+#\r
+# Guid C Name Section - list of Guids that this module uses or produces.\r
+#\r
+################################################################################\r
+\r
+[Guids]\r
+\r
+\r
+################################################################################\r
+#\r
+# Protocol C Name Section - list of Protocol and Protocol Notify C Names\r
+# that this module uses or produces.\r
+#\r
+################################################################################\r
+\r
+[Protocols]\r
+ gEfiRuntimeArchProtocolGuid # PROTOCOL ALWAYS_PRODUCED\r
+ gEfiLoadedImageProtocolGuid # PROTOCOL ALWAYS_CONSUMED\r
+\r
--- /dev/null
+<?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
--- /dev/null
+/** @file\r
+ This driver supports platform security service.\r
+ \r
+ Copyright (c) 2006 - 2007, 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
+**/\r
+\r
+\r
+#include "SecurityStub.h"\r
+\r
+//\r
+// Handle for the Security Architectural Protocol instance produced by this driver\r
+//\r
+EFI_HANDLE mSecurityArchProtocolHandle = NULL;\r
+\r
+//\r
+// Security Architectural Protocol instance produced by this driver\r
+//\r
+EFI_SECURITY_ARCH_PROTOCOL mSecurityStub = { \r
+ SecurityStubAuthenticateState \r
+};\r
+\r
+\r
+/**\r
+ The EFI_SECURITY_ARCH_PROTOCOL (SAP) is used to abstract platform-specific \r
+ policy from the DXE core response to an attempt to use a file that returns a \r
+ given status for the authentication check from the section extraction protocol. \r
+\r
+ The possible responses in a given SAP implementation may include locking \r
+ flash upon failure to authenticate, attestation logging for all signed drivers, \r
+ and other exception operations. The File parameter allows for possible logging \r
+ within the SAP of the driver.\r
+\r
+ If File is NULL, then EFI_INVALID_PARAMETER is returned.\r
+\r
+ If the file specified by File with an authentication status specified by \r
+ AuthenticationStatus is safe for the DXE Core to use, then EFI_SUCCESS is returned.\r
+\r
+ If the file specified by File with an authentication status specified by \r
+ AuthenticationStatus is not safe for the DXE Core to use under any circumstances, \r
+ then EFI_ACCESS_DENIED is returned.\r
+\r
+ If the file specified by File with an authentication status specified by \r
+ AuthenticationStatus is not safe for the DXE Core to use right now, but it \r
+ might be possible to use it at a future time, then EFI_SECURITY_VIOLATION is \r
+ returned.\r
+\r
+ @param This The EFI_SECURITY_ARCH_PROTOCOL instance.\r
+ @param AuthenticationStatus \r
+ This is the authentication type returned from the Section\r
+ Extraction protocol. See the Section Extraction Protocol\r
+ Specification for details on this type.\r
+ @param File This is a pointer to the device path of the file that is\r
+ being dispatched. This will optionally be used for logging.\r
+\r
+ @retval EFI_SUCCESS The file specified by File did authenticate, and the\r
+ platform policy dictates that the DXE Core may use File.\r
+ @retval EFI_INVALID_PARAMETER Driver is NULL.\r
+ @retval EFI_SECURITY_VIOLATION The file specified by File did not authenticate, and\r
+ the platform policy dictates that File should be placed\r
+ in the untrusted state. A file may be promoted from\r
+ the untrusted to the trusted state at a future time\r
+ with a call to the Trust() DXE Service.\r
+ @retval EFI_ACCESS_DENIED The file specified by File did not authenticate, and\r
+ the platform policy dictates that File should not be\r
+ used for any purpose.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SecurityStubAuthenticateState (\r
+ IN EFI_SECURITY_ARCH_PROTOCOL *This,\r
+ IN UINT32 AuthenticationStatus,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *File\r
+ )\r
+{\r
+ if (File == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+ The user Entry Point for DXE driver. The user code starts with this function\r
+ as the real entry point for the image goes into a library that calls this \r
+ function.\r
+\r
+ @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
+ @param[in] SystemTable A pointer to the EFI System Table.\r
+ \r
+ @retval EFI_SUCCESS The entry point is executed successfully.\r
+ @retval other Some error occurs when executing this entry point.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SecurityStubInitialize (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Make sure the Security Architectural Protocol is not already installed in the system\r
+ //\r
+ ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiSecurityArchProtocolGuid);\r
+\r
+ //\r
+ // Install the Security Architectural Protocol onto a new handle\r
+ //\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &mSecurityArchProtocolHandle,\r
+ &gEfiSecurityArchProtocolGuid,\r
+ &mSecurityStub,\r
+ NULL\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ return Status;\r
+}\r
--- /dev/null
+/*++\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
+ SecurityStub.dxs\r
+\r
+Abstract:\r
+\r
+ Dependency expression source file.\r
+ \r
+--*/ \r
+\r
+//\r
+// Include common header file for this module.\r
+//\r
+#include "CommonHeader.h"\r
+\r
+#include <DxeDepex.h>\r
+\r
+DEPENDENCY_START\r
+ TRUE\r
+DEPENDENCY_END\r
--- /dev/null
+/** @file\r
+ Some definitions for Security Architectural Protocol stub driver\r
+\r
+ Copyright (c) 2006 - 2007, 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
+**/\r
+\r
+#ifndef _SECURITY_STUB_ARCH_PROTOCOL_H\r
+#define _SECURITY_STUB_ARCH_PROTOCOL_H\r
+\r
+\r
+//\r
+// Common header files for this module.\r
+//\r
+#include <PiDxe.h>\r
+#include <Protocol/Security.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+\r
+//\r
+// Function prototypes\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+SecurityStubAuthenticateState (\r
+ IN EFI_SECURITY_ARCH_PROTOCOL *This,\r
+ IN UINT32 AuthenticationStatus,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *File\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SecurityStubInitialize (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ );\r
+\r
+#endif\r
--- /dev/null
+#/** @file\r
+# Component description file for SecurityStub module\r
+#\r
+# Copyright (c) 2006 - 2007, 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
+#\r
+#**/\r
+\r
+################################################################################\r
+#\r
+# Defines Section - statements that will be processed to create a Makefile.\r
+#\r
+################################################################################\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = SecurityStub\r
+ FILE_GUID = F80697E9-7FD6-4665-8646-88E33EF71DFC\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ EDK_RELEASE_VERSION = 0x00020000\r
+ EFI_SPECIFICATION_VERSION = 0x00020000\r
+\r
+ ENTRY_POINT = SecurityStubInitialize\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
+#\r
+\r
+################################################################################\r
+#\r
+# Sources Section - list of files that are required for the build to succeed.\r
+#\r
+################################################################################\r
+\r
+[Sources.common]\r
+ SecurityStub.c\r
+ SecurityStub.h\r
+\r
+\r
+################################################################################\r
+#\r
+# Includes Section - list of Include locations that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+[Includes]\r
+ $(WORKSPACE)/MdePkg/Include/Library\r
+\r
+################################################################################\r
+#\r
+# Package Dependency Section - list of Package files that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+\r
+\r
+################################################################################\r
+#\r
+# Library Class Section - list of Library Classes that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+[LibraryClasses]\r
+ UefiDriverEntryPoint\r
+ UefiBootServicesTableLib\r
+ DebugLib\r
+\r
+\r
+################################################################################\r
+#\r
+# Protocol C Name Section - list of Protocol and Protocol Notify C Names\r
+# that this module uses or produces.\r
+#\r
+################################################################################\r
+\r
+[Protocols]\r
+ gEfiSecurityArchProtocolGuid # PROTOCOL ALWAYS_PRODUCED\r
+\r
+################################################################################\r
+#\r
+# Dependency Expression Section - list of Dependency expressions that are required for\r
+# this module.\r
+#\r
+################################################################################\r
+\r
+[Depex]\r
+ TRUE
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
+ <MsaHeader>\r
+ <ModuleName>SecurityStub</ModuleName>\r
+ <ModuleType>DXE_DRIVER</ModuleType>\r
+ <GuidValue>F80697E9-7FD6-4665-8646-88E33EF71DFC</GuidValue>\r
+ <Version>1.0</Version>\r
+ <Abstract>Component description file for SecurityStub module</Abstract>\r
+ <Description>This driver supports platform security service.</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>SecurityStub</OutputFileBasename>\r
+ </ModuleDefinitions>\r
+ <LibraryClassDefinitions>\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>UefiBootServicesTableLib</Keyword>\r
+ </LibraryClass>\r
+ <LibraryClass Usage="ALWAYS_CONSUMED">\r
+ <Keyword>UefiDriverEntryPoint</Keyword>\r
+ </LibraryClass>\r
+ </LibraryClassDefinitions>\r
+ <SourceFiles>\r
+ <Filename>SecurityStub.dxs</Filename>\r
+ <Filename>SecurityStub.h</Filename>\r
+ <Filename>SecurityStub.c</Filename>\r
+ </SourceFiles>\r
+ <PackageDependencies>\r
+ <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
+ </PackageDependencies>\r
+ <Protocols>\r
+ <Protocol Usage="ALWAYS_PRODUCED">\r
+ <ProtocolCName>gEfiSecurityArchProtocolGuid</ProtocolCName>\r
+ </Protocol>\r
+ </Protocols>\r
+ <Externs>\r
+ <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
+ <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
+ <Extern>\r
+ <ModuleEntryPoint>SecurityStubInitialize</ModuleEntryPoint>\r
+ </Extern>\r
+ </Externs>\r
+</ModuleSurfaceArea>
\ No newline at end of file
\r
#define EFI_PAGES_TO_SIZE(a) ( (a) << EFI_PAGE_SHIFT)\r
\r
+\r
+#define EFI_MAX_BIT MAX_BIT\r
+#define EFI_MAX_ADDRESS MAX_ADDRESS\r
+\r
#endif\r