Compare commits
4 Commits
af9a7aa712
...
ab79782a78
Author | SHA1 | Date | |
---|---|---|---|
ab79782a78 | |||
b9544293e5 | |||
a10579346c | |||
3968c4c376 |
@ -9,6 +9,7 @@ use core::convert::TryInto;
|
|||||||
|
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use spin::Mutex;
|
use spin::Mutex;
|
||||||
|
use crate::utils::AsyncMutex;
|
||||||
use x86_64::instructions::port::Port;
|
use x86_64::instructions::port::Port;
|
||||||
|
|
||||||
const CD_SECTOR_SIZE: usize = 2048;
|
const CD_SECTOR_SIZE: usize = 2048;
|
||||||
@ -58,15 +59,15 @@ static ATAPI_SIG: [u8; 4] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref DRIVE: Mutex<Option<ATABus>> = {
|
pub static ref DRIVE: AsyncMutex<Option<ATABus>> = {
|
||||||
Mutex::new(ATABus::discover_atapi_drive())
|
AsyncMutex::new(ATABus::discover_atapi_drive())
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn init() {
|
pub async fn init() {
|
||||||
println!("Detecting drives");
|
println!("Detecting drives");
|
||||||
match DRIVE.lock().as_ref() {
|
match DRIVE.lock().await.as_ref() {
|
||||||
None => println!("No drive detected :("),
|
None => println!("No drive detected :("),
|
||||||
Some(drive) => {
|
Some(drive) => {
|
||||||
let drive_type = match drive.current_drive {
|
let drive_type = match drive.current_drive {
|
||||||
@ -322,6 +323,6 @@ impl ATABus {
|
|||||||
|
|
||||||
|
|
||||||
pub async fn print_block() {
|
pub async fn print_block() {
|
||||||
DRIVE.lock().as_mut().unwrap().read_block(500).await;
|
let block = DRIVE.lock().await.as_mut().unwrap().read_block(500).await;
|
||||||
serial_println!("{:x?}", DRIVE.lock().as_mut().unwrap().block);
|
serial_println!("{:x?}", block);
|
||||||
}
|
}
|
@ -1,6 +1,6 @@
|
|||||||
pub mod iso9660;
|
pub mod iso9660;
|
||||||
|
|
||||||
use crate::serial_println;
|
use crate::println;
|
||||||
use crate::drivers::atapi::{DRIVE};
|
use crate::drivers::atapi::{DRIVE};
|
||||||
use crate::utils::unserialize;
|
use crate::utils::unserialize;
|
||||||
use iso9660::{IsoPrimVolDesc};
|
use iso9660::{IsoPrimVolDesc};
|
||||||
@ -8,11 +8,12 @@ use iso9660::{IsoPrimVolDesc};
|
|||||||
pub async fn init_prim_vol_desc() {
|
pub async fn init_prim_vol_desc() {
|
||||||
let desc_block = DRIVE
|
let desc_block = DRIVE
|
||||||
.lock()
|
.lock()
|
||||||
|
.await
|
||||||
.as_mut()
|
.as_mut()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.read_block(iso9660::ISO_PRIM_VOLDESC_BLOCK)
|
.read_block(iso9660::ISO_PRIM_VOLDESC_BLOCK)
|
||||||
.await;
|
.await;
|
||||||
let prim_vol_desc: &IsoPrimVolDesc = unserialize::<IsoPrimVolDesc>(desc_block.as_ptr());
|
let prim_vol_desc: &IsoPrimVolDesc = unserialize::<IsoPrimVolDesc>(desc_block.as_ptr());
|
||||||
|
|
||||||
serial_println!("{:?}", prim_vol_desc.std_identifier);
|
println!("{:?}", alloc::string::String::from_utf8_lossy(&prim_vol_desc.std_identifier));
|
||||||
}
|
}
|
@ -43,7 +43,6 @@ pub fn init(boot_info: &BootInformation) {
|
|||||||
memory::init(boot_info);
|
memory::init(boot_info);
|
||||||
memory::gdt::init_gdt();
|
memory::gdt::init_gdt();
|
||||||
interrupts::init_idt();
|
interrupts::init_idt();
|
||||||
drivers::atapi::init();
|
|
||||||
vga::change_color(ColorCode::new(Color::LightGreen, Color::Black));
|
vga::change_color(ColorCode::new(Color::LightGreen, Color::Black));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,6 +55,7 @@ pub extern "C" fn julios_main(multiboot_info_addr: usize) -> ! {
|
|||||||
serial_println!("Hello serial");
|
serial_println!("Hello serial");
|
||||||
|
|
||||||
let mut executor = Executor::new();
|
let mut executor = Executor::new();
|
||||||
|
executor.spawn(Task::new(drivers::atapi::init()));
|
||||||
executor.spawn(Task::new(keyboard::print_keypresses()));
|
executor.spawn(Task::new(keyboard::print_keypresses()));
|
||||||
executor.spawn(Task::new(fs::iso::init_prim_vol_desc()));
|
executor.spawn(Task::new(fs::iso::init_prim_vol_desc()));
|
||||||
executor.run();
|
executor.run();
|
||||||
|
@ -4,14 +4,14 @@ use core::cell::UnsafeCell;
|
|||||||
use core::ops::{Deref, DerefMut, Drop};
|
use core::ops::{Deref, DerefMut, Drop};
|
||||||
use core::sync::atomic::{AtomicBool, Ordering};
|
use core::sync::atomic::{AtomicBool, Ordering};
|
||||||
use core::task::{Context, Poll};
|
use core::task::{Context, Poll};
|
||||||
use alloc::rc::Rc;
|
use alloc::sync::Arc;
|
||||||
|
|
||||||
use futures_util::task::AtomicWaker;
|
use futures_util::task::AtomicWaker;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct Lock {
|
struct Lock {
|
||||||
lock: Rc<AtomicBool>,
|
lock: Arc<AtomicBool>,
|
||||||
waker: Rc<AtomicWaker>,
|
waker: Arc<AtomicWaker>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct AsyncMutex<T> {
|
pub struct AsyncMutex<T> {
|
||||||
@ -29,8 +29,8 @@ where
|
|||||||
impl Lock {
|
impl Lock {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Lock {
|
Lock {
|
||||||
lock: Rc::new(AtomicBool::new(false)),
|
lock: Arc::new(AtomicBool::new(false)),
|
||||||
waker: Rc::new(AtomicWaker::new()),
|
waker: Arc::new(AtomicWaker::new()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,6 +86,8 @@ impl<T> AsyncMutex<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl<T> Send for AsyncMutex<T> {}
|
||||||
|
unsafe impl<T> Sync for AsyncMutex<T> {}
|
||||||
|
|
||||||
impl<T> Drop for AsyncMutexGuard<'_, T> {
|
impl<T> Drop for AsyncMutexGuard<'_, T> {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
|
Loading…
Reference in New Issue
Block a user