diff options
Diffstat (limited to 'rust/macros/lib.rs')
| -rw-r--r-- | rust/macros/lib.rs | 72 | 
1 files changed, 72 insertions, 0 deletions
diff --git a/rust/macros/lib.rs b/rust/macros/lib.rs new file mode 100644 index 000000000000..91764bfb1f89 --- /dev/null +++ b/rust/macros/lib.rs @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Crate for all kernel procedural macros. + +mod helpers; +mod module; + +use proc_macro::TokenStream; + +/// Declares a kernel module. +/// +/// The `type` argument should be a type which implements the [`Module`] +/// trait. Also accepts various forms of kernel metadata. +/// +/// C header: [`include/linux/moduleparam.h`](../../../include/linux/moduleparam.h) +/// +/// [`Module`]: ../kernel/trait.Module.html +/// +/// # Examples +/// +/// ```ignore +/// use kernel::prelude::*; +/// +/// module!{ +///     type: MyModule, +///     name: b"my_kernel_module", +///     author: b"Rust for Linux Contributors", +///     description: b"My very own kernel module!", +///     license: b"GPL", +///     params: { +///        my_i32: i32 { +///            default: 42, +///            permissions: 0o000, +///            description: b"Example of i32", +///        }, +///        writeable_i32: i32 { +///            default: 42, +///            permissions: 0o644, +///            description: b"Example of i32", +///        }, +///    }, +/// } +/// +/// struct MyModule; +/// +/// impl kernel::Module for MyModule { +///     fn init() -> Result<Self> { +///         // If the parameter is writeable, then the kparam lock must be +///         // taken to read the parameter: +///         { +///             let lock = THIS_MODULE.kernel_param_lock(); +///             pr_info!("i32 param is:  {}\n", writeable_i32.read(&lock)); +///         } +///         // If the parameter is read only, it can be read without locking +///         // the kernel parameters: +///         pr_info!("i32 param is:  {}\n", my_i32.read()); +///         Ok(Self) +///     } +/// } +/// ``` +/// +/// # Supported argument types +///   - `type`: type which implements the [`Module`] trait (required). +///   - `name`: byte array of the name of the kernel module (required). +///   - `author`: byte array of the author of the kernel module. +///   - `description`: byte array of the description of the kernel module. +///   - `license`: byte array of the license of the kernel module (required). +///   - `alias`: byte array of alias name of the kernel module. +#[proc_macro] +pub fn module(ts: TokenStream) -> TokenStream { +    module::module(ts) +}  |