linux-imx/rust/helpers.c
Alice Ryhl bd197c334a ANDROID: revert Rust Binder changes in android15-6.6
This reverts the following commits:
0347be8c14 ANDROID: rust: disable floating point target features
013c5ddc64 ANDROID: rust_binder: fix leak of name in binderfs
2f4e6b1def ANDROID: Disable warning about new bindgen
3396c2131d ANDROID: rust: use target.json for aarch64
1656e8d99d ANDROID: rust: rustfmt scripts/generate_rust_target.rs
42eb612b25 ANDROID: Enable Rust Binder Module
cb0bef6d8e ANDROID: rust_binder: Switch Rust Binder to GKI Module
b511e79bc5 ANDROID: Only warn on long symbols
4a571c32cb ANDROID: Re-enable Rust symbol export
08dde7cab7 ANDROID: rust_binder: properly handle critical refcount increments
39285e9a6e ANDROID: rust_binder: split out logic for zero-to-one refcount increment
76784ba7b8 ANDROID: rust_binder: don't use boolean to schedule nodes
64018a934a ANDROID: rust_binder: don't pr_warn on benign errors
9ff51354fd ANDROID: use 1.73.0b compiler prebuilt
ed1360bdfa ANDROID: rust_binder: fix CFI failure in rust_shrink_free_page
741b6ae073 ANDROID: rust_binder: don't use default implementations
bee37573f9 ANDROID: rust_binder: add missing void arguments to binderfs files
8ae6dec97f ANDROID: rust_binder: fix ioctl_freeze
c9370a3cbb ANDROID: rust_binder: return pending info for frozen async txns
f6d2f5ebcb ANDROID: rust_binder: various minor improvements
d27c2c39fd ANDROID: rust_binder: add elapsed to binder_logs/state
9ef1712688 FROMLIST: rust: time: add Ktime
306e7bafe8 FROMLIST: rust: don't select CONSTRUCTORS
5424a7cb43 FROMLIST: rust: add flags for shadow call stack sanitizer
c42560464f ANDROID: binder: update Kconfig for choosing between implementations
87f0a459c0 ANDROID: rust: uaccess: fix length usage in read_all
c6c6be80a8 ANDROID: rust: use Rust atomics for Arc refcount
282b78baf0 ANDROID: rust_binder: choose driver with kcmdline flag
01ac18bd09 ANDROID: rust_binder: add binder_logs/state
ec1855352b ANDROID: rust_binder: fail if objects are out of order
ac68e23d38 ANDROID: rust_binder: add vma shrinker
2e4f09314c ANDROID: rust_binder: add priority inheritance
691f0f1682 ANDROID: rust_binder: add oneway spam detection
6249f06992 ANDROID: rust_binder: add TF_UPDATE_TXN support
50259804b1 ANDROID: rust_binder: add process freezing
571343fd97 ANDROID: rust_binder: add BINDER_TYPE_FDA support
b427bc70cf ANDROID: rust_binder: add BINDER_TYPE_FD support
451e930fc0 ANDROID: rust_binder: add BINDER_TYPE_PTR support
ae1d247379 ANDROID: rust_binder: send nodes in transactions
892df033dc ANDROID: rust_binder: add death notifications
fe5dea5fc7 ANDROID: rust_binder: serialize oneway transactions
b67f39008f ANDROID: rust_binder: add non-oneway transactions
98cf4f1b76 ANDROID: rust_binder: add epoll support
bb1d504151 ANDROID: rust_binder: add oneway transactions
0ccb57c72d ANDROID: rust_binder: add nodes and context managers
6feafb413a ANDROID: rust_binder: add work lists
046eb3d735 ANDROID: rust_binder: add threading support
0d512d37b0 ANDROID: rust_binder: add binderfs support to Rust binder
adfa541d88 ANDROID: rust_binder: define a Rust binder driver
b1661c9e45 ANDROID: rust: add linked list implementation
ec656ad4c9 ANDROID: rust: sync: add `Arc::into_unique_or_drop`
b57704d237 ANDROID: rust: sync: add `ArcBorrow::from_raw`
a1bb998934 ANDROID: rust: mm: add bindings for memory management
67fe8ee749 FROMLIST: rust: add abstraction for `struct page`
6896fba16f FROMLIST: rust: uaccess: add typed accessors for userspace pointers
881c1e2f85 FROMLIST: uaccess: always export _copy_[from|to]_user with CONFIG_RUST
3629eb70a6 FROMLIST: rust: uaccess: add userspace pointers
84e0b6c8ef FROMLIST: rust: rbtree: add `RBTree::entry`
c226168bb5 FROMLIST: rust: rbtree: add `RBTreeCursor`
a3e1a10677 FROMLIST: rust: rbtree: add `RBTreeIteratorMut`
97cbf6e271 FROMLIST: rust: rbtree: add `RBTreeIterator`
adfa8383a5 FROMLIST: rust: rbtree: add red-black tree implementation backed by the C version
4cb6d81d02 FROMLIST: rust: add `container_of!` macro
879f437248 FROMLIST: rust: file: add abstraction for `poll_table`
4aa358bcc5 FROMLIST: rust: file: add `DeferredFdCloser`
8abb138ec8 FROMLIST: rust: file: add `Kuid` wrapper
f764ce9b2b FROMLIST: rust: file: add `FileDescriptorReservation`
a34dbbde7c FROMLIST: rust: security: add abstraction for secctx
c0b96a7765 FROMLIST: rust: cred: add Rust abstraction for `struct cred`
40eecc8bdf FROMLIST: rust: file: add Rust abstraction for `struct file`
c8ae5646c9 FROMLIST: rust: task: add `Task::current_raw`
6b4006d2d7 FROMLIST: rust: types: add `NotThreadSafe`
6bb35a6e52 FROMGIT: rust: sync: update integer types in CondVar
bd6e290154 FROMGIT: rust: sync: add `CondVar::wait_timeout`
117298b362 FROMGIT: rust: time: add msecs to jiffies conversion
d6ce2b7bd7 FROMGIT: rust: sync: add `CondVar::notify_sync`
495235c0f3 FROMGIT: rust: sync: `CondVar` rename "wait_list" to "wait_queue_head"
4c5e3e9f01 UPSTREAM: binder: use enum for binder ioctls
fbb9dbf62c UPSTREAM: rust: support `srctree`-relative links
0f40dd3c65 UPSTREAM: rust: sync: Makes `CondVar::wait()` an uninterruptible wait
5e2edfbc03 UPSTREAM: rust: macros: improve `#[vtable]` documentation
8bd5093c30 UPSTREAM: rust: macros: update 'paste!' macro to accept string literals
63a42cf758 UPSTREAM: rust: bindings: rename const binding using sed
412965714b UPSTREAM: rust: replace <linux/module.h> with <linux/export.h> in rust/exports.c
1765f2a273 UPSTREAM: rust: kernel: str: Implement Debug for CString
fe69811059 UPSTREAM: rust: task: remove redundant explicit link
f2497a4bb0 UPSTREAM: rust: kernel: remove `#[allow(clippy::new_ret_no_self)]`
a6ab1c4b59 UPSTREAM: rust: workqueue: add examples
3525914f07 UPSTREAM: rust: workqueue: add `try_spawn` helper method
7b431db132 UPSTREAM: rust: workqueue: implement `WorkItemPointer` for pointer types
c5e9e92b74 UPSTREAM: rust: workqueue: add helper for defining work_struct fields
fef46ccba9 UPSTREAM: rust: workqueue: define built-in queues
37fe02321c UPSTREAM: rust: workqueue: add low-level workqueue bindings
a0c639eadc UPSTREAM: rust: sync: add `Arc::{from_raw, into_raw}`
37e90c8aef ANDROID: rust: Enable KCFI support when available
6be7b55440 ANDROID: rust: Use From instances for JSON encoder
2b93c38ece ANDROID: rust: Support arrays in target JSON
4085063afb ANDROID: rust: allow MODVERSIONS by no longer exporting symbols
e019515a16 ANDROID: rust: Select rustc-1.73.0
ae876716fc FROMLIST: x86: rust: Disable entry padding with Rust
b802a765fb FROMLIST: arm64: rust: Enable Rust support for AArch64
433a394399 FROMLIST: rust: Refactor the build target to allow the use of builtin targets
5eb6b43401 UPSTREAM: rust: Suppress searching builtin sysroot
9b8f3fdda6 UPSTREAM: rust: Ignore preserve-most functions
5341e12502 UPSTREAM: x86: Enable IBT in Rust if enabled in C
37481c8f5a UPSTREAM: rust: upgrade to Rust 1.73.0
42092eccd9 UPSTREAM: rust: upgrade to Rust 1.72.1
30043aaafb UPSTREAM: rust: arc: add explicit `drop()` around `Box::from_raw()`
3365cb02fe UPSTREAM: rust: Use grep -Ev rather than relying on GNU grep
5dd966b03a UPSTREAM: rust: Use awk instead of recent xargs
8a38f60333 UPSTREAM: rust: Respect HOSTCC when linking for host

