diff --git a/kernel/src/arch/x86_64/pci/pci.rs b/kernel/src/arch/x86_64/pci/pci.rs index d4bcd97a..e19227d1 100644 --- a/kernel/src/arch/x86_64/pci/pci.rs +++ b/kernel/src/arch/x86_64/pci/pci.rs @@ -1,17 +1,16 @@ use crate::arch::TraitPciArch; -use crate::driver::acpi::old::mcfg_find_segment; +use crate::driver::acpi::acpi_manager; use crate::driver::pci::pci::{ BusDeviceFunction, PciAddr, PciError, PciRoot, SegmentGroupNumber, PORT_PCI_CONFIG_ADDRESS, PORT_PCI_CONFIG_DATA, }; -use crate::include::bindings::bindings::{ - acpi_get_MCFG, acpi_iter_SDT, acpi_system_description_table_header_t, io_in32, io_out32, -}; +use crate::include::bindings::bindings::{acpi_get_MCFG, acpi_iter_SDT, io_in32, io_out32}; use crate::mm::PhysAddr; +use acpi::mcfg::Mcfg; use core::ffi::c_void; -use core::ptr::NonNull; -pub struct X86_64PciArch {} + +pub struct X86_64PciArch; impl TraitPciArch for X86_64PciArch { fn read_config(bus_device_function: &BusDeviceFunction, offset: u8) -> u32 { // 构造pci配置空间地址 @@ -57,19 +56,22 @@ impl TraitPciArch for X86_64PciArch { } //kdebug!("{}",data); //loop{} - let head = NonNull::new(data as *mut acpi_system_description_table_header_t).unwrap(); - let outcome = unsafe { mcfg_find_segment(head).as_ref() }; - for segmentgroupconfiguration in outcome { - if segmentgroupconfiguration.segement_group_number == segement { - return Ok(PciRoot { - physical_address_base: PhysAddr::new( - segmentgroupconfiguration.base_address as usize, - ), - mmio_guard: None, - segement_group_number: segement, - bus_begin: segmentgroupconfiguration.bus_begin, - bus_end: segmentgroupconfiguration.bus_end, - }); + + let binding = acpi_manager() + .tables() + .expect("get acpi_manager table error") + .find_table::(); + if let Ok(mcfg) = binding { + for mcfg_entry in mcfg.entries() { + if mcfg_entry.pci_segment_group == segement { + return Ok(PciRoot { + physical_address_base: PhysAddr::new(mcfg_entry.base_address as usize), + mmio_guard: None, + segement_group_number: segement, + bus_begin: mcfg_entry.bus_number_start, + bus_end: mcfg_entry.bus_number_end, + }); + } } } return Err(PciError::SegmentNotFound); diff --git a/kernel/src/driver/acpi/mod.rs b/kernel/src/driver/acpi/mod.rs index 06b5c4ed..9ec99cab 100644 --- a/kernel/src/driver/acpi/mod.rs +++ b/kernel/src/driver/acpi/mod.rs @@ -21,7 +21,6 @@ extern crate acpi; pub mod bus; mod c_adapter; pub mod glue; -pub mod old; pub mod pmtmr; mod sysfs; diff --git a/kernel/src/driver/acpi/old.rs b/kernel/src/driver/acpi/old.rs deleted file mode 100644 index eed6f9ea..00000000 --- a/kernel/src/driver/acpi/old.rs +++ /dev/null @@ -1,27 +0,0 @@ -use crate::driver::pci::pci::SegmentGroupNumber; -use crate::include::bindings::bindings::acpi_system_description_table_header_t; -use core::ptr::{slice_from_raw_parts_mut, NonNull}; -// MCFG表中的Segement配置部分,开始位置为44+16*n -#[repr(C, packed)] -pub struct SegementConfigurationSpace { - pub base_address: u64, - pub segement_group_number: SegmentGroupNumber, - pub bus_begin: u8, - pub bus_end: u8, - pub reverse: u32, -} - -/// @brief 获取Segement_Configuration_Space的数量并返回对应数量的Segement_Configuration_Space的切片指针 -/// @param head acpi_system_description_table_header_t的指针 -/// @return NonNull<[Segement_Configuration_Space]> -pub fn mcfg_find_segment( - head: NonNull, -) -> NonNull<[SegementConfigurationSpace]> { - let table_length = unsafe { (*head.as_ptr()).Length }; - let number_of_segments = ((table_length - 44) / 16) as u16; - NonNull::new(slice_from_raw_parts_mut( - (head.as_ptr() as usize + 44) as *mut _, - number_of_segments as usize, - )) - .unwrap() -} diff --git a/kernel/src/driver/net/virtio_net.rs b/kernel/src/driver/net/virtio_net.rs index 2b58fb6c..3cca5e51 100644 --- a/kernel/src/driver/net/virtio_net.rs +++ b/kernel/src/driver/net/virtio_net.rs @@ -15,8 +15,7 @@ use crate::{ kobject::{KObjType, KObject, KObjectState}, }, virtio::virtio_impl::HalImpl, - }, - kdebug, kerror, kinfo, + }, kerror, kinfo, libs::spinlock::SpinLock, net::{generate_iface_id, NET_DRIVERS}, syscall::SystemError,