in src/enclave_proc/resource_manager.rs [796:866]
fn do_ioctl<T>(fd: RawFd, ioctl_code: u64, arg: &mut T) -> NitroCliResult<i32> {
let rc = unsafe { libc::ioctl(fd, ioctl_code as _, arg) };
if rc >= 0 {
return Ok(rc);
}
let err_msg = match Error::last_os_error().raw_os_error().unwrap_or(0) as u32 {
NE_ERR_VCPU_ALREADY_USED => "The provided vCPU is already used".to_string(),
NE_ERR_VCPU_NOT_IN_CPU_POOL => {
"The provided vCPU is not available in the CPU pool".to_string()
}
NE_ERR_VCPU_INVALID_CPU_CORE => {
"The vCPU core ID is invalid for the CPU pool".to_string()
}
NE_ERR_INVALID_MEM_REGION_SIZE => {
"The memory region's size is not a multiple of 2 MiB".to_string()
}
NE_ERR_INVALID_MEM_REGION_ADDR => "The memory region's address is invalid".to_string(),
NE_ERR_UNALIGNED_MEM_REGION_ADDR => {
"The memory region's address is not aligned".to_string()
}
NE_ERR_MEM_REGION_ALREADY_USED => "The memory region is already used".to_string(),
NE_ERR_MEM_NOT_HUGE_PAGE => {
"The memory region is not backed by contiguous physical huge page(s)".to_string()
}
NE_ERR_MEM_DIFFERENT_NUMA_NODE => {
"The memory region's pages and the CPUs belong to different NUMA nodes".to_string()
}
NE_ERR_MEM_MAX_REGIONS => {
"The maximum number of memory regions per enclave has been reached".to_string()
}
NE_ERR_NO_MEM_REGIONS_ADDED => {
"The enclave cannot start because no memory regions have been added".to_string()
}
NE_ERR_NO_VCPUS_ADDED => {
"The enclave cannot start because no vCPUs have been added".to_string()
}
NE_ERR_ENCLAVE_MEM_MIN_SIZE => {
"The enclave's memory size is lower than the minimum supported".to_string()
}
NE_ERR_FULL_CORES_NOT_USED => {
"The enclave cannot start because full CPU cores have not been set".to_string()
}
NE_ERR_NOT_IN_INIT_STATE => {
"The enclave is in an incorrect state to set resources or start".to_string()
}
NE_ERR_INVALID_VCPU => {
"The provided vCPU is out of range of the available CPUs".to_string()
}
NE_ERR_NO_CPUS_AVAIL_IN_POOL => {
"The enclave cannot be created because no CPUs are available in the pool"
.to_string()
}
NE_ERR_INVALID_PAGE_SIZE => {
"The memory region is not backed by page(s) multiple of 2 MiB".to_string()
}
NE_ERR_INVALID_FLAG_VALUE => {
"The provided flags value in the ioctl arg data structure is invalid".to_string()
}
NE_ERR_INVALID_ENCLAVE_CID => {
"The provided enclave CID is invalid, being a well-known CID or the parent VM CID"
.to_string()
}
e => format!("An error has occurred: {} (rc: {})", e, rc),
};
Err(new_nitro_cli_failure!(
&err_msg,
NitroCliErrorEnum::IoctlFailure
))
}