twizzler_abi/syscall/
random.rs

1use core::mem::MaybeUninit;
2
3use bitflags::bitflags;
4use twizzler_rt_abi::Result;
5
6use super::{convert_codes_to_result, twzerr, Syscall};
7use crate::arch::syscall::raw_syscall;
8
9bitflags! {
10    #[derive(Debug)]
11    pub struct GetRandomFlags: u32 {
12        const NONBLOCKING = 1 << 0;
13        const UNEXPECTED = 2 << 0;
14    }
15}
16
17impl From<u64> for GetRandomFlags {
18    fn from(value: u64) -> Self {
19        match value {
20            1 => GetRandomFlags::NONBLOCKING,
21            0 => GetRandomFlags::empty(),
22            _ => GetRandomFlags::UNEXPECTED,
23        }
24    }
25}
26impl From<u32> for GetRandomFlags {
27    fn from(value: u32) -> Self {
28        match value {
29            1 => GetRandomFlags::NONBLOCKING,
30            0 => GetRandomFlags::empty(),
31            _ => GetRandomFlags::UNEXPECTED,
32        }
33    }
34}
35
36pub fn sys_get_random(dest: &mut [MaybeUninit<u8>], flags: GetRandomFlags) -> Result<usize> {
37    let (code, val) = unsafe {
38        raw_syscall(
39            Syscall::GetRandom,
40            &[
41                dest.as_mut_ptr() as u64,
42                dest.len() as u64,
43                flags.bits() as u64,
44            ],
45        )
46    };
47    let out = convert_codes_to_result(code, val, |c, _| c != 0, |_, v| v as usize, twzerr);
48    out
49}