mirror of
https://github.com/tianocore/edk2
synced 2026-08-27 00:23:19 -04:00
Replace traditional `#ifndef`/`#define`/`#endif` include guards with
`#pragma` once.
`#pragma once` is a widely supported preprocessor directive that
prevents header files from being included multiple times. It is
supported by all toolchains used to build edk2: GCC, Clang/LLVM, and
MSVC.
Compared to macro-based include guards, `#pragma once`:
- Eliminates the risk of macro name collisions or copy/paste errors
where two headers inadvertently use the same guard macro.
- Eliminate inconsistency in the way include guard macros are named
(e.g., some files use `__FILE_H__`, others use `FILE_H_`, etc.).
- Reduces boilerplate (three lines replaced by one).
- Avoids polluting the macro namespace with guard symbols.
- Can improve build times as the preprocessor can skip re-opening the
file entirely, rather than re-reading it to find the matching
`#endif` ("multiple-include optimization").
- Note that some compilers may already optimize traditional include
guards, by recognzining the idiomatic pattern.
This change is made acknowledging that overall portability of the
code will technically be reduced, as `#pragma once` is not part of the
C/C++ standards.
However, this is considered acceptable given:
1. edk2 already defines a subset of supported compilers in
BaseTools/Conf/tools_def.template, all of which have supported
`#pragma once` for over two decades.
2. There have been concerns raised to the project about inconsistent
include guard naming and potential macro collisions.
Approximate compiler support dates:
- MSVC: Supported since Visual C++ 4.2 (1996)
- GCC: Supported since 3.4 (2004)
(http://gnu.ist.utl.pt/software/gcc/gcc-3.4/changes.html)
- Clang (LLVM based): Since initial release in 2007
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
355 lines
7.4 KiB
C
355 lines
7.4 KiB
C
/*++ @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
|
|
|
|
**/
|
|
|
|
#pragma once
|
|
|
|
//
|
|
// 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 <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/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;
|