Update third_party/libtock-drivers to support OpenSK.
This commit is contained in:
49
third_party/libtock-drivers/src/rng.rs
vendored
49
third_party/libtock-drivers/src/rng.rs
vendored
@@ -1,9 +1,6 @@
|
||||
use crate::callback::Identity0Consumer;
|
||||
use crate::futures;
|
||||
use crate::result::TockResult;
|
||||
use crate::syscalls;
|
||||
use crate::util;
|
||||
use core::cell::Cell;
|
||||
use core::mem;
|
||||
use libtock_core::{callback, syscalls};
|
||||
|
||||
const DRIVER_NUMBER: usize = 0x40001;
|
||||
|
||||
@@ -19,24 +16,30 @@ mod allow_nr {
|
||||
pub const SHARE_BUFFER: usize = 0;
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct RngDriver;
|
||||
pub fn fill_buffer(buf: &mut [u8]) -> bool {
|
||||
let buf_len = buf.len();
|
||||
|
||||
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(())
|
||||
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::<callback::Identity0Consumer, _>(
|
||||
DRIVER_NUMBER,
|
||||
subscribe_nr::BUFFER_FILLED,
|
||||
&mut is_filled_alarm,
|
||||
);
|
||||
if subscription.is_err() {
|
||||
return false;
|
||||
}
|
||||
|
||||
let result_code = syscalls::command(DRIVER_NUMBER, command_nr::REQUEST_RNG, buf_len, 0);
|
||||
if result_code.is_err() {
|
||||
return false;
|
||||
}
|
||||
|
||||
util::yieldk_for(|| is_filled.get());
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user