use hyperlight_common::flatbuffer_wrappers::guest_error::{
ErrorCode, GuestError as GuestErrorStruct,
};
use crate::error::HyperlightError::{GuestError, OutBHandlingError, StackOverflow};
use crate::mem::shared_mem::HostSharedMemory;
use crate::sandbox::mem_mgr::MemMgrWrapper;
use crate::sandbox::metrics::SandboxMetric::GuestErrorCount;
use crate::{int_counter_vec_inc, log_then_return, Result};
pub(crate) fn check_for_guest_error(mgr: &MemMgrWrapper<HostSharedMemory>) -> Result<()> {
let guest_err = mgr.as_ref().get_guest_error()?;
match guest_err.code {
ErrorCode::NoError => Ok(()),
ErrorCode::OutbError => match mgr.as_ref().get_host_error()? {
Some(host_err) => {
increment_guest_error_count(&guest_err);
log_then_return!(OutBHandlingError(
host_err.source.clone(),
guest_err.message.clone()
));
}
None => Ok(()),
},
ErrorCode::StackOverflow => {
increment_guest_error_count(&guest_err.clone());
log_then_return!(StackOverflow());
}
_ => {
increment_guest_error_count(&guest_err.clone());
log_then_return!(GuestError(
guest_err.code.clone(),
guest_err.message.clone()
));
}
}
}
fn increment_guest_error_count(guest_err: &GuestErrorStruct) {
let guest_err_code_string: String = guest_err.code.clone().into();
int_counter_vec_inc!(
&GuestErrorCount,
&[&guest_err_code_string, guest_err.message.clone().as_str()]
);
}