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 Filhofn 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