From dc3452650cfb593de80b64eac0d2bfba4339f569 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Sat, 18 Apr 2020 23:17:37 +0200 Subject: [PATCH] Execute AML code after IOAPIC init, which tells the firmware that the I/O APIC is used rather than the 8259 PIC. --- src/acpi/mod.rs | 2 +- src/arch/x86_64/device/ioapic.rs | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs index 7d79c7ce..96f50a11 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 d2966789..ecee0e8b 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) -- GitLab