use std::mem::MaybeUninit;
use crate::{ffi, types::TextMut};
#[non_exhaustive]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum Arch {
Wasm = 0,
RiscV = 1,
Arm = 2,
Mips = 3,
X86 = 4,
}
pub async fn arch() -> Arch {
let ready = ffi::allocate();
let mut out = MaybeUninit::<u32>::uninit();
let future = unsafe {
ffi::request_future(ffi::Command {
portal: ffi::Portal::CpuInfo,
ready,
command: 0,
data: out.as_mut_ptr().cast(),
})
};
future.await;
match unsafe { out.assume_init() } {
0 => Arch::Wasm,
1 => Arch::RiscV,
2 => Arch::Arm,
3 => Arch::Mips,
4 => Arch::X86,
_ => Arch::Wasm,
}
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum Width {
Cpu16 = 0,
Cpu32 = 1,
Cpu64 = 2,
Cpu128 = 3,
}
pub async fn width() -> Width {
let ready = ffi::allocate();
let mut out = MaybeUninit::<u32>::uninit();
let future = unsafe {
ffi::request_future(ffi::Command {
portal: ffi::Portal::CpuInfo,
ready,
command: 1,
data: out.as_mut_ptr().cast(),
})
};
future.await;
match unsafe { out.assume_init() } {
0 => Width::Cpu16,
1 => Width::Cpu32,
2 => Width::Cpu64,
3 => Width::Cpu128,
_ => Width::Cpu32,
}
}
pub async fn extensions() -> String {
let ready = ffi::allocate();
let mut out = TextMut {
size: 0,
data: std::ptr::null_mut(),
};
let future = unsafe {
ffi::request_future(ffi::Command {
portal: ffi::Portal::CpuInfo,
ready,
command: 2,
data: <*mut TextMut>::cast(&mut out),
})
};
future.await;
let ready = ffi::allocate();
let mut string = String::with_capacity(out.size);
let mut out = TextMut {
size: string.capacity(),
data: string.as_mut_ptr(),
};
let future = unsafe {
ffi::request_future(ffi::Command {
portal: ffi::Portal::CpuInfo,
ready,
command: 2,
data: <*mut TextMut>::cast(&mut out),
})
};
future.await;
string
}