old.rs 1.1 KB

123456789101112131415161718192021222324252627
  1. use crate::driver::pci::pci::SegmentGroupNumber;
  2. use crate::include::bindings::bindings::acpi_system_description_table_header_t;
  3. use core::ptr::{slice_from_raw_parts_mut, NonNull};
  4. // MCFG表中的Segement配置部分,开始位置为44+16*n
  5. #[repr(C, packed)]
  6. pub struct SegementConfigurationSpace {
  7. pub base_address: u64,
  8. pub segement_group_number: SegmentGroupNumber,
  9. pub bus_begin: u8,
  10. pub bus_end: u8,
  11. pub reverse: u32,
  12. }
  13. /// @brief 获取Segement_Configuration_Space的数量并返回对应数量的Segement_Configuration_Space的切片指针
  14. /// @param head acpi_system_description_table_header_t的指针
  15. /// @return NonNull<[Segement_Configuration_Space]>
  16. pub fn mcfg_find_segment(
  17. head: NonNull<acpi_system_description_table_header_t>,
  18. ) -> NonNull<[SegementConfigurationSpace]> {
  19. let table_length = unsafe { (*head.as_ptr()).Length };
  20. let number_of_segments = ((table_length - 44) / 16) as u16;
  21. NonNull::new(slice_from_raw_parts_mut(
  22. (head.as_ptr() as usize + 44) as *mut _,
  23. number_of_segments as usize,
  24. ))
  25. .unwrap()
  26. }