From 3af29649554d3f99cac845fbf121c8dc88376887 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Sun, 18 Feb 2018 16:24:34 -0700
Subject: [PATCH] Add ACPI feature

---
 Cargo.toml                    |  3 +-
 src/arch/x86_64/device/mod.rs | 30 +++++++++------
 src/arch/x86_64/macros.rs     | 69 ++++++++++++-----------------------
 src/arch/x86_64/start.rs      |  2 +
 src/arch/x86_64/stop.rs       |  3 ++
 src/lib.rs                    |  1 +
 6 files changed, 51 insertions(+), 57 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 56e09c55..e7e116a4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -27,7 +27,8 @@ version = "0.7"
 default-features = false
 
 [features]
-default = []
+default = ["acpi"]
+acpi = []
 doc = []
 live = []
 multi_core = []
diff --git a/src/arch/x86_64/device/mod.rs b/src/arch/x86_64/device/mod.rs
index 1678e739..9a9e8937 100644
--- a/src/arch/x86_64/device/mod.rs
+++ b/src/arch/x86_64/device/mod.rs
@@ -1,5 +1,4 @@
 use paging::ActivePageTable;
-use acpi::ACPI_TABLE;
 
 pub mod cpu;
 pub mod local_apic;
@@ -7,6 +6,7 @@ pub mod pic;
 pub mod pit;
 pub mod rtc;
 pub mod serial;
