From 59ad461d9d2ce06baee1248a9f856bc417e59e4c Mon Sep 17 00:00:00 2001 From: jljusten Date: Wed, 29 Jun 2011 05:13:33 +0000 Subject: EmulatorPkg/Unix: Rename SecMain to Host Signed-off-by: jljusten git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11924 6f19259b-4bc3-4df7-8a09-765794883524 --- EmulatorPkg/Unix/GdbRun | 2 +- EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c | 2 +- EmulatorPkg/Unix/Host/BlockIo.c | 2 +- EmulatorPkg/Unix/Host/EmuThunk.c | 2 +- EmulatorPkg/Unix/Host/Host.c | 1226 ++++++++++++++++++++ EmulatorPkg/Unix/Host/Host.h | 356 ++++++ EmulatorPkg/Unix/Host/Host.inf | 140 +++ EmulatorPkg/Unix/Host/Ia32/SwitchStack.c | 2 +- EmulatorPkg/Unix/Host/LinuxPacketFilter.c | 2 +- EmulatorPkg/Unix/Host/PosixFileSystem.c | 2 +- EmulatorPkg/Unix/Host/Pthreads.c | 2 +- EmulatorPkg/Unix/Host/SecMain.c | 1226 -------------------- EmulatorPkg/Unix/Host/SecMain.h | 356 ------ EmulatorPkg/Unix/Host/SecMain.inf | 140 --- EmulatorPkg/Unix/Host/X11GraphicsWindow.c | 2 +- EmulatorPkg/Unix/UnixX64.dsc | 4 +- .../xcode_project.xcodeproj/default.pbxuser | 18 +- .../xcode_project.xcodeproj/default.pbxuser | 18 +- EmulatorPkg/Unix/build.sh | 6 +- EmulatorPkg/Unix/build64.sh | 6 +- 20 files changed, 1757 insertions(+), 1757 deletions(-) create mode 100644 EmulatorPkg/Unix/Host/Host.c create mode 100644 EmulatorPkg/Unix/Host/Host.h create mode 100644 EmulatorPkg/Unix/Host/Host.inf delete mode 100644 EmulatorPkg/Unix/Host/SecMain.c delete mode 100644 EmulatorPkg/Unix/Host/SecMain.h delete mode 100644 EmulatorPkg/Unix/Host/SecMain.inf (limited to 'EmulatorPkg') diff --git a/EmulatorPkg/Unix/GdbRun b/EmulatorPkg/Unix/GdbRun index 14a398d62a..b2d6dccccb 100644 --- a/EmulatorPkg/Unix/GdbRun +++ b/EmulatorPkg/Unix/GdbRun @@ -28,7 +28,7 @@ define hook-stop if $_exitcode != 42 quit else - source SecMain.gdb + source Host.gdb end end diff --git a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c index b94da9ee82..4ba27c2a6a 100644 --- a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c +++ b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c @@ -18,7 +18,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ -#include "SecMain.h" +#include "Host.h" #ifdef __APPLE__ diff --git a/EmulatorPkg/Unix/Host/BlockIo.c b/EmulatorPkg/Unix/Host/BlockIo.c index 657ce34e45..50fe9b575e 100644 --- a/EmulatorPkg/Unix/Host/BlockIo.c +++ b/EmulatorPkg/Unix/Host/BlockIo.c @@ -11,7 +11,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ -#include "SecMain.h" +#include "Host.h" #define EMU_BLOCK_IO_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'M', 'b', 'k') typedef struct { diff --git a/EmulatorPkg/Unix/Host/EmuThunk.c b/EmulatorPkg/Unix/Host/EmuThunk.c index d9816298d4..52875c3bce 100644 --- a/EmulatorPkg/Unix/Host/EmuThunk.c +++ b/EmulatorPkg/Unix/Host/EmuThunk.c @@ -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 index 0000000000..17130168f0 --- /dev/null +++ b/EmulatorPkg/Unix/Host/Host.c @@ -0,0 +1,1226 @@ +/*++ @file + +Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
+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 index 0000000000..aff7c36d79 --- /dev/null +++ b/EmulatorPkg/Unix/Host/Host.h @@ -0,0 +1,356 @@ +/*++ @file + +Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
+ +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. + +**/ + +#ifndef _SEC_MAIN_H__ +#define _SEC_MAIN_H__ + +// +// Name mangle to prevent build errors. I.e conflicts between EFI and OS +// +#define NTOHL _UNIX_EFI_NAME_MANGLE_NTOHL_ +#define HTONL _UNIX_EFI_NAME_MANGLE_HTONL_ +#define NTOHS _UNIX_EFI_NAME_MANGLE_NTOHS_ +#define HTONS _UNIX_EFI_NAME_MANGLE_HTOHS_ +#define B0 _UNIX_EFI_NAME_MANGLE_B0_ + +#include +#include + +#include +#include +#include +#include + +#if __CYGWIN__ +#include +#else +#include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#include +#include +#include +#include +#define _XOPEN_SOURCE +#ifndef _Bool + #define _Bool char // for clang debug +#endif +#else +#include +#include +#include +#endif + +#include + +#undef NTOHL +#undef HTONL +#undef NTOHS +#undef HTONS +#undef B0 + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +#include "Gasket.h" + + +#define STACK_SIZE 0x20000 + +typedef struct { + EFI_PHYSICAL_ADDRESS Address; + UINT64 Size; +} EMU_FD_INFO; + +typedef struct { + EFI_PHYSICAL_ADDRESS Memory; + UINT64 Size; +} EMU_SYSTEM_MEMORY; + + +#define MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE 0x100 + +typedef struct { + PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext; + VOID *ModHandle; +} IMAGE_CONTEXT_TO_MOD_HANDLE; + + +EFI_STATUS +EFIAPI +SecUnixPeiLoadFile ( + VOID *Pe32Data, + EFI_PHYSICAL_ADDRESS *ImageAddress, + UINT64 *ImageSize, + EFI_PHYSICAL_ADDRESS *EntryPoint + ); + +int +main ( + IN int Argc, + IN char **Argv, + IN char **Envp + ); + +VOID +SecLoadFromCore ( + IN UINTN LargestRegion, + IN UINTN LargestRegionSize, + IN UINTN BootFirmwareVolumeBase, + IN VOID *PeiCoreFile + ); + +EFI_STATUS +SecLoadFile ( + IN VOID *Pe32Data, + IN EFI_PHYSICAL_ADDRESS *ImageAddress, + IN UINT64 *ImageSize, + IN EFI_PHYSICAL_ADDRESS *EntryPoint + ); + +EFI_STATUS +SecFfsFindPeiCore ( + IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader, + OUT VOID **Pe32Data + ); + +EFI_STATUS +SecFfsFindNextFile ( + IN EFI_FV_FILETYPE SearchType, + IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader, + IN OUT EFI_FFS_FILE_HEADER **FileHeader + ); + +EFI_STATUS +SecFfsFindSectionData ( + IN EFI_SECTION_TYPE SectionType, + IN EFI_FFS_FILE_HEADER *FfsFileHeader, + IN OUT VOID **SectionData + ); + +EFI_STATUS +EFIAPI +SecUnixPeCoffLoaderLoadAsDll ( + IN CHAR8 *PdbFileName, + IN VOID **ImageEntryPoint, + OUT VOID **ModHandle + ); + +EFI_STATUS +EFIAPI +SecUnixPeCoffLoaderFreeLibrary ( + OUT VOID *ModHandle + ); + +EFI_STATUS +SecUnixFdAddress ( + IN UINTN Index, + IN OUT EFI_PHYSICAL_ADDRESS *FdBase, + IN OUT UINT64 *FdSize, + IN OUT EFI_PHYSICAL_ADDRESS *FixUp + ) +; + +EFI_STATUS +EFIAPI +GasketSecUnixFdAddress ( + IN UINTN Index, + IN OUT EFI_PHYSICAL_ADDRESS *FdBase, + IN OUT UINT64 *FdSize, + IN OUT EFI_PHYSICAL_ADDRESS *FixUp + ) +; + + +EFI_STATUS +GetImageReadFunction ( + IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, + IN EFI_PHYSICAL_ADDRESS *TopOfMemory + ); + +EFI_STATUS +EFIAPI +SecImageRead ( + IN VOID *FileHandle, + IN UINTN FileOffset, + IN OUT UINTN *ReadSize, + OUT VOID *Buffer + ); + +CHAR16 * +AsciiToUnicode ( + IN CHAR8 *Ascii, + IN UINTN *StrLen OPTIONAL + ); + +UINTN +CountSeperatorsInString ( + IN const CHAR16 *String, + IN CHAR16 Seperator + ); + +EFI_STATUS +EFIAPI +SecTemporaryRamSupport ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, + IN UINTN CopySize + ); + +EFI_STATUS +EFIAPI +GasketSecTemporaryRamSupport ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, + IN UINTN CopySize + ); + + +RETURN_STATUS +EFIAPI +SecPeCoffGetEntryPoint ( + IN VOID *Pe32Data, + IN OUT VOID **EntryPoint + ); + +VOID +EFIAPI +SecPeCoffRelocateImageExtraAction ( + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext + ); + +VOID +EFIAPI +SecPeCoffLoaderUnloadImageExtraAction ( + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext + ); + + +VOID +PeiSwitchStacks ( + IN SWITCH_STACK_ENTRY_POINT EntryPoint, + IN VOID *Context1, OPTIONAL + IN VOID *Context2, OPTIONAL + IN VOID *NewStack + ); + +VOID +SecInitThunkProtocol ( + VOID + ); + + +EFI_PHYSICAL_ADDRESS * +MapMemory ( + INTN fd, + UINT64 length, + INTN prot, + INTN flags); + +EFI_STATUS +MapFile ( + IN CHAR8 *FileName, + IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress, + OUT UINT64 *Length + ); + +EFI_STATUS +MapFd0 ( + IN CHAR8 *FileName, + IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress, + OUT UINT64 *Length + ); + +BOOLEAN +EfiSystemMemoryRange ( + IN VOID *MemoryAddress + ); + + +VOID SecSleep (UINT64 Nanoseconds); +VOID SecEnableInterrupt (VOID); +VOID SecDisableInterrupt (VOID); +BOOLEAN SecInterruptEanbled (VOID); + + +extern EMU_THUNK_PROTOCOL gEmuThunkProtocol; +extern EMU_IO_THUNK_PROTOCOL gX11ThunkIo; +extern EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo; +extern EMU_IO_THUNK_PROTOCOL gPthreadThunkIo; +extern EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo; +extern EMU_IO_THUNK_PROTOCOL gSnpThunkIo; + +#endif diff --git a/EmulatorPkg/Unix/Host/Host.inf b/EmulatorPkg/Unix/Host/Host.inf new file mode 100644 index 0000000000..c2d16697c9 --- /dev/null +++ b/EmulatorPkg/Unix/Host/Host.inf @@ -0,0 +1,140 @@ +## @file +# Entry Point of Emu Emulator +# +# Main executable file of Unix Emulator that loads PEI core after initialization finished. +# Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.
+# Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
+# +# 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. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = Host + FILE_GUID = 8863C0AD-7724-C84B-88E5-A33B116D1485 + MODULE_TYPE = USER_DEFINED + VERSION_STRING = 1.0 + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources] + Host.c + EmuThunk.c + X11GraphicsWindow.c + Pthreads.c + PosixFileSystem.c + BlockIo.c + LinuxPacketFilter.c + BerkeleyPacketFilter.c + MemoryAllocationLib.c + +[Sources.X64] + X64/Gasket.S # convert between Emu x86_64 ABI and EFI X64 ABI + X64/SwitchStack.S + +[Sources.IA32] + Ia32/Gasket.S # enforce 16-byte stack alignment for Mac OS X + Ia32/SwitchStack.c + + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + EmulatorPkg/EmulatorPkg.dec + +[LibraryClasses] + DebugLib + PcdLib + PrintLib + BaseMemoryLib + BaseLib + PeCoffLib + ThunkPpiList + ThunkProtocolList + PpiListLib + PeiServicesLib + PeCoffGetEntryPointLib + +[Ppis] + gEfiPeiStatusCodePpiGuid # PPI ALWAYS_PRODUCED + gEmuThunkPpiGuid + +[Protocols] + gEmuIoThunkProtocolGuid + gEmuIoThunkProtocolGuid + gEmuGraphicsWindowProtocolGuid + gEmuThreadThunkProtocolGuid + gEmuBlockIoProtocolGuid + gEmuSnpProtocolGuid + gEfiSimpleFileSystemProtocolGuid + +[Guids] + gEfiFileSystemVolumeLabelInfoIdGuid # SOMETIMES_CONSUMED + gEfiFileInfoGuid # SOMETIMES_CONSUMED + gEfiFileSystemInfoGuid # SOMETIMES_CONSUMED + +[Pcd] + gEmulatorPkgTokenSpaceGuid.PcdEmuBootMode + gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareVolume + gEmulatorPkgTokenSpaceGuid.PcdEmuMemorySize + gEmulatorPkgTokenSpaceGuid.PcdEmuFdBaseAddress + gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize + gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareBlockSize + gEmulatorPkgTokenSpaceGuid.PcdEmuApCount + gEmulatorPkgTokenSpaceGuid.PcdEmuVirtualDisk + gEmulatorPkgTokenSpaceGuid.PcdEmuGop|L"GOP Window" + gEmulatorPkgTokenSpaceGuid.PcdEmuFileSystem + gEmulatorPkgTokenSpaceGuid.PcdEmuSerialPort + gEmulatorPkgTokenSpaceGuid.PcdEmuNetworkInterface + gEmulatorPkgTokenSpaceGuid.PcdNetworkPacketFilterSize + + gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoveryBase + gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoverySize + gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageVariableBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize + gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogBase + gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogSize + gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwWorkingBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize + gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwSpareBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize + gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage + + +[BuildOptions] + 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 + GCC:*_*_*_DLINK2_FLAGS == -lpthread -lc + 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 + GCC:*_*_IA32_PP_FLAGS == -m32 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h + GCC:*_*_IA32_ASM_FLAGS == -m32 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h + + 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 + 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 + GCC:*_GCC44_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" + GCC:*_GCC45_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" + GCC:*_*_X64_PP_FLAGS == -m64 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h + GCC:*_*_X64_ASM_FLAGS == -m64 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h + +# +# Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version +# + XCODE:*_*_IA32_DLINK_PATH == gcc + XCODE:*_*_IA32_CC_FLAGS == -arch i386 -O0 -g -include $(DEST_DIR_DEBUG)/AutoGen.h -c -fshort-wchar -fno-strict-aliasing + XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/Host -L/usr/X11R6/lib -lXext -lX11 -framework Carbon + XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g + + XCODE:*_*_X64_DLINK_PATH == gcc + XCODE:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/Host -L/usr/X11R6/lib -lXext -lX11 -framework Carbon + XCODE:*_*_X64_ASM_FLAGS == -g + diff --git a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c index 1d36500e78..118083f4b5 100644 --- a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c +++ b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c @@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. --*/ -#include "SecMain.h" +#include "Host.h" /** diff --git a/EmulatorPkg/Unix/Host/LinuxPacketFilter.c b/EmulatorPkg/Unix/Host/LinuxPacketFilter.c index 41124f72eb..15e4bc9543 100644 --- a/EmulatorPkg/Unix/Host/LinuxPacketFilter.c +++ b/EmulatorPkg/Unix/Host/LinuxPacketFilter.c @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ -#include "SecMain.h" +#include "Host.h" #ifndef __APPLE__ diff --git a/EmulatorPkg/Unix/Host/PosixFileSystem.c b/EmulatorPkg/Unix/Host/PosixFileSystem.c index aab7161b7f..40b412e5f2 100644 --- a/EmulatorPkg/Unix/Host/PosixFileSystem.c +++ b/EmulatorPkg/Unix/Host/PosixFileSystem.c @@ -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') diff --git a/EmulatorPkg/Unix/Host/Pthreads.c b/EmulatorPkg/Unix/Host/Pthreads.c index 36d1298651..c60c298099 100644 --- a/EmulatorPkg/Unix/Host/Pthreads.c +++ b/EmulatorPkg/Unix/Host/Pthreads.c @@ -15,7 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ -#include "SecMain.h" +#include "Host.h" #include diff --git a/EmulatorPkg/Unix/Host/SecMain.c b/EmulatorPkg/Unix/Host/SecMain.c deleted file mode 100644 index a0af3e4d53..0000000000 --- a/EmulatorPkg/Unix/Host/SecMain.c +++ /dev/null @@ -1,1226 +0,0 @@ -/*++ @file - -Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
-Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
-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 index aff7c36d79..0000000000 --- a/EmulatorPkg/Unix/Host/SecMain.h +++ /dev/null @@ -1,356 +0,0 @@ -/*++ @file - -Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
-Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
- -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. - -**/ - -#ifndef _SEC_MAIN_H__ -#define _SEC_MAIN_H__ - -// -// Name mangle to prevent build errors. I.e conflicts between EFI and OS -// -#define NTOHL _UNIX_EFI_NAME_MANGLE_NTOHL_ -#define HTONL _UNIX_EFI_NAME_MANGLE_HTONL_ -#define NTOHS _UNIX_EFI_NAME_MANGLE_NTOHS_ -#define HTONS _UNIX_EFI_NAME_MANGLE_HTOHS_ -#define B0 _UNIX_EFI_NAME_MANGLE_B0_ - -#include -#include - -#include -#include -#include -#include - -#if __CYGWIN__ -#include -#else -#include -#endif - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#ifdef __APPLE__ -#include -#include -#include -#include -#include -#define _XOPEN_SOURCE -#ifndef _Bool - #define _Bool char // for clang debug -#endif -#else -#include -#include -#include -#endif - -#include - -#undef NTOHL -#undef HTONL -#undef NTOHS -#undef HTONS -#undef B0 - - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - - -#include "Gasket.h" - - -#define STACK_SIZE 0x20000 - -typedef struct { - EFI_PHYSICAL_ADDRESS Address; - UINT64 Size; -} EMU_FD_INFO; - -typedef struct { - EFI_PHYSICAL_ADDRESS Memory; - UINT64 Size; -} EMU_SYSTEM_MEMORY; - - -#define MAX_IMAGE_CONTEXT_TO_MOD_HANDLE_ARRAY_SIZE 0x100 - -typedef struct { - PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext; - VOID *ModHandle; -} IMAGE_CONTEXT_TO_MOD_HANDLE; - - -EFI_STATUS -EFIAPI -SecUnixPeiLoadFile ( - VOID *Pe32Data, - EFI_PHYSICAL_ADDRESS *ImageAddress, - UINT64 *ImageSize, - EFI_PHYSICAL_ADDRESS *EntryPoint - ); - -int -main ( - IN int Argc, - IN char **Argv, - IN char **Envp - ); - -VOID -SecLoadFromCore ( - IN UINTN LargestRegion, - IN UINTN LargestRegionSize, - IN UINTN BootFirmwareVolumeBase, - IN VOID *PeiCoreFile - ); - -EFI_STATUS -SecLoadFile ( - IN VOID *Pe32Data, - IN EFI_PHYSICAL_ADDRESS *ImageAddress, - IN UINT64 *ImageSize, - IN EFI_PHYSICAL_ADDRESS *EntryPoint - ); - -EFI_STATUS -SecFfsFindPeiCore ( - IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader, - OUT VOID **Pe32Data - ); - -EFI_STATUS -SecFfsFindNextFile ( - IN EFI_FV_FILETYPE SearchType, - IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader, - IN OUT EFI_FFS_FILE_HEADER **FileHeader - ); - -EFI_STATUS -SecFfsFindSectionData ( - IN EFI_SECTION_TYPE SectionType, - IN EFI_FFS_FILE_HEADER *FfsFileHeader, - IN OUT VOID **SectionData - ); - -EFI_STATUS -EFIAPI -SecUnixPeCoffLoaderLoadAsDll ( - IN CHAR8 *PdbFileName, - IN VOID **ImageEntryPoint, - OUT VOID **ModHandle - ); - -EFI_STATUS -EFIAPI -SecUnixPeCoffLoaderFreeLibrary ( - OUT VOID *ModHandle - ); - -EFI_STATUS -SecUnixFdAddress ( - IN UINTN Index, - IN OUT EFI_PHYSICAL_ADDRESS *FdBase, - IN OUT UINT64 *FdSize, - IN OUT EFI_PHYSICAL_ADDRESS *FixUp - ) -; - -EFI_STATUS -EFIAPI -GasketSecUnixFdAddress ( - IN UINTN Index, - IN OUT EFI_PHYSICAL_ADDRESS *FdBase, - IN OUT UINT64 *FdSize, - IN OUT EFI_PHYSICAL_ADDRESS *FixUp - ) -; - - -EFI_STATUS -GetImageReadFunction ( - IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, - IN EFI_PHYSICAL_ADDRESS *TopOfMemory - ); - -EFI_STATUS -EFIAPI -SecImageRead ( - IN VOID *FileHandle, - IN UINTN FileOffset, - IN OUT UINTN *ReadSize, - OUT VOID *Buffer - ); - -CHAR16 * -AsciiToUnicode ( - IN CHAR8 *Ascii, - IN UINTN *StrLen OPTIONAL - ); - -UINTN -CountSeperatorsInString ( - IN const CHAR16 *String, - IN CHAR16 Seperator - ); - -EFI_STATUS -EFIAPI -SecTemporaryRamSupport ( - IN CONST EFI_PEI_SERVICES **PeiServices, - IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, - IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, - IN UINTN CopySize - ); - -EFI_STATUS -EFIAPI -GasketSecTemporaryRamSupport ( - IN CONST EFI_PEI_SERVICES **PeiServices, - IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, - IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, - IN UINTN CopySize - ); - - -RETURN_STATUS -EFIAPI -SecPeCoffGetEntryPoint ( - IN VOID *Pe32Data, - IN OUT VOID **EntryPoint - ); - -VOID -EFIAPI -SecPeCoffRelocateImageExtraAction ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - -VOID -EFIAPI -SecPeCoffLoaderUnloadImageExtraAction ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - - -VOID -PeiSwitchStacks ( - IN SWITCH_STACK_ENTRY_POINT EntryPoint, - IN VOID *Context1, OPTIONAL - IN VOID *Context2, OPTIONAL - IN VOID *NewStack - ); - -VOID -SecInitThunkProtocol ( - VOID - ); - - -EFI_PHYSICAL_ADDRESS * -MapMemory ( - INTN fd, - UINT64 length, - INTN prot, - INTN flags); - -EFI_STATUS -MapFile ( - IN CHAR8 *FileName, - IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress, - OUT UINT64 *Length - ); - -EFI_STATUS -MapFd0 ( - IN CHAR8 *FileName, - IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress, - OUT UINT64 *Length - ); - -BOOLEAN -EfiSystemMemoryRange ( - IN VOID *MemoryAddress - ); - - -VOID SecSleep (UINT64 Nanoseconds); -VOID SecEnableInterrupt (VOID); -VOID SecDisableInterrupt (VOID); -BOOLEAN SecInterruptEanbled (VOID); - - -extern EMU_THUNK_PROTOCOL gEmuThunkProtocol; -extern EMU_IO_THUNK_PROTOCOL gX11ThunkIo; -extern EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo; -extern EMU_IO_THUNK_PROTOCOL gPthreadThunkIo; -extern EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo; -extern EMU_IO_THUNK_PROTOCOL gSnpThunkIo; - -#endif diff --git a/EmulatorPkg/Unix/Host/SecMain.inf b/EmulatorPkg/Unix/Host/SecMain.inf deleted file mode 100644 index c9ba71dc4e..0000000000 --- a/EmulatorPkg/Unix/Host/SecMain.inf +++ /dev/null @@ -1,140 +0,0 @@ -## @file -# Entry Point of Emu Emulator -# -# Main executable file of Unix Emulator that loads PEI core after initialization finished. -# Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.
-# Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
-# -# 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. -# -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = SecMain - FILE_GUID = 8863C0AD-7724-C84B-88E5-A33B116D1485 - MODULE_TYPE = USER_DEFINED - VERSION_STRING = 1.0 - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 IPF EBC -# - -[Sources] - SecMain.c - EmuThunk.c - X11GraphicsWindow.c - Pthreads.c - PosixFileSystem.c - BlockIo.c - LinuxPacketFilter.c - BerkeleyPacketFilter.c - MemoryAllocationLib.c - -[Sources.X64] - X64/Gasket.S # convert between Emu x86_64 ABI and EFI X64 ABI - X64/SwitchStack.S - -[Sources.IA32] - Ia32/Gasket.S # enforce 16-byte stack alignment for Mac OS X - Ia32/SwitchStack.c - - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - EmulatorPkg/EmulatorPkg.dec - -[LibraryClasses] - DebugLib - PcdLib - PrintLib - BaseMemoryLib - BaseLib - PeCoffLib - ThunkPpiList - ThunkProtocolList - PpiListLib - PeiServicesLib - PeCoffGetEntryPointLib - -[Ppis] - gEfiPeiStatusCodePpiGuid # PPI ALWAYS_PRODUCED - gEmuThunkPpiGuid - -[Protocols] - gEmuIoThunkProtocolGuid - gEmuIoThunkProtocolGuid - gEmuGraphicsWindowProtocolGuid - gEmuThreadThunkProtocolGuid - gEmuBlockIoProtocolGuid - gEmuSnpProtocolGuid - gEfiSimpleFileSystemProtocolGuid - -[Guids] - gEfiFileSystemVolumeLabelInfoIdGuid # SOMETIMES_CONSUMED - gEfiFileInfoGuid # SOMETIMES_CONSUMED - gEfiFileSystemInfoGuid # SOMETIMES_CONSUMED - -[Pcd] - gEmulatorPkgTokenSpaceGuid.PcdEmuBootMode - gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareVolume - gEmulatorPkgTokenSpaceGuid.PcdEmuMemorySize - gEmulatorPkgTokenSpaceGuid.PcdEmuFdBaseAddress - gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize - gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareBlockSize - gEmulatorPkgTokenSpaceGuid.PcdEmuApCount - gEmulatorPkgTokenSpaceGuid.PcdEmuVirtualDisk - gEmulatorPkgTokenSpaceGuid.PcdEmuGop|L"GOP Window" - gEmulatorPkgTokenSpaceGuid.PcdEmuFileSystem - gEmulatorPkgTokenSpaceGuid.PcdEmuSerialPort - gEmulatorPkgTokenSpaceGuid.PcdEmuNetworkInterface - gEmulatorPkgTokenSpaceGuid.PcdNetworkPacketFilterSize - - gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoveryBase - gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoverySize - gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageVariableBase - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize - gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogBase - gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogSize - gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwWorkingBase - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize - gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwSpareBase - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize - gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage - - -[BuildOptions] - 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 - GCC:*_*_*_DLINK2_FLAGS == -lpthread -lc - 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 - GCC:*_*_IA32_PP_FLAGS == -m32 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h - GCC:*_*_IA32_ASM_FLAGS == -m32 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h - - 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 - 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 - GCC:*_GCC44_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" - GCC:*_GCC45_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" - GCC:*_*_X64_PP_FLAGS == -m64 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h - GCC:*_*_X64_ASM_FLAGS == -m64 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h - -# -# Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version -# - XCODE:*_*_IA32_DLINK_PATH == gcc - XCODE:*_*_IA32_CC_FLAGS == -arch i386 -O0 -g -include $(DEST_DIR_DEBUG)/AutoGen.h -c -fshort-wchar -fno-strict-aliasing - XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/SecMain -L/usr/X11R6/lib -lXext -lX11 -framework Carbon - XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g - - XCODE:*_*_X64_DLINK_PATH == gcc - XCODE:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/SecMain -L/usr/X11R6/lib -lXext -lX11 -framework Carbon - XCODE:*_*_X64_ASM_FLAGS == -g - diff --git a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c index 00d8c58a5b..adb9b2b830 100644 --- a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c +++ b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c @@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ -#include "SecMain.h" +#include "Host.h" #include #include diff --git a/EmulatorPkg/Unix/UnixX64.dsc b/EmulatorPkg/Unix/UnixX64.dsc index c1b30def08..6fb76e1c0c 100644 --- a/EmulatorPkg/Unix/UnixX64.dsc +++ b/EmulatorPkg/Unix/UnixX64.dsc @@ -205,7 +205,7 @@ gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareBlockSize|0x10000 gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareVolume|L"../FV/FV_RECOVERY.fd" - gEmulatorPkgTokenSpaceGuid.PcdEmuMemorySizeForSecMain|L"64!64" + gEmulatorPkgTokenSpaceGuid.PcdEmuMemorySize|L"64!64" !if $(BUILD_NEW_SHELL) gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 } @@ -296,7 +296,7 @@ ## # Emulator, OS POSIX application ## - EmulatorPkg/Unix/Host/SecMain.inf + EmulatorPkg/Unix/Host/Host.inf !endif !ifndef $(SKIP_MAIN_BUILD) diff --git a/EmulatorPkg/Unix/Xcode/xcode_project32/xcode_project.xcodeproj/default.pbxuser b/EmulatorPkg/Unix/Xcode/xcode_project32/xcode_project.xcodeproj/default.pbxuser index e2dfcb9f29..026a84544d 100644 --- a/EmulatorPkg/Unix/Xcode/xcode_project32/xcode_project.xcodeproj/default.pbxuser +++ b/EmulatorPkg/Unix/Xcode/xcode_project32/xcode_project.xcodeproj/default.pbxuser @@ -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 = ( ); @@ -144,9 +144,9 @@ ); executableSystemSymbolLevel = 0; executableUserSymbolLevel = 0; - launchableReference = BA11A1020FB10BCE00D06FEC /* SecMain.dll */; + launchableReference = BA11A1020FB10BCE00D06FEC /* Host.dll */; libgmallocEnabled = 0; - name = SecMain.dll; + name = Host.dll; savedGlobals = { }; showTypeColumn = 0; @@ -154,11 +154,11 @@ ); 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 */ = { @@ -172,7 +172,7 @@ delayBeforeContinue = 0; hitCount = 0; ignoreCount = 0; - location = SecMain; + location = Host; modificationTime = 263261853.260195; originalNumberOfMultipleMatches = 1; state = 1; diff --git a/EmulatorPkg/Unix/Xcode/xcode_project64/xcode_project.xcodeproj/default.pbxuser b/EmulatorPkg/Unix/Xcode/xcode_project64/xcode_project.xcodeproj/default.pbxuser index 55c869f9fd..3cc5f92d36 100644 --- a/EmulatorPkg/Unix/Xcode/xcode_project64/xcode_project.xcodeproj/default.pbxuser +++ b/EmulatorPkg/Unix/Xcode/xcode_project64/xcode_project.xcodeproj/default.pbxuser @@ -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 = ( ); @@ -144,9 +144,9 @@ ); executableSystemSymbolLevel = 0; executableUserSymbolLevel = 0; - launchableReference = BA11A1020FB10BCE00D06FEC /* SecMain.dll */; + launchableReference = BA11A1020FB10BCE00D06FEC /* Host.dll */; libgmallocEnabled = 0; - name = SecMain.dll; + name = Host.dll; savedGlobals = { }; showTypeColumn = 0; @@ -154,11 +154,11 @@ ); 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 */ = { @@ -172,7 +172,7 @@ delayBeforeContinue = 0; hitCount = 0; ignoreCount = 0; - location = SecMain; + location = Host; modificationTime = 263261853.260195; originalNumberOfMultipleMatches = 1; state = 1; diff --git a/EmulatorPkg/Unix/build.sh b/EmulatorPkg/Unix/build.sh index b7dc0bb109..98b4f69479 100755 --- a/EmulatorPkg/Unix/build.sh +++ b/EmulatorPkg/Unix/build.sh @@ -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 $? diff --git a/EmulatorPkg/Unix/build64.sh b/EmulatorPkg/Unix/build64.sh index 25d14dfc67..6ddbe2d50d 100755 --- a/EmulatorPkg/Unix/build64.sh +++ b/EmulatorPkg/Unix/build64.sh @@ -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 $? -- cgit v1.2.3