uefi_specs/hyperv/
boot_bios_log.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Types and constants defined in `BootBiosLogInterface.h`
5
6use 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
14/// Event Id for Device Boot Attempts
15pub const BOOT_DEVICE_EVENT_ID: u32 = 1;
16
17// Device status code groups
18const 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    /// Device failure reason codes
24    ///
25    /// Status codes are made up of a group ID in the high word and a
26    /// status code in the low word
27    ///
28    /// If items are added to this enum the UEFI string mapping function
29    /// PlatformConsoleDeviceStatusString and the corresponding string table
30    /// in PlatformBdsString.uni must be updated
31    ///
32    /// reSearch query: `BOOT_DEVICE_STATUS`
33    #[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/// reSearch query: `BOOTEVENT_DEVICE_ENTRY`
80#[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    // Variable device_path payload
90}
91
92const_assert_eq!(size_of::<BootEventDeviceEntry>(), 24);