]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/Sec/SecMain.c
Update SecMain code to remove unused logic.
[mirror_edk2.git] / Nt32Pkg / Sec / SecMain.c
index 4054d61bd04ea1307652aa74c9414580b2657be5..e503ecf2c3d4c2f1c7a012ffab6d94cebded35af 100644 (file)
@@ -1,4 +1,4 @@
-/*++\r
+/**@file\r
 \r
 Copyright (c) 2006, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
@@ -26,7 +26,7 @@ Abstract:
   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
@@ -58,6 +58,7 @@ EFI_PEI_PROGRESS_CODE_PPI                 mSecStatusCodePpi     = { SecPeiReport
 \r
 NT_FWH_PPI                                mSecFwhInformationPpi = { SecWinNtFdAddress };\r
 \r
+TEMPORARY_RAM_SUPPORT_PPI                 mSecTemporaryRamSupportPpi = {SecTemporaryRamSupport};\r
 \r
 EFI_PEI_PPI_DESCRIPTOR  gPrivateDispatchTable[] = {\r
   {\r
@@ -85,6 +86,11 @@ EFI_PEI_PPI_DESCRIPTOR  gPrivateDispatchTable[] = {
     &gEfiPeiStatusCodePpiGuid,\r
     &mSecStatusCodePpi\r
   },\r
+  {\r
+    EFI_PEI_PPI_DESCRIPTOR_PPI,\r
+    &gEfiTemporaryRamSupportPpiGuid,\r
+    &mSecTemporaryRamSupportPpi\r
+  },\r
   {\r
     EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
     &gNtFwhPpiGuid,\r
@@ -116,7 +122,12 @@ UINTN                   mPdbNameModHandleArraySize = 0;
 PDB_NAME_TO_MOD_HANDLE  *mPdbNameModHandleArray = NULL;\r
 \r
 \r
-\r
+VOID\r
+EFIAPI\r
+SecSwitchStack (\r
+  UINT32   TemporaryMemoryBase,\r
+  UINT32   PermenentMemoryBase\r
+  );\r
 \r
 INTN\r
 EFIAPI\r
@@ -147,7 +158,6 @@ Returns:
   UINTN                 Index;\r
   UINTN                 Index1;\r
   UINTN                 Index2;\r
-  UINTN                 PeiIndex;\r
   CHAR16                *FileName;\r
   CHAR16                *FileNamePtr;\r
   BOOLEAN               Done;\r
@@ -174,7 +184,7 @@ Returns:
   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
@@ -183,7 +193,7 @@ Returns:
   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
@@ -209,7 +219,7 @@ Returns:
     *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
@@ -222,7 +232,7 @@ Returns:
 \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
@@ -244,7 +254,7 @@ Returns:
               &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
@@ -264,7 +274,6 @@ Returns:
       //\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
@@ -465,7 +474,7 @@ Returns:
     //\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
@@ -560,24 +569,34 @@ Returns:
 --*/\r
 {\r
   EFI_STATUS                  Status;\r
-  EFI_PHYSICAL_ADDRESS        TopOfMemory;\r
   VOID                        *TopOfStack;\r
   UINT64                      PeiCoreSize;\r
   EFI_PHYSICAL_ADDRESS        PeiCoreEntryPoint;\r
   EFI_PHYSICAL_ADDRESS        PeiImageAddress;\r
   EFI_SEC_PEI_HAND_OFF        *SecCoreData;\r
+  UINTN                       PeiStackSize;\r
 \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
-  // Allocate 128KB for the Stack\r
+  // |-----------| <---- TemporaryRamBase + TemporaryRamSize\r
+  // |   Heap    |\r
+  // |           |\r
+  // |-----------| <---- StackBase / PeiTemporaryMemoryBase\r
+  // |           |\r
+  // |  Stack    |\r
+  // |-----------| <---- TemporaryRamBase\r
+  // \r
+  TopOfStack  = (VOID *)(LargestRegion + PeiStackSize);\r
+\r
   //\r
-  TopOfStack  = (VOID *)((UINTN)TopOfMemory - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);\r
+  // Reservet space for storing PeiCore's parament in stack.\r
+  // \r
+  TopOfStack  = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);\r
   TopOfStack  = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
