Skip to content

Commit d99ec13

Browse files
committed
Update EfiVar printing
* Define "verbose" variable printing * Define "decimal" variable printing
1 parent f44392b commit d99ec13

File tree

5 files changed

+85
-33
lines changed

5 files changed

+85
-33
lines changed

src/lib/efivar/efivar_display.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use std::fmt;
2+
use types::{EfiVariable, EfiVariableAttribute};
3+
4+
pub struct Verbose<'a>(pub &'a EfiVariable<'a>);
5+
pub struct Decimal<'a>(pub &'a EfiVariable<'a>);
6+
7+
impl fmt::Display for Decimal<'_> {
8+
fn fmt(&self, f:&mut fmt::Formatter<'_>) -> fmt::Result {
9+
for (i, b) in self.0.data.iter().enumerate() {
10+
if (i > 0) && (i % 16 == 0) {
11+
f.write_str(" ")?;
12+
}
13+
if i % 16 < 8 {
14+
f.write_str(&format!("{} ", b))?;
15+
} else {
16+
f.write_str(&format!(" {}", b))?;
17+
}
18+
}
19+
return Ok(());
20+
}
21+
}
22+
23+
impl fmt::Display for Verbose<'_> {
24+
fn fmt(&self, f:&mut fmt::Formatter<'_>) -> fmt::Result {
25+
f.write_str(&format!("GUID: {}\n", self.0.guid))?;
26+
f.write_str(&format!("Name: \"{}\"\n", self.0.name))?;
27+
f.write_str("Attributes:\n")?;
28+
let mut sorted_attrs:Vec<&EfiVariableAttribute> =
29+
self.0.attributes.clone().into_iter().collect();
30+
sorted_attrs.sort_unstable_by(|a1, a2| <u32>::from(*a1).cmp(&<u32>::from(*a2)));
31+
for a in sorted_attrs.iter() {
32+
f.write_str(&format!("\t{}\n", String::from(*a)))?;
33+
}
34+
35+
f.write_str("Value:\n")?;
36+
for i in (0..self.0.data.len()).step_by(16) {
37+
f.write_str(&format!("{:08x} ", i))?;
38+
39+
let mut decode:[u8; 16] = [0; 16];
40+
let mut line_iter = self.0.data.iter().skip(i);
41+
for j in i..i + 16 {
42+
match line_iter.next() {
43+
Some(c) => {
44+
if (0x20 < *c) && (*c < 0x7e) {
45+
decode[j - i] = u32::from(*c) as u8;
46+
} else {
47+
decode[j - i] = u32::from('.') as u8;
48+
}
49+
if j < i + 8 {
50+
f.write_str(&format!("{:02x} ", u8::from(*c)))?;
51+
} else {
52+
f.write_str(&format!(" {:02x}", u8::from(*c)))?;
53+
}
54+
}
55+
None => {
56+
decode[j - i] = u32::from(' ') as u8;
57+
f.write_str(" ")?;
58+
}
59+
};
60+
}
61+
f.write_str(&format!(" |{}|\n", std::str::from_utf8(&decode).unwrap()))?;
62+
}
63+
f.write_str(&format!("{:08x}\n", self.0.data.len()))?;
64+
return Ok(());
65+
}
66+
}

src/lib/efivar/mod.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
pub mod types;
2+
pub mod efivar_display;
23

3-
pub mod attributes {
4+
pub mod efi_variable_attributes {
45
use types::EfiVariableAttribute;
56

67
pub static NON_VOLATILE:EfiVariableAttribute
7-
= EfiVariableAttribute::init("Non Volatile", 0x1);
8+
= EfiVariableAttribute::init("Non-Volatile", 0x1);
89

910
pub static BOOTSERVICE_ACCESS:EfiVariableAttribute
10-
= EfiVariableAttribute::init("Bootservice Access", 0x2);
11+
= EfiVariableAttribute::init("Boot Service Access", 0x2);
1112

1213
pub static RUNTIME_ACCESS:EfiVariableAttribute
13-
= EfiVariableAttribute::init("Runtime Access", 0x4);
14+
= EfiVariableAttribute::init("Runtime Service Access", 0x4);
1415

1516
pub static HARDWARE_ERROR_RECORD:EfiVariableAttribute
1617
= EfiVariableAttribute::init("Hardware Error Record", 0x8);

src/lib/efivar/types/efi_guid.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ macro_rules! from_bytes {
100100

101101
from_bytes!(i8, u8);
102102

103-
104103
impl FromStr for EfiGuid {
105104
type Err = EfiGuidError;
106105

@@ -137,3 +136,11 @@ impl FromStr for EfiGuid {
137136
});
138137
}
139138
}
139+
140+
impl TryFrom<&str> for EfiGuid {
141+
type Error = EfiGuidError;
142+
143+
fn try_from(value: &str) -> Result<Self, EfiGuidError> {
144+
return value.parse::<Self>();
145+
}
146+
}
Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,10 @@
1-
use std::fmt;
2-
3-
pub use super::efi_guid::EfiGuid;
4-
pub use super::efi_variable_attribute::EfiVariableAttribute;
1+
use std::collections::HashSet;
2+
use super::efi_guid::EfiGuid;
3+
use super::efi_variable_attribute::EfiVariableAttribute;
54

65
pub struct EfiVariable<'a> {
7-
pub attributes: Vec<&'a EfiVariableAttribute>,
6+
pub attributes: HashSet<&'a EfiVariableAttribute>,
87
pub guid: EfiGuid,
9-
pub name: &'a str,
8+
pub name: Box<str>,
109
pub data: Vec<u8>,
1110
}
12-
13-
impl fmt::Display for EfiVariable<'_> {
14-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
15-
f.write_str(&format!("EfiVariable {{ attributes: ["))?;
16-
for a in self.attributes.iter() {
17-
f.write_str(&format!("{}", *a)[..])?;
18-
}
19-
f.write_str(&format!("], guid: \"{}\", name: \"{}\", data: [", self.guid, self.name)[..])?;
20-
if self.data.len() > 0 {
21-
f.write_str(&format!("{:02x}", self.data[0])[..])?;
22-
}
23-
if self.data.len() > 1 {
24-
for b in self.data[1..].iter() {
25-
f.write_str(&format!(" {:02x}", *b)[..])?;
26-
};
27-
}
28-
f.write_str("] }}")?;
29-
30-
return Ok(());
31-
}
32-
}

src/lib/efivar/types/efi_variable_attribute.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ macro_rules! EfiVariableAttribute_field_value_maps {
2020
}
2121
}
2222

23-
#[derive(Clone, Copy, PartialEq, Eq)]
23+
#[derive(Debug, Hash, Eq, PartialEq)]
2424
pub struct EfiVariableAttribute {
2525
name: &'static str,
2626
value: u64,

0 commit comments

Comments
 (0)