Add ACPI feature
This commit is contained in:
@@ -27,7 +27,8 @@ version = "0.7"
|
||||
default-features = false
|
||||
|
||||
[features]
|
||||
default = []
|
||||
default = ["acpi"]
|
||||
acpi = []
|
||||
doc = []
|
||||
live = []
|
||||
multi_core = []
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
#[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() {
|
||||
if ! init_hpet() {
|
||||
pit::init();
|
||||
}
|
||||
|
||||
rtc::init();
|
||||
serial::init();
|
||||
}
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -69,6 +69,7 @@ pub mod consts;
|
||||
pub mod allocator;
|
||||
|
||||
/// ACPI table parsing
|
||||
#[cfg(feature = "acpi")]
|
||||
mod acpi;
|
||||
|
||||
/// Context management
|
||||
|
||||
Reference in New Issue
Block a user