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