1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
/*
* EFI Boot Guard
*
* Copyright (c) Siemens AG, 2017-2025
*
* Authors:
* Jan Kiszka <jan.kiszka@siemens.com>
* Andreas Reichel <andreas.reichel.ext@siemens.com>
*
* This work is licensed under the terms of the GNU GPL, version 2. See
* the COPYING file in the top-level directory.
*
* SPDX-License-Identifier: GPL-2.0-only
*/
#pragma once
#include <efi.h>
#include <efilib.h>
#define MAX_INFO_SIZE 1024
typedef struct _VOLUME_DESC {
EFI_DEVICE_PATH *devpath;
BOOLEAN onbootmedium;
CHAR16 *fslabel;
CHAR16 *fscustomlabel;
EFI_FILE_HANDLE root;
} VOLUME_DESC;
extern VOLUME_DESC *volumes;
extern UINTN volume_count;
typedef enum { DOSFSLABEL, CUSTOMLABEL, NOLABEL } LABELMODE;
VOID __attribute__((noreturn)) error_exit(CHAR16 *message, EFI_STATUS status);
CHAR16 *get_volume_label(EFI_FILE_HANDLE fh);
EFI_STATUS get_volumes(VOLUME_DESC **volumes, UINTN *count);
EFI_STATUS close_volumes(VOLUME_DESC *volumes, UINTN count);
EFI_DEVICE_PATH *FileDevicePathFromConfig(EFI_HANDLE device,
CHAR16 *payloadpath);
CHAR16 *GetBootMediumPath(const CHAR16 *input);
typedef EFI_STATUS (*WATCHDOG_PROBE)(EFI_PCI_IO *, UINT16, UINT16, UINTN);
typedef struct _WATCHDOG_DRIVER {
WATCHDOG_PROBE probe;
struct _WATCHDOG_DRIVER *next;
} WATCHDOG_DRIVER;
VOID register_watchdog(WATCHDOG_DRIVER *driver);
#define WATCHDOG_REGISTER(_func) \
static WATCHDOG_DRIVER this_driver = {.probe = _func}; \
static void __attribute__((constructor)) register_driver(void) \
{ \
register_watchdog(&this_driver); \
}
VOID PrintC(const UINT8 color, const CHAR16 *fmt, ...);
#define ERROR(fmt, ...) \
do { \
PrintC(EFI_LIGHTRED, L"ERROR: "); \
PrintC(EFI_LIGHTGRAY, fmt, ##__VA_ARGS__); \
} while (0)
#define WARNING(fmt, ...) \
do { \
PrintC(EFI_YELLOW, L"WARNING: "); \
PrintC(EFI_LIGHTGRAY, fmt, ##__VA_ARGS__); \
} while (0)
#if !defined(SILENT_BOOT)
#define INFO(fmt, ...) \
PrintC(EFI_LIGHTGRAY, fmt, ##__VA_ARGS__)
#else
#define INFO(fmt, ...) do { } while (0)
#endif
#define BIT(x) (1UL << (x))
|