summaryrefslogtreecommitdiff
path: root/rust/bindings/lib.rs
diff options
context:
space:
mode:
authorBenno Lossin <lossin@kernel.org>2025-08-14 11:30:29 +0200
committerMiguel Ojeda <ojeda@kernel.org>2025-09-08 14:03:17 +0200
commit4846300ba8f9b725594cc2e77785057f536b50c1 (patch)
tree5f4c98856a18dbb84a05db551c46b29b1a4238fd /rust/bindings/lib.rs
parent3c847e17225aa9481fc3f6c948f5c718dea526f1 (diff)
downloadlinux-next-4846300ba8f9b725594cc2e77785057f536b50c1.tar.gz
linux-next-4846300ba8f9b725594cc2e77785057f536b50c1.zip
rust: derive `Zeroable` for all structs & unions generated by bindgen where possible
Using the `--with-derive-custom-{struct,union}` option of bindgen, add `#[derive(MaybeZeroable)]` to every struct & union. This makes those types implement `Zeroable` if all their fields implement it. Sadly bindgen doesn't add custom derives to the `__BindgenBitfieldUnit` struct. So manually implement `Zeroable` for that. Signed-off-by: Benno Lossin <lossin@kernel.org> Reviewed-by: Alice Ryhl <aliceryhl@google.com> [ Formatted comment. - Miguel ] Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
Diffstat (limited to 'rust/bindings/lib.rs')
-rw-r--r--rust/bindings/lib.rs8
1 files changed, 8 insertions, 0 deletions
diff --git a/rust/bindings/lib.rs b/rust/bindings/lib.rs
index 474cc98c48a3..0c57cf9b4004 100644
--- a/rust/bindings/lib.rs
+++ b/rust/bindings/lib.rs
@@ -31,11 +31,19 @@
#[allow(clippy::undocumented_unsafe_blocks)]
#[cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]
mod bindings_raw {
+ use pin_init::{MaybeZeroable, Zeroable};
+
// Manual definition for blocklisted types.
type __kernel_size_t = usize;
type __kernel_ssize_t = isize;
type __kernel_ptrdiff_t = isize;
+ // `bindgen` doesn't automatically do this, see
+ // <https://github.com/rust-lang/rust-bindgen/issues/3196>
+ //
+ // SAFETY: `__BindgenBitfieldUnit<Storage>` is a newtype around `Storage`.
+ unsafe impl<Storage> Zeroable for __BindgenBitfieldUnit<Storage> where Storage: Zeroable {}
+
// Use glob import here to expose all helpers.
// Symbols defined within the module will take precedence to the glob import.
pub use super::bindings_helper::*;