1#![no_std]
15#![feature(inline_const)]
21#![feature(lint_reasons)]
24#![feature(raw_ref_op)]
27#![feature(const_maybe_uninit_as_mut_ptr)]
30#![feature(const_mut_refs)]
31#![feature(const_ptr_write)]
32#![feature(const_refs_to_cell)]
33#![feature(arbitrary_self_types)]
36#![feature(used_with_arg)]
39#![cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, feature(derive_coerce_pointee))]
43#![cfg_attr(not(CONFIG_RUSTC_HAS_COERCE_POINTEE), feature(coerce_unsized))]
44#![cfg_attr(not(CONFIG_RUSTC_HAS_COERCE_POINTEE), feature(dispatch_from_dyn))]
45#![cfg_attr(not(CONFIG_RUSTC_HAS_COERCE_POINTEE), feature(unsize))]
46
47#[cfg(not(CONFIG_RUST))]
50compile_error!("Missing kernel configuration for conditional compilation");
51
52extern crate self as kernel;
54
55pub use ffi;
56
57pub mod alloc;
58#[cfg(CONFIG_AUXILIARY_BUS)]
59pub mod auxiliary;
60#[cfg(CONFIG_BLOCK)]
61pub mod block;
62#[doc(hidden)]
63pub mod build_assert;
64pub mod clk;
65#[cfg(CONFIG_CONFIGFS_FS)]
66pub mod configfs;
67pub mod cpu;
68#[cfg(CONFIG_CPU_FREQ)]
69pub mod cpufreq;
70pub mod cpumask;
71pub mod cred;
72pub mod device;
73pub mod device_id;
74pub mod devres;
75pub mod dma;
76pub mod driver;
77#[cfg(CONFIG_DRM = "y")]
78pub mod drm;
79pub mod error;
80pub mod faux;
81#[cfg(CONFIG_RUST_FW_LOADER_ABSTRACTIONS)]
82pub mod firmware;
83pub mod fs;
84pub mod init;
85pub mod io;
86pub mod ioctl;
87pub mod jump_label;
88#[cfg(CONFIG_KUNIT)]
89pub mod kunit;
90pub mod list;
91pub mod miscdevice;
92pub mod mm;
93#[cfg(CONFIG_NET)]
94pub mod net;
95pub mod of;
96#[cfg(CONFIG_PM_OPP)]
97pub mod opp;
98pub mod page;
99#[cfg(CONFIG_PCI)]
100pub mod pci;
101pub mod pid_namespace;
102pub mod platform;
103pub mod prelude;
104pub mod print;
105pub mod rbtree;
106pub mod revocable;
107pub mod security;
108pub mod seq_file;
109pub mod sizes;
110mod static_assert;
111#[doc(hidden)]
112pub mod std_vendor;
113pub mod str;
114pub mod sync;
115pub mod task;
116pub mod time;
117pub mod tracepoint;
118pub mod transmute;
119pub mod types;
120pub mod uaccess;
121pub mod workqueue;
122pub mod xarray;
123
124#[doc(hidden)]
125pub use bindings;
126pub use macros;
127pub use uapi;
128
129const __LOG_PREFIX: &[u8] = b"rust_kernel\0";
131
132pub trait Module: Sized + Sync + Send {
136 fn init(module: &'static ThisModule) -> error::Result<Self>;
143}
144
145pub trait InPlaceModule: Sync + Send {
147 fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, error::Error>;
151}
152
153impl<T: Module> InPlaceModule for T {
154 fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, error::Error> {
155 let initer = move |slot: *mut Self| {
156 let m = <Self as Module>::init(module)?;
157
158 unsafe { slot.write(m) };
160 Ok(())
161 };
162
163 unsafe { pin_init::pin_init_from_closure(initer) }
165 }
166}
167
168pub trait ModuleMetadata {
170 const NAME: &'static crate::str::CStr;
172}
173
174pub struct ThisModule(*mut bindings::module);
178
179unsafe impl Sync for ThisModule {}
181
182impl ThisModule {
183 pub const unsafe fn from_ptr(ptr: *mut bindings::module) -> ThisModule {
189 ThisModule(ptr)
190 }
191
192 pub const fn as_ptr(&self) -> *mut bindings::module {
196 self.0
197 }
198}
199
200#[cfg(not(any(testlib, test)))]
201#[panic_handler]
202fn panic(info: &core::panic::PanicInfo<'_>) -> ! {
203 pr_emerg!("{}\n", info);
204 unsafe { bindings::BUG() };
206}
207
208#[macro_export]
232macro_rules! container_of {
233 ($field_ptr:expr, $Container:ty, $($fields:tt)*) => {{
234 let offset: usize = ::core::mem::offset_of!($Container, $($fields)*);
235 let field_ptr = $field_ptr;
236 let container_ptr = field_ptr.byte_sub(offset).cast::<$Container>();
237 $crate::assert_same_type(field_ptr, (&raw const (*container_ptr).$($fields)*).cast_mut());
238 container_ptr
239 }}
240}
241
242#[doc(hidden)]
244pub fn assert_same_type<T>(_: T, _: T) {}
245
246#[doc(hidden)]
248#[macro_export]
249macro_rules! concat_literals {
250 ($( $asm:literal )* ) => {
251 ::core::concat!($($asm),*)
252 };
253}
254
255#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
261#[macro_export]
262macro_rules! asm {
263 ($($asm:expr),* ; $($rest:tt)*) => {
264 ::core::arch::asm!( $($asm)*, options(att_syntax), $($rest)* )
265 };
266}
267
268#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
274#[macro_export]
275macro_rules! asm {
276 ($($asm:expr),* ; $($rest:tt)*) => {
277 ::core::arch::asm!( $($asm)*, $($rest)* )
278 };
279}