]> git.proxmox.com Git - mirror_edk2.git/commitdiff
EmulatorPkg/Unix: Rename SecMain to Host
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 29 Jun 2011 05:13:33 +0000 (05:13 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 29 Jun 2011 05:13:33 +0000 (05:13 +0000)
Signed-off-by: jljusten
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11924 6f19259b-4bc3-4df7-8a09-765794883524

20 files changed:
EmulatorPkg/Unix/GdbRun
EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
EmulatorPkg/Unix/Host/BlockIo.c
EmulatorPkg/Unix/Host/EmuThunk.c
EmulatorPkg/Unix/Host/Host.c [new file with mode: 0644]
EmulatorPkg/Unix/Host/Host.h [new file with mode: 0644]
EmulatorPkg/Unix/Host/Host.inf [new file with mode: 0644]
EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
EmulatorPkg/Unix/Host/LinuxPacketFilter.c
EmulatorPkg/Unix/Host/PosixFileSystem.c
EmulatorPkg/Unix/Host/Pthreads.c
EmulatorPkg/Unix/Host/SecMain.c [deleted file]
EmulatorPkg/Unix/Host/SecMain.h [deleted file]
EmulatorPkg/Unix/Host/SecMain.inf [deleted file]
EmulatorPkg/Unix/Host/X11GraphicsWindow.c
EmulatorPkg/Unix/UnixX64.dsc
EmulatorPkg/Unix/Xcode/xcode_project32/xcode_project.xcodeproj/default.pbxuser
EmulatorPkg/Unix/Xcode/xcode_project64/xcode_project.xcodeproj/default.pbxuser
EmulatorPkg/Unix/build.sh
EmulatorPkg/Unix/build64.sh

index 14a398d62abe668e31f64859a8975e1860479af2..b2d6dccccb7c1210f83c1803541a1b5fcdccbec3 100644 (file)
@@ -28,7 +28,7 @@ define hook-stop
   if $_exitcode != 42
     quit
   else
-    source SecMain.gdb
+    source Host.gdb
   end
 end
 
index b94da9ee824e65eb07dd9419abbb955d59356347..4ba27c2a6a57f740474756742f65a96f58968e1a 100644 (file)
@@ -18,7 +18,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 \r
-#include "SecMain.h"\r
+#include "Host.h"\r
 \r
 #ifdef __APPLE__\r
 \r
index 657ce34e4589a40e89381326621b28f68b26b80b..50fe9b575e10c140f0ada79daca258c26fd676e1 100644 (file)
@@ -11,7 +11,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 \r
-#include "SecMain.h"\r
+#include "Host.h"\r
 \r
 #define EMU_BLOCK_IO_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'M', 'b', 'k')\r
 typedef struct {\r
index d9816298d4efd13554959071cd577a85c918c550..52875c3bce5cc0709ddfec43b3c41752a37a608a 100644 (file)
@@ -21,7 +21,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 **/
 
-#include "SecMain.h"
+#include "Host.h"
 
 #ifdef __APPLE__
 #define DebugAssert _Mangle__DebugAssert
diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c
new file mode 100644 (file)
index 0000000..1713016
--- /dev/null
@@ -0,0 +1,1226 @@
+/*++ @file
+
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "Host.h"
+
+#ifdef __APPLE__
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
+
+//
+// Globals
+//
+
+EMU_THUNK_PPI mSecEmuThunkPpi = {
+  GasketSecUnixPeiAutoScan,
+  GasketSecUnixFdAddress,
+  GasketSecEmuThunkAddress
+};
+
+char *gGdbWorkingFileName = NULL;
+unsigned int mScriptSymbolChangesCount = 0;
+
+
+//
+// Default information about where the FD is located.
+//  This array gets filled in with information from EFI_FIRMWARE_VOLUMES
+//  EFI_FIRMWARE_VOLUMES is a host environment variable set by system.cmd.
+//  The number of array elements is allocated base on parsing
+//  EFI_FIRMWARE_VOLUMES and the memory is never freed.
+//
+UINTN       gFdInfoCount = 0;
+EMU_FD_INFO *gFdInfo;
+
+//
+// Array that supports seperate memory rantes.
+//  The memory ranges are set in system.cmd via the EFI_MEMORY_SIZE variable.
+//  The number of array elements is allocated base on parsing
+//  EFI_MEMORY_SIZE and the memory is never freed.
+//
+UINTN              gSystemMemoryCount = 0;
+EMU_SYSTEM_MEMORY  *gSystemMemory;
+
+
+
+UINTN                        mImageContextModHandleArraySize = 0;
+IMAGE_CONTEXT_TO_MOD_HANDLE  *mImageContextModHandleArray = NULL;
+
+EFI_PEI_PPI_DESCRIPTOR  *gPpiList;
+
+
+int gInXcode = 0;
+
+
+/*++
+  Breakpoint target for Xcode project. Set in the Xcode XML
+
+  Xcode breakpoint will 'source Host.gdb'
+  gGdbWorkingFileName is set to Host.gdb
+
+**/
+VOID
+SecGdbConfigBreak (
+  VOID
+  )
+{
+}
+
+
+
+/*++
+
+Routine Description:
+  Main entry point to SEC for Unix. This is a unix program
+
+Arguments:
+  Argc - Number of command line arguments
+  Argv - Array of command line argument strings
+  Envp - Array of environmemt variable strings
+
+Returns:
+  0 - Normal exit
+  1 - Abnormal exit
+
+**/
+int
+main (
+  IN  int   Argc,
+  IN  char  **Argv,
+  IN  char  **Envp
+  )
+{
+  EFI_STATUS            Status;
+  EFI_PHYSICAL_ADDRESS  InitialStackMemory;
+  UINT64                InitialStackMemorySize;
+  UINTN                 Index;
+  UINTN                 Index1;
+  UINTN                 Index2;
+  UINTN                 PeiIndex;
+  CHAR8                 *FileName;
+  BOOLEAN               Done;
+  EFI_PEI_FILE_HANDLE   FileHandle;
+  VOID                  *SecFile;
+  CHAR16                *MemorySizeStr;
+  CHAR16                *FirmwareVolumesStr;
+  UINTN                 *StackPointer;
+  FILE                  *GdbTempFile;
+
+  //
+  // Xcode does not support sourcing gdb scripts directly, so the Xcode XML
+  // has a break point script to source the GdbRun script.
+  //
+  SecGdbConfigBreak ();
+
+  //
+  // If dlopen doesn't work, then we build a gdb script to allow the
+  // symbols to be loaded.
+  //
+  Index = strlen (*Argv);
+  gGdbWorkingFileName = AllocatePool (Index + strlen(".gdb") + 1);
+  strcpy (gGdbWorkingFileName, *Argv);
+  strcat (gGdbWorkingFileName, ".gdb");
+
+  //
+  // Empty out the gdb symbols script file.
+  //
+  GdbTempFile = fopen (gGdbWorkingFileName, "w");
+  if (GdbTempFile != NULL) {
+    fclose (GdbTempFile);
+  }
+
+  printf ("\nEDK II UNIX Host Emulation Environment from edk2.sourceforge.net\n");
+
+  setbuf (stdout, 0);
+  setbuf (stderr, 0);
+
+  MemorySizeStr      = (CHAR16 *) PcdGetPtr (PcdEmuMemorySize);
+  FirmwareVolumesStr = (CHAR16 *) PcdGetPtr (PcdEmuFirmwareVolume);
+
+  //
+  // PPIs pased into PEI_CORE
+  //
+  AddThunkPpi (EFI_PEI_PPI_DESCRIPTOR_PPI, &gEmuThunkPpiGuid, &mSecEmuThunkPpi);
+
+  SecInitThunkProtocol ();
+
+  //
+  // Emulator Bus Driver Thunks
+  //
+  AddThunkProtocol (&gX11ThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuGop), TRUE);
+  AddThunkProtocol (&gPosixFileSystemThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuFileSystem), TRUE);
+  AddThunkProtocol (&gBlockIoThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuVirtualDisk), TRUE);
+  AddThunkProtocol (&gSnpThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuNetworkInterface), TRUE);
+
+  //
+  // Emulator other Thunks
+  //
+  AddThunkProtocol (&gPthreadThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuApCount), FALSE);
+
+  // EmuSecLibConstructor ();
+
+  gPpiList = GetThunkPpiList ();
+
+  //
+  // Allocate space for gSystemMemory Array
+  //
+  gSystemMemoryCount  = CountSeperatorsInString (MemorySizeStr, '!') + 1;
+  gSystemMemory       = AllocateZeroPool (gSystemMemoryCount * sizeof (EMU_SYSTEM_MEMORY));
+  if (gSystemMemory == NULL) {
+    printf ("ERROR : Can not allocate memory for system.  Exiting.\n");
+    exit (1);
+  }
+  //
+  // Allocate space for gSystemMemory Array
+  //
+  gFdInfoCount  = CountSeperatorsInString (FirmwareVolumesStr, '!') + 1;
+  gFdInfo       = AllocateZeroPool (gFdInfoCount * sizeof (EMU_FD_INFO));
+  if (gFdInfo == NULL) {
+    printf ("ERROR : Can not allocate memory for fd info.  Exiting.\n");
+    exit (1);
+  }
+
+  printf ("  BootMode 0x%02x\n", (unsigned int)PcdGet32 (PcdEmuBootMode));
+
+  //
+  // Open up a 128K file to emulate temp memory for SEC.
+  //  on a real platform this would be SRAM, or using the cache as RAM.
+  //  Set InitialStackMemory to zero so UnixOpenFile will allocate a new mapping
+  //
+  InitialStackMemorySize  = STACK_SIZE;
+  InitialStackMemory = (UINTN)MapMemory (
+                                0, (UINT32) InitialStackMemorySize,
+                                PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE
+                                );
+  if (InitialStackMemory == 0) {
+    printf ("ERROR : Can not open SecStack Exiting\n");
+    exit (1);
+  }
+
+  printf ("  OS Emulator passing in %u KB of temp RAM at 0x%08lx to SEC\n",
+    (unsigned int)(InitialStackMemorySize / 1024),
+    (unsigned long)InitialStackMemory
+    );
+
+  for (StackPointer = (UINTN*) (UINTN) InitialStackMemory;
+     StackPointer < (UINTN*)(UINTN)((UINTN) InitialStackMemory + (UINT64) InitialStackMemorySize);
+     StackPointer ++) {
+    *StackPointer = 0x5AA55AA5;
+  }
+
+  //
+  // Open All the firmware volumes and remember the info in the gFdInfo global
+  //
+  FileName = (CHAR8 *) AllocatePool (StrLen (FirmwareVolumesStr) + 1);
+  if (FileName == NULL) {
+    printf ("ERROR : Can not allocate memory for firmware volume string\n");
+    exit (1);
+  }
+
+  Index2 = 0;
+  for (Done = FALSE, Index = 0, PeiIndex = 0, SecFile = NULL;
+       FirmwareVolumesStr[Index2] != 0;
+       Index++) {
+    for (Index1 = 0; (FirmwareVolumesStr[Index2] != '!') && (FirmwareVolumesStr[Index2] != 0); Index2++) {
+      FileName[Index1++] = FirmwareVolumesStr[Index2];
+    }
+    if (FirmwareVolumesStr[Index2] == '!') {
+      Index2++;
+    }
+    FileName[Index1]  = '\0';
+
+    if (Index == 0) {
+      // Map FV Recovery Read Only and other areas Read/Write
+      Status = MapFd0 (
+                FileName,
+                &gFdInfo[0].Address,
+                &gFdInfo[0].Size
+                );
+    } else {
+      //
+      // Open the FD and remmeber where it got mapped into our processes address space
+      // Maps Read Only
+      //
+      Status = MapFile (
+                FileName,
+                &gFdInfo[Index].Address,
+                &gFdInfo[Index].Size
+                );
+    }
+    if (EFI_ERROR (Status)) {
+      printf ("ERROR : Can not open Firmware Device File %s (%x).  Exiting.\n", FileName, (unsigned int)Status);
+      exit (1);
+    }
+
+    printf ("  FD loaded from %s at 0x%08lx",FileName, (unsigned long)gFdInfo[Index].Address);
+
+    if (SecFile == NULL) {
+      //
+      // Assume the beginning of the FD is an FV and look for the SEC Core.
+      // Load the first one we find.
+      //
+      FileHandle = NULL;
+      Status = PeiServicesFfsFindNextFile (
+                  EFI_FV_FILETYPE_SECURITY_CORE,
+                  (EFI_PEI_FV_HANDLE)(UINTN)gFdInfo[Index].Address,
+                  &FileHandle
+                  );
+      if (!EFI_ERROR (Status)) {
+        Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &SecFile);
+        if (!EFI_ERROR (Status)) {
+          PeiIndex = Index;
+          printf (" contains SEC Core");
+        }
+      }
+    }
+
+    printf ("\n");
+  }
+  //
+  // Calculate memory regions and store the information in the gSystemMemory
+  //  global for later use. The autosizing code will use this data to
+  //  map this memory into the SEC process memory space.
+  //
+  Index1 = 0;
+  Index = 0;
+  while (1) {
+    UINTN val = 0;
+    //
+    // Save the size of the memory.
+    //
+    while (MemorySizeStr[Index1] >= '0' && MemorySizeStr[Index1] <= '9') {
+      val = val * 10 + MemorySizeStr[Index1] - '0';
+      Index1++;
+    }
+    gSystemMemory[Index++].Size = val * 0x100000;
+    if (MemorySizeStr[Index1] == 0) {
+      break;
+    }
+    Index1++;
+  }
+
+  printf ("\n");
+
+  //
+  // Hand off to SEC
+  //
+  SecLoadFromCore ((UINTN) InitialStackMemory, (UINTN) InitialStackMemorySize, (UINTN) gFdInfo[0].Address, SecFile);
+
+  //
+  // If we get here, then the SEC Core returned. This is an error as SEC should
+  //  always hand off to PEI Core and then on to DXE Core.
+  //
+  printf ("ERROR : SEC returned\n");
+  exit (1);
+}
+
+
+EFI_PHYSICAL_ADDRESS *
+MapMemory (
+  IN INTN   fd,
+  IN UINT64 length,
+  IN INTN   prot,
+  IN INTN   flags
+  )
+{
+  STATIC UINTN base  = 0x40000000;
+  CONST UINTN  align = (1 << 24);
+  VOID         *res  = NULL;
+  BOOLEAN      isAligned = 0;
+
+  //
+  // Try to get an aligned block somewhere in the address space of this
+  // process.
+  //
+  while((!isAligned) && (base != 0)) {
+    res = mmap ((void *)base, length, prot, flags, fd, 0);
+    if (res == MAP_FAILED) {
+      return NULL;
+    }
+    if ((((UINTN)res) & ~(align-1)) == (UINTN)res) {
+      isAligned=1;
+    } else {
+      munmap(res, length);
+      base += align;
+    }
+  }
+  return res;
+}
+
+
+/*++
+
+Routine Description:
+  Opens and memory maps a file using Unix services. If BaseAddress is non zero
+  the process will try and allocate the memory starting at BaseAddress.
+
+Arguments:
+  FileName            - The name of the file to open and map
+  MapSize             - The amount of the file to map in bytes
+  CreationDisposition - The flags to pass to CreateFile().  Use to create new files for
+                        memory emulation, and exiting files for firmware volume emulation
+  BaseAddress         - The base address of the mapped file in the user address space.
+                         If passed in as NULL the a new memory region is used.
+                         If passed in as non NULL the request memory region is used for
+                          the mapping of the file into the process space.
+  Length              - The size of the mapped region in bytes
+
+Returns:
+  EFI_SUCCESS      - The file was opened and mapped.
+  EFI_NOT_FOUND    - FileName was not found in the current directory
+  EFI_DEVICE_ERROR - An error occured attempting to map the opened file
+
+**/
+EFI_STATUS
+MapFile (
+  IN  CHAR8                     *FileName,
+  IN OUT  EFI_PHYSICAL_ADDRESS  *BaseAddress,
+  OUT UINT64                    *Length
+  )
+{
+  int     fd;
+  VOID    *res;
+  UINTN   FileSize;
+
+  fd = open (FileName, O_RDWR);
+  if (fd < 0) {
+    return EFI_NOT_FOUND;
+  }
+  FileSize = lseek (fd, 0, SEEK_END);
+
+
+  res = MapMemory (fd, FileSize, PROT_READ | PROT_EXEC, MAP_PRIVATE);
+
+  close (fd);
+
+  if (res == NULL) {
+    perror ("MapFile() Failed");
+    return EFI_DEVICE_ERROR;
+  }
+
+  *Length = (UINT64) FileSize;
+  *BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res;
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+MapFd0 (
+  IN  CHAR8                     *FileName,
+  IN OUT  EFI_PHYSICAL_ADDRESS  *BaseAddress,
+  OUT UINT64                    *Length
+  )
+{
+  int     fd;
+  void    *res, *res2, *res3;
+  UINTN   FileSize;
+  UINTN   FvSize;
+  void    *EmuMagicPage;
+
+  fd = open (FileName, O_RDWR);
+  if (fd < 0) {
+    return EFI_NOT_FOUND;
+  }
+  FileSize = lseek (fd, 0, SEEK_END);
+
+  FvSize = FixedPcdGet64 (PcdEmuFlashFvRecoverySize);
+
+  // Assume start of FD is Recovery FV, and make it write protected
+  res = mmap (
+          (void *)(UINTN)FixedPcdGet64 (PcdEmuFlashFvRecoveryBase),
+          FvSize,
+          PROT_READ | PROT_EXEC,
+          MAP_PRIVATE,
+          fd,
+          0
+          );
+  if (res == MAP_FAILED) {
+    perror ("MapFd0() Failed res =");
+    close (fd);
+    return EFI_DEVICE_ERROR;
+  } else if (res != (void *)(UINTN)FixedPcdGet64 (PcdEmuFlashFvRecoveryBase)) {
+    // We could not load at the build address, so we need to allow writes
+    munmap (res, FvSize);
+    res = mmap (
+            (void *)(UINTN)FixedPcdGet64 (PcdEmuFlashFvRecoveryBase),
+            FvSize,
+            PROT_READ | PROT_WRITE | PROT_EXEC,
+            MAP_PRIVATE,
+            fd,
+            0
+            );
+    if (res == MAP_FAILED) {
+      perror ("MapFd0() Failed res =");
+      close (fd);
+      return EFI_DEVICE_ERROR;
+    }
+  }
+
+  // Map the rest of the FD as read/write
+  res2 = mmap (
+          (void *)(UINTN)(FixedPcdGet64 (PcdEmuFlashFvRecoveryBase) + FvSize),
+          FileSize - FvSize,
+          PROT_READ | PROT_WRITE | PROT_EXEC,
+          MAP_SHARED,
+          fd,
+          FvSize
+          );
+  close (fd);
+  if (res2 == MAP_FAILED) {
+    perror ("MapFd0() Failed res2 =");
+    return EFI_DEVICE_ERROR;
+  }
+
+  //
+  // If enabled use the magic page to communicate between modules
+  // This replaces the PI PeiServicesTable pointer mechanism that
+  // deos not work in the emulator. It also allows the removal of
+  // writable globals from SEC, PEI_CORE (libraries), PEIMs
+  //
+  EmuMagicPage = (void *)(UINTN)FixedPcdGet64 (PcdPeiServicesTablePage);
+  if (EmuMagicPage != NULL) {
+    res3 =  mmap (
+              (void *)EmuMagicPage,
+              4096,
+              PROT_READ | PROT_WRITE,
+              MAP_PRIVATE | MAP_ANONYMOUS,
+              0,
+              0
+              );
+    if (res3 != EmuMagicPage) {
+      printf ("MapFd0(): Could not allocate PeiServicesTablePage @ %lx\n", (long unsigned int)EmuMagicPage);
+      return EFI_DEVICE_ERROR;
+    }
+  }
+
+  *Length = (UINT64) FileSize;
+  *BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res;
+
+  return EFI_SUCCESS;
+}
+
+
+/*++
+
+Routine Description:
+  This is the service to load the SEC Core from the Firmware Volume
+
+Arguments:
+  LargestRegion           - Memory to use for SEC.
+  LargestRegionSize       - Size of Memory to use for PEI
+  BootFirmwareVolumeBase  - Start of the Boot FV
+  PeiCorePe32File         - SEC PE32
+
+Returns:
+  Success means control is transfered and thus we should never return
+
+**/
+VOID
+SecLoadFromCore (
+  IN  UINTN   LargestRegion,
+  IN  UINTN   LargestRegionSize,
+  IN  UINTN   BootFirmwareVolumeBase,
+  IN  VOID    *PeiCorePe32File
+  )
+{
+  EFI_STATUS                  Status;
+  EFI_PHYSICAL_ADDRESS        TopOfMemory;
+  VOID                        *TopOfStack;
+  EFI_PHYSICAL_ADDRESS        PeiCoreEntryPoint;
+  EFI_SEC_PEI_HAND_OFF        *SecCoreData;
+  UINTN                       PeiStackSize;
+
+  //
+  // Compute Top Of Memory for Stack and PEI Core Allocations
+  //
+  TopOfMemory  = LargestRegion + LargestRegionSize;
+  PeiStackSize = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);
+
+  //
+  // |-----------| <---- TemporaryRamBase + TemporaryRamSize
+  // |   Heap    |
+  // |           |
+  // |-----------| <---- StackBase / PeiTemporaryMemoryBase
+  // |           |
+  // |  Stack    |
+  // |-----------| <---- TemporaryRamBase
+  //
+  TopOfStack  = (VOID *)(LargestRegion + PeiStackSize);
+  TopOfMemory = LargestRegion + PeiStackSize;
+
+  //
+  // Reservet space for storing PeiCore's parament in stack.
+  //
+  TopOfStack  = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);
+  TopOfStack  = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
+
+
+  //
+  // Bind this information into the SEC hand-off state
+  //
+  SecCoreData                         = (EFI_SEC_PEI_HAND_OFF*)(UINTN) TopOfStack;
+  SecCoreData->DataSize               = sizeof(EFI_SEC_PEI_HAND_OFF);
+  SecCoreData->BootFirmwareVolumeBase = (VOID*)BootFirmwareVolumeBase;
+  SecCoreData->BootFirmwareVolumeSize = PcdGet32 (PcdEmuFirmwareFdSize);
+  SecCoreData->TemporaryRamBase       = (VOID*)(UINTN)LargestRegion;
+  SecCoreData->TemporaryRamSize       = STACK_SIZE;
+  SecCoreData->StackBase              = SecCoreData->TemporaryRamBase;
+  SecCoreData->StackSize              = PeiStackSize;
+  SecCoreData->PeiTemporaryRamBase    = (VOID*) ((UINTN) SecCoreData->TemporaryRamBase + PeiStackSize);
+  SecCoreData->PeiTemporaryRamSize    = STACK_SIZE - PeiStackSize;
+
+  //
+  // Find the SEC Core Entry Point
+  //
+  Status = SecPeCoffGetEntryPoint (PeiCorePe32File, (VOID **)&PeiCoreEntryPoint);
+  if (EFI_ERROR (Status)) {
+    return ;
+  }
+
+  //
+  // Transfer control to the SEC Core
+  //
+  PeiSwitchStacks (
+    (SWITCH_STACK_ENTRY_POINT) (UINTN) PeiCoreEntryPoint,
+    SecCoreData,
+    (VOID *)gPpiList,
+    TopOfStack
+    );
+  //
+  // If we get here, then the SEC Core returned.  This is an error
+  //
+  return ;
+}
+
+
+/*++
+
+Routine Description:
+  This service is called from Index == 0 until it returns EFI_UNSUPPORTED.
+  It allows discontiguous memory regions to be supported by the emulator.
+  It uses gSystemMemory[] and gSystemMemoryCount that were created by
+  parsing the host environment variable EFI_MEMORY_SIZE.
+  The size comes from the varaible and the address comes from the call to
+  UnixOpenFile.
+
+Arguments:
+  Index      - Which memory region to use
+  MemoryBase - Return Base address of memory region
+  MemorySize - Return size in bytes of the memory region
+
+Returns:
+  EFI_SUCCESS - If memory region was mapped
+  EFI_UNSUPPORTED - If Index is not supported
+
+**/
+EFI_STATUS
+SecUnixPeiAutoScan (
+  IN  UINTN                 Index,
+  OUT EFI_PHYSICAL_ADDRESS  *MemoryBase,
+  OUT UINT64                *MemorySize
+  )
+{
+  void *res;
+
+  if (Index >= gSystemMemoryCount) {
+    return EFI_UNSUPPORTED;
+  }
+
+  *MemoryBase = 0;
+  res = MapMemory (
+          0, gSystemMemory[Index].Size,
+          PROT_READ | PROT_WRITE | PROT_EXEC,
+          MAP_PRIVATE | MAP_ANONYMOUS
+          );
+  if (res == MAP_FAILED) {
+    return EFI_DEVICE_ERROR;
+  }
+  *MemorySize = gSystemMemory[Index].Size;
+  *MemoryBase = (UINTN)res;
+  gSystemMemory[Index].Memory = *MemoryBase;
+
+  return EFI_SUCCESS;
+}
+
+
+/*++
+
+Routine Description:
+ Check to see if an address range is in the EFI GCD memory map.
+
+ This is all of GCD for system memory passed to DXE Core. FV
+ mapping and other device mapped into system memory are not
+ inlcuded in the check.
+
+Arguments:
+  Index      - Which memory region to use
+  MemoryBase - Return Base address of memory region
+  MemorySize - Return size in bytes of the memory region
+
+Returns:
+  TRUE -  Address is in the EFI GCD memory map
+  FALSE - Address is NOT in memory map
+
+**/
+BOOLEAN
+EfiSystemMemoryRange (
+  IN  VOID *MemoryAddress
+  )
+{
+  UINTN                 Index;
+  EFI_PHYSICAL_ADDRESS  MemoryBase;
+
+  MemoryBase = (EFI_PHYSICAL_ADDRESS)(UINTN)MemoryAddress;
+  for (Index = 0; Index < gSystemMemoryCount; Index++) {
+    if ((MemoryBase >= gSystemMemory[Index].Memory) &&
+        (MemoryBase < (gSystemMemory[Index].Memory + gSystemMemory[Index].Size)) ) {
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
+
+
+/*++
+
+Routine Description:
+  Since the SEC is the only Unix program in stack it must export
+  an interface to do POSIX calls.  gUnix is initailized in UnixThunk.c.
+
+Arguments:
+  InterfaceSize - sizeof (EFI_WIN_NT_THUNK_PROTOCOL);
+  InterfaceBase - Address of the gUnix global
+
+Returns:
+  EFI_SUCCESS - Data returned
+
+**/
+VOID *
+SecEmuThunkAddress (
+  VOID
+  )
+{
+  return &gEmuThunkProtocol;
+}
+
+
+
+RETURN_STATUS
+EFIAPI
+SecPeCoffGetEntryPoint (
+  IN     VOID  *Pe32Data,
+  IN OUT VOID  **EntryPoint
+  )
+{
+  EFI_STATUS                    Status;
+  PE_COFF_LOADER_IMAGE_CONTEXT  ImageContext;
+
+  ZeroMem (&ImageContext, sizeof (ImageContext));
+  ImageContext.Handle     = Pe32Data;
+  ImageContext.ImageRead  = (PE_COFF_LOADER_READ_FILE) SecImageRead;
+
+  Status                  = PeCoffLoaderGetImageInfo (&ImageContext);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  if (ImageContext.ImageAddress != (UINTN)Pe32Data) {
+    //
+    // Relocate image to match the address where it resides
+    //
+    ImageContext.ImageAddress = (UINTN)Pe32Data;
+    Status = PeCoffLoaderLoadImage (&ImageContext);
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    Status = PeCoffLoaderRelocateImage (&ImageContext);
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+  } else {
+    //
+    // Or just return image entry point
+    //
+    ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer (Pe32Data);
+    Status = PeCoffLoaderGetEntryPoint (Pe32Data, EntryPoint);
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+    ImageContext.EntryPoint = (UINTN)*EntryPoint;
+  }
+
+  // On Unix a dlopen is done that will change the entry point
+  SecPeCoffRelocateImageExtraAction (&ImageContext);
+  *EntryPoint = (VOID *)(UINTN)ImageContext.EntryPoint;
+
+  return Status;
+}
+
+
+
+/*++
+
+Routine Description:
+  Return the FD Size and base address. Since the FD is loaded from a
+  file into host memory only the SEC will know it's address.
+
+Arguments:
+  Index  - Which FD, starts at zero.
+  FdSize - Size of the FD in bytes
+  FdBase - Start address of the FD. Assume it points to an FV Header
+  FixUp  - Difference between actual FD address and build address
+
+Returns:
+  EFI_SUCCESS     - Return the Base address and size of the FV
+  EFI_UNSUPPORTED - Index does nto map to an FD in the system
+
+**/
+EFI_STATUS
+SecUnixFdAddress (
+  IN     UINTN                 Index,
+  IN OUT EFI_PHYSICAL_ADDRESS  *FdBase,
+  IN OUT UINT64                *FdSize,
+  IN OUT EFI_PHYSICAL_ADDRESS  *FixUp
+  )
+{
+  if (Index >= gFdInfoCount) {
+    return EFI_UNSUPPORTED;
+  }
+
+  *FdBase = gFdInfo[Index].Address;
+  *FdSize = gFdInfo[Index].Size;
+  *FixUp  = 0;
+
+  if (*FdBase == 0 && *FdSize == 0) {
+    return EFI_UNSUPPORTED;
+  }
+
+  if (Index == 0) {
+    //
+    // FD 0 has XIP code and well known PCD values
+    // If the memory buffer could not be allocated at the FD build address
+    // the Fixup is the difference.
+    //
+    *FixUp = *FdBase - PcdGet64 (PcdEmuFdBaseAddress);
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+/*++
+
+Routine Description:
+  Count the number of seperators in String
+
+Arguments:
+  String    - String to process
+  Seperator - Item to count
+
+Returns:
+  Number of Seperator in String
+
+**/
+UINTN
+CountSeperatorsInString (
+  IN  const CHAR16   *String,
+  IN  CHAR16         Seperator
+  )
+{
+  UINTN Count;
+
+  for (Count = 0; *String != '\0'; String++) {
+    if (*String == Seperator) {
+      Count++;
+    }
+  }
+
+  return Count;
+}
+
+
+EFI_STATUS
+EFIAPI
+SecImageRead (
+  IN     VOID    *FileHandle,
+  IN     UINTN   FileOffset,
+  IN OUT UINTN   *ReadSize,
+  OUT    VOID    *Buffer
+  )
+/*++
+
+Routine Description:
+  Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file
+
+Arguments:
+  FileHandle - The handle to the PE/COFF file
+  FileOffset - The offset, in bytes, into the file to read
+  ReadSize   - The number of bytes to read from the file starting at FileOffset
+  Buffer     - A pointer to the buffer to read the data into.
+
+Returns:
+  EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset
+
+**/
+{
+  CHAR8 *Destination8;
+  CHAR8 *Source8;
+  UINTN Length;
+
+  Destination8  = Buffer;
+  Source8       = (CHAR8 *) ((UINTN) FileHandle + FileOffset);
+  Length        = *ReadSize;
+  while (Length--) {
+    *(Destination8++) = *(Source8++);
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+/*++
+
+Routine Description:
+  Store the ModHandle in an array indexed by the Pdb File name.
+  The ModHandle is needed to unload the image.
+
+Arguments:
+  ImageContext - Input data returned from PE Laoder Library. Used to find the
+                 .PDB file name of the PE Image.
+  ModHandle    - Returned from LoadLibraryEx() and stored for call to
+                 FreeLibrary().
+
+Returns:
+  EFI_SUCCESS - ModHandle was stored.
+
+**/
+EFI_STATUS
+AddHandle (
+  IN  PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext,
+  IN  VOID                                 *ModHandle
+  )
+{
+  UINTN                       Index;
+  IMAGE_CONTEXT_TO_MOD_HANDLE *Array;
+  UINTN                       PreviousSize;
+
+
+  Array = mImageContextModHandleArray;
+  for (Index = 0; Index < mImageContextModHandleArraySize; Index++, Array++) {
+    if (Array->ImageContext == NULL) {
+      //
+      // Make a copy of the stirng and store the ModHandle
+      //
+      Array->ImageContext = ImageContext;
+      Array->ModHandle    = ModHandle;
+      return EFI_SUCCESS;
+    }
+  }
+
+  //
+  // No free space in mImageContextModHandleArray so grow it by
+  // IMAGE_CONTEXT_TO_MOD_HANDLE entires. realloc will
+  // copy the old values to the new locaiton. But it does
+  // not zero the new memory area.
+  //
+  PreviousSize = mImageContextModHandleArraySize * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE);
+  mImageContextModHandleArraySize += MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE;
+
+  mImageContextModHandleArray = ReallocatePool (
+                                  (mImageContextModHandleArraySize - 1) * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE),
+                                  mImageContextModHandleArraySize * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE),
+                                  mImageContextModHandleArray
+                                  );
+  if (mImageContextModHandleArray == NULL) {
+    ASSERT (FALSE);
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  memset (mImageContextModHandleArray + PreviousSize, 0, MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE));
+
+  return AddHandle (ImageContext, ModHandle);
+}
+
+
+/*++
+
+Routine Description:
+  Return the ModHandle and delete the entry in the array.
+
+Arguments:
+  ImageContext - Input data returned from PE Laoder Library. Used to find the
+                 .PDB file name of the PE Image.
+
+Returns:
+  ModHandle - ModHandle assoicated with ImageContext is returned
+  NULL      - No ModHandle associated with ImageContext
+
+**/
+VOID *
+RemoveHandle (
+  IN  PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
+  )
+{
+  UINTN                        Index;
+  IMAGE_CONTEXT_TO_MOD_HANDLE  *Array;
+
+  if (ImageContext->PdbPointer == NULL) {
+    //
+    // If no PDB pointer there is no ModHandle so return NULL
+    //
+    return NULL;
+  }
+
+  Array = mImageContextModHandleArray;
+  for (Index = 0; Index < mImageContextModHandleArraySize; Index++, Array++) {
+    if (Array->ImageContext == ImageContext) {
+      //
+      // If you find a match return it and delete the entry
+      //
+      Array->ImageContext = NULL;
+      return Array->ModHandle;
+    }
+  }
+
+  return NULL;
+}
+
+
+
+BOOLEAN
+IsPdbFile (
+  IN  CHAR8   *PdbFileName
+  )
+{
+  UINTN Len;
+
+  if (PdbFileName == NULL) {
+    return FALSE;
+  }
+
+  Len = strlen (PdbFileName);
+  if ((Len < 5)|| (PdbFileName[Len - 4] != '.')) {
+    return FALSE;
+  }
+
+  if ((PdbFileName[Len - 3] == 'P' || PdbFileName[Len - 3] == 'p') &&
+      (PdbFileName[Len - 2] == 'D' || PdbFileName[Len - 2] == 'd') &&
+      (PdbFileName[Len - 1] == 'B' || PdbFileName[Len - 1] == 'b')) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+
+#define MAX_SPRINT_BUFFER_SIZE 0x200
+
+void
+PrintLoadAddress (
+  IN PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext
+  )
+{
+  if (ImageContext->PdbPointer == NULL) {
+    fprintf (stderr,
+      "0x%08lx Loading NO DEBUG with entry point 0x%08lx\n",
+      (unsigned long)(ImageContext->ImageAddress),
+      (unsigned long)ImageContext->EntryPoint
+      );
+  } else {
+    fprintf (stderr,
+      "0x%08lx Loading %s with entry point 0x%08lx\n",
+      (unsigned long)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders),
+      ImageContext->PdbPointer,
+      (unsigned long)ImageContext->EntryPoint
+      );
+  }
+  // Keep output synced up
+  fflush (stderr);
+}
+
+
+/**
+  Loads the image using dlopen so symbols will be automatically
+  loaded by gdb.
+
+  @param  ImageContext  The PE/COFF image context
+
+  @retval TRUE - The image was successfully loaded
+  @retval FALSE - The image was successfully loaded
+
+**/
+BOOLEAN
+DlLoadImage (
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
+  )
+{
+
+#ifdef __APPLE__
+
+  return FALSE;
+
+#else
+
+  void        *Handle = NULL;
+  void        *Entry = NULL;
+
+  if (ImageContext->PdbPointer == NULL) {
+    return FALSE;
+  }
+
+  if (!IsPdbFile (ImageContext->PdbPointer)) {
+    return FALSE;
+  }
+
+  fprintf (
+     stderr,
+     "Loading %s 0x%08lx - entry point 0x%08lx\n",
+     ImageContext->PdbPointer,
+     (unsigned long)ImageContext->ImageAddress,
+     (unsigned long)ImageContext->EntryPoint
+     );
+
+  Handle = dlopen (ImageContext->PdbPointer, RTLD_NOW);
+  if (Handle != NULL) {
+    Entry = dlsym (Handle, "_ModuleEntryPoint");
+    AddHandle (ImageContext, Handle);
+  } else {
+    printf("%s\n", dlerror());
+  }
+
+  if (Entry != NULL) {
+    ImageContext->EntryPoint = (UINTN)Entry;
+    printf ("Change %s Entrypoint to :0x%08lx\n", ImageContext->PdbPointer, (unsigned long)Entry);
+    return TRUE;
+  } else {
+    return FALSE;
+  }
+
+#endif
+}
+
+
+/**
+  Adds the image to a gdb script so it's symbols can be loaded.
+  The AddFirmwareSymbolFile helper macro is used.
+
+  @param  ImageContext  The PE/COFF image context
+
+**/
+VOID
+GdbScriptAddImage (
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
+  )
+{
+
+  PrintLoadAddress (ImageContext);
+
+  if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) {
+    FILE  *GdbTempFile;
+    GdbTempFile = fopen (gGdbWorkingFileName, "a");
+    if (GdbTempFile != NULL) {
+      long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders);
+      mScriptSymbolChangesCount++;
+      fprintf (
+        GdbTempFile,
+        "AddFirmwareSymbolFile 0x%x %s 0x%08lx\n",
+        mScriptSymbolChangesCount,
+        ImageContext->PdbPointer,
+        SymbolsAddr
+        );
+      fclose (GdbTempFile);
+    } else {
+      ASSERT (FALSE);
+    }
+  }
+}
+
+
+VOID
+EFIAPI
+SecPeCoffRelocateImageExtraAction (
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
+  )
+{
+  if (!DlLoadImage (ImageContext)) {
+    GdbScriptAddImage (ImageContext);
+  }
+}
+
+
+/**
+  Adds the image to a gdb script so it's symbols can be unloaded.
+  The RemoveFirmwareSymbolFile helper macro is used.
+
+  @param  ImageContext  The PE/COFF image context
+
+**/
+VOID
+GdbScriptRemoveImage (
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
+  )
+{
+  FILE  *GdbTempFile;
+
+  //
+  // Need to skip .PDB files created from VC++
+  //
+  if (IsPdbFile (ImageContext->PdbPointer)) {
+    return;
+  }
+
+  //
+  // Write the file we need for the gdb script
+  //
+  GdbTempFile = fopen (gGdbWorkingFileName, "a");
+  if (GdbTempFile != NULL) {
+    mScriptSymbolChangesCount++;
+    fprintf (
+      GdbTempFile,
+      "RemoveFirmwareSymbolFile 0x%x %s\n",
+      mScriptSymbolChangesCount,
+      ImageContext->PdbPointer
+      );
+    fclose (GdbTempFile);
+  } else {
+    ASSERT (FALSE);
+  }
+}
+
+
+VOID
+EFIAPI
+SecPeCoffUnloadImageExtraAction (
+  IN PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
+  )
+{
+  VOID *Handle;
+
+  //
+  // Check to see if the image symbols were loaded with gdb script, or dlopen
+  //
+  Handle = RemoveHandle (ImageContext);
+  if (Handle != NULL) {
+#ifndef __APPLE__
+    dlclose (Handle);
+#endif
+    return;
+  }
+
+  GdbScriptRemoveImage (ImageContext);
+}
+
+
diff --git a/EmulatorPkg/Unix/Host/Host.h b/EmulatorPkg/Unix/Host/Host.h
new file mode 100644 (file)
index 0000000..aff7c36
--- /dev/null
@@ -0,0 +1,356 @@
+/*++ @file\r
+\r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+\r
+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 _SEC_MAIN_H__\r
+#define _SEC_MAIN_H__\r
+\r
+//\r
+// Name mangle to prevent build errors. I.e conflicts between EFI and OS\r
+//\r
+#define NTOHL   _UNIX_EFI_NAME_MANGLE_NTOHL_\r
+#define HTONL   _UNIX_EFI_NAME_MANGLE_HTONL_\r
+#define NTOHS   _UNIX_EFI_NAME_MANGLE_NTOHS_\r
+#define HTONS   _UNIX_EFI_NAME_MANGLE_HTOHS_\r
+#define B0      _UNIX_EFI_NAME_MANGLE_B0_\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <sys/termios.h>\r
+#include <sys/time.h>\r
+\r
+#if __CYGWIN__\r
+#include <sys/dirent.h>\r
+#else\r
+#include <sys/dir.h>\r
+#endif\r
+\r
+#include <sys/mman.h>\r
+#include <dlfcn.h>\r
+\r
+#include <unistd.h>\r
+#include <poll.h>\r
+#include <fcntl.h>\r
+#include <time.h>\r
+#include <signal.h>\r
+#include <errno.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#include <sys/ioctl.h>\r
+#include <sys/statvfs.h>\r
+\r
+#include <sys/socket.h>\r
+#include <netdb.h>\r
+#include <netinet/in.h>\r
+#include <net/if.h>\r
+#include <ifaddrs.h>\r
+\r
+#ifdef __APPLE__\r
+#include <net/if_dl.h>\r
+#include <net/bpf.h>\r
+#include <sys/param.h>\r
+#include <sys/mount.h>\r
+#include <sys/disk.h>\r
+#define _XOPEN_SOURCE\r
+#ifndef _Bool\r
+  #define _Bool char // for clang debug\r
+#endif\r
+#else\r
+#include <termio.h>\r
+#include <sys/vfs.h>\r
+#include <linux/fs.h>\r
+#endif\r
+\r
+#include <utime.h>\r
+\r
+#undef NTOHL\r
+#undef HTONL\r
+#undef NTOHS\r
+#undef HTONS\r
+#undef B0\r
+\r
+\r
+#include <PiPei.h>\r
+#include <Uefi.h>\r
+\r
+#include <Library/PeCoffLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/PrintLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/ReportStatusCodeLib.h>\r
+\r
+#include <Library/ThunkPpiList.h>\r
+#include <Library/ThunkProtocolList.h>\r
+#include <Library/PeiServicesLib.h>\r
+#include <Library/PeCoffGetEntryPointLib.h>\r
+#include <Library/EmuMagicPageLib.h>\r
+\r
+#include <Ppi/EmuThunk.h>\r
+#include <Ppi/StatusCode.h>\r
+\r
+#include <Protocol/SimplePointer.h>\r
+#include <Protocol/SimpleTextIn.h>\r
+#include <Protocol/SimpleTextInEx.h>\r
+#include <Protocol/UgaDraw.h>\r
+#include <Protocol/SimpleFileSystem.h>\r
+\r
+#include <Protocol/EmuThunk.h>\r
+#include <Protocol/EmuIoThunk.h>\r
+#include <Protocol/EmuGraphicsWindow.h>\r
+#include <Protocol/EmuThread.h>\r
+#include <Protocol/EmuBlockIo.h>\r
+#include <Protocol/EmuSnp.h>\r
+\r
+#include <Guid/FileInfo.h>\r
+#include <Guid/FileSystemInfo.h>\r
+#include <Guid/FileSystemVolumeLabelInfo.h>\r
+\r
+\r
+#include "Gasket.h"\r
+\r
+\r
+#define STACK_SIZE                0x20000\r
+\r
+typedef struct {\r
+  EFI_PHYSICAL_ADDRESS  Address;\r
+  UINT64                Size;\r
+} EMU_FD_INFO;\r
+\r
+typedef struct {\r
+  EFI_PHYSICAL_ADDRESS  Memory;\r
+  UINT64                Size;\r
+} EMU_SYSTEM_MEMORY;\r
+\r
+\r
+#define MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE 0x100\r
+\r
+typedef struct {\r
+  PE_COFF_LOADER_IMAGE_CONTEXT   *ImageContext;\r
+  VOID                           *ModHandle;\r
+} IMAGE_CONTEXT_TO_MOD_HANDLE;\r
+\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SecUnixPeiLoadFile (\r
+  VOID                  *Pe32Data,\r
+  EFI_PHYSICAL_ADDRESS  *ImageAddress,\r
+  UINT64                *ImageSize,\r
+  EFI_PHYSICAL_ADDRESS  *EntryPoint\r
+  );\r
+\r
+int\r
+main (\r
+  IN  int   Argc,\r
+  IN  char  **Argv,\r
+  IN  char  **Envp\r
+  );\r
+\r
+VOID\r
+SecLoadFromCore (\r
+  IN  UINTN   LargestRegion,\r
+  IN  UINTN   LargestRegionSize,\r
+  IN  UINTN   BootFirmwareVolumeBase,\r
+  IN  VOID    *PeiCoreFile\r
+  );\r
+\r
+EFI_STATUS\r
+SecLoadFile (\r
+  IN  VOID                    *Pe32Data,\r
+  IN  EFI_PHYSICAL_ADDRESS    *ImageAddress,\r
+  IN  UINT64                  *ImageSize,\r
+  IN  EFI_PHYSICAL_ADDRESS    *EntryPoint\r
+  );\r
+\r
+EFI_STATUS\r
+SecFfsFindPeiCore (\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader,\r
+  OUT VOID                        **Pe32Data\r
+  );\r
+\r
+EFI_STATUS\r
+SecFfsFindNextFile (\r
+  IN EFI_FV_FILETYPE             SearchType,\r
+  IN EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader,\r
+  IN OUT EFI_FFS_FILE_HEADER     **FileHeader\r
+  );\r
+\r
+EFI_STATUS\r
+SecFfsFindSectionData (\r
+  IN EFI_SECTION_TYPE      SectionType,\r
+  IN EFI_FFS_FILE_HEADER   *FfsFileHeader,\r
+  IN OUT VOID              **SectionData\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SecUnixPeCoffLoaderLoadAsDll (\r
+  IN CHAR8    *PdbFileName,\r
+  IN VOID     **ImageEntryPoint,\r
+  OUT VOID    **ModHandle\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SecUnixPeCoffLoaderFreeLibrary (\r
+  OUT VOID    *ModHandle\r
+  );\r
+\r
+EFI_STATUS\r
+SecUnixFdAddress (\r
+  IN     UINTN                 Index,\r
+  IN OUT EFI_PHYSICAL_ADDRESS  *FdBase,\r
+  IN OUT UINT64                *FdSize,\r
+  IN OUT EFI_PHYSICAL_ADDRESS  *FixUp\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+GasketSecUnixFdAddress (\r
+  IN     UINTN                 Index,\r
+  IN OUT EFI_PHYSICAL_ADDRESS  *FdBase,\r
+  IN OUT UINT64                *FdSize,\r
+  IN OUT EFI_PHYSICAL_ADDRESS  *FixUp\r
+  )\r
+;\r
+\r
+\r
+EFI_STATUS\r
+GetImageReadFunction (\r
+  IN PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext,\r
+  IN EFI_PHYSICAL_ADDRESS                  *TopOfMemory\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SecImageRead (\r
+  IN     VOID    *FileHandle,\r
+  IN     UINTN   FileOffset,\r
+  IN OUT UINTN   *ReadSize,\r
+  OUT    VOID    *Buffer\r
+  );\r
+\r
+CHAR16                            *\r
+AsciiToUnicode (\r
+  IN  CHAR8   *Ascii,\r
+  IN  UINTN   *StrLen OPTIONAL\r
+  );\r
+\r
+UINTN\r
+CountSeperatorsInString (\r
+  IN  const CHAR16   *String,\r
+  IN  CHAR16   Seperator\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
+EFI_STATUS\r
+EFIAPI\r
+GasketSecTemporaryRamSupport (\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
+RETURN_STATUS\r
+EFIAPI\r
+SecPeCoffGetEntryPoint (\r
+  IN     VOID  *Pe32Data,\r
+  IN OUT VOID  **EntryPoint\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+SecPeCoffRelocateImageExtraAction (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+SecPeCoffLoaderUnloadImageExtraAction (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  );\r
+\r
+\r
+VOID\r
+PeiSwitchStacks (\r
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *NewStack\r
+  );\r
+\r
+VOID\r
+SecInitThunkProtocol (\r
+  VOID\r
+  );\r
+\r
+\r
+EFI_PHYSICAL_ADDRESS *\r
+MapMemory (\r
+  INTN fd,\r
+  UINT64 length,\r
+  INTN   prot,\r
+  INTN   flags);\r
+\r
+EFI_STATUS\r
+MapFile (\r
+  IN  CHAR8                     *FileName,\r
+  IN OUT  EFI_PHYSICAL_ADDRESS  *BaseAddress,\r
+  OUT UINT64                    *Length\r
+  );\r
+\r
+EFI_STATUS\r
+MapFd0 (\r
+  IN  CHAR8                     *FileName,\r
+  IN OUT  EFI_PHYSICAL_ADDRESS  *BaseAddress,\r
+  OUT UINT64                    *Length\r
+  );\r
+\r
+BOOLEAN\r
+EfiSystemMemoryRange (\r
+  IN  VOID *MemoryAddress\r
+  );\r
+\r
+\r
+VOID SecSleep (UINT64 Nanoseconds);\r
+VOID SecEnableInterrupt (VOID);\r
+VOID SecDisableInterrupt (VOID);\r
+BOOLEAN SecInterruptEanbled (VOID);\r
+\r
+\r
+extern EMU_THUNK_PROTOCOL    gEmuThunkProtocol;\r
+extern EMU_IO_THUNK_PROTOCOL gX11ThunkIo;\r
+extern EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo;\r
+extern EMU_IO_THUNK_PROTOCOL gPthreadThunkIo;\r
+extern EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo;\r
+extern EMU_IO_THUNK_PROTOCOL gSnpThunkIo;\r
+\r
+#endif\r
diff --git a/EmulatorPkg/Unix/Host/Host.inf b/EmulatorPkg/Unix/Host/Host.inf
new file mode 100644 (file)
index 0000000..c2d1669
--- /dev/null
@@ -0,0 +1,140 @@
+## @file\r
+# Entry Point of Emu Emulator\r
+#\r
+# Main executable file of Unix Emulator that loads PEI core after initialization finished.\r
+# Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>\r
+# Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+#\r
+#  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
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = Host\r
+  FILE_GUID                      = 8863C0AD-7724-C84B-88E5-A33B116D1485\r
+  MODULE_TYPE                    = USER_DEFINED\r
+  VERSION_STRING                 = 1.0\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
+[Sources]\r
+  Host.c\r
+  EmuThunk.c\r
+  X11GraphicsWindow.c\r
+  Pthreads.c\r
+  PosixFileSystem.c\r
+  BlockIo.c\r
+  LinuxPacketFilter.c\r
+  BerkeleyPacketFilter.c\r
+  MemoryAllocationLib.c\r
+\r
+[Sources.X64]\r
+  X64/Gasket.S        # convert between Emu x86_64 ABI and EFI X64 ABI\r
+  X64/SwitchStack.S\r
+\r
+[Sources.IA32]\r
+  Ia32/Gasket.S       # enforce 16-byte stack alignment for Mac OS X\r
+  Ia32/SwitchStack.c\r
+\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
+  EmulatorPkg/EmulatorPkg.dec\r
+\r
+[LibraryClasses]\r
+  DebugLib\r
+  PcdLib\r
+  PrintLib\r
+  BaseMemoryLib\r
+  BaseLib\r
+  PeCoffLib\r
+  ThunkPpiList\r
+  ThunkProtocolList\r
+  PpiListLib\r
+  PeiServicesLib\r
+  PeCoffGetEntryPointLib\r
+\r
+[Ppis]\r
+  gEfiPeiStatusCodePpiGuid                      # PPI ALWAYS_PRODUCED\r
+  gEmuThunkPpiGuid\r
+\r
+[Protocols]\r
+  gEmuIoThunkProtocolGuid\r
+  gEmuIoThunkProtocolGuid\r
+  gEmuGraphicsWindowProtocolGuid\r
+  gEmuThreadThunkProtocolGuid\r
+  gEmuBlockIoProtocolGuid\r
+  gEmuSnpProtocolGuid\r
+  gEfiSimpleFileSystemProtocolGuid\r
+\r
+[Guids]\r
+  gEfiFileSystemVolumeLabelInfoIdGuid           # SOMETIMES_CONSUMED\r
+  gEfiFileInfoGuid                              # SOMETIMES_CONSUMED\r
+  gEfiFileSystemInfoGuid                        # SOMETIMES_CONSUMED\r
+\r
+[Pcd]\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuBootMode\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareVolume\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuMemorySize\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFdBaseAddress\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareBlockSize\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuApCount\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuVirtualDisk\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuGop|L"GOP Window"\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFileSystem\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuSerialPort\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuNetworkInterface\r
+  gEmulatorPkgTokenSpaceGuid.PcdNetworkPacketFilterSize\r
+\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoveryBase\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoverySize\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageVariableBase\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogBase\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogSize\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwWorkingBase\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwSpareBase\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize\r
+  gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage\r
+\r
+\r
+[BuildOptions]\r
+   GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/Host -m elf_i386 -dynamic-linker /lib$(LIB_ARCH_SFX)/ld-linux.so.2 /usr/lib$(LIB_ARCH_SFX)/crt1.o /usr/lib$(LIB_ARCH_SFX)/crti.o -L/usr/X11R6/lib -lXext -lX11 /usr/lib$(LIB_ARCH_SFX)/crtn.o\r
+   GCC:*_*_*_DLINK2_FLAGS == -lpthread -lc\r
+   GCC:*_*_IA32_CC_FLAGS == -m32 -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -idirafter/usr/include -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings\r
+   GCC:*_*_IA32_PP_FLAGS == -m32 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h\r
+   GCC:*_*_IA32_ASM_FLAGS == -m32 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h\r
+\r
+   GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/Host -m elf_x86_64 -dynamic-linker /lib$(LIB_ARCH_SFX)/ld-linux-x86-64.so.2 /usr/lib$(LIB_ARCH_SFX)/crt1.o /usr/lib$(LIB_ARCH_SFX)/crti.o -L/usr/X11R6/lib -lXext -lX11 /usr/lib$(LIB_ARCH_SFX)/crtn.o\r
+   GCC:*_*_X64_CC_FLAGS == -m64 -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -idirafter/usr/include -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings\r
+   GCC:*_GCC44_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))"\r
+   GCC:*_GCC45_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))"\r
+   GCC:*_*_X64_PP_FLAGS == -m64 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h\r
+   GCC:*_*_X64_ASM_FLAGS == -m64 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h\r
+\r
+#\r
+# Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version\r
+#\r
+   XCODE:*_*_IA32_DLINK_PATH == gcc\r
+   XCODE:*_*_IA32_CC_FLAGS == -arch i386 -O0 -g -include $(DEST_DIR_DEBUG)/AutoGen.h -c -fshort-wchar -fno-strict-aliasing\r
+   XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/Host -L/usr/X11R6/lib -lXext -lX11 -framework Carbon\r
+   XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g\r
+\r
+   XCODE:*_*_X64_DLINK_PATH == gcc\r
+   XCODE:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/Host -L/usr/X11R6/lib -lXext -lX11 -framework Carbon\r
+   XCODE:*_*_X64_ASM_FLAGS == -g\r
+\r
index 1d36500e788640dc550958936094cc5073ea7b5e..118083f4b52349d2938f03a9eb65e082af224f67 100644 (file)
@@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 --*/
 
-#include "SecMain.h"
+#include "Host.h"
 
 
 /**
index 41124f72ebff909899138a71541e22c316831780..15e4bc95437e74bcf972e844a59e972328e47965 100644 (file)
@@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 \r
-#include "SecMain.h"\r
+#include "Host.h"\r
 \r
 #ifndef __APPLE__\r
 \r
index aab7161b7f4b74e5f21436b12983d7f3c6fd4aed..40b412e5f2dada2988c8e645d48ede3e89a70149 100644 (file)
@@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 **/
 
-#include "SecMain.h"
+#include "Host.h"
 
 
 #define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 's')
index 36d12986513d7462e8121ffa44d005cc2405080d..c60c298099e5f4e49e9b421d18f70be0600bfd00 100644 (file)
@@ -15,7 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 **/
 
-#include "SecMain.h"
+#include "Host.h"
 #include <pthread.h>
 
 
diff --git a/EmulatorPkg/Unix/Host/SecMain.c b/EmulatorPkg/Unix/Host/SecMain.c
deleted file mode 100644 (file)
index a0af3e4..0000000
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*++ @file
-
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "SecMain.h"
-
-#ifdef __APPLE__
-#define MAP_ANONYMOUS MAP_ANON
-#endif
-
-
-//
-// Globals
-//
-
-EMU_THUNK_PPI mSecEmuThunkPpi = {
-  GasketSecUnixPeiAutoScan,
-  GasketSecUnixFdAddress,
-  GasketSecEmuThunkAddress
-};
-
-char *gGdbWorkingFileName = NULL;
-unsigned int mScriptSymbolChangesCount = 0;
-
-
-//
-// Default information about where the FD is located.
-//  This array gets filled in with information from EFI_FIRMWARE_VOLUMES
-//  EFI_FIRMWARE_VOLUMES is a host environment variable set by system.cmd.
-//  The number of array elements is allocated base on parsing
-//  EFI_FIRMWARE_VOLUMES and the memory is never freed.
-//
-UINTN       gFdInfoCount = 0;
-EMU_FD_INFO *gFdInfo;
-
-//
-// Array that supports seperate memory rantes.
-//  The memory ranges are set in system.cmd via the EFI_MEMORY_SIZE variable.
-//  The number of array elements is allocated base on parsing
-//  EFI_MEMORY_SIZE and the memory is never freed.
-//
-UINTN              gSystemMemoryCount = 0;
-EMU_SYSTEM_MEMORY  *gSystemMemory;
-
-
-
-UINTN                        mImageContextModHandleArraySize = 0;
-IMAGE_CONTEXT_TO_MOD_HANDLE  *mImageContextModHandleArray = NULL;
-
-EFI_PEI_PPI_DESCRIPTOR  *gPpiList;
-
-
-int gInXcode = 0;
-
-
-/*++
-  Breakpoint target for Xcode project. Set in the Xcode XML
-
-  Xcode breakpoint will 'source SecMain.gdb'
-  gGdbWorkingFileName is set to SecMain.gdb
-
-**/
-VOID
-SecGdbConfigBreak (
-  VOID
-  )
-{
-}
-
-
-
-/*++
-
-Routine Description:
-  Main entry point to SEC for Unix. This is a unix program
-
-Arguments:
-  Argc - Number of command line arguments
-  Argv - Array of command line argument strings
-  Envp - Array of environmemt variable strings
-
-Returns:
-  0 - Normal exit
-  1 - Abnormal exit
-
-**/
-int
-main (
-  IN  int   Argc,
-  IN  char  **Argv,
-  IN  char  **Envp
-  )
-{
-  EFI_STATUS            Status;
-  EFI_PHYSICAL_ADDRESS  InitialStackMemory;
-  UINT64                InitialStackMemorySize;
-  UINTN                 Index;
-  UINTN                 Index1;
-  UINTN                 Index2;
-  UINTN                 PeiIndex;
-  CHAR8                 *FileName;
-  BOOLEAN               Done;
-  EFI_PEI_FILE_HANDLE   FileHandle;
-  VOID                  *SecFile;
-  CHAR16                *MemorySizeStr;
-  CHAR16                *FirmwareVolumesStr;
-  UINTN                 *StackPointer;
-  FILE                  *GdbTempFile;
-
-  //
-  // Xcode does not support sourcing gdb scripts directly, so the Xcode XML
-  // has a break point script to source the GdbRun script.
-  //
-  SecGdbConfigBreak ();
-
-  //
-  // If dlopen doesn't work, then we build a gdb script to allow the
-  // symbols to be loaded.
-  //
-  Index = strlen (*Argv);
-  gGdbWorkingFileName = AllocatePool (Index + strlen(".gdb") + 1);
-  strcpy (gGdbWorkingFileName, *Argv);
-  strcat (gGdbWorkingFileName, ".gdb");
-
-  //
-  // Empty out the gdb symbols script file.
-  //
-  GdbTempFile = fopen (gGdbWorkingFileName, "w");
-  if (GdbTempFile != NULL) {
-    fclose (GdbTempFile);
-  }
-
-  printf ("\nEDK II UNIX Host Emulation Environment from edk2.sourceforge.net\n");
-
-  setbuf (stdout, 0);
-  setbuf (stderr, 0);
-
-  MemorySizeStr      = (CHAR16 *) PcdGetPtr (PcdEmuMemorySize);
-  FirmwareVolumesStr = (CHAR16 *) PcdGetPtr (PcdEmuFirmwareVolume);
-
-  //
-  // PPIs pased into PEI_CORE
-  //
-  AddThunkPpi (EFI_PEI_PPI_DESCRIPTOR_PPI, &gEmuThunkPpiGuid, &mSecEmuThunkPpi);
-
-  SecInitThunkProtocol ();
-
-  //
-  // Emulator Bus Driver Thunks
-  //
-  AddThunkProtocol (&gX11ThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuGop), TRUE);
-  AddThunkProtocol (&gPosixFileSystemThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuFileSystem), TRUE);
-  AddThunkProtocol (&gBlockIoThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuVirtualDisk), TRUE);
-  AddThunkProtocol (&gSnpThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuNetworkInterface), TRUE);
-
-  //
-  // Emulator other Thunks
-  //
-  AddThunkProtocol (&gPthreadThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuApCount), FALSE);
-
-  // EmuSecLibConstructor ();
-
-  gPpiList = GetThunkPpiList ();
-
-  //
-  // Allocate space for gSystemMemory Array
-  //
-  gSystemMemoryCount  = CountSeperatorsInString (MemorySizeStr, '!') + 1;
-  gSystemMemory       = AllocateZeroPool (gSystemMemoryCount * sizeof (EMU_SYSTEM_MEMORY));
-  if (gSystemMemory == NULL) {
-    printf ("ERROR : Can not allocate memory for system.  Exiting.\n");
-    exit (1);
-  }
-  //
-  // Allocate space for gSystemMemory Array
-  //
-  gFdInfoCount  = CountSeperatorsInString (FirmwareVolumesStr, '!') + 1;
-  gFdInfo       = AllocateZeroPool (gFdInfoCount * sizeof (EMU_FD_INFO));
-  if (gFdInfo == NULL) {
-    printf ("ERROR : Can not allocate memory for fd info.  Exiting.\n");
-    exit (1);
-  }
-
-  printf ("  BootMode 0x%02x\n", (unsigned int)PcdGet32 (PcdEmuBootMode));
-
-  //
-  // Open up a 128K file to emulate temp memory for SEC.
-  //  on a real platform this would be SRAM, or using the cache as RAM.
-  //  Set InitialStackMemory to zero so UnixOpenFile will allocate a new mapping
-  //
-  InitialStackMemorySize  = STACK_SIZE;
-  InitialStackMemory = (UINTN)MapMemory (
-                                0, (UINT32) InitialStackMemorySize,
-                                PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE
-                                );
-  if (InitialStackMemory == 0) {
-    printf ("ERROR : Can not open SecStack Exiting\n");
-    exit (1);
-  }
-
-  printf ("  OS Emulator passing in %u KB of temp RAM at 0x%08lx to SEC\n",
-    (unsigned int)(InitialStackMemorySize / 1024),
-    (unsigned long)InitialStackMemory
-    );
-
-  for (StackPointer = (UINTN*) (UINTN) InitialStackMemory;
-     StackPointer < (UINTN*)(UINTN)((UINTN) InitialStackMemory + (UINT64) InitialStackMemorySize);
-     StackPointer ++) {
-    *StackPointer = 0x5AA55AA5;
-  }
-
-  //
-  // Open All the firmware volumes and remember the info in the gFdInfo global
-  //
-  FileName = (CHAR8 *) AllocatePool (StrLen (FirmwareVolumesStr) + 1);
-  if (FileName == NULL) {
-    printf ("ERROR : Can not allocate memory for firmware volume string\n");
-    exit (1);
-  }
-
-  Index2 = 0;
-  for (Done = FALSE, Index = 0, PeiIndex = 0, SecFile = NULL;
-       FirmwareVolumesStr[Index2] != 0;
-       Index++) {
-    for (Index1 = 0; (FirmwareVolumesStr[Index2] != '!') && (FirmwareVolumesStr[Index2] != 0); Index2++) {
-      FileName[Index1++] = FirmwareVolumesStr[Index2];
-    }
-    if (FirmwareVolumesStr[Index2] == '!') {
-      Index2++;
-    }
-    FileName[Index1]  = '\0';
-
-    if (Index == 0) {
-      // Map FV Recovery Read Only and other areas Read/Write
-      Status = MapFd0 (
-                FileName,
-                &gFdInfo[0].Address,
-                &gFdInfo[0].Size
-                );
-    } else {
-      //
-      // Open the FD and remmeber where it got mapped into our processes address space
-      // Maps Read Only
-      //
-      Status = MapFile (
-                FileName,
-                &gFdInfo[Index].Address,
-                &gFdInfo[Index].Size
-                );
-    }
-    if (EFI_ERROR (Status)) {
-      printf ("ERROR : Can not open Firmware Device File %s (%x).  Exiting.\n", FileName, (unsigned int)Status);
-      exit (1);
-    }
-
-    printf ("  FD loaded from %s at 0x%08lx",FileName, (unsigned long)gFdInfo[Index].Address);
-
-    if (SecFile == NULL) {
-      //
-      // Assume the beginning of the FD is an FV and look for the SEC Core.
-      // Load the first one we find.
-      //
-      FileHandle = NULL;
-      Status = PeiServicesFfsFindNextFile (
-                  EFI_FV_FILETYPE_SECURITY_CORE,
-                  (EFI_PEI_FV_HANDLE)(UINTN)gFdInfo[Index].Address,
-                  &FileHandle
-                  );
-      if (!EFI_ERROR (Status)) {
-        Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &SecFile);
-        if (!EFI_ERROR (Status)) {
-          PeiIndex = Index;
-          printf (" contains SEC Core");
-        }
-      }
-    }
-
-    printf ("\n");
-  }
-  //
-  // Calculate memory regions and store the information in the gSystemMemory
-  //  global for later use. The autosizing code will use this data to
-  //  map this memory into the SEC process memory space.
-  //
-  Index1 = 0;
-  Index = 0;
-  while (1) {
-    UINTN val = 0;
-    //
-    // Save the size of the memory.
-    //
-    while (MemorySizeStr[Index1] >= '0' && MemorySizeStr[Index1] <= '9') {
-      val = val * 10 + MemorySizeStr[Index1] - '0';
-      Index1++;
-    }
-    gSystemMemory[Index++].Size = val * 0x100000;
-    if (MemorySizeStr[Index1] == 0) {
-      break;
-    }
-    Index1++;
-  }
-
-  printf ("\n");
-
-  //
-  // Hand off to SEC
-  //
-  SecLoadFromCore ((UINTN) InitialStackMemory, (UINTN) InitialStackMemorySize, (UINTN) gFdInfo[0].Address, SecFile);
-
-  //
-  // If we get here, then the SEC Core returned. This is an error as SEC should
-  //  always hand off to PEI Core and then on to DXE Core.
-  //
-  printf ("ERROR : SEC returned\n");
-  exit (1);
-}
-
-
-EFI_PHYSICAL_ADDRESS *
-MapMemory (
-  IN INTN   fd,
-  IN UINT64 length,
-  IN INTN   prot,
-  IN INTN   flags
-  )
-{
-  STATIC UINTN base  = 0x40000000;
-  CONST UINTN  align = (1 << 24);
-  VOID         *res  = NULL;
-  BOOLEAN      isAligned = 0;
-
-  //
-  // Try to get an aligned block somewhere in the address space of this
-  // process.
-  //
-  while((!isAligned) && (base != 0)) {
-    res = mmap ((void *)base, length, prot, flags, fd, 0);
-    if (res == MAP_FAILED) {
-      return NULL;
-    }
-    if ((((UINTN)res) & ~(align-1)) == (UINTN)res) {
-      isAligned=1;
-    } else {
-      munmap(res, length);
-      base += align;
-    }
-  }
-  return res;
-}
-
-
-/*++
-
-Routine Description:
-  Opens and memory maps a file using Unix services. If BaseAddress is non zero
-  the process will try and allocate the memory starting at BaseAddress.
-
-Arguments:
-  FileName            - The name of the file to open and map
-  MapSize             - The amount of the file to map in bytes
-  CreationDisposition - The flags to pass to CreateFile().  Use to create new files for
-                        memory emulation, and exiting files for firmware volume emulation
-  BaseAddress         - The base address of the mapped file in the user address space.
-                         If passed in as NULL the a new memory region is used.
-                         If passed in as non NULL the request memory region is used for
-                          the mapping of the file into the process space.
-  Length              - The size of the mapped region in bytes
-
-Returns:
-  EFI_SUCCESS      - The file was opened and mapped.
-  EFI_NOT_FOUND    - FileName was not found in the current directory
-  EFI_DEVICE_ERROR - An error occured attempting to map the opened file
-
-**/
-EFI_STATUS
-MapFile (
-  IN  CHAR8                     *FileName,
-  IN OUT  EFI_PHYSICAL_ADDRESS  *BaseAddress,
-  OUT UINT64                    *Length
-  )
-{
-  int     fd;
-  VOID    *res;
-  UINTN   FileSize;
-
-  fd = open (FileName, O_RDWR);
-  if (fd < 0) {
-    return EFI_NOT_FOUND;
-  }
-  FileSize = lseek (fd, 0, SEEK_END);
-
-
-  res = MapMemory (fd, FileSize, PROT_READ | PROT_EXEC, MAP_PRIVATE);
-
-  close (fd);
-
-  if (res == NULL) {
-    perror ("MapFile() Failed");
-    return EFI_DEVICE_ERROR;
-  }
-
-  *Length = (UINT64) FileSize;
-  *BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res;
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-MapFd0 (
-  IN  CHAR8                     *FileName,
-  IN OUT  EFI_PHYSICAL_ADDRESS  *BaseAddress,
-  OUT UINT64                    *Length
-  )
-{
-  int     fd;
-  void    *res, *res2, *res3;
-  UINTN   FileSize;
-  UINTN   FvSize;
-  void    *EmuMagicPage;
-
-  fd = open (FileName, O_RDWR);
-  if (fd < 0) {
-    return EFI_NOT_FOUND;
-  }
-  FileSize = lseek (fd, 0, SEEK_END);
-
-  FvSize = FixedPcdGet64 (PcdEmuFlashFvRecoverySize);
-
-  // Assume start of FD is Recovery FV, and make it write protected
-  res = mmap (
-          (void *)(UINTN)FixedPcdGet64 (PcdEmuFlashFvRecoveryBase),
-          FvSize,
-          PROT_READ | PROT_EXEC,
-          MAP_PRIVATE,
-          fd,
-          0
-          );
-  if (res == MAP_FAILED) {
-    perror ("MapFd0() Failed res =");
-    close (fd);
-    return EFI_DEVICE_ERROR;
-  } else if (res != (void *)(UINTN)FixedPcdGet64 (PcdEmuFlashFvRecoveryBase)) {
-    // We could not load at the build address, so we need to allow writes
-    munmap (res, FvSize);
-    res = mmap (
-            (void *)(UINTN)FixedPcdGet64 (PcdEmuFlashFvRecoveryBase),
-            FvSize,
-            PROT_READ | PROT_WRITE | PROT_EXEC,
-            MAP_PRIVATE,
-            fd,
-            0
-            );
-    if (res == MAP_FAILED) {
-      perror ("MapFd0() Failed res =");
-      close (fd);
-      return EFI_DEVICE_ERROR;
-    }
-  }
-
-  // Map the rest of the FD as read/write
-  res2 = mmap (
-          (void *)(UINTN)(FixedPcdGet64 (PcdEmuFlashFvRecoveryBase) + FvSize),
-          FileSize - FvSize,
-          PROT_READ | PROT_WRITE | PROT_EXEC,
-          MAP_SHARED,
-          fd,
-          FvSize
-          );
-  close (fd);
-  if (res2 == MAP_FAILED) {
-    perror ("MapFd0() Failed res2 =");
-    return EFI_DEVICE_ERROR;
-  }
-
-  //
-  // If enabled use the magic page to communicate between modules
-  // This replaces the PI PeiServicesTable pointer mechanism that
-  // deos not work in the emulator. It also allows the removal of
-  // writable globals from SEC, PEI_CORE (libraries), PEIMs
-  //
-  EmuMagicPage = (void *)(UINTN)FixedPcdGet64 (PcdPeiServicesTablePage);
-  if (EmuMagicPage != NULL) {
-    res3 =  mmap (
-              (void *)EmuMagicPage,
-              4096,
-              PROT_READ | PROT_WRITE,
-              MAP_PRIVATE | MAP_ANONYMOUS,
-              0,
-              0
-              );
-    if (res3 != EmuMagicPage) {
-      printf ("MapFd0(): Could not allocate PeiServicesTablePage @ %lx\n", (long unsigned int)EmuMagicPage);
-      return EFI_DEVICE_ERROR;
-    }
-  }
-
-  *Length = (UINT64) FileSize;
-  *BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res;
-
-  return EFI_SUCCESS;
-}
-
-
-/*++
-
-Routine Description:
-  This is the service to load the SEC Core from the Firmware Volume
-
-Arguments:
-  LargestRegion           - Memory to use for SEC.
-  LargestRegionSize       - Size of Memory to use for PEI
-  BootFirmwareVolumeBase  - Start of the Boot FV
-  PeiCorePe32File         - SEC PE32
-
-Returns:
-  Success means control is transfered and thus we should never return
-
-**/
-VOID
-SecLoadFromCore (
-  IN  UINTN   LargestRegion,
-  IN  UINTN   LargestRegionSize,
-  IN  UINTN   BootFirmwareVolumeBase,
-  IN  VOID    *PeiCorePe32File
-  )
-{
-  EFI_STATUS                  Status;
-  EFI_PHYSICAL_ADDRESS        TopOfMemory;
-  VOID                        *TopOfStack;
-  EFI_PHYSICAL_ADDRESS        PeiCoreEntryPoint;
-  EFI_SEC_PEI_HAND_OFF        *SecCoreData;
-  UINTN                       PeiStackSize;
-
-  //
-  // Compute Top Of Memory for Stack and PEI Core Allocations
-  //
-  TopOfMemory  = LargestRegion + LargestRegionSize;
-  PeiStackSize = (UINTN)RShiftU64((UINT64)STACK_SIZE,1);
-
-  //
-  // |-----------| <---- TemporaryRamBase + TemporaryRamSize
-  // |   Heap    |
-  // |           |
-  // |-----------| <---- StackBase / PeiTemporaryMemoryBase
-  // |           |
-  // |  Stack    |
-  // |-----------| <---- TemporaryRamBase
-  //
-  TopOfStack  = (VOID *)(LargestRegion + PeiStackSize);
-  TopOfMemory = LargestRegion + PeiStackSize;
-
-  //
-  // Reservet space for storing PeiCore's parament in stack.
-  //
-  TopOfStack  = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);
-  TopOfStack  = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
-
-
-  //
-  // Bind this information into the SEC hand-off state
-  //
-  SecCoreData                         = (EFI_SEC_PEI_HAND_OFF*)(UINTN) TopOfStack;
-  SecCoreData->DataSize               = sizeof(EFI_SEC_PEI_HAND_OFF);
-  SecCoreData->BootFirmwareVolumeBase = (VOID*)BootFirmwareVolumeBase;
-  SecCoreData->BootFirmwareVolumeSize = PcdGet32 (PcdEmuFirmwareFdSize);
-  SecCoreData->TemporaryRamBase       = (VOID*)(UINTN)LargestRegion;
-  SecCoreData->TemporaryRamSize       = STACK_SIZE;
-  SecCoreData->StackBase              = SecCoreData->TemporaryRamBase;
-  SecCoreData->StackSize              = PeiStackSize;
-  SecCoreData->PeiTemporaryRamBase    = (VOID*) ((UINTN) SecCoreData->TemporaryRamBase + PeiStackSize);
-  SecCoreData->PeiTemporaryRamSize    = STACK_SIZE - PeiStackSize;
-
-  //
-  // Find the SEC Core Entry Point
-  //
-  Status = SecPeCoffGetEntryPoint (PeiCorePe32File, (VOID **)&PeiCoreEntryPoint);
-  if (EFI_ERROR (Status)) {
-    return ;
-  }
-
-  //
-  // Transfer control to the SEC Core
-  //
-  PeiSwitchStacks (
-    (SWITCH_STACK_ENTRY_POINT) (UINTN) PeiCoreEntryPoint,
-    SecCoreData,
-    (VOID *)gPpiList,
-    TopOfStack
-    );
-  //
-  // If we get here, then the SEC Core returned.  This is an error
-  //
-  return ;
-}
-
-
-/*++
-
-Routine Description:
-  This service is called from Index == 0 until it returns EFI_UNSUPPORTED.
-  It allows discontiguous memory regions to be supported by the emulator.
-  It uses gSystemMemory[] and gSystemMemoryCount that were created by
-  parsing the host environment variable EFI_MEMORY_SIZE.
-  The size comes from the varaible and the address comes from the call to
-  UnixOpenFile.
-
-Arguments:
-  Index      - Which memory region to use
-  MemoryBase - Return Base address of memory region
-  MemorySize - Return size in bytes of the memory region
-
-Returns:
-  EFI_SUCCESS - If memory region was mapped
-  EFI_UNSUPPORTED - If Index is not supported
-
-**/
-EFI_STATUS
-SecUnixPeiAutoScan (
-  IN  UINTN                 Index,
-  OUT EFI_PHYSICAL_ADDRESS  *MemoryBase,
-  OUT UINT64                *MemorySize
-  )
-{
-  void *res;
-
-  if (Index >= gSystemMemoryCount) {
-    return EFI_UNSUPPORTED;
-  }
-
-  *MemoryBase = 0;
-  res = MapMemory (
-          0, gSystemMemory[Index].Size,
-          PROT_READ | PROT_WRITE | PROT_EXEC,
-          MAP_PRIVATE | MAP_ANONYMOUS
-          );
-  if (res == MAP_FAILED) {
-    return EFI_DEVICE_ERROR;
-  }
-  *MemorySize = gSystemMemory[Index].Size;
-  *MemoryBase = (UINTN)res;
-  gSystemMemory[Index].Memory = *MemoryBase;
-
-  return EFI_SUCCESS;
-}
-
-
-/*++
-
-Routine Description:
- Check to see if an address range is in the EFI GCD memory map.
-
- This is all of GCD for system memory passed to DXE Core. FV
- mapping and other device mapped into system memory are not
- inlcuded in the check.
-
-Arguments:
-  Index      - Which memory region to use
-  MemoryBase - Return Base address of memory region
-  MemorySize - Return size in bytes of the memory region
-
-Returns:
-  TRUE -  Address is in the EFI GCD memory map
-  FALSE - Address is NOT in memory map
-
-**/
-BOOLEAN
-EfiSystemMemoryRange (
-  IN  VOID *MemoryAddress
-  )
-{
-  UINTN                 Index;
-  EFI_PHYSICAL_ADDRESS  MemoryBase;
-
-  MemoryBase = (EFI_PHYSICAL_ADDRESS)(UINTN)MemoryAddress;
-  for (Index = 0; Index < gSystemMemoryCount; Index++) {
-    if ((MemoryBase >= gSystemMemory[Index].Memory) &&
-        (MemoryBase < (gSystemMemory[Index].Memory + gSystemMemory[Index].Size)) ) {
-      return TRUE;
-    }
-  }
-
-  return FALSE;
-}
-
-
-/*++
-
-Routine Description:
-  Since the SEC is the only Unix program in stack it must export
-  an interface to do POSIX calls.  gUnix is initailized in UnixThunk.c.
-
-Arguments:
-  InterfaceSize - sizeof (EFI_WIN_NT_THUNK_PROTOCOL);
-  InterfaceBase - Address of the gUnix global
-
-Returns:
-  EFI_SUCCESS - Data returned
-
-**/
-VOID *
-SecEmuThunkAddress (
-  VOID
-  )
-{
-  return &gEmuThunkProtocol;
-}
-
-
-
-RETURN_STATUS
-EFIAPI
-SecPeCoffGetEntryPoint (
-  IN     VOID  *Pe32Data,
-  IN OUT VOID  **EntryPoint
-  )
-{
-  EFI_STATUS                    Status;
-  PE_COFF_LOADER_IMAGE_CONTEXT  ImageContext;
-
-  ZeroMem (&ImageContext, sizeof (ImageContext));
-  ImageContext.Handle     = Pe32Data;
-  ImageContext.ImageRead  = (PE_COFF_LOADER_READ_FILE) SecImageRead;
-
-  Status                  = PeCoffLoaderGetImageInfo (&ImageContext);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  if (ImageContext.ImageAddress != (UINTN)Pe32Data) {
-    //
-    // Relocate image to match the address where it resides
-    //
-    ImageContext.ImageAddress = (UINTN)Pe32Data;
-    Status = PeCoffLoaderLoadImage (&ImageContext);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-
-    Status = PeCoffLoaderRelocateImage (&ImageContext);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  } else {
-    //
-    // Or just return image entry point
-    //
-    ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer (Pe32Data);
-    Status = PeCoffLoaderGetEntryPoint (Pe32Data, EntryPoint);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-    ImageContext.EntryPoint = (UINTN)*EntryPoint;
-  }
-
-  // On Unix a dlopen is done that will change the entry point
-  SecPeCoffRelocateImageExtraAction (&ImageContext);
-  *EntryPoint = (VOID *)(UINTN)ImageContext.EntryPoint;
-
-  return Status;
-}
-
-
-
-/*++
-
-Routine Description:
-  Return the FD Size and base address. Since the FD is loaded from a
-  file into host memory only the SEC will know it's address.
-
-Arguments:
-  Index  - Which FD, starts at zero.
-  FdSize - Size of the FD in bytes
-  FdBase - Start address of the FD. Assume it points to an FV Header
-  FixUp  - Difference between actual FD address and build address
-
-Returns:
-  EFI_SUCCESS     - Return the Base address and size of the FV
-  EFI_UNSUPPORTED - Index does nto map to an FD in the system
-
-**/
-EFI_STATUS
-SecUnixFdAddress (
-  IN     UINTN                 Index,
-  IN OUT EFI_PHYSICAL_ADDRESS  *FdBase,
-  IN OUT UINT64                *FdSize,
-  IN OUT EFI_PHYSICAL_ADDRESS  *FixUp
-  )
-{
-  if (Index >= gFdInfoCount) {
-    return EFI_UNSUPPORTED;
-  }
-
-  *FdBase = gFdInfo[Index].Address;
-  *FdSize = gFdInfo[Index].Size;
-  *FixUp  = 0;
-
-  if (*FdBase == 0 && *FdSize == 0) {
-    return EFI_UNSUPPORTED;
-  }
-
-  if (Index == 0) {
-    //
-    // FD 0 has XIP code and well known PCD values
-    // If the memory buffer could not be allocated at the FD build address
-    // the Fixup is the difference.
-    //
-    *FixUp = *FdBase - PcdGet64 (PcdEmuFdBaseAddress);
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/*++
-
-Routine Description:
-  Count the number of seperators in String
-
-Arguments:
-  String    - String to process
-  Seperator - Item to count
-
-Returns:
-  Number of Seperator in String
-
-**/
-UINTN
-CountSeperatorsInString (
-  IN  const CHAR16   *String,
-  IN  CHAR16         Seperator
-  )
-{
-  UINTN Count;
-
-  for (Count = 0; *String != '\0'; String++) {
-    if (*String == Seperator) {
-      Count++;
-    }
-  }
-
-  return Count;
-}
-
-
-EFI_STATUS
-EFIAPI
-SecImageRead (
-  IN     VOID    *FileHandle,
-  IN     UINTN   FileOffset,
-  IN OUT UINTN   *ReadSize,
-  OUT    VOID    *Buffer
-  )
-/*++
-
-Routine Description:
-  Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file
-
-Arguments:
-  FileHandle - The handle to the PE/COFF file
-  FileOffset - The offset, in bytes, into the file to read
-  ReadSize   - The number of bytes to read from the file starting at FileOffset
-  Buffer     - A pointer to the buffer to read the data into.
-
-Returns:
-  EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset
-
-**/
-{
-  CHAR8 *Destination8;
-  CHAR8 *Source8;
-  UINTN Length;
-
-  Destination8  = Buffer;
-  Source8       = (CHAR8 *) ((UINTN) FileHandle + FileOffset);
-  Length        = *ReadSize;
-  while (Length--) {
-    *(Destination8++) = *(Source8++);
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/*++
-
-Routine Description:
-  Store the ModHandle in an array indexed by the Pdb File name.
-  The ModHandle is needed to unload the image.
-
-Arguments:
-  ImageContext - Input data returned from PE Laoder Library. Used to find the
-                 .PDB file name of the PE Image.
-  ModHandle    - Returned from LoadLibraryEx() and stored for call to
-                 FreeLibrary().
-
-Returns:
-  EFI_SUCCESS - ModHandle was stored.
-
-**/
-EFI_STATUS
-AddHandle (
-  IN  PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext,
-  IN  VOID                                 *ModHandle
-  )
-{
-  UINTN                       Index;
-  IMAGE_CONTEXT_TO_MOD_HANDLE *Array;
-  UINTN                       PreviousSize;
-
-
-  Array = mImageContextModHandleArray;
-  for (Index = 0; Index < mImageContextModHandleArraySize; Index++, Array++) {
-    if (Array->ImageContext == NULL) {
-      //
-      // Make a copy of the stirng and store the ModHandle
-      //
-      Array->ImageContext = ImageContext;
-      Array->ModHandle    = ModHandle;
-      return EFI_SUCCESS;
-    }
-  }
-
-  //
-  // No free space in mImageContextModHandleArray so grow it by
-  // IMAGE_CONTEXT_TO_MOD_HANDLE entires. realloc will
-  // copy the old values to the new locaiton. But it does
-  // not zero the new memory area.
-  //
-  PreviousSize = mImageContextModHandleArraySize * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE);
-  mImageContextModHandleArraySize += MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE;
-
-  mImageContextModHandleArray = ReallocatePool (
-                                  (mImageContextModHandleArraySize - 1) * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE),
-                                  mImageContextModHandleArraySize * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE),
-                                  mImageContextModHandleArray
-                                  );
-  if (mImageContextModHandleArray == NULL) {
-    ASSERT (FALSE);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  memset (mImageContextModHandleArray + PreviousSize, 0, MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE * sizeof (IMAGE_CONTEXT_TO_MOD_HANDLE));
-
-  return AddHandle (ImageContext, ModHandle);
-}
-
-
-/*++
-
-Routine Description:
-  Return the ModHandle and delete the entry in the array.
-
-Arguments:
-  ImageContext - Input data returned from PE Laoder Library. Used to find the
-                 .PDB file name of the PE Image.
-
-Returns:
-  ModHandle - ModHandle assoicated with ImageContext is returned
-  NULL      - No ModHandle associated with ImageContext
-
-**/
-VOID *
-RemoveHandle (
-  IN  PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
-  )
-{
-  UINTN                        Index;
-  IMAGE_CONTEXT_TO_MOD_HANDLE  *Array;
-
-  if (ImageContext->PdbPointer == NULL) {
-    //
-    // If no PDB pointer there is no ModHandle so return NULL
-    //
-    return NULL;
-  }
-
-  Array = mImageContextModHandleArray;
-  for (Index = 0; Index < mImageContextModHandleArraySize; Index++, Array++) {
-    if (Array->ImageContext == ImageContext) {
-      //
-      // If you find a match return it and delete the entry
-      //
-      Array->ImageContext = NULL;
-      return Array->ModHandle;
-    }
-  }
-
-  return NULL;
-}
-
-
-
-BOOLEAN
-IsPdbFile (
-  IN  CHAR8   *PdbFileName
-  )
-{
-  UINTN Len;
-
-  if (PdbFileName == NULL) {
-    return FALSE;
-  }
-
-  Len = strlen (PdbFileName);
-  if ((Len < 5)|| (PdbFileName[Len - 4] != '.')) {
-    return FALSE;
-  }
-
-  if ((PdbFileName[Len - 3] == 'P' || PdbFileName[Len - 3] == 'p') &&
-      (PdbFileName[Len - 2] == 'D' || PdbFileName[Len - 2] == 'd') &&
-      (PdbFileName[Len - 1] == 'B' || PdbFileName[Len - 1] == 'b')) {
-    return TRUE;
-  }
-
-  return FALSE;
-}
-
-
-#define MAX_SPRINT_BUFFER_SIZE 0x200
-
-void
-PrintLoadAddress (
-  IN PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext
-  )
-{
-  if (ImageContext->PdbPointer == NULL) {
-    fprintf (stderr,
-      "0x%08lx Loading NO DEBUG with entry point 0x%08lx\n",
-      (unsigned long)(ImageContext->ImageAddress),
-      (unsigned long)ImageContext->EntryPoint
-      );
-  } else {
-    fprintf (stderr,
-      "0x%08lx Loading %s with entry point 0x%08lx\n",
-      (unsigned long)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders),
-      ImageContext->PdbPointer,
-      (unsigned long)ImageContext->EntryPoint
-      );
-  }
-  // Keep output synced up
-  fflush (stderr);
-}
-
-
-/**
-  Loads the image using dlopen so symbols will be automatically
-  loaded by gdb.
-
-  @param  ImageContext  The PE/COFF image context
-
-  @retval TRUE - The image was successfully loaded
-  @retval FALSE - The image was successfully loaded
-
-**/
-BOOLEAN
-DlLoadImage (
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
-  )
-{
-
-#ifdef __APPLE__
-
-  return FALSE;
-
-#else
-
-  void        *Handle = NULL;
-  void        *Entry = NULL;
-
-  if (ImageContext->PdbPointer == NULL) {
-    return FALSE;
-  }
-
-  if (!IsPdbFile (ImageContext->PdbPointer)) {
-    return FALSE;
-  }
-
-  fprintf (
-     stderr,
-     "Loading %s 0x%08lx - entry point 0x%08lx\n",
-     ImageContext->PdbPointer,
-     (unsigned long)ImageContext->ImageAddress,
-     (unsigned long)ImageContext->EntryPoint
-     );
-
-  Handle = dlopen (ImageContext->PdbPointer, RTLD_NOW);
-  if (Handle != NULL) {
-    Entry = dlsym (Handle, "_ModuleEntryPoint");
-    AddHandle (ImageContext, Handle);
-  } else {
-    printf("%s\n", dlerror());
-  }
-
-  if (Entry != NULL) {
-    ImageContext->EntryPoint = (UINTN)Entry;
-    printf ("Change %s Entrypoint to :0x%08lx\n", ImageContext->PdbPointer, (unsigned long)Entry);
-    return TRUE;
-  } else {
-    return FALSE;
-  }
-
-#endif
-}
-
-
-/**
-  Adds the image to a gdb script so it's symbols can be loaded.
-  The AddFirmwareSymbolFile helper macro is used.
-
-  @param  ImageContext  The PE/COFF image context
-
-**/
-VOID
-GdbScriptAddImage (
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
-  )
-{
-
-  PrintLoadAddress (ImageContext);
-
-  if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) {
-    FILE  *GdbTempFile;
-    GdbTempFile = fopen (gGdbWorkingFileName, "a");
-    if (GdbTempFile != NULL) {
-      long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders);
-      mScriptSymbolChangesCount++;
-      fprintf (
-        GdbTempFile,
-        "AddFirmwareSymbolFile 0x%x %s 0x%08lx\n",
-        mScriptSymbolChangesCount,
-        ImageContext->PdbPointer,
-        SymbolsAddr
-        );
-      fclose (GdbTempFile);
-    } else {
-      ASSERT (FALSE);
-    }
-  }
-}
-
-
-VOID
-EFIAPI
-SecPeCoffRelocateImageExtraAction (
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
-  )
-{
-  if (!DlLoadImage (ImageContext)) {
-    GdbScriptAddImage (ImageContext);
-  }
-}
-
-
-/**
-  Adds the image to a gdb script so it's symbols can be unloaded.
-  The RemoveFirmwareSymbolFile helper macro is used.
-
-  @param  ImageContext  The PE/COFF image context
-
-**/
-VOID
-GdbScriptRemoveImage (
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
-  )
-{
-  FILE  *GdbTempFile;
-
-  //
-  // Need to skip .PDB files created from VC++
-  //
-  if (IsPdbFile (ImageContext->PdbPointer)) {
-    return;
-  }
-
-  //
-  // Write the file we need for the gdb script
-  //
-  GdbTempFile = fopen (gGdbWorkingFileName, "a");
-  if (GdbTempFile != NULL) {
-    mScriptSymbolChangesCount++;
-    fprintf (
-      GdbTempFile,
-      "RemoveFirmwareSymbolFile 0x%x %s\n",
-      mScriptSymbolChangesCount,
-      ImageContext->PdbPointer
-      );
-    fclose (GdbTempFile);
-  } else {
-    ASSERT (FALSE);
-  }
-}
-
-
-VOID
-EFIAPI
-SecPeCoffUnloadImageExtraAction (
-  IN PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext
-  )
-{
-  VOID *Handle;
-
-  //
-  // Check to see if the image symbols were loaded with gdb script, or dlopen
-  //
-  Handle = RemoveHandle (ImageContext);
-  if (Handle != NULL) {
-#ifndef __APPLE__
-    dlclose (Handle);
-#endif
-    return;
-  }
-
-  GdbScriptRemoveImage (ImageContext);
-}
-
-
diff --git a/EmulatorPkg/Unix/Host/SecMain.h b/EmulatorPkg/Unix/Host/SecMain.h
deleted file mode 100644 (file)
index aff7c36..0000000
+++ /dev/null
@@ -1,356 +0,0 @@
-/*++ @file\r
-\r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
-Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
-\r
-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 _SEC_MAIN_H__\r
-#define _SEC_MAIN_H__\r
-\r
-//\r
-// Name mangle to prevent build errors. I.e conflicts between EFI and OS\r
-//\r
-#define NTOHL   _UNIX_EFI_NAME_MANGLE_NTOHL_\r
-#define HTONL   _UNIX_EFI_NAME_MANGLE_HTONL_\r
-#define NTOHS   _UNIX_EFI_NAME_MANGLE_NTOHS_\r
-#define HTONS   _UNIX_EFI_NAME_MANGLE_HTOHS_\r
-#define B0      _UNIX_EFI_NAME_MANGLE_B0_\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-\r
-#include <sys/types.h>\r
-#include <sys/stat.h>\r
-#include <sys/termios.h>\r
-#include <sys/time.h>\r
-\r
-#if __CYGWIN__\r
-#include <sys/dirent.h>\r
-#else\r
-#include <sys/dir.h>\r
-#endif\r
-\r
-#include <sys/mman.h>\r
-#include <dlfcn.h>\r
-\r
-#include <unistd.h>\r
-#include <poll.h>\r
-#include <fcntl.h>\r
-#include <time.h>\r
-#include <signal.h>\r
-#include <errno.h>\r
-#include <string.h>\r
-#include <stdlib.h>\r
-#include <sys/ioctl.h>\r
-#include <sys/statvfs.h>\r
-\r
-#include <sys/socket.h>\r
-#include <netdb.h>\r
-#include <netinet/in.h>\r
-#include <net/if.h>\r
-#include <ifaddrs.h>\r
-\r
-#ifdef __APPLE__\r
-#include <net/if_dl.h>\r
-#include <net/bpf.h>\r
-#include <sys/param.h>\r
-#include <sys/mount.h>\r
-#include <sys/disk.h>\r
-#define _XOPEN_SOURCE\r
-#ifndef _Bool\r
-  #define _Bool char // for clang debug\r
-#endif\r
-#else\r
-#include <termio.h>\r
-#include <sys/vfs.h>\r
-#include <linux/fs.h>\r
-#endif\r
-\r
-#include <utime.h>\r
-\r
-#undef NTOHL\r
-#undef HTONL\r
-#undef NTOHS\r
-#undef HTONS\r
-#undef B0\r
-\r
-\r
-#include <PiPei.h>\r
-#include <Uefi.h>\r
-\r
-#include <Library/PeCoffLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/PrintLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/ReportStatusCodeLib.h>\r
-\r
-#include <Library/ThunkPpiList.h>\r
-#include <Library/ThunkProtocolList.h>\r
-#include <Library/PeiServicesLib.h>\r
-#include <Library/PeCoffGetEntryPointLib.h>\r
-#include <Library/EmuMagicPageLib.h>\r
-\r
-#include <Ppi/EmuThunk.h>\r
-#include <Ppi/StatusCode.h>\r
-\r
-#include <Protocol/SimplePointer.h>\r
-#include <Protocol/SimpleTextIn.h>\r
-#include <Protocol/SimpleTextInEx.h>\r
-#include <Protocol/UgaDraw.h>\r
-#include <Protocol/SimpleFileSystem.h>\r
-\r
-#include <Protocol/EmuThunk.h>\r
-#include <Protocol/EmuIoThunk.h>\r
-#include <Protocol/EmuGraphicsWindow.h>\r
-#include <Protocol/EmuThread.h>\r
-#include <Protocol/EmuBlockIo.h>\r
-#include <Protocol/EmuSnp.h>\r
-\r
-#include <Guid/FileInfo.h>\r
-#include <Guid/FileSystemInfo.h>\r
-#include <Guid/FileSystemVolumeLabelInfo.h>\r
-\r
-\r
-#include "Gasket.h"\r
-\r
-\r
-#define STACK_SIZE                0x20000\r
-\r
-typedef struct {\r
-  EFI_PHYSICAL_ADDRESS  Address;\r
-  UINT64                Size;\r
-} EMU_FD_INFO;\r
-\r
-typedef struct {\r
-  EFI_PHYSICAL_ADDRESS  Memory;\r
-  UINT64                Size;\r
-} EMU_SYSTEM_MEMORY;\r
-\r
-\r
-#define MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE 0x100\r
-\r
-typedef struct {\r
-  PE_COFF_LOADER_IMAGE_CONTEXT   *ImageContext;\r
-  VOID                           *ModHandle;\r
-} IMAGE_CONTEXT_TO_MOD_HANDLE;\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-SecUnixPeiLoadFile (\r
-  VOID                  *Pe32Data,\r
-  EFI_PHYSICAL_ADDRESS  *ImageAddress,\r
-  UINT64                *ImageSize,\r
-  EFI_PHYSICAL_ADDRESS  *EntryPoint\r
-  );\r
-\r
-int\r
-main (\r
-  IN  int   Argc,\r
-  IN  char  **Argv,\r
-  IN  char  **Envp\r
-  );\r
-\r
-VOID\r
-SecLoadFromCore (\r
-  IN  UINTN   LargestRegion,\r
-  IN  UINTN   LargestRegionSize,\r
-  IN  UINTN   BootFirmwareVolumeBase,\r
-  IN  VOID    *PeiCoreFile\r
-  );\r
-\r
-EFI_STATUS\r
-SecLoadFile (\r
-  IN  VOID                    *Pe32Data,\r
-  IN  EFI_PHYSICAL_ADDRESS    *ImageAddress,\r
-  IN  UINT64                  *ImageSize,\r
-  IN  EFI_PHYSICAL_ADDRESS    *EntryPoint\r
-  );\r
-\r
-EFI_STATUS\r
-SecFfsFindPeiCore (\r
-  IN  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader,\r
-  OUT VOID                        **Pe32Data\r
-  );\r
-\r
-EFI_STATUS\r
-SecFfsFindNextFile (\r
-  IN EFI_FV_FILETYPE             SearchType,\r
-  IN EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader,\r
-  IN OUT EFI_FFS_FILE_HEADER     **FileHeader\r
-  );\r
-\r
-EFI_STATUS\r
-SecFfsFindSectionData (\r
-  IN EFI_SECTION_TYPE      SectionType,\r
-  IN EFI_FFS_FILE_HEADER   *FfsFileHeader,\r
-  IN OUT VOID              **SectionData\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-SecUnixPeCoffLoaderLoadAsDll (\r
-  IN CHAR8    *PdbFileName,\r
-  IN VOID     **ImageEntryPoint,\r
-  OUT VOID    **ModHandle\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-SecUnixPeCoffLoaderFreeLibrary (\r
-  OUT VOID    *ModHandle\r
-  );\r
-\r
-EFI_STATUS\r
-SecUnixFdAddress (\r
-  IN     UINTN                 Index,\r
-  IN OUT EFI_PHYSICAL_ADDRESS  *FdBase,\r
-  IN OUT UINT64                *FdSize,\r
-  IN OUT EFI_PHYSICAL_ADDRESS  *FixUp\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GasketSecUnixFdAddress (\r
-  IN     UINTN                 Index,\r
-  IN OUT EFI_PHYSICAL_ADDRESS  *FdBase,\r
-  IN OUT UINT64                *FdSize,\r
-  IN OUT EFI_PHYSICAL_ADDRESS  *FixUp\r
-  )\r
-;\r
-\r
-\r
-EFI_STATUS\r
-GetImageReadFunction (\r
-  IN PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext,\r
-  IN EFI_PHYSICAL_ADDRESS                  *TopOfMemory\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-SecImageRead (\r
-  IN     VOID    *FileHandle,\r
-  IN     UINTN   FileOffset,\r
-  IN OUT UINTN   *ReadSize,\r
-  OUT    VOID    *Buffer\r
-  );\r
-\r
-CHAR16                            *\r
-AsciiToUnicode (\r
-  IN  CHAR8   *Ascii,\r
-  IN  UINTN   *StrLen OPTIONAL\r
-  );\r
-\r
-UINTN\r
-CountSeperatorsInString (\r
-  IN  const CHAR16   *String,\r
-  IN  CHAR16   Seperator\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
-EFI_STATUS\r
-EFIAPI\r
-GasketSecTemporaryRamSupport (\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
-RETURN_STATUS\r
-EFIAPI\r
-SecPeCoffGetEntryPoint (\r
-  IN     VOID  *Pe32Data,\r
-  IN OUT VOID  **EntryPoint\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-SecPeCoffRelocateImageExtraAction (\r
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-SecPeCoffLoaderUnloadImageExtraAction (\r
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
-  );\r
-\r
-\r
-VOID\r
-PeiSwitchStacks (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *NewStack\r
-  );\r
-\r
-VOID\r
-SecInitThunkProtocol (\r
-  VOID\r
-  );\r
-\r
-\r
-EFI_PHYSICAL_ADDRESS *\r
-MapMemory (\r
-  INTN fd,\r
-  UINT64 length,\r
-  INTN   prot,\r
-  INTN   flags);\r
-\r
-EFI_STATUS\r
-MapFile (\r
-  IN  CHAR8                     *FileName,\r
-  IN OUT  EFI_PHYSICAL_ADDRESS  *BaseAddress,\r
-  OUT UINT64                    *Length\r
-  );\r
-\r
-EFI_STATUS\r
-MapFd0 (\r
-  IN  CHAR8                     *FileName,\r
-  IN OUT  EFI_PHYSICAL_ADDRESS  *BaseAddress,\r
-  OUT UINT64                    *Length\r
-  );\r
-\r
-BOOLEAN\r
-EfiSystemMemoryRange (\r
-  IN  VOID *MemoryAddress\r
-  );\r
-\r
-\r
-VOID SecSleep (UINT64 Nanoseconds);\r
-VOID SecEnableInterrupt (VOID);\r
-VOID SecDisableInterrupt (VOID);\r
-BOOLEAN SecInterruptEanbled (VOID);\r
-\r
-\r
-extern EMU_THUNK_PROTOCOL    gEmuThunkProtocol;\r
-extern EMU_IO_THUNK_PROTOCOL gX11ThunkIo;\r
-extern EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo;\r
-extern EMU_IO_THUNK_PROTOCOL gPthreadThunkIo;\r
-extern EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo;\r
-extern EMU_IO_THUNK_PROTOCOL gSnpThunkIo;\r
-\r
-#endif\r
diff --git a/EmulatorPkg/Unix/Host/SecMain.inf b/EmulatorPkg/Unix/Host/SecMain.inf
deleted file mode 100644 (file)
index c9ba71d..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-## @file\r
-# Entry Point of Emu Emulator\r
-#\r
-# Main executable file of Unix Emulator that loads PEI core after initialization finished.\r
-# Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>\r
-# Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
-#\r
-#  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
-[Defines]\r
-  INF_VERSION                    = 0x00010005\r
-  BASE_NAME                      = SecMain\r
-  FILE_GUID                      = 8863C0AD-7724-C84B-88E5-A33B116D1485\r
-  MODULE_TYPE                    = USER_DEFINED\r
-  VERSION_STRING                 = 1.0\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
-[Sources]\r
-  SecMain.c\r
-  EmuThunk.c\r
-  X11GraphicsWindow.c\r
-  Pthreads.c\r
-  PosixFileSystem.c\r
-  BlockIo.c\r
-  LinuxPacketFilter.c\r
-  BerkeleyPacketFilter.c\r
-  MemoryAllocationLib.c\r
-\r
-[Sources.X64]\r
-  X64/Gasket.S        # convert between Emu x86_64 ABI and EFI X64 ABI\r
-  X64/SwitchStack.S\r
-\r
-[Sources.IA32]\r
-  Ia32/Gasket.S       # enforce 16-byte stack alignment for Mac OS X\r
-  Ia32/SwitchStack.c\r
-\r
-\r
-[Packages]\r
-  MdePkg/MdePkg.dec\r
-  MdeModulePkg/MdeModulePkg.dec\r
-  EmulatorPkg/EmulatorPkg.dec\r
-\r
-[LibraryClasses]\r
-  DebugLib\r
-  PcdLib\r
-  PrintLib\r
-  BaseMemoryLib\r
-  BaseLib\r
-  PeCoffLib\r
-  ThunkPpiList\r
-  ThunkProtocolList\r
-  PpiListLib\r
-  PeiServicesLib\r
-  PeCoffGetEntryPointLib\r
-\r
-[Ppis]\r
-  gEfiPeiStatusCodePpiGuid                      # PPI ALWAYS_PRODUCED\r
-  gEmuThunkPpiGuid\r
-\r
-[Protocols]\r
-  gEmuIoThunkProtocolGuid\r
-  gEmuIoThunkProtocolGuid\r
-  gEmuGraphicsWindowProtocolGuid\r
-  gEmuThreadThunkProtocolGuid\r
-  gEmuBlockIoProtocolGuid\r
-  gEmuSnpProtocolGuid\r
-  gEfiSimpleFileSystemProtocolGuid\r
-\r
-[Guids]\r
-  gEfiFileSystemVolumeLabelInfoIdGuid           # SOMETIMES_CONSUMED\r
-  gEfiFileInfoGuid                              # SOMETIMES_CONSUMED\r
-  gEfiFileSystemInfoGuid                        # SOMETIMES_CONSUMED\r
-\r
-[Pcd]\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuBootMode\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareVolume\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuMemorySize\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFdBaseAddress\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareBlockSize\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuApCount\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuVirtualDisk\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuGop|L"GOP Window"\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFileSystem\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuSerialPort\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuNetworkInterface\r
-  gEmulatorPkgTokenSpaceGuid.PcdNetworkPacketFilterSize\r
-\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoveryBase\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoverySize\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageVariableBase\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogBase\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogSize\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwWorkingBase\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize\r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwSpareBase\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize\r
-  gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage\r
-\r
-\r
-[BuildOptions]\r
-   GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/SecMain -m elf_i386 -dynamic-linker /lib$(LIB_ARCH_SFX)/ld-linux.so.2 /usr/lib$(LIB_ARCH_SFX)/crt1.o /usr/lib$(LIB_ARCH_SFX)/crti.o -L/usr/X11R6/lib -lXext -lX11 /usr/lib$(LIB_ARCH_SFX)/crtn.o\r
-   GCC:*_*_*_DLINK2_FLAGS == -lpthread -lc\r
-   GCC:*_*_IA32_CC_FLAGS == -m32 -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -idirafter/usr/include -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings\r
-   GCC:*_*_IA32_PP_FLAGS == -m32 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h\r
-   GCC:*_*_IA32_ASM_FLAGS == -m32 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h\r
-\r
-   GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/SecMain -m elf_x86_64 -dynamic-linker /lib$(LIB_ARCH_SFX)/ld-linux-x86-64.so.2 /usr/lib$(LIB_ARCH_SFX)/crt1.o /usr/lib$(LIB_ARCH_SFX)/crti.o -L/usr/X11R6/lib -lXext -lX11 /usr/lib$(LIB_ARCH_SFX)/crtn.o\r
-   GCC:*_*_X64_CC_FLAGS == -m64 -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -idirafter/usr/include -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings\r
-   GCC:*_GCC44_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))"\r
-   GCC:*_GCC45_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))"\r
-   GCC:*_*_X64_PP_FLAGS == -m64 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h\r
-   GCC:*_*_X64_ASM_FLAGS == -m64 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h\r
-\r
-#\r
-# Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version\r
-#\r
-   XCODE:*_*_IA32_DLINK_PATH == gcc\r
-   XCODE:*_*_IA32_CC_FLAGS == -arch i386 -O0 -g -include $(DEST_DIR_DEBUG)/AutoGen.h -c -fshort-wchar -fno-strict-aliasing\r
-   XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/SecMain -L/usr/X11R6/lib -lXext -lX11 -framework Carbon\r
-   XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g\r
-\r
-   XCODE:*_*_X64_DLINK_PATH == gcc\r
-   XCODE:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/SecMain -L/usr/X11R6/lib -lXext -lX11 -framework Carbon\r
-   XCODE:*_*_X64_ASM_FLAGS == -g\r
-\r
index 00d8c58a5b8c4899703a5a64f6c97499536df581..adb9b2b83037574b9f84b7c88f223267976f44c7 100644 (file)
@@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 **/
 
