From 0365b6f2b79777bc54ae1988262188ccb4bb0888 Mon Sep 17 00:00:00 2001 From: Connor Wood Date: Fri, 21 Jul 2017 12:51:30 +0100 Subject: [PATCH] Created a function to control the global S state --- src/acpi/mod.rs | 30 ++++++++++++++++++++++++++++++ src/stop.rs | 31 ++----------------------------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs index ada10d1..d22140b 100644 --- a/src/acpi/mod.rs +++ b/src/acpi/mod.rs @@ -7,6 +7,8 @@ use collections::btree_map::BTreeMap; use collections::string::String; use alloc::boxed::Box; +use syscall::io::{Io, Pio}; + use spin::{Mutex, RwLock}; use device::local_apic::LOCAL_APIC; @@ -282,6 +284,34 @@ pub unsafe fn init(active_table: &mut ActivePageTable) { */ } +pub fn set_global_s_state(state: u8) { + if state == 5 { + let fadt = ACPI_TABLE.fadt.read(); + + if let Some(ref fadt) = *fadt { + let port = fadt.pm1a_control_block as u16; + let mut val = 1 << 13; + + let namespace = ACPI_TABLE.namespace.read(); + + if let Some(ref namespace) = *namespace { + if let Some(s) = namespace.get("\\_S5") { + if let Ok(p) = s.get_as_package() { + let slp_typa = p[0].get_as_integer().expect("SLP_TYPa is not an integer"); + let slp_typb = p[1].get_as_integer().expect("SLP_TYPb is not an integer"); + + println!("Shutdown SLP_TYPa {:X}, SLP_TYPb {:X}", slp_typa, slp_typb); + val |= slp_typa as u16; + + println!("Shutdown with ACPI outw(0x{:X}, 0x{:X})", port, val); + Pio::::new(port).write(val); + } + } + } + } + } +} + pub struct Acpi { pub fadt: RwLock>, pub namespace: RwLock>>, diff --git a/src/stop.rs b/src/stop.rs index acd0179..bf01fde 100644 --- a/src/stop.rs +++ b/src/stop.rs @@ -4,35 +4,8 @@ use syscall::io::{Io, Pio}; #[no_mangle] pub unsafe extern fn kstop() -> ! { println!("kstop"); - - // ACPI shutdown - { - let fadt = acpi::ACPI_TABLE.fadt.read(); - - if let Some(ref fadt) = *fadt { - let port = fadt.pm1a_control_block as u16; - let mut val = 1 << 13; - - let namespace = acpi::ACPI_TABLE.namespace.read(); - - if let Some(ref namespace) = *namespace { - if let Some(s) = namespace.get("\\_S5") { - if let Ok(p) = s.get_as_package() { - println!("{:?}", p); - let slp_typa = p[0].get_as_integer().expect("SLP_TYPa is not an integer"); - let slp_typb = p[1].get_as_integer().expect("SLP_TYPb is not an integer"); - - println!("Shutdown SLP_TYPa {:X}, SLP_TYPb {:X}", slp_typa, slp_typb); - val |= slp_typa as u16; - - println!("Shutdown with ACPI outw(0x{:X}, 0x{:X})", port, val); - Pio::::new(port).write(val); - } - } - } - } - } - + acpi::set_global_s_state(5); + // Magic shutdown code for bochs and qemu (older versions). for c in "Shutdown".bytes() { let port = 0x8900;