The current scheme maps a file into a memory buffer. You can write to the memory buffer, but if you restart the emulator the data is not written back to the FD. Since the build, rebuilds the FD it will blow away any changes. You can now set variables and restart the emulator and they are still set. There is a bug if the FV is set to write protect that still needs to be tracked down. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11761 6f19259b-4bc3-4df7-8a09-765794883524
335 lines
7.2 KiB
C
335 lines
7.2 KiB
C
/*++ @file
|
|
|
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
|
Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
|
|
|
|
This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#ifndef _SEC_MAIN_H__
|
|
#define _SEC_MAIN_H__
|
|
|
|
#include <PiPei.h>
|
|
#include <Uefi.h>
|
|
|
|
#include <Library/PeCoffLib.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/PrintLib.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/ReportStatusCodeLib.h>
|
|
|
|
#include <Library/ThunkPpiList.h>
|
|
#include <Library/ThunkProtocolList.h>
|
|
#include <Library/PpiListLib.h>
|
|
#include <Library/PeiServicesLib.h>
|
|
#include <Library/PeCoffGetEntryPointLib.h>
|
|
|
|
#include <Ppi/EmuThunk.h>
|
|
#include <Ppi/StatusCode.h>
|
|
|
|
#include <Protocol/SimplePointer.h>
|
|
#include <Protocol/SimpleTextIn.h>
|
|
#include <Protocol/SimpleTextInEx.h>
|
|
#include <Protocol/UgaDraw.h>
|
|
#include <Protocol/SimpleFileSystem.h>
|
|
|
|
#include <Protocol/EmuThunk.h>
|
|
#include <Protocol/EmuIoThunk.h>
|
|
#include <Protocol/EmuGraphicsWindow.h>
|
|
#include <Protocol/EmuThread.h>
|
|
#include <Protocol/EmuBlockIo.h>
|
|
|
|
#include <Guid/FileInfo.h>
|
|
#include <Guid/FileSystemInfo.h>
|
|
#include <Guid/FileSystemVolumeLabelInfo.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/termios.h>
|
|
#include <sys/time.h>
|
|
|
|
#if __CYGWIN__
|
|
#include <sys/dirent.h>
|
|
#else
|
|
#include <sys/dir.h>
|
|
#endif
|
|
|
|
#include <sys/mman.h>
|
|
#include <dlfcn.h>
|
|
|
|
#include <unistd.h>
|
|
#include <poll.h>
|
|
#include <fcntl.h>
|
|
#include <time.h>
|
|
#include <signal.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/statvfs.h>
|
|
|
|
#include <sys/socket.h>
|
|
#include <netdb.h>
|
|
#include <netinet/in.h>
|
|
#include <net/if.h>
|
|
#include <ifaddrs.h>
|
|
|
|
#ifdef __APPLE__
|
|
#include <net/if_dl.h>
|
|
#include <net/bpf.h>
|
|
#include <sys/param.h>
|
|
#include <sys/mount.h>
|
|
#include <sys/disk.h>
|
|
#define _XOPEN_SOURCE
|
|
#ifndef _Bool
|
|
#define _Bool char // for clang debug
|
|
#endif
|
|
#else
|
|
#include <termio.h>
|
|
#include <sys/vfs.h>
|
|
#include <linux/fs.h>
|
|
#endif
|
|
|
|
#include <utime.h>
|
|
|
|
#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
|
|
EFIAPI
|
|
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
|
|
EFIAPI
|
|
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
|
|
);
|
|
|
|
|
|
|
|
VOID SecSleep (UINT64 Milliseconds);
|
|
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;
|
|
|
|
#endif
|