+#[cfg(feature = "acpi")]
 pub mod hpet;
 
 pub unsafe fn init(active_table: &mut ActivePageTable){
@@ -14,18 +14,26 @@ pub unsafe fn init(active_table: &mut ActivePageTable){
     local_apic::init(active_table);
 }
 
+#[cfg(feature = "acpi")]
+unsafe fn init_hpet() -> bool {
+    use acpi::ACPI_TABLE;
+    if let Some(ref mut hpet) = *ACPI_TABLE.hpet.write() {
+        hpet::init(hpet)
+    } else {
+        false
+    }
+}
+
+#[cfg(not(feature = "acpi"))]
+unsafe fn init_hpet() -> bool {
+    false
+}
+
 pub unsafe fn init_noncore() {
-    {
-        let using_hpet = if let Some(ref mut hpet) = *ACPI_TABLE.hpet.write() {
-            hpet::init(hpet)
-        } else {
-            false
-        };
-        if !using_hpet {
-            pit::init();
-        }
+    if ! init_hpet() {
+        pit::init();
     }
-    
+
     rtc::init();
     serial::init();
 }
diff --git a/src/arch/x86_64/macros.rs b/src/arch/x86_64/macros.rs
index 29a3024b..1772c3d8 100644
--- a/src/arch/x86_64/macros.rs
+++ b/src/arch/x86_64/macros.rs
@@ -31,25 +31,15 @@ pub struct ScratchRegisters {
 
 impl ScratchRegisters {
     pub fn dump(&self) {
-        let rax = self.rax;
-        let rcx = self.rcx;
-        let rdx = self.rdx;
-        let rdi = self.rdi;
-        let rsi = self.rsi;
-        let r8 = self.r8;
-        let r9 = self.r9;
-        let r10 = self.r10;
-        let r11 = self.r11;
-
-        println!("RAX:   {:>016X}", rax);
-        println!("RCX:   {:>016X}", rcx);
-        println!("RDX:   {:>016X}", rdx);
-        println!("RDI:   {:>016X}", rdi);
-        println!("RSI:   {:>016X}", rsi);
-        println!("R8:    {:>016X}", r8);
-        println!("R9:    {:>016X}", r9);
-        println!("R10:   {:>016X}", r10);
-        println!("R11:   {:>016X}", r11);
+        println!("RAX:   {:>016X}", { self.rax });
+        println!("RCX:   {:>016X}", { self.rcx });
+        println!("RDX:   {:>016X}", { self.rdx });
+        println!("RDI:   {:>016X}", { self.rdi });
+        println!("RSI:   {:>016X}", { self.rsi });
+        println!("R8:    {:>016X}", { self.r8 });
+        println!("R9:    {:>016X}", { self.r9 });
+        println!("R10:   {:>016X}", { self.r10 });
+        println!("R11:   {:>016X}", { self.r11 });
     }
 }
 
@@ -96,19 +86,12 @@ pub struct PreservedRegisters {
 
 impl PreservedRegisters {
     pub fn dump(&self) {
-        let rbx = self.rbx;
-        let rbp = self.rbp;
-        let r12 = self.r12;
-        let r13 = self.r13;
-        let r14 = self.r14;
-        let r15 = self.r15;
-
-        println!("RBX:   {:>016X}", rbx);
-        println!("RBP:   {:>016X}", rbp);
-        println!("R12:   {:>016X}", r12);
-        println!("R13:   {:>016X}", r13);
-        println!("R14:   {:>016X}", r14);
-        println!("R15:   {:>016X}", r15);
+        println!("RBX:   {:>016X}", { self.rbx });
+        println!("RBP:   {:>016X}", { self.rbp });
+        println!("R12:   {:>016X}", { self.r12 });
+        println!("R13:   {:>016X}", { self.r13 });
+        println!("R14:   {:>016X}", { self.r14 });
+        println!("R15:   {:>016X}", { self.r15 });
     }
 }
 
@@ -162,13 +145,9 @@ pub struct IretRegisters {
 
 impl IretRegisters {
     pub fn dump(&self) {
-        let rflags = self.rflags;
-        let cs = self.cs;
-        let rip = self.rip;
-
-        println!("RFLAG: {:>016X}", rflags);
-        println!("CS:    {:>016X}", cs);
-        println!("RIP:   {:>016X}", rip);
+        println!("RFLAG: {:>016X}", { self.rflags });
+        println!("CS:    {:>016X}", { self.cs });
+        println!("RIP:   {:>016X}", { self.rip });
     }
 }
 
@@ -223,7 +202,7 @@ impl InterruptStack {
     pub fn dump(&self) {
         self.iret.dump();
         self.scratch.dump();
-        println!("FS:    {:>016X}", self.fs);
+        println!("FS:    {:>016X}", { self.fs });
     }
 }
 
@@ -274,9 +253,9 @@ pub struct InterruptErrorStack {
 impl InterruptErrorStack {
     pub fn dump(&self) {
         self.iret.dump();
-        println!("CODE:  {:>016X}", self.code);
+        println!("CODE:  {:>016X}", { self.code });
         self.scratch.dump();
-        println!("FS:    {:>016X}", self.fs);
+        println!("FS:    {:>016X}", { self.fs });
     }
 }
 
@@ -330,7 +309,7 @@ impl InterruptStackP {
         self.iret.dump();
         self.scratch.dump();
         self.preserved.dump();
-        println!("FS:    {:>016X}", self.fs);
+        println!("FS:    {:>016X}", { self.fs });
     }
 }
 
@@ -384,10 +363,10 @@ pub struct InterruptErrorStackP {
 impl InterruptErrorStackP {
     pub fn dump(&self) {
         self.iret.dump();
-        println!("CODE:  {:>016X}", self.code);
+        println!("CODE:  {:>016X}", { self.code });
         self.scratch.dump();
         self.preserved.dump();
-        println!("FS:    {:>016X}", self.fs);
+        println!("FS:    {:>016X}", { self.fs });
     }
 }
 
diff --git a/src/arch/x86_64/start.rs b/src/arch/x86_64/start.rs
index 96d24586..1d92afc0 100644
--- a/src/arch/x86_64/start.rs
+++ b/src/arch/x86_64/start.rs
@@ -7,6 +7,7 @@ use core::slice;
 use core::sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT, AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
 
 use allocator;
+#[cfg(feature = "acpi")]
 use acpi;
 use arch::x86_64::pti;
 use device;
@@ -103,6 +104,7 @@ pub unsafe extern fn kstart(args_ptr: *const KernelArgs) -> ! {
         device::init(&mut active_table);
 
         // Read ACPI tables, starts APs
+        #[cfg(feature = "acpi")]
         acpi::init(&mut active_table);
 
         // Initialize all of the non-core devices not otherwise needed to complete initialization
diff --git a/src/arch/x86_64/stop.rs b/src/arch/x86_64/stop.rs
index c65768cc..ae084f00 100644
--- a/src/arch/x86_64/stop.rs
+++ b/src/arch/x86_64/stop.rs
@@ -1,3 +1,4 @@
+#[cfg(feature = "acpi")]
 use acpi;
 use syscall::io::{Io, Pio};
 
@@ -21,6 +22,8 @@ pub unsafe extern fn kreset() -> ! {
 #[no_mangle]
 pub unsafe extern fn kstop() -> ! {
     println!("kstop");
+
+    #[cfg(feature = "acpi")]
     acpi::set_global_s_state(5);
 
     // Magic shutdown code for bochs and qemu (older versions).
diff --git a/src/lib.rs b/src/lib.rs
index 7e5a6b96..cbbd38a9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -69,6 +69,7 @@ pub mod consts;
 pub mod allocator;
 
 /// ACPI table parsing
+#[cfg(feature = "acpi")]
 mod acpi;
 
 /// Context management
-- 
GitLab