diff --git a/Cargo.lock b/Cargo.lock index d39c4a73a4..272f63687b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -441,6 +441,17 @@ dependencies = [ "libc", ] +[[package]] +name = "ided" +version = "0.1.0" +dependencies = [ + "log", + "pcid", + "redox-daemon", + "redox-log", + "redox_syscall 0.3.4", +] + [[package]] name = "idna" version = "0.1.5" diff --git a/Cargo.toml b/Cargo.toml index 8078a99e90..fb901ff23b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ members = [ "bgad", "block-io-wrapper", "e1000d", + "ided", "ihdad", "ixgbed", "nvmed", diff --git a/ided/.gitignore b/ided/.gitignore new file mode 100644 index 0000000000..ea8c4bf7f3 --- /dev/null +++ b/ided/.gitignore @@ -0,0 +1 @@ +/target diff --git a/ided/Cargo.toml b/ided/Cargo.toml new file mode 100644 index 0000000000..d62d829374 --- /dev/null +++ b/ided/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "ided" +version = "0.1.0" +edition = "2018" + +[dependencies] +log = "0.4" +pcid = { path = "../pcid" } +redox-daemon = "0.1" +redox-log = "0.1" +redox_syscall = "0.3" diff --git a/ided/src/main.rs b/ided/src/main.rs new file mode 100644 index 0000000000..6391ce4f6b --- /dev/null +++ b/ided/src/main.rs @@ -0,0 +1,63 @@ +use pcid_interface::PcidServerHandle; + +use log::{error, info}; +use redox_log::{OutputBuilder, RedoxLogger}; + +fn setup_logging() -> Option<&'static RedoxLogger> { + let mut logger = RedoxLogger::new() + .with_output( + OutputBuilder::stderr() + .with_filter(log::LevelFilter::Info) // limit global output to important info + .with_ansi_escape_codes() + .flush_on_newline(true) + .build() + ); + + #[cfg(target_os = "redox")] + match OutputBuilder::in_redox_logging_scheme("disk", "pcie", "ide.log") { + Ok(b) => logger = logger.with_output( + // TODO: Add a configuration file for this + b.with_filter(log::LevelFilter::Info) + .flush_on_newline(true) + .build() + ), + Err(error) => eprintln!("ided: failed to create ide.log: {}", error), + } + + #[cfg(target_os = "redox")] + match OutputBuilder::in_redox_logging_scheme("disk", "pcie", "ide.ansi.log") { + Ok(b) => logger = logger.with_output( + b.with_filter(log::LevelFilter::Info) + .with_ansi_escape_codes() + .flush_on_newline(true) + .build() + ), + Err(error) => eprintln!("ided: failed to create ide.ansi.log: {}", error), + } + + match logger.enable() { + Ok(logger_ref) => { + eprintln!("ided: enabled logger"); + Some(logger_ref) + } + Err(error) => { + eprintln!("ided: failed to set default logger: {}", error); + None + } + } +} + +fn main() { + redox_daemon::Daemon::new(daemon).expect("ided: failed to daemonize"); +} + +fn daemon(daemon: redox_daemon::Daemon) -> ! { + let _logger_ref = setup_logging(); + + let mut pcid_handle = + PcidServerHandle::connect_default().expect("ided: failed to setup channel to pcid"); + + println!("IDE {:#x?}", pcid_handle.fetch_header()); + + std::process::exit(0); +} diff --git a/initfs.toml b/initfs.toml index fed4f568c0..1c1c6015fd 100644 --- a/initfs.toml +++ b/initfs.toml @@ -7,6 +7,14 @@ class = 1 subclass = 6 command = ["ahcid", "$NAME", "$BAR5", "$BARSIZE5", "$IRQ"] +# ided +[[drivers]] +name = "IDE storage" +class = 1 +subclass = 1 +command = ["ided"] +use_channel = true + # nvmed [[drivers]] name = "NVME storage"