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>
67 lines
2.2 KiB
Plaintext
67 lines
2.2 KiB
Plaintext
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
# We want to map these types to `isize`/`usize` manually, instead of
|
|
# define them as `int`/`long` depending on platform bitwidth.
|
|
--blocklist-type __kernel_s?size_t
|
|
--blocklist-type __kernel_ptrdiff_t
|
|
|
|
--opaque-type xregs_state
|
|
--opaque-type desc_struct
|
|
--opaque-type arch_lbr_state
|
|
--opaque-type local_apic
|
|
|
|
# Packed type cannot transitively contain a `#[repr(align)]` type.
|
|
--opaque-type alt_instr
|
|
--opaque-type x86_msi_data
|
|
--opaque-type x86_msi_addr_lo
|
|
|
|
# If SMP is disabled, `arch_spinlock_t` is defined as a ZST which triggers a Rust
|
|
# warning. We don't need to peek into it anyway.
|
|
--opaque-type spinlock
|
|
|
|
# enums that appear in indirect function calls should specify a cfi type
|
|
--newtype-enum lru_status
|
|
--with-attribute-custom-enum=lru_status='#[cfi_encoding="10lru_status"]'
|
|
|
|
# `seccomp`'s comment gets understood as a doctest
|
|
--no-doc-comments
|
|
|
|
# These functions use the `__preserve_most` calling convention, which neither bindgen
|
|
# nor Rust currently understand, and which Clang currently declares to be unstable.
|
|
--blocklist-function __list_.*_report
|
|
|
|
# These constants are sometimes not recognized by bindgen depending on config.
|
|
# We use const helpers to aid bindgen, to avoid conflicts when constants are
|
|
# recognized, block generation of the non-helper constants.
|
|
--blocklist-item ARCH_SLAB_MINALIGN
|
|
--blocklist-item ARCH_KMALLOC_MINALIGN
|
|
--blocklist-item VM_MERGEABLE
|
|
--blocklist-item VM_READ
|
|
--blocklist-item VM_WRITE
|
|
--blocklist-item VM_EXEC
|
|
--blocklist-item VM_SHARED
|
|
--blocklist-item VM_MAYREAD
|
|
--blocklist-item VM_MAYWRITE
|
|
--blocklist-item VM_MAYEXEC
|
|
--blocklist-item VM_MAYEXEC
|
|
--blocklist-item VM_PFNMAP
|
|
--blocklist-item VM_IO
|
|
--blocklist-item VM_DONTCOPY
|
|
--blocklist-item VM_DONTEXPAND
|
|
--blocklist-item VM_LOCKONFAULT
|
|
--blocklist-item VM_ACCOUNT
|
|
--blocklist-item VM_NORESERVE
|
|
--blocklist-item VM_HUGETLB
|
|
--blocklist-item VM_SYNC
|
|
--blocklist-item VM_ARCH_1
|
|
--blocklist-item VM_WIPEONFORK
|
|
--blocklist-item VM_DONTDUMP
|
|
--blocklist-item VM_SOFTDIRTY
|
|
--blocklist-item VM_MIXEDMAP
|
|
--blocklist-item VM_HUGEPAGE
|
|
--blocklist-item VM_NOHUGEPAGE
|
|
|
|
# Structs should implement `Zeroable` when all of their fields do.
|
|
--with-derive-custom-struct .*=MaybeZeroable
|
|
--with-derive-custom-union .*=MaybeZeroable
|