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