diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs index 7d79c7cec23f4a3cbe90bdf0d41fde86506f288f..96f50a11e3793ede1f98443e051a3c31f5f025d5 100644 --- a/src/acpi/mod.rs +++ b/src/acpi/mod.rs @@ -35,7 +35,7 @@ pub mod madt; mod rsdt; mod sdt; mod xsdt; -mod aml; +pub mod aml; mod rxsdt; mod rsdp; diff --git a/src/arch/x86_64/device/ioapic.rs b/src/arch/x86_64/device/ioapic.rs index d2966789ec1f8a4a8a40ecb417471355ffa5c316..ecee0e8b7f993b0076567a817a1a17252a4a8188 100644 --- a/src/arch/x86_64/device/ioapic.rs +++ b/src/arch/x86_64/device/ioapic.rs @@ -306,11 +306,12 @@ pub unsafe fn init(active_table: &mut ActivePageTable) { _ => (), } } - +/* let namespace_guard = crate::acpi::ACPI_TABLE.namespace.read(); for (k, v) in namespace_guard.as_ref().unwrap().iter() { println!("{} = {:?}", k, v); } +*/ } println!("I/O APICs: {:?}, overrides: {:?}", ioapics(), src_overrides()); @@ -358,6 +359,22 @@ pub unsafe fn init(active_table: &mut ActivePageTable) { } println!("I/O APICs: {:?}, overrides: {:?}", ioapics(), src_overrides()); irq::set_irq_method(irq::IrqMethod::Apic); + + // tell the firmware that we're using APIC rather than the default 8259 PIC. + #[cfg(feature = "acpi")] + { + let method = { + let namespace_guard = crate::acpi::ACPI_TABLE.namespace.read(); + if let Some(value) = namespace_guard.as_ref().unwrap().get("\\_PIC") { + value.get_as_method().ok() + } else { + None + } + }; + if let Some(m) = method { + m.execute("\\_PIC".into(), vec!(crate::acpi::aml::AmlValue::Integer(1))); + } + } } fn get_override(irq: u8) -> Option<&'static Override> { src_overrides().iter().find(|over| over.bus_irq == irq)