From 946bfba2c321425f22fecb53349b779594543919 Mon Sep 17 00:00:00 2001 From: andrewfish Date: Wed, 8 Jun 2011 21:52:21 +0000 Subject: InOsEmuPkg: Make XIP work properly Update the InOsEmuPkg to properly function with XIP. Make the Recovery FV read only. Remove the use of global variable writes from XIP code. Add a new global page that can be used in place of writting to the FD by XIP code. Think of this global page as a system SRAM. igned-off-by: andrewfish git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11771 6f19259b-4bc3-4df7-8a09-765794883524 --- InOsEmuPkg/Unix/Sec/SecMain.c | 64 ++++++++++++++++++++++++++++++++++++----- InOsEmuPkg/Unix/Sec/SecMain.h | 2 +- InOsEmuPkg/Unix/Sec/SecMain.inf | 2 +- 3 files changed, 59 insertions(+), 9 deletions(-) (limited to 'InOsEmuPkg/Unix/Sec') diff --git a/InOsEmuPkg/Unix/Sec/SecMain.c b/InOsEmuPkg/Unix/Sec/SecMain.c index 1771f36..5dcb445 100644 --- a/InOsEmuPkg/Unix/Sec/SecMain.c +++ b/InOsEmuPkg/Unix/Sec/SecMain.c @@ -57,7 +57,7 @@ EMU_SYSTEM_MEMORY *gSystemMemory; UINTN mImageContextModHandleArraySize = 0; IMAGE_CONTEXT_TO_MOD_HANDLE *mImageContextModHandleArray = NULL; - +EFI_PEI_PPI_DESCRIPTOR *gPpiList; /*++ @@ -127,7 +127,6 @@ main ( // EmuSecLibConstructor (); - gPpiList = GetThunkPpiList (); @@ -371,7 +370,7 @@ MapFile ( FileSize = lseek (fd, 0, SEEK_END); - res = MapMemory (fd, FileSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE); + res = MapMemory (fd, FileSize, PROT_READ | PROT_EXEC, MAP_PRIVATE); close (fd); @@ -394,9 +393,10 @@ MapFd0 ( ) { int fd; - VOID *res, *res2; + void *res, *res2, *res3; UINTN FileSize; UINTN FvSize; + void *EmuMagicPage; fd = open (FileName, O_RDWR); if (fd < 0) { @@ -410,15 +410,31 @@ MapFd0 ( res = mmap ( (void *)(UINTN)FixedPcdGet64 (PcdEmuFlashFvRecoveryBase), FvSize, - PROT_READ | PROT_WRITE | PROT_EXEC, + PROT_READ | PROT_EXEC, MAP_PRIVATE, fd, 0 ); if (res == MAP_FAILED) { - perror ("MapFile() Failed res ="); + 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 @@ -432,10 +448,32 @@ MapFd0 ( ); close (fd); if (res2 == MAP_FAILED) { - perror ("MapFile() Failed res2 ="); + 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; @@ -631,6 +669,7 @@ SecPeCoffGetEntryPoint ( return Status; } + if (ImageContext.ImageAddress != (UINTN)Pe32Data) { // // Relocate image to match the address where it resides // @@ -644,6 +683,17 @@ SecPeCoffGetEntryPoint ( 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); diff --git a/InOsEmuPkg/Unix/Sec/SecMain.h b/InOsEmuPkg/Unix/Sec/SecMain.h index af88d06..cbe98de 100644 --- a/InOsEmuPkg/Unix/Sec/SecMain.h +++ b/InOsEmuPkg/Unix/Sec/SecMain.h @@ -29,9 +29,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include -#include #include #include +#include #include #include diff --git a/InOsEmuPkg/Unix/Sec/SecMain.inf b/InOsEmuPkg/Unix/Sec/SecMain.inf index 0e494e7..da4714e 100644 --- a/InOsEmuPkg/Unix/Sec/SecMain.inf +++ b/InOsEmuPkg/Unix/Sec/SecMain.inf @@ -101,7 +101,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize gInOsEmuPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwSpareBase gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize - + gInOsEmuPkgTokenSpaceGuid.PcdPeiServicesTablePage [BuildOptions] -- cgit v1.1