mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
2.2 KiB
51 lines
2.2 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
/* |
|
* Non-trivial C macros cannot be used in Rust. Similarly, inlined C functions |
|
* cannot be called either. This file explicitly creates functions ("helpers") |
|
* that wrap those so that they can be called from Rust. |
|
* |
|
* Even though Rust kernel modules should never use directly the bindings, some |
|
* of these helpers need to be exported because Rust generics and inlined |
|
* functions may not get their code generated in the crate where they are |
|
* defined. Other helpers, called from non-inline functions, may not be |
|
* exported, in principle. However, in general, the Rust compiler does not |
|
* guarantee codegen will be performed for a non-inline function either. |
|
* Therefore, this file exports all the helpers. In the future, this may be |
|
* revisited to reduce the number of exports after the compiler is informed |
|
* about the places codegen is required. |
|
* |
|
* All symbols are exported as GPL-only to guarantee no GPL-only feature is |
|
* accidentally exposed. |
|
*/ |
|
|
|
#include <linux/bug.h> |
|
#include <linux/build_bug.h> |
|
|
|
__noreturn void rust_helper_BUG(void) |
|
{ |
|
BUG(); |
|
} |
|
EXPORT_SYMBOL_GPL(rust_helper_BUG); |
|
|
|
/* |
|
* We use `bindgen`'s `--size_t-is-usize` option to bind the C `size_t` type |
|
* as the Rust `usize` type, so we can use it in contexts where Rust |
|
* expects a `usize` like slice (array) indices. `usize` is defined to be |
|
* the same as C's `uintptr_t` type (can hold any pointer) but not |
|
* necessarily the same as `size_t` (can hold the size of any single |
|
* object). Most modern platforms use the same concrete integer type for |
|
* both of them, but in case we find ourselves on a platform where |
|
* that's not true, fail early instead of risking ABI or |
|
* integer-overflow issues. |
|
* |
|
* If your platform fails this assertion, it means that you are in |
|
* danger of integer-overflow bugs (even if you attempt to remove |
|
* `--size_t-is-usize`). It may be easiest to change the kernel ABI on |
|
* your platform such that `size_t` matches `uintptr_t` (i.e., to increase |
|
* `size_t`, because `uintptr_t` has to be at least as big as `size_t`). |
|
*/ |
|
static_assert( |
|
sizeof(size_t) == sizeof(uintptr_t) && |
|
__alignof__(size_t) == __alignof__(uintptr_t), |
|
"Rust code expects C `size_t` to match Rust `usize`" |
|
);
|
|
|