Linux Audio

Check our new training course

Loading...
v6.2
 1// SPDX-License-Identifier: GPL-2.0
 2
 3//! The `kernel` crate.
 4//!
 5//! This crate contains the kernel APIs that have been ported or wrapped for
 6//! usage by Rust code in the kernel and is shared by all of them.
 7//!
 8//! In other words, all the rest of the Rust code in the kernel (e.g. kernel
 9//! modules written in Rust) depends on [`core`], [`alloc`] and this crate.
10//!
11//! If you need a kernel C API that is not ported or wrapped yet here, then
12//! do so first instead of bypassing this crate.
13
14#![no_std]
15#![feature(allocator_api)]
16#![feature(core_ffi_c)]
 
 
 
 
 
17
18// Ensure conditional compilation based on the kernel configuration works;
19// otherwise we may silently break things like initcall handling.
20#[cfg(not(CONFIG_RUST))]
21compile_error!("Missing kernel configuration for conditional compilation");
22
 
 
 
23#[cfg(not(test))]
24#[cfg(not(testlib))]
25mod allocator;
26mod build_assert;
27pub mod error;
 
 
 
 
 
 
28pub mod prelude;
29pub mod print;
30mod static_assert;
31#[doc(hidden)]
32pub mod std_vendor;
33pub mod str;
 
 
 
34pub mod types;
 
35
36#[doc(hidden)]
37pub use bindings;
38pub use macros;
 
