mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	 1fbde52bde
			
		
	
	
		1fbde52bde
		
	
	
	
	
		
			
			This crate contains all the procedural macros ("proc macros")
shared by all the kernel.
Procedural macros allow to create syntax extensions. They run at
compile-time and can consume as well as produce Rust syntax.
For instance, the `module!` macro that is used by Rust modules
is implemented here. It allows to easily declare the equivalent
information to the `MODULE_*` macros in C modules, e.g.:
    module! {
        type: RustMinimal,
        name: b"rust_minimal",
        author: b"Rust for Linux Contributors",
        description: b"Rust minimal sample",
        license: b"GPL",
    }
Co-developed-by: Alex Gaynor <alex.gaynor@gmail.com>
Signed-off-by: Alex Gaynor <alex.gaynor@gmail.com>
Co-developed-by: Finn Behrens <me@kloenk.de>
Signed-off-by: Finn Behrens <me@kloenk.de>
Co-developed-by: Adam Bratschi-Kaye <ark.email@gmail.com>
Signed-off-by: Adam Bratschi-Kaye <ark.email@gmail.com>
Co-developed-by: Wedson Almeida Filho <wedsonaf@google.com>
Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com>
Co-developed-by: Sumera Priyadarsini <sylphrenadin@gmail.com>
Signed-off-by: Sumera Priyadarsini <sylphrenadin@gmail.com>
Co-developed-by: Gary Guo <gary@garyguo.net>
Signed-off-by: Gary Guo <gary@garyguo.net>
Co-developed-by: Matthew Bakhtiari <dev@mtbk.me>
Signed-off-by: Matthew Bakhtiari <dev@mtbk.me>
Co-developed-by: Björn Roy Baron <bjorn3_gh@protonmail.com>
Signed-off-by: Björn Roy Baron <bjorn3_gh@protonmail.com>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
		
	
			
		
			
				
	
	
		
			72 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // 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)
 | |
| }
 |