16e50bde1SPaolo Bonzini // SPDX-License-Identifier: GPL-2.0-or-later 26e50bde1SPaolo Bonzini 3ebacd14aSPaolo Bonzini //! Defines a trait for structs that can be safely initialized with zero bytes. 4ebacd14aSPaolo Bonzini 56e50bde1SPaolo Bonzini /// Encapsulates the requirement that 6bb42965dSPaolo Bonzini /// `MaybeUninit::<Self>::zeroed().assume_init()` does not cause undefined 7*08238372SPaolo Bonzini /// behavior. 86e50bde1SPaolo Bonzini /// 96e50bde1SPaolo Bonzini /// # Safety 106e50bde1SPaolo Bonzini /// 11*08238372SPaolo Bonzini /// Do not add this trait to a type unless all-zeroes is a valid value for the 12*08238372SPaolo Bonzini /// type. In particular, raw pointers can be zero, but references and 13*08238372SPaolo Bonzini /// `NonNull<T>` cannot. 146e50bde1SPaolo Bonzini pub unsafe trait Zeroable: Default { 15*08238372SPaolo Bonzini /// Return a value of Self whose memory representation consists of all 16*08238372SPaolo Bonzini /// zeroes, with the possible exclusion of padding bytes. 17*08238372SPaolo Bonzini const ZERO: Self = unsafe { ::core::mem::MaybeUninit::<Self>::zeroed().assume_init() }; 18bb42965dSPaolo Bonzini } 19bb42965dSPaolo Bonzini 202537f830SPaolo Bonzini // bindgen does not derive Default here 212537f830SPaolo Bonzini #[allow(clippy::derivable_impls)] 222537f830SPaolo Bonzini impl Default for crate::bindings::VMStateFlags { default() -> Self232537f830SPaolo Bonzini fn default() -> Self { 242537f830SPaolo Bonzini Self(0) 252537f830SPaolo Bonzini } 262537f830SPaolo Bonzini } 272537f830SPaolo Bonzini 28*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::Property__bindgen_ty_1 {} 29*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::Property {} 30*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::VMStateFlags {} 31*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::VMStateField {} 32*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::VMStateDescription {} 33*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::MemoryRegionOps__bindgen_ty_1 {} 34*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::MemoryRegionOps__bindgen_ty_2 {} 35*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::MemoryRegionOps {} 36*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::MemTxAttrs {} 37*08238372SPaolo Bonzini unsafe impl Zeroable for crate::bindings::CharBackend {} 38