twizzler_abi/syscall/
random.rs1use 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}