hyperlight_guest/
shared_input_data.rsuse alloc::format;
use alloc::string::ToString;
use core::any::type_name;
use core::slice::from_raw_parts_mut;
use hyperlight_common::flatbuffer_wrappers::guest_error::ErrorCode;
use crate::error::{HyperlightGuestError, Result};
use crate::P_PEB;
pub fn try_pop_shared_input_data_into<T>() -> Result<T>
where
T: for<'a> TryFrom<&'a [u8]>,
{
let peb_ptr = unsafe { P_PEB.unwrap() };
let shared_buffer_size = unsafe { (*peb_ptr).inputdata.inputDataSize as usize };
let idb = unsafe {
from_raw_parts_mut(
(*peb_ptr).inputdata.inputDataBuffer as *mut u8,
shared_buffer_size,
)
};
if idb.is_empty() {
return Err(HyperlightGuestError::new(
ErrorCode::GuestError,
"Got a 0-size buffer in pop_shared_input_data_into".to_string(),
));
}
let stack_ptr_rel: usize =
usize::from_le_bytes(idb[..8].try_into().expect("Shared input buffer too small"));
if stack_ptr_rel > shared_buffer_size || stack_ptr_rel < 16 {
return Err(HyperlightGuestError::new(
ErrorCode::GuestError,
format!(
"Invalid stack pointer: {} in pop_shared_input_data_into",
stack_ptr_rel
),
));
}
let last_element_offset_rel = usize::from_le_bytes(
idb[stack_ptr_rel - 8..stack_ptr_rel]
.try_into()
.expect("Invalid stack pointer in pop_shared_input_data_into"),
);
let buffer = &idb[last_element_offset_rel..];
let type_t = match T::try_from(buffer) {
Ok(t) => Ok(t),
Err(_e) => {
return Err(HyperlightGuestError::new(
ErrorCode::GuestError,
format!("Unable to convert buffer to {}", type_name::<T>()),
));
}
};
idb[..8].copy_from_slice(&last_element_offset_rel.to_le_bytes());
idb[last_element_offset_rel..stack_ptr_rel].fill(0);
type_t
}