device.rs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. use crate::driver::base::class::Class;
  2. use crate::driver::base::device::bus::Bus;
  3. use crate::driver::base::device::driver::Driver;
  4. use crate::driver::base::device::{Device, DeviceCommonData, DeviceType, IdTable};
  5. use crate::driver::base::kobject::{
  6. KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState,
  7. };
  8. use crate::driver::base::kset::KSet;
  9. use crate::filesystem::kernfs::KernFSInode;
  10. use crate::filesystem::sysfs::{Attribute, SysFSOpsSupport};
  11. use crate::filesystem::vfs::syscall::ModeType;
  12. use crate::libs::rwlock::{RwLockReadGuard, RwLockWriteGuard};
  13. use crate::libs::spinlock::{SpinLock, SpinLockGuard};
  14. use alloc::string::{String, ToString};
  15. use alloc::sync::{Arc, Weak};
  16. use core::fmt::Debug;
  17. use system_error::SystemError;
  18. #[derive(Debug)]
  19. #[cast_to([sync] Device)]
  20. pub struct KprobeDevice {
  21. inner: SpinLock<InnerKprobeDevice>,
  22. kobj_state: LockedKObjectState,
  23. name: String,
  24. }
  25. #[derive(Debug)]
  26. struct InnerKprobeDevice {
  27. kobject_common: KObjectCommonData,
  28. device_common: DeviceCommonData,
  29. }
  30. impl KprobeDevice {
  31. pub fn new(parent: Option<Weak<dyn KObject>>) -> Arc<Self> {
  32. let bus_device = Self {
  33. inner: SpinLock::new(InnerKprobeDevice {
  34. kobject_common: KObjectCommonData::default(),
  35. device_common: DeviceCommonData::default(),
  36. }),
  37. kobj_state: LockedKObjectState::new(None),
  38. name: "kprobe".to_string(),
  39. };
  40. bus_device.set_parent(parent);
  41. return Arc::new(bus_device);
  42. }
  43. fn inner(&self) -> SpinLockGuard<InnerKprobeDevice> {
  44. self.inner.lock()
  45. }
  46. }
  47. impl KObject for KprobeDevice {
  48. fn as_any_ref(&self) -> &dyn core::any::Any {
  49. self
  50. }
  51. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  52. self.inner().kobject_common.kern_inode = inode;
  53. }
  54. fn inode(&self) -> Option<Arc<KernFSInode>> {
  55. self.inner().kobject_common.kern_inode.clone()
  56. }
  57. fn parent(&self) -> Option<Weak<dyn KObject>> {
  58. self.inner().kobject_common.parent.clone()
  59. }
  60. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  61. self.inner().kobject_common.parent = parent;
  62. }
  63. fn kset(&self) -> Option<Arc<KSet>> {
  64. self.inner().kobject_common.kset.clone()
  65. }
  66. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  67. self.inner().kobject_common.kset = kset;
  68. }
  69. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  70. self.inner().kobject_common.kobj_type
  71. }
  72. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  73. self.inner().kobject_common.kobj_type = ktype;
  74. }
  75. fn name(&self) -> String {
  76. self.name.clone()
  77. }
  78. fn set_name(&self, _name: String) {}
  79. fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
  80. self.kobj_state.read()
  81. }
  82. fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
  83. self.kobj_state.write()
  84. }
  85. fn set_kobj_state(&self, state: KObjectState) {
  86. *self.kobj_state.write() = state;
  87. }
  88. }
  89. impl Device for KprobeDevice {
  90. #[inline]
  91. #[allow(dead_code)]
  92. fn dev_type(&self) -> DeviceType {
  93. return DeviceType::Other;
  94. }
  95. #[inline]
  96. fn id_table(&self) -> IdTable {
  97. IdTable::new("kprobe".to_string(), None)
  98. }
  99. fn bus(&self) -> Option<Weak<dyn Bus>> {
  100. self.inner().device_common.bus.clone()
  101. }
  102. fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
  103. self.inner().device_common.bus = bus;
  104. }
  105. fn set_class(&self, class: Option<Weak<dyn Class>>) {
  106. self.inner().device_common.class = class;
  107. }
  108. fn driver(&self) -> Option<Arc<dyn Driver>> {
  109. self.inner().device_common.driver.clone()?.upgrade()
  110. }
  111. fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
  112. self.inner().device_common.driver = driver;
  113. }
  114. #[inline]
  115. fn is_dead(&self) -> bool {
  116. false
  117. }
  118. fn can_match(&self) -> bool {
  119. todo!()
  120. }
  121. fn set_can_match(&self, _can_match: bool) {
  122. todo!()
  123. }
  124. fn state_synced(&self) -> bool {
  125. todo!()
  126. }
  127. fn dev_parent(&self) -> Option<Weak<dyn Device>> {
  128. self.inner().device_common.get_parent_weak_or_clear()
  129. }
  130. fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) {
  131. self.inner().device_common.parent = dev_parent;
  132. }
  133. }
  134. #[derive(Debug)]
  135. pub struct KprobeAttr;
  136. impl Attribute for KprobeAttr {
  137. fn name(&self) -> &str {
  138. "type"
  139. }
  140. fn mode(&self) -> ModeType {
  141. ModeType::S_IRUGO
  142. }
  143. fn support(&self) -> SysFSOpsSupport {
  144. SysFSOpsSupport::ATTR_SHOW
  145. }
  146. fn show(&self, _kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
  147. if buf.is_empty() {
  148. return Err(SystemError::EINVAL);
  149. }
  150. // perf_type_id::PERF_TYPE_MAX
  151. buf[0] = b'6';
  152. Ok(1)
  153. }
  154. }