diff --git a/rust/kernel/src/chrdev.rs b/rust/kernel/src/chrdev.rs index d32b9a0d584a56..8c67d5630328ba 100644 --- a/rust/kernel/src/chrdev.rs +++ b/rust/kernel/src/chrdev.rs @@ -38,7 +38,7 @@ impl Builder { self } - pub fn build(self) -> KernelResult { + pub fn build(self, this_module: *mut bindings::module) -> KernelResult { let mut dev: bindings::dev_t = 0; let res = unsafe { bindings::alloc_chrdev_region( @@ -58,8 +58,7 @@ impl Builder { for (i, file_op) in self.file_ops.iter().enumerate() { unsafe { bindings::cdev_init(&mut cdevs[i], *file_op); - // TODO: proper `THIS_MODULE` handling - cdevs[i].owner = core::ptr::null_mut(); + cdevs[i].owner = this_module; let rc = bindings::cdev_add(&mut cdevs[i], dev + i as bindings::dev_t, 1); if rc != 0 { // Clean up the ones that were allocated. diff --git a/rust/module/src/lib.rs b/rust/module/src/lib.rs index 82dac6780b9ccf..9295ebfe3a75e0 100644 --- a/rust/module/src/lib.rs +++ b/rust/module/src/lib.rs @@ -242,8 +242,7 @@ pub fn module(ts: TokenStream) -> TokenStream { #[used] static __{name}_{param_name}_struct: __{name}_{param_name}_RacyKernelParam = __{name}_{param_name}_RacyKernelParam(kernel::bindings::kernel_param {{ name: __{name}_{param_name}_name, - // TODO: `THIS_MODULE` - mod_: core::ptr::null_mut(), + mod_: THIS_MODULE.0, ops: unsafe {{ &kernel::bindings::param_ops_{param_kernel_type} }} as *const kernel::bindings::kernel_param_ops, perm: {permissions}, level: -1, @@ -269,6 +268,19 @@ pub fn module(ts: TokenStream) -> TokenStream { " static mut __MOD: Option<{type_}> = None; + struct __THIS_MODULE(*mut kernel::bindings::module); + + unsafe impl Sync for __THIS_MODULE {{ + }} + + // TODO: provide a better abstraction to avoid passing around + // `THIS_MODULE.0`, i.e. `this_module: *mut bindings::module` parameters. + #[cfg(MODULE)] + static THIS_MODULE: __THIS_MODULE = __THIS_MODULE(unsafe {{ &kernel::bindings::__this_module }} as *const _ as *mut kernel::bindings::module); + + #[cfg(not(MODULE))] + static THIS_MODULE: __THIS_MODULE = __THIS_MODULE(core::ptr::null_mut()); + // Loadable modules need to export the `{{init,cleanup}}_module` identifiers #[cfg(MODULE)] #[no_mangle]