diff --git a/Cargo.lock b/Cargo.lock index 4ba9133b5..1f193276b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,13 +4,12 @@ version = 3 [[package]] name = "acpi" -version = "4.1.1" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "654f48ab3178632ea535be1765073b990895cb62f70a7e5671975d7150c26d15" +checksum = "e248409195304021f61b39ba2628f62a45a3abf6119669d44b3399d60eabe4c3" dependencies = [ "bit_field", "log", - "rsdp", ] [[package]] @@ -285,12 +284,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "managed" @@ -560,15 +556,6 @@ dependencies = [ "bitflags 2.3.2", ] -[[package]] -name = "rsdp" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d3add2fc55ef37511bcf81a08ee7a09eff07b23aae38b06a29024a38c604b1" -dependencies = [ - "log", -] - [[package]] name = "rustc_version" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 834f4d810..94db634e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ video = [] serial = [] [dependencies] -acpi = "4.1.0" +acpi = "5.0.0" aml = "0.16.4" base64 = { version = "0.13.1", default-features = false } bit_field = "0.10.2" diff --git a/src/sys/acpi.rs b/src/sys/acpi.rs index 93b72aefd..a65abd7d5 100644 --- a/src/sys/acpi.rs +++ b/src/sys/acpi.rs @@ -8,30 +8,11 @@ use core::ptr::NonNull; use x86_64::PhysAddr; use x86_64::instructions::port::Port; -#[allow(dead_code)] -#[repr(u64)] -enum FADT { - SciInterrupt = 46, // u16, - SmiCmdPort = 48, // u32, - AcpiEnable = 52, // u8, - AcpiDisable = 53, // u8, - S4biosReq = 54, // u8, - PstateControl = 55, // u8, - Pm1aEventBlock = 56, // u32, - Pm1bEventBlock = 60, // u32, - Pm1aControlBlock = 64, // u32, - Pm1bControlBlock = 68, // u32, -} - fn read_addr(physical_address: usize) -> T where T: Copy { let virtual_address = sys::mem::phys_to_virt(PhysAddr::new(physical_address as u64)); unsafe { *virtual_address.as_ptr::() } } -fn read_fadt(address: usize, offset: FADT) -> T where T: Copy { - read_addr::(address + offset as usize) -} - pub fn shutdown() { let mut pm1a_control_block = 0; let mut slp_typa = 0; @@ -42,47 +23,32 @@ pub fn shutdown() { let res = unsafe { AcpiTables::search_for_rsdp_bios(MorosAcpiHandler) }; match res { Ok(acpi) => { - //debug!("ACPI Found RDSP in BIOS"); - for (sign, sdt) in acpi.sdts { - if sign.as_str() == "FACP" { - //debug!("ACPI Found FACP at {:#x}", sdt.physical_address); - - /* - // Enable ACPI - let smi_cmd_port = read_fadt::(sdt.physical_address, FADT::SmiCmdPort); - let acpi_enable = read_fadt::(sdt.physical_address, FADT::AcpiEnable); - let mut port: Port = Port::new(smi_cmd_port); - unsafe { port.write(acpi_enable); } - sys::time::sleep(3.0); - */ - - pm1a_control_block = read_fadt::(sdt.physical_address, FADT::Pm1aControlBlock); + if let Ok(fadt) = acpi.find_table::() { + if let Ok(block) = fadt.pm1a_control_block() { + pm1a_control_block = block.address as u32; //debug!("ACPI Found PM1a Control Block: {:#x}", pm1a_control_block); } } - match &acpi.dsdt { - Some(dsdt) => { - let address = sys::mem::phys_to_virt(PhysAddr::new(dsdt.address as u64)); - //debug!("ACPI Found DSDT at {:#x} {:#x}", dsdt.address, address); - let table = unsafe { core::slice::from_raw_parts(address.as_ptr(), dsdt.length as usize) }; - if aml.parse_table(table).is_ok() { - let name = AmlName::from_str("\\_S5").unwrap(); - if let Ok(AmlValue::Package(s5)) = aml.namespace.get_by_path(&name) { - //debug!("ACPI Found \\_S5 in DSDT"); - if let AmlValue::Integer(value) = s5[0] { - slp_typa = value as u16; - //debug!("ACPI Found SLP_TYPa in \\_S5: {}", slp_typa); - } + if let Ok(dsdt) = &acpi.dsdt() { + let address = sys::mem::phys_to_virt(PhysAddr::new(dsdt.address as u64)); + //debug!("ACPI Found DSDT at {:#x} {:#x}", dsdt.address, address); + let table = unsafe { core::slice::from_raw_parts(address.as_ptr(), dsdt.length as usize) }; + if aml.parse_table(table).is_ok() { + let name = AmlName::from_str("\\_S5").unwrap(); + if let Ok(AmlValue::Package(s5)) = aml.namespace.get_by_path(&name) { + //debug!("ACPI Found \\_S5 in DSDT"); + if let AmlValue::Integer(value) = s5[0] { + slp_typa = value as u16; + //debug!("ACPI Found SLP_TYPa in \\_S5: {}", slp_typa); } - } else { - debug!("ACPI Failed to parse AML in DSDT"); - // FIXME: AML parsing works on QEMU and Bochs but not - // on VirtualBox at the moment, so we use the following - // hardcoded value: - slp_typa = (5 & 7) << 10; } - }, - None => {}, + } else { + debug!("ACPI Failed to parse AML in DSDT"); + // FIXME: AML parsing works on QEMU and Bochs but not + // on VirtualBox at the moment, so we use the following + // hardcoded value: + slp_typa = (5 & 7) << 10; + } } } Err(_e) => { diff --git a/src/sys/syscall/mod.rs b/src/sys/syscall/mod.rs index ec265aae9..2d4f505e9 100644 --- a/src/sys/syscall/mod.rs +++ b/src/sys/syscall/mod.rs @@ -104,7 +104,7 @@ pub fn dispatcher(n: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) let buf_len = arg3; let buf = unsafe { core::slice::from_raw_parts_mut(buf_ptr, buf_len) }; if let Ok(addr) = service::accept(handle) { - buf[0..buf_len].clone_from_slice(&addr.as_bytes()); + buf[0..buf_len].clone_from_slice(addr.as_bytes()); 0 } else { -1 as isize as usize diff --git a/src/usr/http.rs b/src/usr/http.rs index cd09686ff..df6df8709 100644 --- a/src/usr/http.rs +++ b/src/usr/http.rs @@ -153,7 +153,7 @@ pub fn main(args: &[&str]) -> Result<(), ExitCode> { print!("{}", csi_reset); } let req = req.join(""); - syscall::write(handle, &req.as_bytes()); + syscall::write(handle, req.as_bytes()); let mut response_state = ResponseState::Headers; loop { diff --git a/src/usr/lisp/primitive.rs b/src/usr/lisp/primitive.rs index f907ea148..c99664c19 100644 --- a/src/usr/lisp/primitive.rs +++ b/src/usr/lisp/primitive.rs @@ -308,7 +308,7 @@ pub fn lisp_slice(args: &[Exp]) -> Result { }; match &args[0] { Exp::List(l) => { - let l: Vec = l.iter().skip(a).cloned().take(b).collect(); + let l: Vec = l.iter().skip(a).take(b).cloned().collect(); Ok(Exp::List(l)) } Exp::Str(s) => { @@ -413,7 +413,7 @@ pub fn lisp_file_size(args: &[Exp]) -> Result { let path = string(&args[0])?; match syscall::info(&path) { Some(info) => Ok(Exp::Num(Number::from(info.size() as usize))), - None => return could_not!("open file"), + None => could_not!("open file"), } } diff --git a/src/usr/socket.rs b/src/usr/socket.rs index 778df483e..22ff40d39 100644 --- a/src/usr/socket.rs +++ b/src/usr/socket.rs @@ -125,7 +125,7 @@ pub fn main(args: &[&str]) -> Result<(), ExitCode> { if let Some((h, _)) = syscall::poll(&list) { if h == stdin { let line = io::stdin().read_line().replace("\n", "\r\n"); - syscall::write(handle, &line.as_bytes()); + syscall::write(handle, line.as_bytes()); } else { let mut data = vec![0; buf_len]; if let Some(bytes) = syscall::read(handle, &mut data) {