-  TopOfMemory = TopOfMemory - STACK_SIZE;\r
 \r
   //\r
   // Patch value in dispatch table values\r
@@ -591,12 +610,12 @@ Returns:
   SecCoreData->DataSize               = sizeof(EFI_SEC_PEI_HAND_OFF);\r
   SecCoreData->BootFirmwareVolumeBase = (VOID*)BootFirmwareVolumeBase;\r
   SecCoreData->BootFirmwareVolumeSize = FixedPcdGet32(PcdWinNtFirmwareFdSize);\r
-  SecCoreData->TemporaryRamBase       = (VOID*)(UINTN)TopOfMemory\r
+  SecCoreData->TemporaryRamBase       = (VOID*)(UINTN)LargestRegion\r
   SecCoreData->TemporaryRamSize       = STACK_SIZE;\r
-  SecCoreData->PeiTemporaryRamBase    = SecCoreData->TemporaryRamBase;\r
-  SecCoreData->PeiTemporaryRamSize    = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);\r
-  SecCoreData->StackBase              = (VOID*)((UINTN)SecCoreData->TemporaryRamBase + (UINTN)SecCoreData->TemporaryRamSize);\r
-  SecCoreData->StackSize              = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);\r
+  SecCoreData->StackBase              = SecCoreData->TemporaryRamBase;\r
+  SecCoreData->StackSize              = PeiStackSize;\r
+  SecCoreData->PeiTemporaryRamBase    = (VOID*) ((UINTN) SecCoreData->TemporaryRamBase + PeiStackSize);\r
+  SecCoreData->PeiTemporaryRamSize    = STACK_SIZE - PeiStackSize;\r
 \r
   //\r
   // Load the PEI Core from a Firmware Volume\r
@@ -894,7 +913,7 @@ Returns:
 \r
 UINTN\r
 CountSeperatorsInString (\r
-  IN  const CHAR16   *String,\r
+  IN  CONST CHAR16   *String,\r
   IN  CHAR16         Seperator\r
   )\r
 /*++\r
@@ -1039,37 +1058,7 @@ SecNt32PeCoffGetImageInfo (
   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
+  return PeCoffLoaderGetImageInfo (ImageContext);\r
 }\r
 \r
 EFI_STATUS\r
@@ -1079,10 +1068,7 @@ SecNt32PeCoffLoadImage (
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
-\r
-  Status = PeCoffLoaderLoadImage (ImageContext);\r
-  return Status;\r
+  return PeCoffLoaderLoadImage (ImageContext);\r
 }\r
 \r
 EFI_STATUS\r
@@ -1209,3 +1195,44 @@ _ModuleEntryPoint (
 {\r
 }\r
 \r
+EFI_STATUS\r
+EFIAPI\r
+SecTemporaryRamSupport (\r
+  IN CONST EFI_PEI_SERVICES   **PeiServices,\r
+  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,\r
+  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,\r
+  IN UINTN                    CopySize\r
+  )\r
+{\r
+  //\r
+  // Migrate the whole temporary memory to permenent memory.\r
+  // \r
+  CopyMem (\r
+    (VOID*)(UINTN)PermanentMemoryBase, \r
+    (VOID*)(UINTN)TemporaryMemoryBase, \r
+    CopySize\r
+    );\r
+\r
+  //\r
+  // SecSwitchStack function must be invoked after the memory migration\r
+  // immediatly, also we need fixup the stack change caused by new call into \r
+  // permenent memory.\r
+  // \r
+  SecSwitchStack (\r
+    (UINT32) TemporaryMemoryBase,\r
+    (UINT32) PermanentMemoryBase\r
+    );\r
+\r
+  //\r
+  // We need *not* fix the return address because currently, \r
+  // The PeiCore is excuted in flash.\r
+  //\r
+\r
+  //\r
+  // Simulate to invalid CAR, terminate CAR\r
+  // \r
+  //ZeroMem ((VOID*)(UINTN)TemporaryMemoryBase, CopySize);\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r