/*++ @file | |
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR> | |
Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#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 NTOHLL _UNIX_EFI_NAME_MANGLE_NTOHLL_ | |
#define HTONL _UNIX_EFI_NAME_MANGLE_HTONL_ | |
#define HTONLL _UNIX_EFI_NAME_MANGLE_HTONLL_ | |
#define NTOHS _UNIX_EFI_NAME_MANGLE_NTOHS_ | |
#define HTONS _UNIX_EFI_NAME_MANGLE_HTOHS_ | |
#define B0 _UNIX_EFI_NAME_MANGLE_B0_ | |
#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> | |
#undef NTOHL | |
#undef NTOHLL | |
#undef HTONL | |
#undef HTONLL | |
#undef NTOHS | |
#undef HTONS | |
#undef B0 | |
#undef CR3 | |
#include <PiPei.h> | |
#include <Uefi.h> | |
#include <Library/PeCoffLib.h> | |
#include <Library/BaseLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/MemoryAllocationLib.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/PeiServicesLib.h> | |
#include <Library/PeCoffGetEntryPointLib.h> | |
#include <Library/EmuMagicPageLib.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 <Protocol/EmuSnp.h> | |
#include <Guid/FileInfo.h> | |
#include <Guid/FileSystemInfo.h> | |
#include <Guid/FileSystemVolumeLabelInfo.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 | |
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 | |
CountSeparatorsInString ( | |
IN const CHAR16 *String, | |
IN CHAR16 Separator | |
); | |
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 |