uefi_raw/capsule.rs
1//! UEFI update capsules.
2//!
3//! Capsules are used to pass information to the firmware, for example to
4//! trigger a firmware update.
5
6use crate::{Guid, PhysicalAddress};
7use bitflags::bitflags;
8
9/// Descriptor that defines a scatter-gather list for passing a set of capsules
10/// to the firmware.
11#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[repr(C)]
13pub struct CapsuleBlockDescriptor {
14 /// Size in bytes of the data block. If zero, the block is treated as a
15 /// continuation pointer.
16 pub length: u64,
17
18 /// Either a data block pointer or a continuation pointer.
19 ///
20 /// * If `length` is non-zero, this is the physical address of the data
21 /// block.
22 /// * If `length` is zero:
23 /// * If `addr` is non-zero, this is the physical address of another block
24 /// of `CapsuleBlockDescriptor`.
25 /// * If `addr` is zero, this entry represents the end of the list.
26 pub address: PhysicalAddress,
27}
28
29bitflags! {
30 /// Capsule update flags.
31 ///
32 /// The meaning of bits `0..=15` are defined by the capsule GUID.
33 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
34 #[repr(transparent)]
35 pub struct CapsuleFlags: u32 {
36 /// The meaning of this bit depends on the capsule GUID.
37 const TYPE_SPECIFIC_BIT_0 = 1 << 0;
38
39 /// The meaning of this bit depends on the capsule GUID.
40 const TYPE_SPECIFIC_BIT_1 = 1 << 1;
41
42 /// The meaning of this bit depends on the capsule GUID.
43 const TYPE_SPECIFIC_BIT_2 = 1 << 2;
44
45 /// The meaning of this bit depends on the capsule GUID.
46 const TYPE_SPECIFIC_BIT_3 = 1 << 3;
47
48 /// The meaning of this bit depends on the capsule GUID.
49 const TYPE_SPECIFIC_BIT_4 = 1 << 4;
50
51 /// The meaning of this bit depends on the capsule GUID.
52 const TYPE_SPECIFIC_BIT_5 = 1 << 5;
53
54 /// The meaning of this bit depends on the capsule GUID.
55 const TYPE_SPECIFIC_BIT_6 = 1 << 6;
56
57 /// The meaning of this bit depends on the capsule GUID.
58 const TYPE_SPECIFIC_BIT_7 = 1 << 7;
59
60 /// The meaning of this bit depends on the capsule GUID.
61 const TYPE_SPECIFIC_BIT_8 = 1 << 8;
62
63 /// The meaning of this bit depends on the capsule GUID.
64 const TYPE_SPECIFIC_BIT_9 = 1 << 9;
65
66 /// The meaning of this bit depends on the capsule GUID.
67 const TYPE_SPECIFIC_BIT_10 = 1 << 10;
68
69 /// The meaning of this bit depends on the capsule GUID.
70 const TYPE_SPECIFIC_BIT_11 = 1 << 11;
71
72 /// The meaning of this bit depends on the capsule GUID.
73 const TYPE_SPECIFIC_BIT_12 = 1 << 12;
74
75 /// The meaning of this bit depends on the capsule GUID.
76 const TYPE_SPECIFIC_BIT_13 = 1 << 13;
77
78 /// The meaning of this bit depends on the capsule GUID.
79 const TYPE_SPECIFIC_BIT_14 = 1 << 14;
80
81 /// The meaning of this bit depends on the capsule GUID.
82 const TYPE_SPECIFIC_BIT_15 = 1 << 15;
83
84 /// Indicates the firmware should process the capsule after system reset.
85 const PERSIST_ACROSS_RESET = 1 << 16;
86
87 /// Causes the contents of the capsule to be coalesced from the
88 /// scatter-gather list into a contiguous buffer, and then a pointer to
89 /// that buffer will be placed in the configuration table after system
90 /// reset.
91 ///
92 /// If this flag is set, [`PERSIST_ACROSS_RESET`] must be set as well.
93 ///
94 /// [`PERSIST_ACROSS_RESET`]: Self::PERSIST_ACROSS_RESET
95 const POPULATE_SYSTEM_TABLE = 1 << 17;
96
97 /// Trigger a system reset after passing the capsule to the firmware.
98 ///
99 /// If this flag is set, [`PERSIST_ACROSS_RESET`] must be set as well.
100 ///
101 /// [`PERSIST_ACROSS_RESET`]: Self::PERSIST_ACROSS_RESET
102 const INITIATE_RESET = 1 << 18;
103 }
104}
105
106/// Common header at the start of a capsule.
107#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
108#[repr(C)]
109pub struct CapsuleHeader {
110 /// GUID that defines the type of data in the capsule.
111 pub capsule_guid: Guid,
112
113 /// Size in bytes of the capsule header. This may be larger than the size of
114 /// `CapsuleHeader` since the specific capsule type defined by
115 /// [`capsule_guid`] may add additional header fields.
116 ///
117 /// [`capsule_guid`]: Self::capsule_guid
118 pub header_size: u32,
119
120 /// Capsule update flags.
121 pub flags: CapsuleFlags,
122
123 /// Size in bytes of the entire capsule, including the header.
124 pub capsule_image_size: u32,
125}