Import https://github.com/tock/libtock-rs at commit 828c19d into third_party/libtock-drivers/.

This commit is contained in:
Guillaume Endignoux
2020-07-10 10:05:35 +02:00
parent 5114a6fee2
commit 251e007d59
10 changed files with 1584 additions and 0 deletions

42
third_party/libtock-drivers/src/rng.rs vendored Normal file
View File

@@ -0,0 +1,42 @@
use crate::callback::Identity0Consumer;
use crate::futures;
use crate::result::TockResult;
use crate::syscalls;
use core::cell::Cell;
use core::mem;
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;
}
#[non_exhaustive]
pub struct RngDriver;
impl RngDriver {
pub async fn fill_buffer(&mut self, buf: &mut [u8]) -> TockResult<()> {
let buf_len = buf.len();
let shared_memory = syscalls::allow(DRIVER_NUMBER, allow_nr::SHARE_BUFFER, buf)?;
let is_filled = Cell::new(false);
let mut is_filled_alarm = || is_filled.set(true);
let subscription = syscalls::subscribe::<Identity0Consumer, _>(
DRIVER_NUMBER,
subscribe_nr::BUFFER_FILLED,
&mut is_filled_alarm,
)?;
syscalls::command(DRIVER_NUMBER, command_nr::REQUEST_RNG, buf_len, 0)?;
futures::wait_until(|| is_filled.get()).await;
mem::drop(subscription);
mem::drop(shared_memory);
Ok(())
}
}