-/*++\r
+/**@file\r
\r
Copyright (c) 2006, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
This code produces 128 K of temporary memory for the PEI stack by directly\r
allocate memory space with ReadWrite and Execute attribute.\r
\r
---*/\r
+**/\r
\r
#include "SecMain.h"\r
\r
\r
-//\r
-// Globals\r
-//\r
-EFI_PEI_PE_COFF_LOADER_PROTOCOL_INSTANCE mPeiEfiPeiPeCoffLoaderInstance = {\r
- {\r
- SecNt32PeCoffGetImageInfo,\r
- SecNt32PeCoffLoadImage,\r
- SecNt32PeCoffRelocateImage,\r
- SecNt32PeCoffUnloadimage\r
- },\r
- NULL\r
-};\r
-\r
-\r
-\r
-EFI_PEI_PE_COFF_LOADER_PROTOCOL *gPeiEfiPeiPeCoffLoader = &mPeiEfiPeiPeCoffLoaderInstance.PeCoff;\r
\r
NT_PEI_LOAD_FILE_PPI mSecNtLoadFilePpi = { SecWinNtPeiLoadFile };\r
\r
TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {SecTemporaryRamSupport};\r
\r
EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {\r
- {\r
- EFI_PEI_PPI_DESCRIPTOR_PPI,\r
- &gEfiPeiPeCoffLoaderGuid,\r
- NULL\r
- },\r
{\r
EFI_PEI_PPI_DESCRIPTOR_PPI,\r
&gNtPeiLoadFilePpiGuid,\r
UINTN gSystemMemoryCount = 0;\r
NT_SYSTEM_MEMORY *gSystemMemory;\r
\r
-\r
-UINTN mPdbNameModHandleArraySize = 0;\r
-PDB_NAME_TO_MOD_HANDLE *mPdbNameModHandleArray = NULL;\r
-\r
-\r
VOID\r
EFIAPI\r
SecSwitchStack (\r
UINT32 TemporaryMemoryBase,\r
UINT32 PermenentMemoryBase\r
);\r
-\r
+EFI_STATUS\r
+SecNt32PeCoffRelocateImage (\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
+ );\r
INTN\r
EFIAPI\r
main (\r
UINTN Index;\r
UINTN Index1;\r
UINTN Index2;\r
- UINTN PeiIndex;\r
CHAR16 *FileName;\r
CHAR16 *FileNamePtr;\r
BOOLEAN Done;\r
gSystemMemoryCount = CountSeperatorsInString (MemorySizeStr, '!') + 1;\r
gSystemMemory = calloc (gSystemMemoryCount, sizeof (NT_SYSTEM_MEMORY));\r
if (gSystemMemory == NULL) {\r
- printf ("ERROR : Can not allocate memory for %s. Exiting.\n", MemorySizeStr);\r
+ wprintf (L"ERROR : Can not allocate memory for %s. Exiting.\n", MemorySizeStr);\r
exit (1);\r
}\r
//\r
gFdInfoCount = CountSeperatorsInString (FirmwareVolumesStr, '!') + 1;\r
gFdInfo = calloc (gFdInfoCount, sizeof (NT_FD_INFO));\r
if (gFdInfo == NULL) {\r
- printf ("ERROR : Can not allocate memory for %s. Exiting.\n", FirmwareVolumesStr);\r
+ wprintf (L"ERROR : Can not allocate memory for %s. Exiting.\n", FirmwareVolumesStr);\r
exit (1);\r
}\r
//\r
*StackPointer = 0x5AA55AA5;\r
}\r
\r
- printf (" SEC passing in %d bytes of temp RAM to PEI\n", InitialStackMemorySize);\r
+ wprintf (L" SEC passing in %d bytes of temp RAM to PEI\n", InitialStackMemorySize);\r
\r
//\r
// Open All the firmware volumes and remember the info in the gFdInfo global\r
\r
StrCpy (FileNamePtr, (CHAR16*)FirmwareVolumesStr);\r
\r
- for (Done = FALSE, Index = 0, PeiIndex = 0, PeiCoreFile = NULL; !Done; Index++) {\r
+ for (Done = FALSE, Index = 0, PeiCoreFile = NULL; !Done; Index++) {\r
FileName = FileNamePtr;\r
for (Index1 = 0; (FileNamePtr[Index1] != '!') && (FileNamePtr[Index1] != 0); Index1++)\r
;\r
&gFdInfo[Index].Size\r
);\r
if (EFI_ERROR (Status)) {\r
- printf ("ERROR : Can not open Firmware Device File %S (%r). Exiting.\n", FileName, Status);\r
+ printf ("ERROR : Can not open Firmware Device File %S (0x%X). Exiting.\n", FileName, Status);\r
exit (1);\r
}\r
\r
//\r
Status = SecFfsFindPeiCore ((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) gFdInfo[Index].Address, &PeiCoreFile);\r
if (!EFI_ERROR (Status)) {\r
- PeiIndex = Index;\r
printf (" contains SEC Core");\r
}\r
}\r
//\r
// Processes ASSERT ()\r
//\r
- printf ("ASSERT %s(%d): %s\n", Filename, LineNumber, Description);\r
+ printf ("ASSERT %s(%d): %s\n", Filename, (int)LineNumber, Description);\r
\r
} else if (ReportStatusCodeExtractDebugInfo (Data, &ErrorLevel, &Marker, &Format)) {\r
//\r
--*/\r
{\r
EFI_STATUS Status;\r
- EFI_PHYSICAL_ADDRESS TopOfMemory;\r
VOID *TopOfStack;\r
UINT64 PeiCoreSize;\r
EFI_PHYSICAL_ADDRESS PeiCoreEntryPoint;\r
//\r
// Compute Top Of Memory for Stack and PEI Core Allocations\r
//\r
- TopOfMemory = LargestRegion + LargestRegionSize;\r
PeiStackSize = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);\r
\r
//\r
// |-----------| <---- TemporaryRamBase\r
// \r
TopOfStack = (VOID *)(LargestRegion + PeiStackSize);\r
- TopOfMemory = LargestRegion + PeiStackSize;\r
\r
//\r
// Reservet space for storing PeiCore's parament in stack.\r
TopOfStack = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);\r
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
\r
- //\r
- // Patch value in dispatch table values\r
- //\r
- gPrivateDispatchTable[0].Ppi = gPeiEfiPeiPeCoffLoader;\r
-\r
//\r
// Bind this information into the SEC hand-off state\r
//\r
\r
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) SecImageRead;\r
\r
- Status = gPeiEfiPeiPeCoffLoader->GetImageInfo (gPeiEfiPeiPeCoffLoader, &ImageContext);\r
+ Status = PeCoffLoaderGetImageInfo (&ImageContext);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
//\r
// Align buffer on section boundry\r
//\r
- ImageContext.ImageAddress += ImageContext.SectionAlignment;\r
+ ImageContext.ImageAddress += ImageContext.SectionAlignment - 1;\r
ImageContext.ImageAddress &= ~(ImageContext.SectionAlignment - 1);\r
\r
- Status = gPeiEfiPeiPeCoffLoader->LoadImage (gPeiEfiPeiPeCoffLoader, &ImageContext);\r
+ Status = PeCoffLoaderLoadImage (&ImageContext);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- Status = gPeiEfiPeiPeCoffLoader->RelocateImage (gPeiEfiPeiPeCoffLoader, &ImageContext);\r
+ Status = SecNt32PeCoffRelocateImage (&ImageContext);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
UINTN\r
CountSeperatorsInString (\r
- IN const CHAR16 *String,\r
+ IN CONST CHAR16 *String,\r
IN CHAR16 Seperator\r
)\r
/*++\r
\r
\r
EFI_STATUS\r
-AddModHandle (\r
- IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,\r
- IN VOID *ModHandle\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Store the ModHandle in an array indexed by the Pdb File name.\r
- The ModHandle is needed to unload the image. \r
-\r
-Arguments:\r
- ImageContext - Input data returned from PE Laoder Library. Used to find the \r
- .PDB file name of the PE Image.\r
- ModHandle - Returned from LoadLibraryEx() and stored for call to \r
- FreeLibrary().\r
-\r
-Returns:\r
- EFI_SUCCESS - ModHandle was stored. \r
-\r
---*/\r
-{\r
- UINTN Index;\r
- PDB_NAME_TO_MOD_HANDLE *Array;\r
- UINTN PreviousSize;\r
-\r
-\r
- Array = mPdbNameModHandleArray;\r
- for (Index = 0; Index < mPdbNameModHandleArraySize; Index++, Array++) {\r
- if (Array->PdbPointer == NULL) {\r
- //\r
- // Make a copy of the stirng and store the ModHandle\r
- //\r
- Array->PdbPointer = malloc (strlen (ImageContext->PdbPointer) + 1);\r
- ASSERT (Array->PdbPointer != NULL);\r
-\r
- strcpy (Array->PdbPointer, ImageContext->PdbPointer);\r
- Array->ModHandle = ModHandle;\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- \r
- //\r
- // No free space in mPdbNameModHandleArray so grow it by \r
- // MAX_PDB_NAME_TO_MOD_HANDLE_ARRAY_SIZE entires. realloc will\r
- // copy the old values to the new locaiton. But it does\r
- // not zero the new memory area.\r
- //\r
- PreviousSize = mPdbNameModHandleArraySize * sizeof (PDB_NAME_TO_MOD_HANDLE);\r
- mPdbNameModHandleArraySize += MAX_PDB_NAME_TO_MOD_HANDLE_ARRAY_SIZE;\r
-\r
- mPdbNameModHandleArray = realloc (mPdbNameModHandleArray, mPdbNameModHandleArraySize * sizeof (PDB_NAME_TO_MOD_HANDLE));\r
- if (mPdbNameModHandleArray == NULL) {\r
- ASSERT (FALSE);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- \r
- memset (mPdbNameModHandleArray + PreviousSize, 0, MAX_PDB_NAME_TO_MOD_HANDLE_ARRAY_SIZE * sizeof (PDB_NAME_TO_MOD_HANDLE));\r
- \r
- return AddModHandle (ImageContext, ModHandle);\r
-}\r
-\r
-\r
-VOID *\r
-RemoveModeHandle (\r
- IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Return the ModHandle and delete the entry in the array.\r
-\r
-Arguments:\r
- ImageContext - Input data returned from PE Laoder Library. Used to find the \r
- .PDB file name of the PE Image.\r
-\r
-Returns:\r
- ModHandle - ModHandle assoicated with ImageContext is returned\r
- NULL - No ModHandle associated with ImageContext\r
-\r
---*/\r
-{\r
- UINTN Index;\r
- PDB_NAME_TO_MOD_HANDLE *Array;\r
-\r
- if (ImageContext->PdbPointer == NULL) {\r
- //\r
- // If no PDB pointer there is no ModHandle so return NULL\r
- //\r
- return NULL;\r
- }\r
-\r
- Array = mPdbNameModHandleArray;\r
- for (Index = 0; Index < mPdbNameModHandleArraySize; Index++, Array++) {\r
- if ((Array->PdbPointer != NULL) && (strcmp(Array->PdbPointer, ImageContext->PdbPointer) == 0)) {\r
- //\r
- // If you find a match return it and delete the entry\r
- //\r
- free (Array->PdbPointer);\r
- Array->PdbPointer = NULL;\r
- return Array->ModHandle;\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-SecNt32PeCoffGetImageInfo (\r
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,\r
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = PeCoffLoaderGetImageInfo (ImageContext);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- switch (ImageContext->ImageType) {\r
-\r
- case EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION:\r
- ImageContext->ImageCodeMemoryType = EfiLoaderCode;\r
- ImageContext->ImageDataMemoryType = EfiLoaderData;\r
- break;\r
-\r
- case EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:\r
- ImageContext->ImageCodeMemoryType = EfiBootServicesCode;\r
- ImageContext->ImageDataMemoryType = EfiBootServicesData;\r
- break;\r
-\r
- case EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:\r
- case EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:\r
- ImageContext->ImageCodeMemoryType = EfiRuntimeServicesCode;\r
- ImageContext->ImageDataMemoryType = EfiRuntimeServicesData;\r
- break;\r
-\r
- default:\r
- ImageContext->ImageError = IMAGE_ERROR_INVALID_SUBSYSTEM;\r
- return RETURN_UNSUPPORTED;\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-SecNt32PeCoffLoadImage (\r
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,\r
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = PeCoffLoaderLoadImage (ImageContext);\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
SecNt32PeCoffRelocateImage (\r
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,\r
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
)\r
{\r
}\r
\r
if ((Library != NULL) && (DllEntryPoint != NULL)) {\r
- AddModHandle (ImageContext, Library);\r
ImageContext->EntryPoint = (EFI_PHYSICAL_ADDRESS) (UINTN) DllEntryPoint;\r
wprintf (L"LoadLibraryEx (%s,\n NULL, DONT_RESOLVE_DLL_REFERENCES)\n", DllFileName);\r
} else {\r
}\r
\r
\r
-EFI_STATUS\r
-EFIAPI\r
-SecNt32PeCoffUnloadimage (\r
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,\r
- IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-{\r
- VOID *ModHandle;\r
\r
- ModHandle = RemoveModeHandle (ImageContext);\r
- if (ModHandle != NULL) {\r
- FreeLibrary (ModHandle);\r
- }\r
- return EFI_SUCCESS;\r
-}\r
\r
VOID\r
_ModuleEntryPoint (\r
//\r
\r
//\r
- // Simulate to invalid CAR, terminate CAR\r
+ // Simulate to invalid temporary memory, terminate temporary memory\r
// \r
//ZeroMem ((VOID*)(UINTN)TemporaryMemoryBase, CopySize);\r
\r