xref: /openbmc/linux/rust/kernel/lib.rs (revision e0d77d0f38aa60ca61b3ce6e60d64fad2aa0853d)
1247b365dSWedson Almeida Filho // SPDX-License-Identifier: GPL-2.0
2247b365dSWedson Almeida Filho 
3247b365dSWedson Almeida Filho //! The `kernel` crate.
4247b365dSWedson Almeida Filho //!
5247b365dSWedson Almeida Filho //! This crate contains the kernel APIs that have been ported or wrapped for
6247b365dSWedson Almeida Filho //! usage by Rust code in the kernel and is shared by all of them.
7247b365dSWedson Almeida Filho //!
8247b365dSWedson Almeida Filho //! In other words, all the rest of the Rust code in the kernel (e.g. kernel
9247b365dSWedson Almeida Filho //! modules written in Rust) depends on [`core`], [`alloc`] and this crate.
10247b365dSWedson Almeida Filho //!
11247b365dSWedson Almeida Filho //! If you need a kernel C API that is not ported or wrapped yet here, then
12247b365dSWedson Almeida Filho //! do so first instead of bypassing this crate.
13247b365dSWedson Almeida Filho 
14247b365dSWedson Almeida Filho #![no_std]
1576e2c2d9SWedson Almeida Filho #![feature(allocator_api)]
16f75cb6fcSWedson Almeida Filho #![feature(coerce_unsized)]
170748424aSWedson Almeida Filho #![feature(dispatch_from_dyn)]
183c01a424SAsahi Lina #![feature(new_uninit)]
1953528772SWedson Almeida Filho #![feature(receiver_trait)]
20f75cb6fcSWedson Almeida Filho #![feature(unsize)]
21247b365dSWedson Almeida Filho 
22247b365dSWedson Almeida Filho // Ensure conditional compilation based on the kernel configuration works;
23247b365dSWedson Almeida Filho // otherwise we may silently break things like initcall handling.
24247b365dSWedson Almeida Filho #[cfg(not(CONFIG_RUST))]
25247b365dSWedson Almeida Filho compile_error!("Missing kernel configuration for conditional compilation");
26247b365dSWedson Almeida Filho 
2790e53c5eSBenno Lossin // Allow proc-macros to refer to `::kernel` inside the `kernel` crate (this crate).
2890e53c5eSBenno Lossin extern crate self as kernel;
2990e53c5eSBenno Lossin 
30247b365dSWedson Almeida Filho #[cfg(not(test))]
31247b365dSWedson Almeida Filho #[cfg(not(testlib))]
32247b365dSWedson Almeida Filho mod allocator;
330f595babSGary Guo mod build_assert;
34247b365dSWedson Almeida Filho pub mod error;
3590e53c5eSBenno Lossin pub mod init;
36ea76e08fSAsahi Lina pub mod ioctl;
37a66d733dSMiguel Ojeda #[cfg(CONFIG_KUNIT)]
38a66d733dSMiguel Ojeda pub mod kunit;
39247b365dSWedson Almeida Filho pub mod prelude;
40247b365dSWedson Almeida Filho pub mod print;
41ef9e3797SMiguel Ojeda mod static_assert;
42bee16889SNiklas Mohrin #[doc(hidden)]
43bee16889SNiklas Mohrin pub mod std_vendor;
44247b365dSWedson Almeida Filho pub mod str;
459dc04365SWedson Almeida Filho pub mod sync;
46313c4281SWedson Almeida Filho pub mod task;
47ba20915bSWedson Almeida Filho pub mod types;
48247b365dSWedson Almeida Filho 
49247b365dSWedson Almeida Filho #[doc(hidden)]
50247b365dSWedson Almeida Filho pub use bindings;
51247b365dSWedson Almeida Filho pub use macros;
524e174665SAsahi Lina pub use uapi;
53247b365dSWedson Almeida Filho 
540f595babSGary Guo #[doc(hidden)]
550f595babSGary Guo pub use build_error::build_error;
560f595babSGary Guo 
57247b365dSWedson Almeida Filho /// Prefix to appear before log messages printed from within the `kernel` crate.
58247b365dSWedson Almeida Filho const __LOG_PREFIX: &[u8] = b"rust_kernel\0";
59247b365dSWedson Almeida Filho 
60247b365dSWedson Almeida Filho /// The top level entrypoint to implementing a kernel module.
61247b365dSWedson Almeida Filho ///
62247b365dSWedson Almeida Filho /// For any teardown or cleanup operations, your type may implement [`Drop`].
63*00d2715aSWedson Almeida Filho pub trait Module: Sized + Sync + Send {
64247b365dSWedson Almeida Filho     /// Called at module initialization time.
65247b365dSWedson Almeida Filho     ///
66247b365dSWedson Almeida Filho     /// Use this method to perform whatever setup or registration your module
67247b365dSWedson Almeida Filho     /// should do.
68247b365dSWedson Almeida Filho     ///
69247b365dSWedson Almeida Filho     /// Equivalent to the `module_init` macro in the C API.
init(module: &'static ThisModule) -> error::Result<Self>70247b365dSWedson Almeida Filho     fn init(module: &'static ThisModule) -> error::Result<Self>;
71247b365dSWedson Almeida Filho }
72247b365dSWedson Almeida Filho 
73247b365dSWedson Almeida Filho /// Equivalent to `THIS_MODULE` in the C API.
74247b365dSWedson Almeida Filho ///
75247b365dSWedson Almeida Filho /// C header: `include/linux/export.h`
76247b365dSWedson Almeida Filho pub struct ThisModule(*mut bindings::module);
77247b365dSWedson Almeida Filho 
78247b365dSWedson Almeida Filho // SAFETY: `THIS_MODULE` may be used from all threads within a module.
79247b365dSWedson Almeida Filho unsafe impl Sync for ThisModule {}
80247b365dSWedson Almeida Filho 
81247b365dSWedson Almeida Filho impl ThisModule {
82247b365dSWedson Almeida Filho     /// Creates a [`ThisModule`] given the `THIS_MODULE` pointer.
83247b365dSWedson Almeida Filho     ///
84247b365dSWedson Almeida Filho     /// # Safety
85247b365dSWedson Almeida Filho     ///
86247b365dSWedson Almeida Filho     /// The pointer must be equal to the right `THIS_MODULE`.
from_ptr(ptr: *mut bindings::module) -> ThisModule87247b365dSWedson Almeida Filho     pub const unsafe fn from_ptr(ptr: *mut bindings::module) -> ThisModule {
88247b365dSWedson Almeida Filho         ThisModule(ptr)
89247b365dSWedson Almeida Filho     }
90247b365dSWedson Almeida Filho }
91247b365dSWedson Almeida Filho 
92247b365dSWedson Almeida Filho #[cfg(not(any(testlib, test)))]
93247b365dSWedson Almeida Filho #[panic_handler]
panic(info: &core::panic::PanicInfo<'_>) -> !94247b365dSWedson Almeida Filho fn panic(info: &core::panic::PanicInfo<'_>) -> ! {
95247b365dSWedson Almeida Filho     pr_emerg!("{}\n", info);
96247b365dSWedson Almeida Filho     // SAFETY: FFI call.
97247b365dSWedson Almeida Filho     unsafe { bindings::BUG() };
98247b365dSWedson Almeida Filho }
99