blob: 915745cdfbe1fb2ab033daf7478ff413a9fbc914 [file] [log] [blame]
use crate::futures;
use crate::syscalls;
use core::cell::Cell;
use core::executor;
const DRIVER_NUMBER: usize = 0x40001;
mod command_nr {
pub const REQUEST_RNG: usize = 1;
}
mod subscribe_nr {
pub const BUFFER_FILLED: usize = 0;
}
mod allow_nr {
pub const SHARE_BUFFER: usize = 0;
}
pub fn fill_buffer(buf: &mut [u8]) -> bool {
let buf_len = buf.len();
let result = syscalls::allow(DRIVER_NUMBER, allow_nr::SHARE_BUFFER, buf);
if result.is_err() {
return false;
}
let is_filled = Cell::new(false);
let mut is_filled_alarm = |_, _, _| is_filled.set(true);
let subscription = syscalls::subscribe(
DRIVER_NUMBER,
subscribe_nr::BUFFER_FILLED,
&mut is_filled_alarm,
);
if subscription.is_err() {
return false;
}
let result_code =
unsafe { syscalls::command(DRIVER_NUMBER, command_nr::REQUEST_RNG, buf_len, 0) };
if result_code < 0 {
return false;
}
executor::block_on(futures::wait_until(|| is_filled.get()));
return true;
}