ksysfs.rs 1.5 KB

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