mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
By default bindgen will convert 'enum lru_status' into a typedef for an integer. For the most part, an integer of the same size as the enum results in the correct ABI, but in the specific case of CFI, that is not the case. The CFI encoding is supposed to be the same as a struct called 'lru_status' rather than the name of the underlying native integer type. To fix this, tell bindgen to generate a newtype and set the CFI type explicitly. Note that we need to set the CFI attribute explicitly as bindgen is using repr(transparent), which is otherwise identical to the inner type for ABI purposes. This allows us to remove the page range helper C function in Binder without risking a CFI failure when list_lru_walk calls the provided function pointer. The --with-attribute-custom-enum argument requires bindgen v0.71 or greater. [ In particular, the feature was added in 0.71.0 [1][2]. In addition, `feature(cfi_encoding)` has been available since Rust 1.71.0 [3]. Link: https://github.com/rust-lang/rust-bindgen/issues/2520 [1] Link: https://github.com/rust-lang/rust-bindgen/pull/2866 [2] Link: https://github.com/rust-lang/rust/pull/105452 [3] - Miguel ] My testing procedure was to add this to the android17-6.18 branch and verify that rust_shrink_free_page is successfully called without crash, and verify that it does in fact crash when the cfi_encoding is set to other values. Note that I couldn't test this on android16-6.12 as that branch uses a bindgen version that is too old. Signed-off-by: Alice Ryhl <aliceryhl@google.com> Link: https://patch.msgid.link/20260223-cfi-lru-status-v2-1-89c6448a63a4@google.com [ Rebased on top of the minimum Rust version bump series which provide the required `bindgen` version. - Miguel ] Reviewed-by: Gary Guo <gary@garyguo.net> Link: https://patch.msgid.link/20260405235309.418950-32-ojeda@kernel.org Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
80 lines
2.2 KiB
Rust
80 lines
2.2 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! Bindings.
|
|
//!
|
|
//! Imports the generated bindings by `bindgen`.
|
|
//!
|
|
//! This crate may not be directly used. If you need a kernel C API that is
|
|
//! not ported or wrapped in the `kernel` crate, then do so first instead of
|
|
//! using this crate.
|
|
|
|
#![no_std]
|
|
#![allow(
|
|
clippy::all,
|
|
missing_docs,
|
|
non_camel_case_types,
|
|
non_upper_case_globals,
|
|
non_snake_case,
|
|
improper_ctypes,
|
|
unreachable_pub,
|
|
unsafe_op_in_unsafe_fn
|
|
)]
|
|
#![feature(cfi_encoding)]
|
|
|
|
#[allow(dead_code)]
|
|
#[allow(clippy::cast_lossless)]
|
|
#[allow(clippy::ptr_as_ptr)]
|
|
#[allow(clippy::ref_as_ptr)]
|
|
#[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::*;
|
|
include!(concat!(
|
|
env!("OBJTREE"),
|
|
"/rust/bindings/bindings_generated.rs"
|
|
));
|
|
}
|
|
|
|
// When both a directly exposed symbol and a helper exists for the same function,
|
|
// the directly exposed symbol is preferred and the helper becomes dead code, so
|
|
// ignore the warning here.
|
|
#[allow(dead_code)]
|
|
mod bindings_helper {
|
|
// Import the generated bindings for types.
|
|
use super::bindings_raw::*;
|
|
include!(concat!(
|
|
env!("OBJTREE"),
|
|
"/rust/bindings/bindings_helpers_generated.rs"
|
|
));
|
|
}
|
|
|
|
pub use bindings_raw::*;
|
|
|
|
pub const compat_ptr_ioctl: Option<
|
|
unsafe extern "C" fn(*mut file, ffi::c_uint, ffi::c_ulong) -> ffi::c_long,
|
|
> = {
|
|
#[cfg(CONFIG_COMPAT)]
|
|
{
|
|
Some(bindings_raw::compat_ptr_ioctl)
|
|
}
|
|
#[cfg(not(CONFIG_COMPAT))]
|
|
{
|
|
None
|
|
}
|
|
};
|