Skip to content

Commit 12f5772

Browse files
committed
rust: add C helpers
Introduces the source file that will contain forwarders to C macros and inlined functions. Initially this only contains a single helper, but will gain more as more functionality is added to the `kernel` crate in the future. Reviewed-by: Greg Kroah-Hartman <[email protected]> Co-developed-by: Alex Gaynor <[email protected]> Signed-off-by: Alex Gaynor <[email protected]> Co-developed-by: Geoffrey Thomas <[email protected]> Signed-off-by: Geoffrey Thomas <[email protected]> Co-developed-by: Wedson Almeida Filho <[email protected]> Signed-off-by: Wedson Almeida Filho <[email protected]> Co-developed-by: Sven Van Asbroeck <[email protected]> Signed-off-by: Sven Van Asbroeck <[email protected]> Co-developed-by: Gary Guo <[email protected]> Signed-off-by: Gary Guo <[email protected]> Co-developed-by: Boqun Feng <[email protected]> Signed-off-by: Boqun Feng <[email protected]> Co-developed-by: Maciej Falkowski <[email protected]> Signed-off-by: Maciej Falkowski <[email protected]> Co-developed-by: Wei Liu <[email protected]> Signed-off-by: Wei Liu <[email protected]> Signed-off-by: Miguel Ojeda <[email protected]>
1 parent b8a94bf commit 12f5772

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

rust/helpers.c

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/*
3+
* Non-trivial C macros cannot be used in Rust. Similarly, inlined C functions
4+
* cannot be called either. This file explicitly creates functions ("helpers")
5+
* that wrap those so that they can be called from Rust.
6+
*
7+
* Even though Rust kernel modules should never use directly the bindings, some
8+
* of these helpers need to be exported because Rust generics and inlined
9+
* functions may not get their code generated in the crate where they are
10+
* defined. Other helpers, called from non-inline functions, may not be
11+
* exported, in principle. However, in general, the Rust compiler does not
12+
* guarantee codegen will be performed for a non-inline function either.
13+
* Therefore, this file exports all the helpers. In the future, this may be
14+
* revisited to reduce the number of exports after the compiler is informed
15+
* about the places codegen is required.
16+
*
17+
* All symbols are exported as GPL-only to guarantee no GPL-only feature is
18+
* accidentally exposed.
19+
*/
20+
21+
#include <linux/bug.h>
22+
#include <linux/build_bug.h>
23+
24+
__noreturn void rust_helper_BUG(void)
25+
{
26+
BUG();
27+
}
28+
EXPORT_SYMBOL_GPL(rust_helper_BUG);
29+
30+
/*
31+
* We use `bindgen`'s `--size_t-is-usize` option to bind the C `size_t` type
32+
* as the Rust `usize` type, so we can use it in contexts where Rust
33+
* expects a `usize` like slice (array) indices. `usize` is defined to be
34+
* the same as C's `uintptr_t` type (can hold any pointer) but not
35+
* necessarily the same as `size_t` (can hold the size of any single
36+
* object). Most modern platforms use the same concrete integer type for
37+
* both of them, but in case we find ourselves on a platform where
38+
* that's not true, fail early instead of risking ABI or
39+
* integer-overflow issues.
40+
*
41+
* If your platform fails this assertion, it means that you are in
42+
* danger of integer-overflow bugs (even if you attempt to remove
43+
* `--size_t-is-usize`). It may be easiest to change the kernel ABI on
44+
* your platform such that `size_t` matches `uintptr_t` (i.e., to increase
45+
* `size_t`, because `uintptr_t` has to be at least as big as `size_t`).
46+
*/
47+
static_assert(
48+
sizeof(size_t) == sizeof(uintptr_t) &&
49+
__alignof__(size_t) == __alignof__(uintptr_t),
50+
"Rust code expects C `size_t` to match Rust `usize`"
51+
);

0 commit comments

Comments
 (0)