redox/drivers/ahcid/src/main.rs

49 lines
1.5 KiB
Rust
Raw Normal View History

#![feature(asm)]
2016-09-27 19:14:27 +02:00
#![feature(question_mark)]
#[macro_use]
extern crate bitflags;
extern crate io;
2016-09-28 04:52:26 +02:00
extern crate spin;
extern crate syscall;
2016-09-28 04:52:26 +02:00
use std::fs::File;
use std::io::{Read, Write};
use std::{env, thread, usize};
2016-09-28 04:52:26 +02:00
use syscall::{iopl, physmap, physunmap, MAP_WRITE, Packet, Scheme};
2016-09-28 04:52:26 +02:00
use scheme::DiskScheme;
pub mod ahci;
2016-09-28 04:52:26 +02:00
pub mod scheme;
fn main() {
let mut args = env::args().skip(1);
let bar_str = args.next().expect("ahcid: no address provided");
let bar = usize::from_str_radix(&bar_str, 16).expect("ahcid: failed to parse address");
let irq_str = args.next().expect("ahcid: no irq provided");
let irq = irq_str.parse::<u8>().expect("ahcid: failed to parse irq");
thread::spawn(move || {
unsafe {
iopl(3).expect("ahcid: failed to get I/O permission");
asm!("cli" :::: "intel", "volatile");
}
let address = unsafe { physmap(bar, 4096, MAP_WRITE).expect("ahcid: failed to map address") };
2016-09-28 04:26:54 +02:00
{
2016-09-28 04:52:26 +02:00
let mut socket = File::create(":disk").expect("ahcid: failed to create disk scheme");
let scheme = DiskScheme::new(ahci::disks(address, irq));
2016-09-28 04:26:54 +02:00
loop {
2016-09-28 04:52:26 +02:00
let mut packet = Packet::default();
socket.read(&mut packet).expect("ahcid: failed to read disk scheme");
scheme.handle(&mut packet);
socket.write(&mut packet).expect("ahcid: failed to read disk scheme");
2016-09-28 04:26:54 +02:00
}
}
2016-09-28 04:26:54 +02:00
unsafe { let _ = physunmap(address); }
});
}