xref: /DragonOS/kernel/src/misc/ksysfs.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a)
1196b75dcSLoGin use crate::{
2196b75dcSLoGin     driver::base::{kobject::KObject, kset::KSet},
3196b75dcSLoGin     filesystem::{
4196b75dcSLoGin         sysfs::{sysfs_instance, Attribute, AttributeGroup},
5196b75dcSLoGin         vfs::syscall::ModeType,
6196b75dcSLoGin     },
7196b75dcSLoGin     init::initcall::INITCALL_CORE,
8196b75dcSLoGin };
9196b75dcSLoGin use alloc::{string::ToString, sync::Arc};
10*2eab6dd7S曾俊 use log::error;
11196b75dcSLoGin use system_error::SystemError;
12196b75dcSLoGin use unified_init::macros::unified_init;
13196b75dcSLoGin 
14196b75dcSLoGin /// `/sys/kernel`的kset
15196b75dcSLoGin static mut KERNEL_KSET_INSTANCE: Option<Arc<KSet>> = None;
16196b75dcSLoGin 
17196b75dcSLoGin #[inline(always)]
18196b75dcSLoGin #[allow(dead_code)]
sys_kernel_kset() -> Arc<KSet>19196b75dcSLoGin pub fn sys_kernel_kset() -> Arc<KSet> {
20196b75dcSLoGin     unsafe { KERNEL_KSET_INSTANCE.clone().unwrap() }
21196b75dcSLoGin }
22196b75dcSLoGin 
23196b75dcSLoGin #[unified_init(INITCALL_CORE)]
ksysfs_init() -> Result<(), SystemError>24196b75dcSLoGin fn ksysfs_init() -> Result<(), SystemError> {
25196b75dcSLoGin     let kernel_kset = KSet::new("kernel".to_string());
26196b75dcSLoGin     kernel_kset
27196b75dcSLoGin         .register(None)
28196b75dcSLoGin         .expect("register kernel kset failed");
29196b75dcSLoGin 
30196b75dcSLoGin     sysfs_instance()
31196b75dcSLoGin         .create_groups(&kernel_kset.as_kobject(), &[&KernelAttrGroup])
32196b75dcSLoGin         .map_err(|e| {
33*2eab6dd7S曾俊             error!("Failed to create sysfs groups for kernel kset: {:?}", e);
34196b75dcSLoGin             kernel_kset.unregister();
35196b75dcSLoGin             SystemError::ENOMEM
36196b75dcSLoGin         })?;
37196b75dcSLoGin 
38196b75dcSLoGin     unsafe {
39196b75dcSLoGin         KERNEL_KSET_INSTANCE = Some(kernel_kset);
40196b75dcSLoGin     }
41196b75dcSLoGin 
42196b75dcSLoGin     return Ok(());
43196b75dcSLoGin }
44196b75dcSLoGin 
45196b75dcSLoGin #[derive(Debug)]
46196b75dcSLoGin struct KernelAttrGroup;
47196b75dcSLoGin 
48196b75dcSLoGin impl AttributeGroup for KernelAttrGroup {
name(&self) -> Option<&str>49196b75dcSLoGin     fn name(&self) -> Option<&str> {
50196b75dcSLoGin         None
51196b75dcSLoGin     }
52196b75dcSLoGin 
attrs(&self) -> &[&'static dyn Attribute]53196b75dcSLoGin     fn attrs(&self) -> &[&'static dyn Attribute] {
54196b75dcSLoGin         &[]
55196b75dcSLoGin     }
56196b75dcSLoGin 
is_visible( &self, _kobj: Arc<dyn KObject>, attr: &'static dyn Attribute, ) -> Option<ModeType>57196b75dcSLoGin     fn is_visible(
58196b75dcSLoGin         &self,
59196b75dcSLoGin         _kobj: Arc<dyn KObject>,
60196b75dcSLoGin         attr: &'static dyn Attribute,
61196b75dcSLoGin     ) -> Option<ModeType> {
62196b75dcSLoGin         Some(attr.mode())
63196b75dcSLoGin     }
64196b75dcSLoGin }
65