From a6e114e034a64413535c603b29ebb6510adfbeed Mon Sep 17 00:00:00 2001 From: Nick Santana Date: Tue, 2 Jan 2024 13:53:39 -0800 Subject: [PATCH] Update logic for new bitflags behavior The bitflags crate was updated to allow for unnamed flags. This change resulted in the formatting of `Attributes` to change slightly. As part of this upgrade the formatting of `Attributes` has been improved to show both the known flags as well as bitflag values that don't pertain to a known flag. --- core/types/src/attributes.rs | 53 ++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/core/types/src/attributes.rs b/core/types/src/attributes.rs index 9c937f4e..3190ddcc 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 taht 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" ); }