ksysfs.rs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. use crate::{
  2. driver::base::{kobject::KObject, kset::KSet},
  3. filesystem::{
  4. sysfs::{sysfs_instance, Attribute, AttributeGroup},
  5. vfs::syscall::ModeType,
  6. },
  7. init::initcall::INITCALL_CORE,
  8. };
  9. use alloc::{string::ToString, sync::Arc};
  10. use system_error::SystemError;
  11. use unified_init::macros::unified_init;
  12. /// `/sys/kernel`的kset
  13. static mut KERNEL_KSET_INSTANCE: Option<Arc<KSet>> = None;
  14. #[inline(always)]
  15. #[allow(dead_code)]
  16. pub fn sys_kernel_kset() -> Arc<KSet> {
  17. unsafe { KERNEL_KSET_INSTANCE.clone().unwrap() }
  18. }
  19. #[unified_init(INITCALL_CORE)]
  20. fn ksysfs_init() -> Result<(), SystemError> {
  21. let kernel_kset = KSet::new("kernel".to_string());
  22. kernel_kset
  23. .register(None)
  24. .expect("register kernel kset failed");
  25. sysfs_instance()
  26. .create_groups(&kernel_kset.as_kobject(), &[&KernelAttrGroup])
  27. .map_err(|e| {
  28. kerror!("Failed to create sysfs groups for kernel kset: {:?}", e);
  29. kernel_kset.unregister();
  30. SystemError::ENOMEM
  31. })?;
  32. unsafe {
  33. KERNEL_KSET_INSTANCE = Some(kernel_kset);
  34. }
  35. return Ok(());
  36. }
  37. #[derive(Debug)]
  38. struct KernelAttrGroup;
  39. impl AttributeGroup for KernelAttrGroup {
  40. fn name(&self) -> Option<&str> {
  41. None
  42. }
  43. fn attrs(&self) -> &[&'static dyn Attribute] {
  44. &[]
  45. }
  46. fn is_visible(
  47. &self,
  48. _kobj: Arc<dyn KObject>,
  49. attr: &'static dyn Attribute,
  50. ) -> Option<ModeType> {
  51. Some(attr.mode())
  52. }
  53. }