uefi_specs/hyperv/
boot_bios_log.rs1use crate::uefi::common::EfiStatus64;
7use open_enum::open_enum;
8use static_assertions::const_assert_eq;
9use zerocopy::FromBytes;
10use zerocopy::Immutable;
11use zerocopy::IntoBytes;
12use zerocopy::KnownLayout;
13
14pub const BOOT_DEVICE_EVENT_ID: u32 = 1;
16
17const DEVICE_STATUS_BOOT_GROUP: u32 = 0x00010000;
19const DEVICE_STATUS_SECURE_BOOT_GROUP: u32 = 0x00020000;
20const DEVICE_STATUS_NETWORK_GROUP: u32 = 0x00030000;
21
22open_enum! {
23 #[derive(IntoBytes, FromBytes, Immutable, KnownLayout)]
34 pub enum BootDeviceStatus: u32 {
35 BOOT_PENDING = 0,
36 BOOT_DEVICE_NO_FILESYSTEM = DEVICE_STATUS_BOOT_GROUP,
37 BOOT_DEVICE_NO_LOADER = DEVICE_STATUS_BOOT_GROUP + 1,
38 BOOT_DEVICE_INCOMPATIBLE_LOADER = DEVICE_STATUS_BOOT_GROUP + 2,
39 BOOT_DEVICE_RETURNED_FAILURE = DEVICE_STATUS_BOOT_GROUP + 3,
40 BOOT_DEVICE_OS_NOT_LOADED = DEVICE_STATUS_BOOT_GROUP + 4,
41 BOOT_DEVICE_OS_LOADED = DEVICE_STATUS_BOOT_GROUP + 5,
42 BOOT_DEVICE_NO_DEVICES = DEVICE_STATUS_BOOT_GROUP + 6,
43 BOOT_DEVICE_LOAD_ERROR = DEVICE_STATUS_BOOT_GROUP + 7,
44 SECURE_BOOT_FAILED = DEVICE_STATUS_SECURE_BOOT_GROUP,
45 SECURE_BOOT_POLICY_DENIED = DEVICE_STATUS_SECURE_BOOT_GROUP + 1,
46 SECURE_BOOT_HASH_DENIED = DEVICE_STATUS_SECURE_BOOT_GROUP + 2,
47 SECURE_BOOT_CERT_DENIED = DEVICE_STATUS_SECURE_BOOT_GROUP + 3,
48 SECURE_BOOT_INVALID_IMAGE = DEVICE_STATUS_SECURE_BOOT_GROUP + 4,
49 SECURE_BOOT_UNSIGNED_HAS_NOT_IN_DB = DEVICE_STATUS_SECURE_BOOT_GROUP + 5,
50 SECURE_BOOT_SIGNED_HASH_NOT_FOUND = DEVICE_STATUS_SECURE_BOOT_GROUP + 6,
51 SECURE_BOOT_NEITHER_CERT_NOR_HASH_IN_DB = DEVICE_STATUS_SECURE_BOOT_GROUP + 7,
52 NETWORK_BOOT_MEDIA_DISCONNECTED = DEVICE_STATUS_NETWORK_GROUP,
53 NETWORK_BOOT_DHCP_FAILED = DEVICE_STATUS_NETWORK_GROUP + 1,
54 NETWORK_BOOT_NO_RESPONSE = DEVICE_STATUS_NETWORK_GROUP + 2,
55 NETWORK_BOOT_BUFFER_TOO_SMALL = DEVICE_STATUS_NETWORK_GROUP + 3,
56 NETWORK_BOOT_DEVICE_ERROR = DEVICE_STATUS_NETWORK_GROUP + 4,
57 NETWORK_BOOT_NO_RESOURCES = DEVICE_STATUS_NETWORK_GROUP + 5,
58 NETWORK_BOOT_SERVER_TIMEOUT = DEVICE_STATUS_NETWORK_GROUP + 6,
59 NETWORK_BOOT_CANCELLED = DEVICE_STATUS_NETWORK_GROUP + 7,
60 NETWORK_BOOT_ICMP_ERROR = DEVICE_STATUS_NETWORK_GROUP + 8,
61 NETWORK_BOOT_TFTP_ERROR = DEVICE_STATUS_NETWORK_GROUP + 9,
62 NETWORK_BOOT_NO_BOOT_FILE = DEVICE_STATUS_NETWORK_GROUP + 10,
63 NETWORK_BOOT_UNEXPECTED_FAILURE = DEVICE_STATUS_NETWORK_GROUP + 11,
64 }
65}
66
67impl Default for BootDeviceStatus {
68 fn default() -> Self {
69 Self::BOOT_PENDING
70 }
71}
72
73impl BootDeviceStatus {
74 pub fn get_boot_device_status_group(&self) -> u32 {
75 self.0 & 0xFFFF0000
76 }
77}
78
79#[repr(C)]
81#[derive(Debug, IntoBytes, FromBytes, Immutable, KnownLayout)]
82pub struct BootEventDeviceEntry {
83 pub status: BootDeviceStatus,
84 pub pad: u32,
85 pub extended_status: EfiStatus64,
86 pub boot_variable_number: u16,
87 pub pad1: u16,
88 pub device_path_size: u32,
89 }
91
92const_assert_eq!(size_of::<BootEventDeviceEntry>(), 24);