use crate::{Engine, HostCallError, KernelContext, OuterVm};
use corevm_host::Outcome;
use log::trace;
use polkakernel::{Kernel, SyscallOutcome};
pub fn syscall<O: OuterVm>(engine: &mut Engine<O>) -> Result<(), HostCallError> {
let state = engine.work_output.take_kernel_state()?;
let context = KernelContext { engine, error: None };
let mut kernel = Kernel::new(context, state);
let outcome = kernel.handle_syscall()?;
let state = kernel.state;
let error = kernel.context.error;
engine.work_output.return_kernel_state(state);
if let Some(e) = error {
return Err(e);
}
match outcome {
SyscallOutcome::Exit(0) => {
trace!("Exited with code 0");
Err(HostCallError::Outcome(Outcome::Halt))
},
SyscallOutcome::Exit(ret) => {
trace!("Exited with code {ret}");
Err(HostCallError::Outcome(Outcome::Panic))
},
SyscallOutcome::Continue => Ok(()),
}
}