1 // SPDX-License-Identifier: GPL-2.0 2 3 //! Crate for all kernel procedural macros. 4 5 mod helpers; 6 mod module; 7 8 use proc_macro::TokenStream; 9 10 /// Declares a kernel module. 11 /// 12 /// The `type` argument should be a type which implements the [`Module`] 13 /// trait. Also accepts various forms of kernel metadata. 14 /// 15 /// C header: [`include/linux/moduleparam.h`](../../../include/linux/moduleparam.h) 16 /// 17 /// [`Module`]: ../kernel/trait.Module.html 18 /// 19 /// # Examples 20 /// 21 /// ```ignore 22 /// use kernel::prelude::*; 23 /// 24 /// module!{ 25 /// type: MyModule, 26 /// name: b"my_kernel_module", 27 /// author: b"Rust for Linux Contributors", 28 /// description: b"My very own kernel module!", 29 /// license: b"GPL", 30 /// params: { 31 /// my_i32: i32 { 32 /// default: 42, 33 /// permissions: 0o000, 34 /// description: b"Example of i32", 35 /// }, 36 /// writeable_i32: i32 { 37 /// default: 42, 38 /// permissions: 0o644, 39 /// description: b"Example of i32", 40 /// }, 41 /// }, 42 /// } 43 /// 44 /// struct MyModule; 45 /// 46 /// impl kernel::Module for MyModule { 47 /// fn init() -> Result<Self> { 48 /// // If the parameter is writeable, then the kparam lock must be 49 /// // taken to read the parameter: 50 /// { 51 /// let lock = THIS_MODULE.kernel_param_lock(); 52 /// pr_info!("i32 param is: {}\n", writeable_i32.read(&lock)); 53 /// } 54 /// // If the parameter is read only, it can be read without locking 55 /// // the kernel parameters: 56 /// pr_info!("i32 param is: {}\n", my_i32.read()); 57 /// Ok(Self) 58 /// } 59 /// } 60 /// ``` 61 /// 62 /// # Supported argument types 63 /// - `type`: type which implements the [`Module`] trait (required). 64 /// - `name`: byte array of the name of the kernel module (required). 65 /// - `author`: byte array of the author of the kernel module. 66 /// - `description`: byte array of the description of the kernel module. 67 /// - `license`: byte array of the license of the kernel module (required). 68 /// - `alias`: byte array of alias name of the kernel module. 69 #[proc_macro] 70 pub fn module(ts: TokenStream) -> TokenStream { 71 module::module(ts) 72 } 73