]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UnixPkg/Sec/SecMain.c
Remove extra #includes where possible to make build more efficient
[mirror_edk2.git] / UnixPkg / Sec / SecMain.c
index a6da20b135e540745a162aed625b46c6cf014f78..4e09ddc3e137ea843768cc0da564e6131f0387ee 100644 (file)
@@ -35,44 +35,25 @@ Abstract:
 #include "SecMain.h"
 #include <sys/mman.h>
 #include <Ppi/UnixPeiLoadFile.h>
-#include <Framework/StatusCode.h>
 #include <Ppi/TemporaryRamSupport.h>
 #include <dlfcn.h>
 //
 // Globals
 //
-EFI_PEI_PE_COFF_LOADER_PROTOCOL_INSTANCE  mPeiEfiPeiPeCoffLoaderInstance = {
-  {
-    SecNt32PeCoffGetImageInfo,
-    SecNt32PeCoffLoadImage,
-    SecNt32PeCoffRelocateImage,
-    SecNt32PeCoffUnloadimage
-  },
-  NULL
-};
-
 
+UNIX_PEI_LOAD_FILE_PPI                    mSecNtLoadFilePpi          = { SecWinNtPeiLoadFile };
 
-EFI_PEI_PE_COFF_LOADER_PROTOCOL           *gPeiEfiPeiPeCoffLoader = &mPeiEfiPeiPeCoffLoaderInstance.PeCoff;
+PEI_UNIX_AUTOSCAN_PPI                     mSecNtAutoScanPpi          = { SecWinNtPeiAutoScan };
 
-UNIX_PEI_LOAD_FILE_PPI                      mSecNtLoadFilePpi     = { SecWinNtPeiLoadFile };
+PEI_UNIX_THUNK_PPI                        mSecWinNtThunkPpi          = { SecWinNtWinNtThunkAddress };
 
-PEI_UNIX_AUTOSCAN_PPI                       mSecNtAutoScanPpi     = { SecWinNtPeiAutoScan };
+EFI_PEI_PROGRESS_CODE_PPI                 mSecStatusCodePpi          = { SecPeiReportStatusCode };
 
