lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAKmqyKNUYZun4Xsh=nNA5RG51MBdDRO-bx4mW1TdECTeaor4-w@mail.gmail.com>
Date: Mon, 2 Dec 2024 16:14:26 +0900
From: Alistair Francis <alistair23@...il.com>
To: Alistair Francis <alistair@...stair23.me>, Miguel Ojeda <miguel.ojeda.sandonis@...il.com>
Cc: linux-kernel@...r.kernel.org, benno.lossin@...ton.me, boqun.feng@...il.com, 
	me@...enk.dev, alex.gaynor@...il.com, a.hindborg@...nel.org, gary@...yguo.net, 
	aliceryhl@...gle.com, alistair.francis@....com, bjorn3_gh@...tonmail.com, 
	tmgross@...ch.edu, rust-for-linux@...r.kernel.org, ojeda@...nel.org
Subject: Re: [PATCH v4 00/11] rust: bindings: Auto-generate inline static functions

On Thu, Nov 14, 2024 at 9:56 AM Alistair Francis <alistair@...stair23.me> wrote:
>
> The kernel includes a large number of static inline functions that are
> defined in header files. One example is the crypto_shash_descsize()
> function which is defined in hash.h as
>
> ```
> static inline unsigned int crypto_shash_descsize(struct crypto_shash *tfm)
> {
>         return tfm->descsize;
> }
> ```
>
> bindgen is currently unable to generate bindings to these functions as
> they are not publically exposed (they are static after all).
>
> The Rust code currently uses rust_helper_* functions, such as
> rust_helper_alloc_pages() for example to call the static inline
> functions. But this is a hassle as someone needs to write a C helper
> function.
>
> Instead we can use the bindgen wrap-static-fns feature. The feature
> is marked as experimental, but has recently been promoted to
> non-experimental (depending on your version of bindgen).
>
> By supporting wrap-static-fns we automatically generate a C file called
> extern.c that exposes the static inline functions, for example like this
>
> ```
> unsigned int crypto_shash_descsize__extern(struct crypto_shash *tfm) { return crypto_shash_descsize(tfm); }
> ```
>
> The nice part is that this is auto-generated.
>
> We then also get a bindings_generate_static.rs file with the Rust
> binding, like this
>
> ```
> extern "C" {
>     #[link_name = "crypto_shash_descsize__extern"]
>     pub fn crypto_shash_descsize(tfm: *mut crypto_shash) -> core::ffi::c_uint;
> }
> ```
>
> So now we can use the static inline functions just like normal
> functions.
>
> There are a bunch of static inline functions that don't work though, because
> the C compiler fails to build extern.c:
>  * functions with inline asm generate "operand probably does not match constraints"
>    errors (rip_rel_ptr() for example)
>  * functions with bit masks (u32_encode_bits() and friends) result in
>    "call to ‘__bad_mask’ declared with attribute error: bad bitfield mask"
>    errors
>
> As well as that any static inline function that calls a function that has been
> kconfig-ed out will fail to link as the function being called isn't built
> (mdio45_ethtool_gset_npage for example)
>
> Due to these failures we use a allow-list system (where functions must
> be manually enabled).
>
> This series adds support for bindgen generating wrappers for inline statics and
> then converts the existing helper functions to this new method. This doesn't
> work for C macros, so we can't reamove all of the helper functions, but we
> can remove most.

Any more comments?

Alistair

>
> v4:
>  - Fix out of tree builds
> v3:
>  - Change SoB email address to match from address
>  - Fixup kunit test build failure
>  - Update Rust binding documentation
> v2:
>  - Fixup build failures report by test bots
>  - Rebase on rust-next (ae7851c29747fa376)
>
> Alistair Francis (11):
>   rust: bindings: Support some inline static functions
>   rust: helpers: Remove blk helper
>   rust: helpers: Remove err helper
>   rust: helpers: Remove kunit helper
>   rust: helpers: Remove some page helpers
>   rust: helpers: Remove rbtree helper
>   rust: helpers: Remove some refcount helpers
>   rust: helpers: Remove signal helper
>   rust: helpers: Remove some spinlock helpers
>   rust: helpers: Remove some task helpers
>   rust: helpers: Remove uaccess helpers
>
>  Documentation/rust/general-information.rst | 10 +++---
>  rust/.gitignore                            |  2 ++
>  rust/Makefile                              | 37 ++++++++++++++++++++--
>  rust/bindgen_static_functions              | 32 +++++++++++++++++++
>  rust/bindings/bindings_helper.h            |  6 ++++
>  rust/bindings/lib.rs                       |  4 +++
>  rust/exports.c                             |  1 +
>  rust/helpers/blk.c                         | 14 --------
>  rust/helpers/err.c                         | 18 -----------
>  rust/helpers/helpers.c                     | 11 ++-----
>  rust/helpers/kunit.c                       |  8 -----
>  rust/helpers/page.c                        |  5 ---
>  rust/helpers/rbtree.c                      |  9 ------
>  rust/helpers/refcount.c                    | 10 ------
>  rust/helpers/signal.c                      |  8 -----
>  rust/helpers/spinlock.c                    | 15 ---------
>  rust/helpers/task.c                        | 10 ------
>  rust/helpers/uaccess.c                     | 15 ---------
>  18 files changed, 87 insertions(+), 128 deletions(-)
>  create mode 100644 rust/bindgen_static_functions
>  delete mode 100644 rust/helpers/blk.c
>  delete mode 100644 rust/helpers/err.c
>  delete mode 100644 rust/helpers/kunit.c
>  delete mode 100644 rust/helpers/rbtree.c
>  delete mode 100644 rust/helpers/signal.c
>  delete mode 100644 rust/helpers/uaccess.c
>
> --
> 2.47.0
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