Fixes: adfa541d88 ("ANDROID: rust_binder: define a Rust binder driver")
Change-Id: Id70e8c42c0b2b31753998c9b5d12e5c449aeafd7
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
2024-08-14 09:00:02 +00:00

168 lines
4.6 KiB
C

// 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.
*
* Sorted alphabetically.
*/
#include <kunit/test-bug.h>
#include <linux/bug.h>
#include <linux/build_bug.h>
#include <linux/err.h>
#include <linux/errname.h>
#include <linux/mutex.h>
#include <linux/refcount.h>
#include <linux/sched/signal.h>
#include <linux/spinlock.h>
#include <linux/wait.h>
__noreturn void rust_helper_BUG(void)
{
BUG();
}
EXPORT_SYMBOL_GPL(rust_helper_BUG);
void rust_helper_mutex_lock(struct mutex *lock)
{
mutex_lock(lock);
}
EXPORT_SYMBOL_GPL(rust_helper_mutex_lock);
void rust_helper___spin_lock_init(spinlock_t *lock, const char *name,
struct lock_class_key *key)
{
#ifdef CONFIG_DEBUG_SPINLOCK
__raw_spin_lock_init(spinlock_check(lock), name, key, LD_WAIT_CONFIG);
#else
spin_lock_init(lock);
#endif
}
EXPORT_SYMBOL_GPL(rust_helper___spin_lock_init);
void rust_helper_spin_lock(spinlock_t *lock)
{
spin_lock(lock);
}
EXPORT_SYMBOL_GPL(rust_helper_spin_lock);
void rust_helper_spin_unlock(spinlock_t *lock)
{
spin_unlock(lock);
}
EXPORT_SYMBOL_GPL(rust_helper_spin_unlock);
void rust_helper_init_wait(struct wait_queue_entry *wq_entry)
{
init_wait(wq_entry);
}
EXPORT_SYMBOL_GPL(rust_helper_init_wait);
int rust_helper_signal_pending(struct task_struct *t)
{
return signal_pending(t);
}
EXPORT_SYMBOL_GPL(rust_helper_signal_pending);
refcount_t rust_helper_REFCOUNT_INIT(int n)
{
return (refcount_t)REFCOUNT_INIT(n);
}
EXPORT_SYMBOL_GPL(rust_helper_REFCOUNT_INIT);
void rust_helper_refcount_inc(refcount_t *r)
{
refcount_inc(r);
}
EXPORT_SYMBOL_GPL(rust_helper_refcount_inc);
bool rust_helper_refcount_dec_and_test(refcount_t *r)
{
return refcount_dec_and_test(r);
}
EXPORT_SYMBOL_GPL(rust_helper_refcount_dec_and_test);
__force void *rust_helper_ERR_PTR(long err)
{
return ERR_PTR(err);
}
EXPORT_SYMBOL_GPL(rust_helper_ERR_PTR);
bool rust_helper_IS_ERR(__force const void *ptr)
{
return IS_ERR(ptr);
}
EXPORT_SYMBOL_GPL(rust_helper_IS_ERR);
long rust_helper_PTR_ERR(__force const void *ptr)
{
return PTR_ERR(ptr);
}
EXPORT_SYMBOL_GPL(rust_helper_PTR_ERR);
const char *rust_helper_errname(int err)
{
return errname(err);
}
EXPORT_SYMBOL_GPL(rust_helper_errname);
struct task_struct *rust_helper_get_current(void)
{
return current;
}
EXPORT_SYMBOL_GPL(rust_helper_get_current);
void rust_helper_get_task_struct(struct task_struct *t)
{
get_task_struct(t);
}
EXPORT_SYMBOL_GPL(rust_helper_get_task_struct);
void rust_helper_put_task_struct(struct task_struct *t)
{
put_task_struct(t);
}
EXPORT_SYMBOL_GPL(rust_helper_put_task_struct);
struct kunit *rust_helper_kunit_get_current_test(void)
{
return kunit_get_current_test();
}
EXPORT_SYMBOL_GPL(rust_helper_kunit_get_current_test);
/*
* `bindgen` binds 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 add
* `--no-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`"
);