-PEI_UNIX_THUNK_PPI                          mSecWinNtThunkPpi     = { SecWinNtWinNtThunkAddress };
-
-EFI_PEI_PROGRESS_CODE_PPI                 mSecStatusCodePpi     = { SecPeiReportStatusCode };
-
-UNIX_FWH_PPI                                mSecFwhInformationPpi = { SecWinNtFdAddress };
+UNIX_FWH_PPI                              mSecFwhInformationPpi      = { SecWinNtFdAddress };
 
 TEMPORARY_RAM_SUPPORT_PPI                 mSecTemporaryRamSupportPpi = {SecTemporaryRamSupport};
 
 EFI_PEI_PPI_DESCRIPTOR  gPrivateDispatchTable[] = {
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI,
-    &gEfiPeiPeCoffLoaderGuid,
-    NULL
-  },
   {
     EFI_PEI_PPI_DESCRIPTOR_PPI,
     &gUnixPeiLoadFilePpiGuid,
@@ -133,7 +114,6 @@ SecSwitchStack (
   UINT32   PermenentMemoryBase
   );
 
-STATIC
 EFI_PHYSICAL_ADDRESS *
 MapMemory (
   INTN fd,
@@ -141,13 +121,17 @@ MapMemory (
   INTN   prot,
   INTN   flags);
 
-STATIC
 EFI_STATUS
 MapFile (
   IN  CHAR8                     *FileName,
   IN OUT  EFI_PHYSICAL_ADDRESS  *BaseAddress,
   OUT UINT64                    *Length
   );
+EFI_STATUS
+EFIAPI
+SecNt32PeCoffRelocateImage (
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
+  );
 
 
 INTN
@@ -463,7 +447,7 @@ Returns:
 // TODO:    Data - add argument and description to function comment
 {
   CHAR8           *Format;
-  VA_LIST         Marker;
+  BASE_LIST       Marker;
   CHAR8           PrintBuffer[BYTES_PER_RECORD * 2];
   CHAR8           *Filename;
   CHAR8           *Description;
@@ -482,7 +466,7 @@ Returns:
     //
     // Process DEBUG () macro 
     //
-    AsciiVSPrint (PrintBuffer, BYTES_PER_RECORD, Format, Marker);
+    AsciiBSPrint (PrintBuffer, BYTES_PER_RECORD, Format, Marker);
     printf (PrintBuffer);
   }
 
@@ -603,11 +587,7 @@ Returns:
   TopOfStack  = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);
   TopOfStack  = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
 
-  //
-  // Patch value in dispatch table values
-  //
-  gPrivateDispatchTable[0].Ppi = gPeiEfiPeiPeCoffLoader;
-
+  
   //
   // Bind this information into the SEC hand-off state
   //
@@ -756,7 +736,7 @@ Returns:
 
   ImageContext.ImageRead  = (PE_COFF_LOADER_READ_FILE) SecImageRead;
 
-  Status                  = gPeiEfiPeiPeCoffLoader->GetImageInfo (gPeiEfiPeiPeCoffLoader, &ImageContext);
+  Status                  = PeCoffLoaderGetImageInfo (&ImageContext);
   if (EFI_ERROR (Status)) {
     return Status;
   }
@@ -770,16 +750,16 @@ Returns:
   //
   // Align buffer on section boundry
   //
-  ImageContext.ImageAddress += ImageContext.SectionAlignment;
+  ImageContext.ImageAddress += ImageContext.SectionAlignment - 1;
   ImageContext.ImageAddress &= ~(ImageContext.SectionAlignment - 1);
 
 
-  Status = gPeiEfiPeiPeCoffLoader->LoadImage (gPeiEfiPeiPeCoffLoader, &ImageContext);
+  Status = PeCoffLoaderLoadImage (&ImageContext);
   if (EFI_ERROR (Status)) {
     return Status;
   }
 
-  Status = gPeiEfiPeiPeCoffLoader->RelocateImage (gPeiEfiPeiPeCoffLoader, &ImageContext);
+  Status = SecNt32PeCoffRelocateImage(&ImageContext);
   if (EFI_ERROR (Status)) {
     return Status;
   }
@@ -903,59 +883,6 @@ Returns:
 
 
 
-EFI_STATUS
-EFIAPI
-SecNt32PeCoffGetImageInfo (
-  IN EFI_PEI_PE_COFF_LOADER_PROTOCOL          *This,
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
-  )
-{
-  EFI_STATUS  Status;
-
-  Status = PeCoffLoaderGetImageInfo (ImageContext);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  switch (ImageContext->ImageType) {
-
-  case EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION:
-    ImageContext->ImageCodeMemoryType = EfiLoaderCode;
-    ImageContext->ImageDataMemoryType = EfiLoaderData;
-    break;
-
-  case EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
-    ImageContext->ImageCodeMemoryType = EfiBootServicesCode;
-    ImageContext->ImageDataMemoryType = EfiBootServicesData;
-    break;
-
-  case EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
-  case EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
-    ImageContext->ImageCodeMemoryType = EfiRuntimeServicesCode;
-    ImageContext->ImageDataMemoryType = EfiRuntimeServicesData;
-    break;
-
-  default:
-    ImageContext->ImageError = IMAGE_ERROR_INVALID_SUBSYSTEM;
-    return RETURN_UNSUPPORTED;
-  }
-
-  return Status;
-}
-
-EFI_STATUS
-EFIAPI
-SecNt32PeCoffLoadImage (
-  IN EFI_PEI_PE_COFF_LOADER_PROTOCOL          *This,
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
-  )
-{
-  EFI_STATUS  Status;
-
-  Status = PeCoffLoaderLoadImage (ImageContext);
-  return Status;
-}
-
 VOID
 SecUnixLoaderBreak (
   VOID
@@ -966,7 +893,6 @@ SecUnixLoaderBreak (
 EFI_STATUS
 EFIAPI
 SecNt32PeCoffRelocateImage (
-  IN EFI_PEI_PE_COFF_LOADER_PROTOCOL          *This,
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
   )
 {
@@ -983,6 +909,19 @@ SecNt32PeCoffRelocateImage (
      (unsigned long)ImageContext->ImageAddress,
      (unsigned long)ImageContext->EntryPoint);
 
+  Handle = dlopen(ImageContext->PdbPointer, RTLD_NOW);
+  
+  if (Handle) {
+    Entry = dlsym(Handle, "_ModuleEntryPoint");
+  } else {
+    printf("%s\n", dlerror());  
+  }
+  
+  if (Entry != NULL) {
+    ImageContext->EntryPoint = Entry;
+    printf("Change %s Entrypoint to :0x%08lx\n", ImageContext->PdbPointer, Entry);
+  }
+
   SecUnixLoaderBreak ();
 
   return Status;
@@ -992,7 +931,6 @@ SecNt32PeCoffRelocateImage (
 EFI_STATUS
 EFIAPI
 SecNt32PeCoffUnloadimage (
-  IN EFI_PEI_PE_COFF_LOADER_PROTOCOL      *This,
   IN PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
   )
 {
@@ -1040,7 +978,7 @@ SecTemporaryRamSupport (
   //
 
   //
-  // Simulate to invalid CAR, terminate CAR
+  // Simulate to invalid temporary memory, terminate temporary memory
   // 
   //ZeroMem ((VOID*)(UINTN)TemporaryMemoryBase, CopySize);