events.rs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. use alloc::string::ToString;
  2. use crate::debug::tracing::TracingDirCallBack;
  3. use crate::filesystem::kernfs::callback::{KernCallbackData, KernFSCallback, KernInodePrivateData};
  4. use crate::filesystem::kernfs::KernFSInode;
  5. use crate::filesystem::vfs::syscall::ModeType;
  6. use crate::filesystem::vfs::PollStatus;
  7. use crate::tracepoint::*;
  8. use alloc::sync::Arc;
  9. use system_error::SystemError;
  10. #[derive(Debug)]
  11. struct EnableCallBack;
  12. impl KernFSCallback for EnableCallBack {
  13. fn open(&self, _data: KernCallbackData) -> Result<(), SystemError> {
  14. Ok(())
  15. }
  16. fn read(
  17. &self,
  18. data: KernCallbackData,
  19. buf: &mut [u8],
  20. offset: usize,
  21. ) -> Result<usize, SystemError> {
  22. let pri_data = data.private_data().as_ref().unwrap();
  23. let tracepoint_info = pri_data.debugfs_tracepoint().unwrap();
  24. let enable_value = tracepoint_info.enable_file().read();
  25. if offset >= enable_value.as_bytes().len() {
  26. return Ok(0); // Offset is beyond the length of the string
  27. }
  28. let len = buf.len().min(enable_value.as_bytes().len() - offset);
  29. buf[..len].copy_from_slice(&enable_value.as_bytes()[offset..offset + len]);
  30. Ok(len)
  31. }
  32. fn write(
  33. &self,
  34. data: KernCallbackData,
  35. buf: &[u8],
  36. _offset: usize,
  37. ) -> Result<usize, SystemError> {
  38. let pri_data = data.private_data().as_ref().unwrap();
  39. let tracepoint = pri_data.debugfs_tracepoint().unwrap();
  40. if buf.is_empty() {
  41. return Err(SystemError::EINVAL);
  42. }
  43. tracepoint.enable_file().write(buf[0] as _);
  44. Ok(buf.len())
  45. }
  46. fn poll(&self, _data: KernCallbackData) -> Result<PollStatus, SystemError> {
  47. Err(SystemError::ENOSYS)
  48. }
  49. }
  50. #[derive(Debug)]
  51. struct FormatCallBack;
  52. impl KernFSCallback for FormatCallBack {
  53. fn open(&self, _data: KernCallbackData) -> Result<(), SystemError> {
  54. Ok(())
  55. }
  56. fn read(
  57. &self,
  58. data: KernCallbackData,
  59. buf: &mut [u8],
  60. offset: usize,
  61. ) -> Result<usize, SystemError> {
  62. let pri_data = data.private_data().as_ref().unwrap();
  63. let tracepoint = pri_data.debugfs_tracepoint().unwrap();
  64. let format_str = tracepoint.format_file().read();
  65. if offset >= format_str.as_bytes().len() {
  66. return Ok(0); // Offset is beyond the length of the string
  67. }
  68. let len = buf.len().min(format_str.as_bytes().len() - offset);
  69. buf[..len].copy_from_slice(&format_str.as_bytes()[offset..offset + len]);
  70. Ok(len)
  71. }
  72. fn write(
  73. &self,
  74. _data: KernCallbackData,
  75. _buf: &[u8],
  76. _offset: usize,
  77. ) -> Result<usize, SystemError> {
  78. Err(SystemError::EPERM)
  79. }
  80. fn poll(&self, _data: KernCallbackData) -> Result<PollStatus, SystemError> {
  81. Err(SystemError::ENOSYS)
  82. }
  83. }
  84. #[derive(Debug)]
  85. struct IDCallBack;
  86. impl KernFSCallback for IDCallBack {
  87. fn open(&self, _data: KernCallbackData) -> Result<(), SystemError> {
  88. Ok(())
  89. }
  90. fn read(
  91. &self,
  92. data: KernCallbackData,
  93. buf: &mut [u8],
  94. offset: usize,
  95. ) -> Result<usize, SystemError> {
  96. let pri_data = data.private_data().as_ref().unwrap();
  97. let tracepoint = pri_data.debugfs_tracepoint().unwrap();
  98. let id_str = tracepoint.id_file().read();
  99. if offset >= id_str.as_bytes().len() {
  100. return Ok(0); // Offset is beyond the length of the string
  101. }
  102. let len = buf.len().min(id_str.as_bytes().len() - offset);
  103. buf[..len].copy_from_slice(&id_str.as_bytes()[offset..offset + len]);
  104. Ok(len)
  105. }
  106. fn write(
  107. &self,
  108. _data: KernCallbackData,
  109. _buf: &[u8],
  110. _offset: usize,
  111. ) -> Result<usize, SystemError> {
  112. Err(SystemError::EPERM)
  113. }
  114. fn poll(&self, _data: KernCallbackData) -> Result<PollStatus, SystemError> {
  115. Err(SystemError::ENOSYS)
  116. }
  117. }
  118. static mut TRACING_EVENTS_MANAGER: Option<TracingEventsManager> = None;
  119. pub fn tracing_events_manager() -> &'static TracingEventsManager {
  120. unsafe {
  121. TRACING_EVENTS_MANAGER
  122. .as_ref()
  123. .expect("TracingEventsManager not initialized")
  124. }
  125. }
  126. pub fn init_events(root: Arc<KernFSInode>) -> Result<(), SystemError> {
  127. let events_manager = crate::tracepoint::global_init_events()?;
  128. // Register the global tracing events manager
  129. for subsystem_name in events_manager.subsystem_names() {
  130. let subsystem = events_manager.get_subsystem(&subsystem_name).unwrap();
  131. // Register the subsystem in the root inode
  132. let subsystem_inode = root.add_dir(
  133. subsystem_name,
  134. ModeType::from_bits_truncate(0o755),
  135. None,
  136. Some(&TracingDirCallBack),
  137. )?;
  138. for event_name in subsystem.event_names() {
  139. let event_info = subsystem.get_event(&event_name).unwrap();
  140. let event_inode = subsystem_inode.add_dir(
  141. event_name,
  142. ModeType::from_bits_truncate(0o755),
  143. None,
  144. Some(&TracingDirCallBack),
  145. )?;
  146. // add enable file for the event
  147. let _enable_inode = event_inode.add_file(
  148. "enable".to_string(),
  149. ModeType::from_bits_truncate(0o644),
  150. None,
  151. Some(KernInodePrivateData::DebugFS(event_info.clone())),
  152. Some(&EnableCallBack),
  153. )?;
  154. // add format file for the event
  155. let _format_inode = event_inode.add_file(
  156. "format".to_string(),
  157. ModeType::from_bits_truncate(0o644),
  158. None,
  159. Some(KernInodePrivateData::DebugFS(event_info.clone())),
  160. Some(&FormatCallBack),
  161. )?;
  162. // add id file for the event
  163. let _id_inode = event_inode.add_file(
  164. "id".to_string(),
  165. ModeType::from_bits_truncate(0o644),
  166. None,
  167. Some(KernInodePrivateData::DebugFS(event_info)),
  168. Some(&IDCallBack),
  169. )?;
  170. }
  171. }
  172. unsafe {
  173. TRACING_EVENTS_MANAGER = Some(events_manager);
  174. }
  175. Ok(())
  176. }