39
40#[doc(hidden)]
41pub use build_error::build_error;
42
43/// Prefix to appear before log messages printed from within the `kernel` crate.
44const __LOG_PREFIX: &[u8] = b"rust_kernel\0";
45
46/// The top level entrypoint to implementing a kernel module.
47///
48/// For any teardown or cleanup operations, your type may implement [`Drop`].
49pub trait Module: Sized + Sync {
50    /// Called at module initialization time.
51    ///
52    /// Use this method to perform whatever setup or registration your module
53    /// should do.
54    ///
55    /// Equivalent to the `module_init` macro in the C API.
56    fn init(module: &'static ThisModule) -> error::Result<Self>;
57}
58
59/// Equivalent to `THIS_MODULE` in the C API.
60///
61/// C header: `include/linux/export.h`
62pub struct ThisModule(*mut bindings::module);
63
64// SAFETY: `THIS_MODULE` may be used from all threads within a module.
65unsafe impl Sync for ThisModule {}
66
67impl ThisModule {
68    /// Creates a [`ThisModule`] given the `THIS_MODULE` pointer.
69    ///
70    /// # Safety
71    ///
72    /// The pointer must be equal to the right `THIS_MODULE`.
73    pub const unsafe fn from_ptr(ptr: *mut bindings::module) -> ThisModule {
74        ThisModule(ptr)
75    }
76}
77
78#[cfg(not(any(testlib, test)))]
79#[panic_handler]
80fn panic(info: &core::panic::PanicInfo<'_>) -> ! {
81    pr_emerg!("{}\n", info);
82    // SAFETY: FFI call.
83    unsafe { bindings::BUG() };
84    // Bindgen currently does not recognize `__noreturn` so `BUG` returns `()`
85    // instead of `!`. See <https://github.com/rust-lang/rust-bindgen/issues/2094>.
86    loop {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87}
v6.9.4
  1// SPDX-License-Identifier: GPL-2.0
  2
  3//! The `kernel` crate.
  4//!
  5//! This crate contains the kernel APIs that have been ported or wrapped for
  6//! usage by Rust code in the kernel and is shared by all of them.
  7//!
  8//! In other words, all the rest of the Rust code in the kernel (e.g. kernel
  9//! modules written in Rust) depends on [`core`], [`alloc`] and this crate.
 10//!
 11//! If you need a kernel C API that is not ported or wrapped yet here, then
 12//! do so first instead of bypassing this crate.
 13
 14#![no_std]
 15#![feature(allocator_api)]
 16#![feature(coerce_unsized)]
 17#![feature(dispatch_from_dyn)]
 18#![feature(new_uninit)]
 19#![feature(offset_of)]
 20#![feature(receiver_trait)]
 21#![feature(unsize)]
 22
 23// Ensure conditional compilation based on the kernel configuration works;
 24// otherwise we may silently break things like initcall handling.
 25#[cfg(not(CONFIG_RUST))]
 26compile_error!("Missing kernel configuration for conditional compilation");
 27
 28// Allow proc-macros to refer to `::kernel` inside the `kernel` crate (this crate).
 29extern crate self as kernel;
 30
 31#[cfg(not(test))]
 32#[cfg(not(testlib))]
 33mod allocator;
 34mod build_assert;
 35pub mod error;
 36pub mod init;
 37pub mod ioctl;
 38#[cfg(CONFIG_KUNIT)]
 39pub mod kunit;
 40#[cfg(CONFIG_NET)]
 41pub mod net;
 42pub mod prelude;
 43pub mod print;
 44mod static_assert;
 45#[doc(hidden)]
 46pub mod std_vendor;
 47pub mod str;
 48pub mod sync;
 49pub mod task;
 50pub mod time;
 51pub mod types;
 52pub mod workqueue;
 53
 54#[doc(hidden)]
 55pub use bindings;
 56pub use macros;
 57pub use uapi;
 58
 59#[doc(hidden)]
 60pub use build_error::build_error;
 61
 62/// Prefix to appear before log messages printed from within the `kernel` crate.
 63const __LOG_PREFIX: &[u8] = b"rust_kernel\0";
 64
 65/// The top level entrypoint to implementing a kernel module.
 66///
 67/// For any teardown or cleanup operations, your type may implement [`Drop`].
 68pub trait Module: Sized + Sync + Send {
 69    /// Called at module initialization time.
 70    ///
 71    /// Use this method to perform whatever setup or registration your module
 72    /// should do.
 73    ///
 74    /// Equivalent to the `module_init` macro in the C API.
 75    fn init(module: &'static ThisModule) -> error::Result<Self>;
 76}
 77
 78/// Equivalent to `THIS_MODULE` in the C API.
 79///
 80/// C header: [`include/linux/export.h`](srctree/include/linux/export.h)
 81pub struct ThisModule(*mut bindings::module);
 82
 83// SAFETY: `THIS_MODULE` may be used from all threads within a module.
 84unsafe impl Sync for ThisModule {}
 85
 86impl ThisModule {
 87    /// Creates a [`ThisModule`] given the `THIS_MODULE` pointer.
 88    ///
 89    /// # Safety
 90    ///
 91    /// The pointer must be equal to the right `THIS_MODULE`.
 92    pub const unsafe fn from_ptr(ptr: *mut bindings::module) -> ThisModule {
 93        ThisModule(ptr)
 94    }
 95}
 96
 97#[cfg(not(any(testlib, test)))]
 98#[panic_handler]
 99fn panic(info: &core::panic::PanicInfo<'_>) -> ! {
100    pr_emerg!("{}\n", info);
101    // SAFETY: FFI call.
102    unsafe { bindings::BUG() };
103}
104
105/// Produces a pointer to an object from a pointer to one of its fields.
106///
107/// # Safety
108///
109/// The pointer passed to this macro, and the pointer returned by this macro, must both be in
110/// bounds of the same allocation.
111///
112/// # Examples
113///
114/// ```
115/// # use kernel::container_of;
116/// struct Test {
117///     a: u64,
118///     b: u32,
119/// }
120///
121/// let test = Test { a: 10, b: 20 };
122/// let b_ptr = &test.b;
123/// // SAFETY: The pointer points at the `b` field of a `Test`, so the resulting pointer will be
124/// // in-bounds of the same allocation as `b_ptr`.
125/// let test_alias = unsafe { container_of!(b_ptr, Test, b) };
126/// assert!(core::ptr::eq(&test, test_alias));
127/// ```
128#[macro_export]
129macro_rules! container_of {
130    ($ptr:expr, $type:ty, $($f:tt)*) => {{
131        let ptr = $ptr as *const _ as *const u8;
132        let offset: usize = ::core::mem::offset_of!($type, $($f)*);
133        ptr.sub(offset) as *const $type
134    }}
135}