Woyten | 8c243cd | 2019-12-01 15:06:20 +0100 | [diff] [blame] | 1 | use crate::callback::Identity0Consumer; |
Woyten | cd7597d | 2019-11-12 12:38:35 +0100 | [diff] [blame] | 2 | use crate::futures; |
Woyten | 22bc254 | 2019-11-15 23:18:40 +0100 | [diff] [blame] | 3 | use crate::result::TockResult; |
Guillaume Endignoux | b091442 | 2019-10-04 13:37:26 +0200 | [diff] [blame] | 4 | use crate::syscalls; |
| 5 | use core::cell::Cell; |
Woyten | 22bc254 | 2019-11-15 23:18:40 +0100 | [diff] [blame] | 6 | use core::mem; |
Guillaume Endignoux | b091442 | 2019-10-04 13:37:26 +0200 | [diff] [blame] | 7 | |
| 8 | const DRIVER_NUMBER: usize = 0x40001; |
| 9 | |
| 10 | mod command_nr { |
| 11 | pub const REQUEST_RNG: usize = 1; |
| 12 | } |
| 13 | |
| 14 | mod subscribe_nr { |
| 15 | pub const BUFFER_FILLED: usize = 0; |
| 16 | } |
| 17 | |
| 18 | mod allow_nr { |
| 19 | pub const SHARE_BUFFER: usize = 0; |
| 20 | } |
| 21 | |
torfmaster | 97c5e72 | 2020-01-02 21:30:16 +0100 | [diff] [blame] | 22 | #[non_exhaustive] |
| 23 | pub struct RngDriver; |
Guillaume Endignoux | b091442 | 2019-10-04 13:37:26 +0200 | [diff] [blame] | 24 | |
torfmaster | 0c1aead | 2019-12-27 18:03:10 +0100 | [diff] [blame] | 25 | impl RngDriver { |
| 26 | pub async fn fill_buffer(&mut self, buf: &mut [u8]) -> TockResult<()> { |
| 27 | let buf_len = buf.len(); |
| 28 | let shared_memory = syscalls::allow(DRIVER_NUMBER, allow_nr::SHARE_BUFFER, buf)?; |
| 29 | let is_filled = Cell::new(false); |
Woyten | 8c243cd | 2019-12-01 15:06:20 +0100 | [diff] [blame] | 30 | let mut is_filled_alarm = || is_filled.set(true); |
| 31 | let subscription = syscalls::subscribe::<Identity0Consumer, _>( |
torfmaster | 0c1aead | 2019-12-27 18:03:10 +0100 | [diff] [blame] | 32 | DRIVER_NUMBER, |
| 33 | subscribe_nr::BUFFER_FILLED, |
| 34 | &mut is_filled_alarm, |
| 35 | )?; |
| 36 | syscalls::command(DRIVER_NUMBER, command_nr::REQUEST_RNG, buf_len, 0)?; |
| 37 | futures::wait_until(|| is_filled.get()).await; |
| 38 | mem::drop(subscription); |
| 39 | mem::drop(shared_memory); |
| 40 | Ok(()) |
| 41 | } |
Guillaume Endignoux | b091442 | 2019-10-04 13:37:26 +0200 | [diff] [blame] | 42 | } |