diff --git a/Cargo.lock b/Cargo.lock index 43e1a2cc..ec2a88ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -41,7 +41,7 @@ version = "0.66.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.1", "cexpr", "clang-sys", "lazy_static", @@ -66,9 +66,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "block-buffer" @@ -525,7 +525,7 @@ dependencies = [ name = "mc-sgx-core-types" version = "0.10.1" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.1", "displaydoc", "getrandom", "hex", @@ -1072,7 +1072,7 @@ version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", diff --git a/core/types/src/attributes.rs b/core/types/src/attributes.rs index 9c937f4e..57112fd2 100644 --- a/core/types/src/attributes.rs +++ b/core/types/src/attributes.rs @@ -3,7 +3,7 @@ //! SGX Attributes types use crate::{impl_newtype, impl_newtype_no_display}; -use bitflags::bitflags; +use bitflags::{bitflags, Flags}; use core::fmt::{Display, Formatter}; use core::ops::BitAnd; use mc_sgx_core_sys_types::{ @@ -79,31 +79,44 @@ impl Display for Attributes { impl Display for AttributeFlags { fn fmt(&self, f: &mut Formatter) -> core::fmt::Result { - for (idx, (name, flag)) in self.iter_names().enumerate() { - if *self & flag == flag { - if idx >= 1 { - write!(f, " | ")?; - } - write!(f, "{}", name)?; - } - } - Ok(()) + format_bitflags(self, f) } } impl Display for ExtendedFeatureRequestMask { fn fmt(&self, f: &mut Formatter) -> core::fmt::Result { - for (idx, (name, flag)) in self.iter_names().enumerate() { - if *self & flag == flag { - if idx >= 1 { - write!(f, " | ")?; - } - write!(f, "{}", name)?; - } - } + format_bitflags(self, f) + } +} - Ok(()) +/// Formats the provided bitflags as text +/// +/// Any bits that aren't part of a contained flag will be formatted as a hex number. +/// +/// Example output with two known flags and some bits that didn't pertain to a tag +/// +/// FLAG1 | FLAG2 | 0x0000_0000_FF00_0000 +/// +fn format_bitflags(bitflags: &F, f: &mut Formatter) -> core::fmt::Result +where + F::Bits: Into, +{ + let mut separators = ::core::iter::once("").chain(::core::iter::repeat(" | ")); + let mut iter = bitflags.iter_names(); + for (name, _) in &mut iter { + let separator = separators.next().expect("Separator should exist"); + write!(f, "{}", separator)?; + write!(f, "{}", name)?; } + + let remaining = iter.remaining().bits(); + if remaining != bitflags::Bits::EMPTY { + let separator = separators.next().expect("Separator should exist"); + write!(f, "{}", separator)?; + mc_sgx_util::fmt_hex(&remaining.into().to_be_bytes(), f)?; + } + + Ok(()) } bitflags! { @@ -311,7 +324,7 @@ mod test { }); assert_eq!( attributes.to_string(), - "Flags: (none) Xfrm: 0x7FFF_FFFF_FFFF_FFFF" + "Flags: (none) Xfrm: LEGACY | AVX | AVX_512 | MPX | PKRU | AMX | 0x7FFF_FFFF_FFF9_FD00" ); }