-#include "SecMain.h"
+#include "Host.h"
 
 #include <sys/ipc.h>
 #include <sys/shm.h>
index c1b30def08ccae6b8c614b504912ee66228bd380..6fb76e1c0c2827c09ec0234f31efe8b966448d6b 100644 (file)
   gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareBlockSize|0x10000\r
   gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareVolume|L"../FV/FV_RECOVERY.fd"\r
 \r
-  gEmulatorPkgTokenSpaceGuid.PcdEmuMemorySizeForSecMain|L"64!64"\r
+  gEmulatorPkgTokenSpaceGuid.PcdEmuMemorySize|L"64!64"\r
 \r
 !if $(BUILD_NEW_SHELL)\r
   gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 }\r
   ##\r
   #  Emulator, OS POSIX application\r
   ##\r
-  EmulatorPkg/Unix/Host/SecMain.inf\r
+  EmulatorPkg/Unix/Host/Host.inf\r
 !endif\r
 \r
 !ifndef $(SKIP_MAIN_BUILD)\r
index e2dfcb9f29bc8d13fc07295aa0011a25cf85a1bb..026a84544dcc99b7a557f318dc7fca820551b53c 100644 (file)
@@ -2,14 +2,14 @@
 {
        08FB7793FE84155DC02AAC07 /* Project object */ = {
                activeBuildConfigurationName = Debug;
-               activeExecutable = BA11A1010FB10BCE00D06FEC /* SecMain.dll */;
+               activeExecutable = BA11A1010FB10BCE00D06FEC /* Host.dll */;
                activeTarget = D28A88AD04BDD90700651E21 /* xcode_project */;
                breakpoints = (
                        BA11A11A0FB10E0700D06FEC /* SecGdbConfigBreak */,
                );
                codeSenseManager = BA11A0FE0FB10B4800D06FEC /* Code sense */;
                executables = (
-                       BA11A1010FB10BCE00D06FEC /* SecMain.dll */,
+                       BA11A1010FB10BCE00D06FEC /* Host.dll */,
                );
                perUserDictionary = {
                        "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = {
@@ -92,7 +92,7 @@
                isa = PBXCodeSenseManager;
                indexTemplatePath = "";
        };
-       BA11A1010FB10BCE00D06FEC /* SecMain.dll */ = {
+       BA11A1010FB10BCE00D06FEC /* Host.dll */ = {
                isa = PBXExecutable;
                activeArgIndices = (
                );
                );
                executableSystemSymbolLevel = 0;
                executableUserSymbolLevel = 0;
-               launchableReference = BA11A1020FB10BCE00D06FEC /* SecMain.dll */;
+               launchableReference = BA11A1020FB10BCE00D06FEC /* Host.dll */;
                libgmallocEnabled = 0;
-               name = SecMain.dll;
+               name = Host.dll;
                savedGlobals = {
                };
                showTypeColumn = 0;
                );
                startupPath = ../../../../Build/EmuUnixIa32/DEBUG_XCLANG/IA32;
        };
-       BA11A1020FB10BCE00D06FEC /* SecMain.dll */ = {
+       BA11A1020FB10BCE00D06FEC /* Host.dll */ = {
                isa = PBXFileReference;
                lastKnownFileType = "compiled.mach-o.executable";
-               name = SecMain.dll;
-               path = ../../../../Build/EmuUnixIa32/DEBUG_XCLANG/IA32/SecMain;
+               name = Host.dll;
+               path = ../../../../Build/EmuUnixIa32/DEBUG_XCLANG/IA32/Host;
                sourceTree = SOURCE_ROOT;
        };
        BA11A11A0FB10E0700D06FEC /* SecGdbConfigBreak */ = {
                delayBeforeContinue = 0;
                hitCount = 0;
                ignoreCount = 0;
-               location = SecMain;
+               location = Host;
                modificationTime = 263261853.260195;
                originalNumberOfMultipleMatches = 1;
                state = 1;
index 55c869f9fd7434bac7a47c99744d86397677d105..3cc5f92d3637ce594a0418f8853b2e362a93d1d5 100644 (file)
@@ -2,14 +2,14 @@
 {
        08FB7793FE84155DC02AAC07 /* Project object */ = {
                activeBuildConfigurationName = Debug;
-               activeExecutable = BA11A1010FB10BCE00D06FEC /* SecMain.dll */;
+               activeExecutable = BA11A1010FB10BCE00D06FEC /* Host.dll */;
                activeTarget = D28A88AD04BDD90700651E21 /* xcode_project */;
                breakpoints = (
                        BA11A11A0FB10E0700D06FEC /* SecGdbConfigBreak */,
                );
                codeSenseManager = BA11A0FE0FB10B4800D06FEC /* Code sense */;
                executables = (
-                       BA11A1010FB10BCE00D06FEC /* SecMain.dll */,
+                       BA11A1010FB10BCE00D06FEC /* Host.dll */,
                );
                perUserDictionary = {
                        "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = {
@@ -92,7 +92,7 @@
                isa = PBXCodeSenseManager;
                indexTemplatePath = "";
        };
-       BA11A1010FB10BCE00D06FEC /* SecMain.dll */ = {
+       BA11A1010FB10BCE00D06FEC /* Host.dll */ = {
                isa = PBXExecutable;
                activeArgIndices = (
                );
                );
                executableSystemSymbolLevel = 0;
                executableUserSymbolLevel = 0;
-               launchableReference = BA11A1020FB10BCE00D06FEC /* SecMain.dll */;
+               launchableReference = BA11A1020FB10BCE00D06FEC /* Host.dll */;
                libgmallocEnabled = 0;
-               name = SecMain.dll;
+               name = Host.dll;
                savedGlobals = {
                };
                showTypeColumn = 0;
                );
                startupPath = ../../../../Build/EmuUnixX64/DEBUG_XCLANG/X64;
        };
-       BA11A1020FB10BCE00D06FEC /* SecMain.dll */ = {
+       BA11A1020FB10BCE00D06FEC /* Host.dll */ = {
                isa = PBXFileReference;
                lastKnownFileType = "compiled.mach-o.executable";
-               name = SecMain.dll;
-               path = ../../../../Build/EmuUnixX64/DEBUG_XCLANG/X64/SecMain;
+               name = Host.dll;
+               path = ../../../../Build/EmuUnixX64/DEBUG_XCLANG/X64/Host;
                sourceTree = SOURCE_ROOT;
        };
        BA11A11A0FB10E0700D06FEC /* SecGdbConfigBreak */ = {
                delayBeforeContinue = 0;
                hitCount = 0;
                ignoreCount = 0;
-               location = SecMain;
+               location = Host;
                modificationTime = 263261853.260195;
                originalNumberOfMultipleMatches = 1;
                state = 1;
index b7dc0bb1092bb9fd8d44f0731dd85af1411e8645..98b4f69479f633f48cde76cd36758c50fa2282ae 100755 (executable)
@@ -96,13 +96,13 @@ do
         #
         # On Darwin we can't use dlopen, so we have to load the real PE/COFF images.
         # This .gdbinit script sets a breakpoint that loads symbols for the PE/COFFEE
-        # images that get loaded in SecMain
+        # images that get loaded in Host
         #
         cp $WORKSPACE/EmulatorPkg/Unix/.gdbinit $WORKSPACE/Build/EmuUnixIa32/DEBUG_"$UNIXPKG_TOOLS"/IA32
         ;;
     esac
 
-    /usr/bin/gdb $BUILD_ROOT_ARCH/SecMain -q -cd=$BUILD_ROOT_ARCH -x $WORKSPACE/EmulatorPkg/Unix/GdbRun
+    /usr/bin/gdb $BUILD_ROOT_ARCH/Host -q -cd=$BUILD_ROOT_ARCH -x $WORKSPACE/EmulatorPkg/Unix/GdbRun
     exit
   fi
 
@@ -131,7 +131,7 @@ if [[ $TARGET_TOOLS == $UNIXPKG_TOOLS ]]; then
 else
   build -p $WORKSPACE/EmulatorPkg/Unix/UnixX64.dsc      -a IA32 -t $TARGET_TOOLS  -D BUILD_32 -D UNIX_SEC_BUILD -D SKIP_MAIN_BUILD -n 3 $1 $2 $3 $4 $5 $6 $7 $8  modules
   build -p $WORKSPACE/EmulatorPkg/Unix/UnixX64.dsc      -a IA32 -t $UNIXPKG_TOOLS -D BUILD_32 $NETWORK_SUPPORT $BUILD_NEW_SHELL $BUILD_FAT -n 3 $1 $2 $3 $4 $5 $6 $7 $8
-  cp $WORKSPACE/Build/EmuUnixIa32/DEBUG_"$TARGET_TOOLS"/IA32/SecMain $WORKSPACE/Build/EmuUnixIa32/DEBUG_"$UNIXPKG_TOOLS"/IA32
+  cp $WORKSPACE/Build/EmuUnixIa32/DEBUG_"$TARGET_TOOLS"/IA32/Host $WORKSPACE/Build/EmuUnixIa32/DEBUG_"$UNIXPKG_TOOLS"/IA32
 fi
 exit $?
 
index 25d14dfc67de93c526ee17620e132a4ba4d7c800..6ddbe2d50d22b6e5720301d24251ea38bd7f8ec2 100755 (executable)
@@ -97,13 +97,13 @@ do
         #
         # On Darwin we can't use dlopen, so we have to load the real PE/COFF images.
         # This .gdbinit script sets a breakpoint that loads symbols for the PE/COFFEE
-        # images that get loaded in SecMain
+        # images that get loaded in Host
         #
         cp $WORKSPACE/EmulatorPkg/Unix/.gdbinit $WORKSPACE/Build/EmuUnixX64/DEBUG_"$UNIXPKG_TOOLS"/X64
         ;;
     esac
 
-    /usr/bin/gdb $BUILD_ROOT_ARCH/SecMain -q -cd=$BUILD_ROOT_ARCH -x $WORKSPACE/EmulatorPkg/Unix/GdbRun
+    /usr/bin/gdb $BUILD_ROOT_ARCH/Host -q -cd=$BUILD_ROOT_ARCH -x $WORKSPACE/EmulatorPkg/Unix/GdbRun
     exit
   fi
 
@@ -132,7 +132,7 @@ if [[ $TARGET_TOOLS == $UNIXPKG_TOOLS ]]; then
 else
   build -p $WORKSPACE/EmulatorPkg/Unix/UnixX64.dsc      -a X64 -t $TARGET_TOOLS  -D UNIX_SEC_BUILD -D SKIP_MAIN_BUILD -n 3 $1 $2 $3 $4 $5 $6 $7 $8  modules
   build -p $WORKSPACE/EmulatorPkg/Unix/UnixX64.dsc      -a X64 -t $UNIXPKG_TOOLS $NETWORK_SUPPORT $BUILD_NEW_SHELL $BUILD_FAT -n 3 $1 $2 $3 $4 $5 $6 $7 $8
-  cp $WORKSPACE/Build/EmuUnixX64/DEBUG_"$TARGET_TOOLS"/X64/SecMain $WORKSPACE/Build/EmuUnixX64/DEBUG_"$UNIXPKG_TOOLS"/X64
+  cp $WORKSPACE/Build/EmuUnixX64/DEBUG_"$TARGET_TOOLS"/X64/Host $WORKSPACE/Build/EmuUnixX64/DEBUG_"$UNIXPKG_TOOLS"/X64
 fi
 exit $?