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