| // SPDX-License-Identifier: GPL-2.0 |
| |
| #include <linux/bug.h> |
| #include <linux/build_bug.h> |
| #include <linux/uaccess.h> |
| #include <linux/sched/signal.h> |
| #include <linux/gfp.h> |
| #include <linux/highmem.h> |
| #include <linux/uio.h> |
| #include <linux/errname.h> |
| #include <linux/mutex.h> |
| #include <linux/platform_device.h> |
| #include <linux/security.h> |
| #include <asm/io.h> |
| |
| __noreturn void rust_helper_BUG(void) |
| { |
| BUG(); |
| } |
| |
| unsigned long rust_helper_copy_from_user(void *to, const void __user *from, unsigned long n) |
| { |
| return copy_from_user(to, from, n); |
| } |
| |
| unsigned long rust_helper_copy_to_user(void __user *to, const void *from, unsigned long n) |
| { |
| return copy_to_user(to, from, n); |
| } |
| |
| unsigned long rust_helper_clear_user(void __user *to, unsigned long n) |
| { |
| return clear_user(to, n); |
| } |
| |
| void __iomem *rust_helper_ioremap(resource_size_t offset, unsigned long size) |
| { |
| return ioremap(offset, size); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_ioremap); |
| |
| u8 rust_helper_readb(const volatile void __iomem *addr) |
| { |
| return readb(addr); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_readb); |
| |
| u16 rust_helper_readw(const volatile void __iomem *addr) |
| { |
| return readw(addr); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_readw); |
| |
| u32 rust_helper_readl(const volatile void __iomem *addr) |
| { |
| return readl(addr); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_readl); |
| |
| #ifdef CONFIG_64BIT |
| u64 rust_helper_readq(const volatile void __iomem *addr) |
| { |
| return readq(addr); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_readq); |
| #endif |
| |
| void rust_helper_writeb(u8 value, volatile void __iomem *addr) |
| { |
| writeb(value, addr); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_writeb); |
| |
| void rust_helper_writew(u16 value, volatile void __iomem *addr) |
| { |
| writew(value, addr); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_writew); |
| |
| void rust_helper_writel(u32 value, volatile void __iomem *addr) |
| { |
| writel(value, addr); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_writel); |
| |
| #ifdef CONFIG_64BIT |
| void rust_helper_writeq(u64 value, volatile void __iomem *addr) |
| { |
| writeq(value, addr); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_writeq); |
| #endif |
| |
| void rust_helper___spin_lock_init(spinlock_t *lock, const char *name, |
| struct lock_class_key *key) |
| { |
| #ifdef CONFIG_DEBUG_SPINLOCK |
| __spin_lock_init(lock, name, key); |
| #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); |
| |
| struct page *rust_helper_alloc_pages(gfp_t gfp_mask, unsigned int order) |
| { |
| return alloc_pages(gfp_mask, order); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_alloc_pages); |
| |
| void *rust_helper_kmap(struct page *page) |
| { |
| return kmap(page); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_kmap); |
| |
| void rust_helper_kunmap(struct page *page) |
| { |
| return kunmap(page); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_kunmap); |
| |
| int rust_helper_cond_resched(void) |
| { |
| return cond_resched(); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_cond_resched); |
| |
| size_t rust_helper_copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) |
| { |
| return copy_from_iter(addr, bytes, i); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_copy_from_iter); |
| |
| size_t rust_helper_copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i) |
| { |
| return copy_to_iter(addr, bytes, i); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_copy_to_iter); |
| |
| 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); |
| |
| void rust_helper_mutex_lock(struct mutex *lock) |
| { |
| mutex_lock(lock); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_mutex_lock); |
| |
| void * |
| rust_helper_platform_get_drvdata(const struct platform_device *pdev) |
| { |
| return platform_get_drvdata(pdev); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_platform_get_drvdata); |
| |
| void |
| rust_helper_platform_set_drvdata(struct platform_device *pdev, |
| void *data) |
| { |
| return platform_set_drvdata(pdev, data); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_platform_set_drvdata); |
| |
| 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); |
| |
| void rust_helper_rb_link_node(struct rb_node *node, struct rb_node *parent, |
| struct rb_node **rb_link) |
| { |
| rb_link_node(node, parent, rb_link); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_rb_link_node); |
| |
| 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); |
| |
| int rust_helper_security_binder_set_context_mgr(struct task_struct *mgr) |
| { |
| return security_binder_set_context_mgr(mgr); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_security_binder_set_context_mgr); |
| |
| int rust_helper_security_binder_transaction(struct task_struct *from, |
| struct task_struct *to) |
| { |
| return security_binder_transaction(from, to); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_security_binder_transaction); |
| |
| int rust_helper_security_binder_transfer_binder(struct task_struct *from, |
| struct task_struct *to) |
| { |
| return security_binder_transfer_binder(from, to); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_security_binder_transfer_binder); |
| |
| int rust_helper_security_binder_transfer_file(struct task_struct *from, |
| struct task_struct *to, |
| struct file *file) |
| { |
| return security_binder_transfer_file(from, to, file); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_security_binder_transfer_file); |
| |
| void *rust_helper_dev_get_drvdata(struct device *dev) |
| { |
| return dev_get_drvdata(dev); |
| } |
| EXPORT_SYMBOL_GPL(rust_helper_dev_get_drvdata); |
| |
| /* 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" |
| ); |