Compare commits

...

7 Commits

Author SHA1 Message Date
Jinank Jain 890309853e
Merge 371e684edf into 7966925c1c 2024-04-06 21:26:59 +08:00
Rob Bradford 7966925c1c build: Bulk update dependencies
Signed-off-by: Rob Bradford <rbradford@rivosinc.com>
2024-04-06 09:48:25 +00:00
Bo Chen f409c4b63b build: Enable metrics and rate-limiter worker
This reverts commit 00684e6d19.

Signed-off-by: Bo Chen <chen.bo@intel.com>
2024-04-06 07:33:38 +00:00
Jinank Jain 371e684edf hypervisor: Implement hypervisor agnostic variant of RegList
Currently on aarch64 we are using kvm_bindings definition of RegList.
Instead we should implment a hypervisor agnostic variant of RegList such
that it works for both KVM and MSHV.

Signed-off-by: Jinank Jain <jinankjain@microsoft.com>
2024-04-05 14:46:41 +00:00
Jinank Jain 917bcd0291 hypervisor: Implement hypervisor agnostic variant of VcpuInit
This would be required to compile CloudHypervisor for MSHV ARM64
support.

Signed-off-by: Jinank Jain <jinankjain@microsoft.com>
2024-04-05 14:46:41 +00:00
Jinank Jain ff13a94a78 hypervisor: Implement hypervisor agnostic version of Register
Currently on aarch64 we are using kvm_one_reg from kvm_bindings as the
definition of Register. This won't work while compiling cloud hypervisor
for MSHV. Thus, implement a hypervisor agnostic version of Register.

Signed-off-by: Jinank Jain <jinankjain@microsoft.com>
2024-04-05 14:46:41 +00:00
Jinank Jain f35b84b03b hypervisor: Implement hypervisor agnostic StandardRegisters
Currently on aarch64 we are using kvm_bindings as StandardRegisters
which calling get/set_regs interface. This does not work for MSHV. We
should define a hypervisor agnostic StandardRegisters interface which
works for both KVM and MSHV.

Signed-off-by: Jinank Jain <jinankjain@microsoft.com>
2024-04-05 14:46:41 +00:00
33 changed files with 618 additions and 515 deletions

View File

@ -0,0 +1,22 @@
name: Cloud Hypervisor Tests (Metrics)
on:
push:
branches:
- main
jobs:
build:
name: Tests (Metrics)
runs-on: jammy-metrics
env:
METRICS_PUBLISH_KEY: ${{ secrets.METRICS_PUBLISH_KEY }}
steps:
- name: Code checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run metrics tests
timeout-minutes: 60
run: scripts/dev_cli.sh tests --metrics -- -- --report-file /root/workloads/metrics.json
- name: Upload metrics report
run: 'curl -X PUT https://ch-metrics.azurewebsites.net/api/publishmetrics -H "x-functions-key: $METRICS_PUBLISH_KEY" -T ~/workloads/metrics.json'

View File

@ -0,0 +1,28 @@
name: Cloud Hypervisor Tests (Rate-Limiter)
on: [merge_group, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: Tests (Rate-Limiter)
runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-latest' || 'jammy-rate-limiter' }}
env:
AUTH_DOWNLOAD_TOKEN: ${{ secrets.AUTH_DOWNLOAD_TOKEN }}
steps:
- name: Fix workspace permissions
if: ${{ github.event_name != 'pull_request' }}
run: sudo chown -R github-runner:github-runner ${GITHUB_WORKSPACE}
- name: Code checkout
if: ${{ github.event_name != 'pull_request' }}
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run rate-limiter integration tests
if: ${{ github.event_name != 'pull_request' }}
timeout-minutes: 10
run: scripts/dev_cli.sh tests --integration-rate-limiter
- name: Skipping build for PR
if: ${{ github.event_name == 'pull_request' }}
run: echo "Skipping build for PR"

626
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -29,20 +29,20 @@ strip = false
debug = true
[dependencies]
anyhow = "1.0.79"
anyhow = "1.0.81"
api_client = { path = "api_client" }
clap = { version = "4.5.1", features = ["string"] }
clap = { version = "4.5.4", features = ["string"] }
dhat = { version = "0.3.3", optional = true }
epoll = "4.3.3"
event_monitor = { path = "event_monitor" }
hypervisor = { path = "hypervisor" }
libc = "0.2.153"
log = { version = "0.4.20", features = ["std"] }
log = { version = "0.4.21", features = ["std"] }
option_parser = { path = "option_parser" }
seccompiler = "0.4.0"
serde_json = "1.0.114"
serde_json = "1.0.115"
signal-hook = "0.3.17"
thiserror = "1.0.52"
thiserror = "1.0.58"
tpm = { path = "tpm"}
tracer = { path = "tracer" }
vmm = { path = "vmm" }
@ -56,10 +56,10 @@ kvm-bindings = { git = "https://github.com/cloud-hypervisor/kvm-bindings", branc
versionize_derive = { git = "https://github.com/cloud-hypervisor/versionize_derive", branch = "ch-0.1.6" }
[dev-dependencies]
dirs = "5.0.0"
dirs = "5.0.1"
net_util = { path = "net_util" }
once_cell = "1.19.0"
serde_json = "1.0.114"
serde_json = "1.0.115"
test_infra = { path = "test_infra" }
wait-timeout = "0.2.0"

View File

@ -10,15 +10,15 @@ sev_snp = []
tdx = []
[dependencies]
anyhow = "1.0.79"
anyhow = "1.0.81"
byteorder = "1.5.0"
hypervisor = { path = "../hypervisor" }
libc = "0.2.153"
linux-loader = { version = "0.11.0", features = ["elf", "bzimage", "pe"] }
log = "0.4.20"
serde = { version = "1.0.196", features = ["rc", "derive"] }
thiserror = "1.0.52"
uuid = "1.3.4"
log = "0.4.21"
serde = { version = "1.0.197", features = ["rc", "derive"] }
thiserror = "1.0.58"
uuid = "1.8.0"
versionize = "0.2.0"
versionize_derive = "0.1.6"
vm-memory = { version = "0.14.1", features = ["backend-mmap", "backend-bitmap"] }
@ -26,5 +26,5 @@ vm-migration = { path = "../vm-migration" }
vmm-sys-util = { version = "0.12.1", features = ["with-serde"] }
[target.'cfg(target_arch = "aarch64")'.dependencies]
fdt_parser = { version = "0.1.4", package = "fdt" }
fdt_parser = { version = "0.1.5", package = "fdt" }
vm-fdt = { git = "https://github.com/rust-vmm/vm-fdt", branch = "main" }

View File

@ -11,16 +11,16 @@ io_uring = ["dep:io-uring"]
[dependencies]
byteorder = "1.5.0"
crc-any = "2.4.4"
io-uring = { version = "0.6.2", optional = true }
io-uring = { version = "0.6.3", optional = true }
libc = "0.2.153"
log = "0.4.20"
remain = "0.2.11"
log = "0.4.21"
remain = "0.2.13"
smallvec = "1.13.2"
thiserror = "1.0.52"
uuid = { version = "1.3.4", features = ["v4"] }
thiserror = "1.0.58"
uuid = { version = "1.8.0", features = ["v4"] }
versionize = "0.2.0"
versionize_derive = "0.1.6"
virtio-bindings = { version = "0.2.0", features = ["virtio-v5_0_0"] }
virtio-bindings = { version = "0.2.2", features = ["virtio-v5_0_0"] }
virtio-queue = "0.11.0"
vm-memory = { version = "0.14.1", features = ["backend-mmap", "backend-atomic", "backend-bitmap"] }
vm-virtio = { path = "../vm-virtio" }

View File

@ -6,16 +6,16 @@ edition = "2021"
[dependencies]
acpi_tables = { git = "https://github.com/rust-vmm/acpi_tables", branch = "main" }
anyhow = "1.0.79"
anyhow = "1.0.81"
arch = { path = "../arch" }
bitflags = "2.4.2"
bitflags = "2.5.0"
byteorder = "1.5.0"
event_monitor = { path = "../event_monitor" }
hypervisor = { path = "../hypervisor" }
libc = "0.2.153"
log = "0.4.20"
log = "0.4.21"
pci = { path = "../pci" }
thiserror = "1.0.52"
thiserror = "1.0.58"
tpm = { path = "../tpm" }
versionize = "0.2.0"
versionize_derive = "0.1.6"

View File

@ -8,5 +8,5 @@ edition = "2021"
flume = "0.10.14"
libc = "0.2.153"
once_cell = "1.19.0"
serde = { version = "1.0.196", features = ["rc", "derive"] }
serde_json = "1.0.114"
serde = { version = "1.0.197", features = ["rc", "derive"] }
serde_json = "1.0.115"

62
fuzz/Cargo.lock generated
View File

@ -5,7 +5,7 @@ version = 3
[[package]]
name = "acpi_tables"
version = "0.1.0"
source = "git+https://github.com/rust-vmm/acpi_tables?branch=main#1a733bf690ccc10bdfeacad33e3c9f6cce0008fd"
source = "git+https://github.com/rust-vmm/acpi_tables?branch=main#ca1a473fe73cdd8eb49c1449faad7aaac06f32c2"
dependencies = [
"zerocopy",
]
@ -128,9 +128,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.4.2"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
[[package]]
name = "block"
@ -200,7 +200,7 @@ dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim 0.11.0",
"strsim 0.11.1",
]
[[package]]
@ -300,7 +300,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim 0.10.0",
"syn 2.0.47",
"syn 2.0.58",
]
[[package]]
@ -311,7 +311,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
dependencies = [
"darling_core",
"quote",
"syn 2.0.47",
"syn 2.0.58",
]
[[package]]
@ -327,7 +327,7 @@ dependencies = [
"acpi_tables",
"anyhow",
"arch",
"bitflags 2.4.2",
"bitflags 2.5.0",
"byteorder",
"event_monitor",
"hypervisor",
@ -351,7 +351,7 @@ version = "4.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74351c3392ea1ff6cd2628e0042d268ac2371cb613252ff383b6dfa50d22fa79"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"libc",
]
@ -405,9 +405,9 @@ checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
[[package]]
name = "getrandom"
version = "0.2.12"
version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
checksum = "a06fddc2749e0528d2813f95e050e87e52c8cbbae56223b9babf73b3e53b0cc6"
dependencies = [
"cfg-if",
"js-sys",
@ -490,7 +490,7 @@ version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9002dff009755414f22b962ec6ae6980b07d6d8b06e5297b1062019d72bd6a8c"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"kvm-bindings",
"libc",
"vmm-sys-util",
@ -634,7 +634,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.47",
"syn 2.0.58",
]
[[package]]
@ -674,7 +674,7 @@ checksum = "ad9f2390298a947ee0aa6073d440e221c0726188cfbcdf9604addb6ee393eb4a"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.47",
"syn 2.0.58",
]
[[package]]
@ -715,7 +715,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.47",
"syn 2.0.58",
]
[[package]]
@ -749,7 +749,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 2.0.47",
"syn 2.0.58",
]
[[package]]
@ -798,9 +798,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "strsim"
version = "0.11.0"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "syn"
@ -815,9 +815,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.47"
version = "2.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1726efe18f42ae774cc644f330953a5e7b3c3003d3edcecf18850fe9d4dd9afb"
checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687"
dependencies = [
"proc-macro2",
"quote",
@ -826,22 +826,22 @@ dependencies = [
[[package]]
name = "thiserror"
version = "1.0.56"
version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.56"
version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.47",
"syn 2.0.58",
]
[[package]]
@ -963,7 +963,7 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b64e816d0d49769fbfaa1494eb77cc2a3ddc526ead05c7f922cb7d64106286f"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"libc",
"vm-memory",
"vmm-sys-util",
@ -1045,8 +1045,8 @@ dependencies = [
[[package]]
name = "vm-fdt"
version = "0.2.0"
source = "git+https://github.com/rust-vmm/vm-fdt?branch=main#c5a99ab71b130435927d19b50c85fcd5ce904a8c"
version = "0.3.0"
source = "git+https://github.com/rust-vmm/vm-fdt?branch=main#982fb8d9c8cd7f53520d7e304b39ff307fa3a641"
[[package]]
name = "vm-memory"
@ -1090,7 +1090,7 @@ dependencies = [
"anyhow",
"arc-swap",
"arch",
"bitflags 2.4.2",
"bitflags 2.5.0",
"block",
"cfg-if",
"clap",
@ -1170,7 +1170,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
"syn 2.0.47",
"syn 2.0.58",
"wasm-bindgen-shared",
]
@ -1192,7 +1192,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.47",
"syn 2.0.58",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@ -1309,5 +1309,5 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.47",
"syn 2.0.58",
]

View File

@ -14,8 +14,8 @@ igvm = []
[dependencies]
block = { path = "../block" }
devices = { path = "../devices" }
epoll = "4.3.1"
libc = "0.2.152"
epoll = "4.3.3"
libc = "0.2.153"
libfuzzer-sys = "0.4.7"
linux-loader = { version = "0.11.0", features = ["elf", "bzimage", "pe"] }
micro_http = { git = "https://github.com/firecracker-microvm/micro-http", branch = "main" }

View File

@ -12,28 +12,28 @@ sev_snp = ["igvm_parser", "igvm_defs"]
tdx = []
[dependencies]
anyhow = "1.0.79"
anyhow = "1.0.81"
byteorder = "1.5.0"
igvm_defs = { git = "https://github.com/microsoft/igvm", branch = "main", package = "igvm_defs", optional = true }
igvm_parser = { git = "https://github.com/microsoft/igvm", branch = "main", package = "igvm", optional = true }
libc = "0.2.153"
log = "0.4.20"
log = "0.4.21"
kvm-ioctls = { version = "0.16.0", optional = true }
kvm-bindings = { git = "https://github.com/cloud-hypervisor/kvm-bindings", branch = "ch-v0.7.0", features = ["with-serde", "fam-wrappers"], optional = true }
mshv-bindings = { git = "https://github.com/rust-vmm/mshv", branch = "main", features = ["with-serde", "fam-wrappers"], optional = true }
mshv-ioctls = { git = "https://github.com/rust-vmm/mshv", branch = "main", optional = true}
serde = { version = "1.0.196", features = ["rc", "derive"] }
serde = { version = "1.0.197", features = ["rc", "derive"] }
serde_with = { version = "3.7.0", default-features = false, features = ["macros"] }
vfio-ioctls = { git = "https://github.com/rust-vmm/vfio", branch = "main", default-features = false }
vm-memory = { version = "0.14.1", features = ["backend-mmap", "backend-atomic"] }
vmm-sys-util = { version = "0.12.1", features = ["with-serde"] }
thiserror = "1.0.52"
thiserror = "1.0.58"
[target.'cfg(target_arch = "x86_64")'.dependencies.iced-x86]
optional = true
version = "1.20.0"
version = "1.21.0"
default-features = false
features = ["std", "decoder", "op_code_info", "instr_info", "fast_fmt"]
[dev-dependencies]
env_logger = "0.10.1"
env_logger = "0.10.2"

View File

@ -1,3 +1,36 @@
// Copyright 2022 Arm Limited (or its affiliates). All rights reserved.
pub mod gic;
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "with-serde", derive(Deserialize, Serialize))]
pub struct StandardRegisters {
pub gpr: [u64; 31usize], // 31 General Purpose Registers
pub sp: u64, // Stack Pointer
pub pc: u64, // Program Counter
pub pstate: u64, // Program Status Register
pub sp_el1: u64, // Stack Pointer for EL1
pub elr_el1: u64, // Exception Link Register for EL1
pub spsr: [u64; 5usize], // Saved Program Status Registers
pub vregs: [u128; 32usize], // 32 Floating Point Registers
pub fpsr: u64, // Floating point status register
pub fpcr: u64, // Floating point control register
}
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "with-serde", derive(Deserialize, Serialize))]
pub struct Register {
pub id: u64,
pub addr: u64,
}
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "with-serde", derive(Deserialize, Serialize))]
pub struct VcpuInit {
pub target: u32,
pub features: [u32; 7usize],
}
#[derive(Debug, Default, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "with-serde", derive(Deserialize, Serialize))]
pub struct RegList(pub Vec<u64>);

View File

@ -9,7 +9,7 @@
//
#[cfg(target_arch = "aarch64")]
use crate::aarch64::{RegList, StandardRegisters, VcpuInit};
use crate::arch::aarch64::{RegList, StandardRegisters, VcpuInit};
#[cfg(target_arch = "x86_64")]
use crate::arch::x86::{
CpuIdEntry, FpuState, LapicState, MsrEntry, SpecialRegisters, StandardRegisters,

View File

@ -206,6 +206,7 @@ pub fn construct_gicr_typers(vcpu_states: &[CpuState]) -> Vec<u64> {
.sys_regs
.into_iter()
.filter(|reg| reg.id == KVM_ARM64_SYSREG_MPIDR_EL1)
.map(|reg| reg.into())
.collect();
//calculate affinity
let mut cpu_affid = mpidr[0].addr & 1095233437695;

View File

@ -10,14 +10,13 @@
pub mod gic;
use crate::arch::aarch64::{Register, StandardRegisters, VcpuInit};
use crate::kvm::{KvmError, KvmResult};
use kvm_bindings::{
kvm_mp_state, kvm_one_reg, kvm_regs, KVM_REG_ARM_COPROC_MASK, KVM_REG_ARM_CORE,
KVM_REG_SIZE_MASK, KVM_REG_SIZE_U32, KVM_REG_SIZE_U64,
};
pub use kvm_bindings::{
kvm_one_reg as Register, kvm_regs as StandardRegisters, kvm_vcpu_init as VcpuInit, RegList,
};
pub use kvm_bindings::{kvm_vcpu_init, user_fpsimd_state, user_pt_regs};
use serde::{Deserialize, Serialize};
pub use {kvm_ioctls::Cap, kvm_ioctls::Kvm};
@ -121,3 +120,79 @@ pub struct VcpuKvmState {
pub core_regs: kvm_regs,
pub sys_regs: Vec<kvm_one_reg>,
}
impl From<StandardRegisters> for kvm_regs {
fn from(regs: StandardRegisters) -> Self {
Self {
regs: user_pt_regs {
regs: regs.gpr,
sp: regs.sp,
pc: regs.pc,
pstate: regs.pstate,
},
sp_el1: regs.sp_el1,
elr_el1: regs.elr_el1,
spsr: regs.spsr,
fp_regs: user_fpsimd_state {
vregs: regs.vregs,
fpsr: regs.fpsr as u32,
fpcr: regs.fpcr as u32,
..Default::default()
},
..Default::default()
}
}
}
impl From<kvm_regs> for StandardRegisters {
fn from(regs: kvm_regs) -> Self {
Self {
gpr: regs.regs.regs,
sp: regs.regs.sp,
pc: regs.regs.pc,
pstate: regs.regs.pstate,
sp_el1: regs.sp_el1,
elr_el1: regs.elr_el1,
spsr: regs.spsr,
vregs: regs.fp_regs.vregs,
fpsr: regs.fp_regs.fpsr as u64,
fpcr: regs.fp_regs.fpcr as u64,
}
}
}
impl From<Register> for kvm_one_reg {
fn from(reg: Register) -> Self {
Self {
id: reg.id,
addr: reg.addr,
}
}
}
impl From<kvm_one_reg> for Register {
fn from(reg: kvm_one_reg) -> Self {
Self {
id: reg.id,
addr: reg.addr,
}
}
}
impl From<VcpuInit> for kvm_vcpu_init {
fn from(vcpu_init: VcpuInit) -> Self {
Self {
target: vcpu_init.target,
features: vcpu_init.features,
}
}
}
impl From<kvm_vcpu_init> for VcpuInit {
fn from(vcpu_init: kvm_vcpu_init) -> Self {
Self {
target: vcpu_init.target,
features: vcpu_init.features,
}
}
}

View File

@ -12,8 +12,7 @@
use crate::aarch64::gic::KvmGicV3Its;
#[cfg(target_arch = "aarch64")]
pub use crate::aarch64::{
check_required_kvm_extensions, gic::Gicv3ItsState as GicState, is_system_register, VcpuInit,
VcpuKvmState,
check_required_kvm_extensions, gic::Gicv3ItsState as GicState, is_system_register, VcpuKvmState,
};
#[cfg(target_arch = "aarch64")]
use crate::arch::aarch64::gic::{Vgic, VgicConfig};
@ -43,6 +42,8 @@ use vmm_sys_util::eventfd::EventFd;
// x86_64 dependencies
#[cfg(target_arch = "x86_64")]
pub mod x86_64;
#[cfg(target_arch = "aarch64")]
use crate::arch::aarch64::{RegList, Register, StandardRegisters, VcpuInit};
#[cfg(target_arch = "x86_64")]
use crate::arch::x86::{
CpuIdEntry, FpuState, LapicState, MsrEntry, SpecialRegisters, StandardRegisters, XsaveState,
@ -54,8 +55,6 @@ use crate::{
CpuState, IoEventAddress, IrqRoutingEntry, MpState, UserMemoryRegion,
USER_MEMORY_REGION_LOG_DIRTY, USER_MEMORY_REGION_READ, USER_MEMORY_REGION_WRITE,
};
#[cfg(target_arch = "aarch64")]
use aarch64::{RegList, Register, StandardRegisters};
#[cfg(target_arch = "x86_64")]
use kvm_bindings::{
kvm_enable_cap, kvm_msr_entry, MsrList, KVM_CAP_HYPERV_SYNIC, KVM_CAP_SPLIT_IRQCHIP,
@ -77,10 +76,11 @@ pub use kvm_bindings::{
};
#[cfg(target_arch = "aarch64")]
use kvm_bindings::{
kvm_regs, user_fpsimd_state, user_pt_regs, KVM_GUESTDBG_USE_HW, KVM_NR_SPSR, KVM_REG_ARM64,
KVM_REG_ARM64_SYSREG, KVM_REG_ARM64_SYSREG_CRM_MASK, KVM_REG_ARM64_SYSREG_CRN_MASK,
KVM_REG_ARM64_SYSREG_OP0_MASK, KVM_REG_ARM64_SYSREG_OP1_MASK, KVM_REG_ARM64_SYSREG_OP2_MASK,
KVM_REG_ARM_CORE, KVM_REG_SIZE_U128, KVM_REG_SIZE_U32, KVM_REG_SIZE_U64,
kvm_regs, user_fpsimd_state, user_pt_regs, RegList as KvmRegList, KVM_GUESTDBG_USE_HW,
KVM_NR_SPSR, KVM_REG_ARM64, KVM_REG_ARM64_SYSREG, KVM_REG_ARM64_SYSREG_CRM_MASK,
KVM_REG_ARM64_SYSREG_CRN_MASK, KVM_REG_ARM64_SYSREG_OP0_MASK, KVM_REG_ARM64_SYSREG_OP1_MASK,
KVM_REG_ARM64_SYSREG_OP2_MASK, KVM_REG_ARM_CORE, KVM_REG_SIZE_U128, KVM_REG_SIZE_U32,
KVM_REG_SIZE_U64,
};
#[cfg(feature = "tdx")]
use kvm_bindings::{kvm_run__bindgen_ty_1, KVMIO};
@ -691,8 +691,9 @@ impl vm::Vm for KvmVm {
///
#[cfg(target_arch = "aarch64")]
fn get_preferred_target(&self, kvi: &mut VcpuInit) -> vm::Result<()> {
let mut kvi = (*kvi).into();
self.fd
.get_preferred_target(kvi)
.get_preferred_target(&mut kvi)
.map_err(|e| vm::HypervisorVmError::GetPreferredTarget(e.into()))
}
@ -1210,7 +1211,7 @@ impl cpu::Vcpu for KvmVcpu {
///
#[cfg(target_arch = "aarch64")]
fn get_regs(&self) -> cpu::Result<StandardRegisters> {
let mut state: StandardRegisters = kvm_regs::default();
let mut state = kvm_regs::default();
let mut off = offset_of!(user_pt_regs, regs);
// There are 31 user_pt_regs:
// https://elixir.free-electrons.com/linux/v4.14.174/source/arch/arm64/include/uapi/asm/ptrace.h#L72
@ -1305,7 +1306,7 @@ impl cpu::Vcpu for KvmVcpu {
.get_one_reg(arm64_core_reg_id!(KVM_REG_SIZE_U32, off), &mut bytes)
.map_err(|e| cpu::HypervisorCpuError::GetCoreRegister(e.into()))?;
state.fp_regs.fpcr = u32::from_le_bytes(bytes);
Ok(state)
Ok(state.into())
}
#[cfg(target_arch = "x86_64")]
@ -1328,6 +1329,7 @@ impl cpu::Vcpu for KvmVcpu {
fn set_regs(&self, state: &StandardRegisters) -> cpu::Result<()> {
// The function follows the exact identical order from `state`. Look there
// for some additional info on registers.
let state: kvm_regs = (*state).into();
let mut off = offset_of!(user_pt_regs, regs);
for i in 0..31 {
self.fd
@ -1776,8 +1778,9 @@ impl cpu::Vcpu for KvmVcpu {
#[cfg(target_arch = "aarch64")]
fn vcpu_init(&self, kvi: &VcpuInit) -> cpu::Result<()> {
let kvi = (*kvi).into();
self.fd
.vcpu_init(kvi)
.vcpu_init(&kvi)
.map_err(|e| cpu::HypervisorCpuError::VcpuInit(e.into()))
}
@ -1787,8 +1790,10 @@ impl cpu::Vcpu for KvmVcpu {
///
#[cfg(target_arch = "aarch64")]
fn get_reg_list(&self, reg_list: &mut RegList) -> cpu::Result<()> {
let mut kvm_reg_list: KvmRegList = KvmRegList::from_entries(reg_list.0.as_slice())
.map_err(|e| cpu::HypervisorCpuError::GetRegList(e.into()))?;
self.fd
.get_reg_list(reg_list)
.get_reg_list(&mut kvm_reg_list)
.map_err(|e| cpu::HypervisorCpuError::GetRegList(e.into()))
}
@ -2013,13 +2018,13 @@ impl cpu::Vcpu for KvmVcpu {
..Default::default()
};
// Get core registers
state.core_regs = self.get_regs()?;
state.core_regs = self.get_regs()?.into();
// Get systerm register
// Call KVM_GET_REG_LIST to get all registers available to the guest.
// For ArmV8 there are around 500 registers.
let mut sys_regs: Vec<Register> = Vec::new();
let mut reg_list = RegList::new(500).unwrap();
let mut reg_list = KvmRegList::new(500).unwrap();
self.fd
.get_reg_list(&mut reg_list)
.map_err(|e| cpu::HypervisorCpuError::GetRegList(e.into()))?;
@ -2041,13 +2046,16 @@ impl cpu::Vcpu for KvmVcpu {
self.fd
.get_one_reg(*index, &mut bytes)
.map_err(|e| cpu::HypervisorCpuError::GetSysRegister(e.into()))?;
sys_regs.push(kvm_bindings::kvm_one_reg {
id: *index,
addr: u64::from_le_bytes(bytes),
});
sys_regs.push(
kvm_bindings::kvm_one_reg {
id: *index,
addr: u64::from_le_bytes(bytes),
}
.into(),
);
}
state.sys_regs = sys_regs;
state.sys_regs = sys_regs.into_iter().map(|reg| reg.into()).collect();
Ok(state.into())
}
@ -2149,7 +2157,7 @@ impl cpu::Vcpu for KvmVcpu {
fn set_state(&self, state: &CpuState) -> cpu::Result<()> {
let state: VcpuKvmState = state.clone().into();
// Set core registers
self.set_regs(&state.core_regs)?;
self.set_regs(&state.core_regs.into())?;
// Set system registers
for reg in &state.sys_regs {
self.fd

View File

@ -1191,12 +1191,12 @@ impl cpu::Vcpu for MshvVcpu {
}
#[cfg(target_arch = "aarch64")]
fn set_regs(&self, regs: &StandardRegisters) -> cpu::Result<()> {
fn set_regs(&self, regs: &crate::arch::aarch64::StandardRegisters) -> cpu::Result<()> {
unimplemented!()
}
#[cfg(target_arch = "aarch64")]
fn get_regs(&self) -> cpu::Result<StandardRegisters> {
fn get_regs(&self) -> cpu::Result<crate::arch::aarch64::StandardRegisters> {
unimplemented!()
}

View File

@ -8,10 +8,10 @@
//
//
#[cfg(target_arch = "aarch64")]
use crate::aarch64::VcpuInit;
#[cfg(target_arch = "aarch64")]
use crate::arch::aarch64::gic::{Vgic, VgicConfig};
#[cfg(target_arch = "aarch64")]
use crate::arch::aarch64::VcpuInit;
#[cfg(feature = "tdx")]
use crate::arch::x86::CpuIdEntry;
use crate::cpu::Vcpu;

View File

@ -6,16 +6,16 @@ edition = "2021"
[dependencies]
epoll = "4.3.3"
getrandom = "0.2.11"
getrandom = "0.2.13"
libc = "0.2.153"
log = "0.4.20"
log = "0.4.21"
net_gen = { path = "../net_gen" }
rate_limiter = { path = "../rate_limiter" }
serde = "1.0.196"
thiserror = "1.0.52"
serde = "1.0.197"
thiserror = "1.0.58"
versionize = "0.2.0"
versionize_derive = "0.1.6"
virtio-bindings = "0.2.0"
virtio-bindings = "0.2.2"
virtio-queue = "0.11.0"
vm-memory = { version = "0.14.1", features = ["backend-mmap", "backend-atomic", "backend-bitmap"] }
vm-virtio = { path = "../vm-virtio" }
@ -25,4 +25,4 @@ vmm-sys-util = "0.12.1"
once_cell = "1.19.0"
pnet = "0.34.0"
pnet_datalink = "0.34.0"
serde_json = "1.0.114"
serde_json = "1.0.115"

View File

@ -10,7 +10,7 @@ kvm = ["vfio-ioctls/kvm"]
mshv = ["vfio-ioctls/mshv"]
[dependencies]
anyhow = "1.0.79"
anyhow = "1.0.81"
byteorder = "1.5.0"
hypervisor = { path = "../hypervisor" }
vfio-bindings = { git = "https://github.com/rust-vmm/vfio", branch = "main", features = ["fam-wrappers"] }
@ -19,9 +19,9 @@ vfio_user = { git = "https://github.com/rust-vmm/vfio-user", branch = "main" }
vmm-sys-util = "0.12.1"
libc = "0.2.153"
log = "0.4.20"
serde = { version = "1.0.196", features = ["derive"] }
thiserror = "1.0.52"
log = "0.4.21"
serde = { version = "1.0.197", features = ["derive"] }
thiserror = "1.0.58"
versionize = "0.2.0"
versionize_derive = "0.1.6"
vm-allocator = { path = "../vm-allocator" }

View File

@ -6,10 +6,10 @@ edition = "2021"
build = "../build.rs"
[dependencies]
clap = { version = "4.5.1", features = ["wrap_help"] }
dirs = "5.0.0"
serde = { version = "1.0.196", features = ["rc", "derive"] }
serde_json = "1.0.114"
clap = { version = "4.5.4", features = ["wrap_help"] }
dirs = "5.0.1"
serde = { version = "1.0.197", features = ["rc", "derive"] }
serde_json = "1.0.115"
test_infra = { path = "../test_infra" }
thiserror = "1.0.52"
thiserror = "1.0.58"
wait-timeout = "0.2.0"

View File

@ -6,6 +6,6 @@ edition = "2021"
[dependencies]
epoll = "4.3.3"
libc = "0.2.153"
log = "0.4.20"
thiserror = "1.0.40"
log = "0.4.21"
thiserror = "1.0.58"
vmm-sys-util = "0.12.1"

View File

@ -5,12 +5,12 @@ authors = ["The Cloud Hypervisor Authors"]
edition = "2021"
[dependencies]
dirs = "5.0.0"
dirs = "5.0.1"
epoll = "4.3.3"
libc = "0.2.153"
once_cell = "1.19.0"
serde = { version = "1.0.196", features = ["rc", "derive"] }
serde_json = "1.0.114"
serde = { version = "1.0.197", features = ["rc", "derive"] }
serde_json = "1.0.115"
ssh2 = { version = "0.9.4", features = ["vendored-openssl"] }
vmm-sys-util = "0.12.1"
wait-timeout = "0.2.0"

View File

@ -6,10 +6,10 @@ license = "Apache-2.0"
version = "0.1.0"
[dependencies]
anyhow = "1.0.66"
byteorder = "1.4.3"
libc = "0.2.138"
log = "0.4.17"
anyhow = "1.0.81"
byteorder = "1.5.0"
libc = "0.2.153"
log = "0.4.21"
net_gen = { path = "../net_gen" }
thiserror = "1.0.37"
thiserror = "1.0.58"
vmm-sys-util = "0.12.1"

View File

@ -6,10 +6,10 @@ edition = "2021"
[dependencies]
libc = "0.2.153"
log = "0.4.20"
log = "0.4.21"
once_cell = "1.19.0"
serde = { version = "1.0.196", features = ["rc", "derive"] }
serde_json = "1.0.114"
serde = { version = "1.0.197", features = ["rc", "derive"] }
serde_json = "1.0.115"
[features]
tracing = []

View File

@ -6,16 +6,16 @@ edition = "2021"
build = "../build.rs"
[dependencies]
clap = { version = "4.5.1", features = ["wrap_help","cargo"] }
clap = { version = "4.5.4", features = ["wrap_help","cargo"] }
block = { path = "../block" }
env_logger = "0.10.1"
env_logger = "0.10.2"
epoll = "4.3.3"
libc = "0.2.153"
log = "0.4.20"
log = "0.4.21"
option_parser = { path = "../option_parser" }
vhost = { version = "0.10.0", features = ["vhost-user-backend"] }
vhost-user-backend = "0.13.1"
virtio-bindings = "0.2.0"
virtio-bindings = "0.2.2"
virtio-queue = "0.11.0"
vm-memory = "0.14.1"
vmm-sys-util = "0.12.1"

View File

@ -6,15 +6,15 @@ edition = "2021"
build = "../build.rs"
[dependencies]
clap = { version = "4.5.1", features = ["wrap_help","cargo"] }
env_logger = "0.10.1"
clap = { version = "4.5.4", features = ["wrap_help","cargo"] }
env_logger = "0.10.2"
epoll = "4.3.3"
libc = "0.2.153"
log = "0.4.20"
log = "0.4.21"
net_util = { path = "../net_util" }
option_parser = { path = "../option_parser" }
vhost = { version = "0.10.0", features = ["vhost-user-backend"] }
vhost-user-backend = "0.13.1"
virtio-bindings = "0.2.0"
virtio-bindings = "0.2.2"
vm-memory = "0.14.1"
vmm-sys-util = "0.12.1"

View File

@ -8,27 +8,27 @@ edition = "2021"
default = []
[dependencies]
anyhow = "1.0.79"
arc-swap = "1.5.1"
anyhow = "1.0.81"
arc-swap = "1.7.1"
block = { path = "../block" }
byteorder = "1.5.0"
epoll = "4.3.3"
event_monitor = { path = "../event_monitor" }
libc = "0.2.153"
log = "0.4.20"
log = "0.4.21"
net_gen = { path = "../net_gen" }
net_util = { path = "../net_util" }
pci = { path = "../pci" }
rate_limiter = { path = "../rate_limiter" }
seccompiler = "0.4.0"
serde = { version = "1.0.196", features = ["derive"] }
serde_json = "1.0.114"
serde = { version = "1.0.197", features = ["derive"] }
serde_json = "1.0.115"
serial_buffer = { path = "../serial_buffer" }
thiserror = "1.0.52"
thiserror = "1.0.58"
versionize = "0.2.0"
versionize_derive = "0.1.6"
vhost = { version = "0.10.0", features = ["vhost-user-frontend", "vhost-user-backend", "vhost-kern", "vhost-vdpa"] }
virtio-bindings = { version = "0.2.0", features = ["virtio-v5_0_0"] }
virtio-bindings = { version = "0.2.2", features = ["virtio-v5_0_0"] }
virtio-queue = "0.11.0"
vm-allocator = { path = "../vm-allocator" }
vm-device = { path = "../vm-device" }

View File

@ -10,10 +10,10 @@ kvm = ["vfio-ioctls/kvm"]
mshv = ["vfio-ioctls/mshv"]
[dependencies]
anyhow = "1.0.79"
anyhow = "1.0.81"
hypervisor = { path = "../hypervisor" }
thiserror = "1.0.52"
serde = { version = "1.0.196", features = ["rc", "derive"] }
thiserror = "1.0.58"
serde = { version = "1.0.197", features = ["rc", "derive"] }
vfio-ioctls = { git = "https://github.com/rust-vmm/vfio", branch = "main", default-features = false }
vm-memory = { version = "0.14.1", features = ["backend-mmap"] }
vmm-sys-util = "0.12.1"

View File

@ -5,10 +5,10 @@ authors = ["The Cloud Hypervisor Authors"]
edition = "2021"
[dependencies]
anyhow = "1.0.79"
thiserror = "1.0.52"
serde = { version = "1.0.196", features = ["rc", "derive"] }
serde_json = "1.0.114"
anyhow = "1.0.81"
thiserror = "1.0.58"
serde = { version = "1.0.197", features = ["rc", "derive"] }
serde_json = "1.0.115"
versionize = "0.2.0"
versionize_derive = "0.1.6"
vm-memory = { version = "0.14.1", features = ["backend-mmap", "backend-atomic"] }

View File

@ -8,6 +8,6 @@ edition = "2021"
default = []
[dependencies]
log = "0.4.20"
log = "0.4.21"
virtio-queue = "0.11.0"
vm-memory = { version = "0.14.1", features = ["backend-mmap", "backend-atomic", "backend-bitmap"] }

View File

@ -18,14 +18,14 @@ tracing = ["tracer/tracing"]
[dependencies]
acpi_tables = { git = "https://github.com/rust-vmm/acpi_tables", branch = "main" }
anyhow = "1.0.79"
arc-swap = "1.5.1"
anyhow = "1.0.81"
arc-swap = "1.7.1"
arch = { path = "../arch" }
bitflags = "2.4.2"
bitflags = "2.5.0"
block = { path = "../block" }
blocking = { version = "1.5.1", optional = true }
cfg-if = "1.0.0"
clap = "4.5.1"
clap = "4.5.4"
devices = { path = "../devices" }
epoll = "4.3.3"
event_monitor = { path = "../event_monitor" }
@ -39,7 +39,7 @@ igvm_defs = { git = "https://github.com/microsoft/igvm", branch = "main", packag
igvm_parser = { git = "https://github.com/microsoft/igvm", branch = "main", package = "igvm", optional = true }
libc = "0.2.153"
linux-loader = { version = "0.11.0", features = ["elf", "bzimage", "pe"] }
log = "0.4.20"
log = "0.4.21"
micro_http = { git = "https://github.com/firecracker-microvm/micro-http", branch = "main" }
mshv-bindings = { git = "https://github.com/rust-vmm/mshv", branch = "main", features = ["with-serde", "fam-wrappers"], optional = true }
net_util = { path = "../net_util" }
@ -49,13 +49,13 @@ pci = { path = "../pci" }
range_map_vec = { version = "0.1.0", optional = true }
rate_limiter = { path = "../rate_limiter" }
seccompiler = "0.4.0"
serde = { version = "1.0.196", features = ["rc", "derive"] }
serde_json = "1.0.114"
serde = { version = "1.0.197", features = ["rc", "derive"] }
serde_json = "1.0.115"
serial_buffer = { path = "../serial_buffer" }
signal-hook = "0.3.17"
thiserror = "1.0.52"
thiserror = "1.0.58"
tracer = { path = "../tracer" }
uuid = "1.3.4"
uuid = "1.8.0"
versionize = "0.2.0"
versionize_derive = "0.1.6"
vfio-ioctls = { git = "https://github.com/rust-vmm/vfio", branch = "main", default-features = false }

View File

@ -43,7 +43,9 @@ use gdbstub_arch::aarch64::reg::AArch64CoreRegs as CoreRegs;
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
use gdbstub_arch::x86::reg::{X86SegmentRegs, X86_64CoreRegs as CoreRegs};
#[cfg(all(target_arch = "aarch64", feature = "guest_debug"))]
use hypervisor::aarch64::StandardRegisters;
use hypervisor::arch::aarch64::StandardRegisters;
#[cfg(target_arch = "aarch64")]
use hypervisor::arch::aarch64::VcpuInit;
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
use hypervisor::arch::x86::msr_index;
#[cfg(target_arch = "x86_64")]
@ -413,7 +415,7 @@ impl Vcpu {
/// Initializes an aarch64 specific vcpu for booting Linux.
#[cfg(target_arch = "aarch64")]
pub fn init(&self, vm: &Arc<dyn hypervisor::Vm>) -> Result<()> {
let mut kvi: kvm_bindings::kvm_vcpu_init = kvm_bindings::kvm_vcpu_init::default();
let mut kvi = VcpuInit::default();
// This reads back the kernel's preferred target type.
vm.get_preferred_target(&mut kvi)
@ -2383,9 +2385,9 @@ impl Debuggable for CpuManager {
.get_regs(cpu_id as u8)
.map_err(DebuggableError::ReadRegs)?;
Ok(CoreRegs {
x: gregs.regs.regs,
sp: gregs.regs.sp,
pc: gregs.regs.pc,
x: gregs.gpr,
sp: gregs.sp,
pc: gregs.pc,
..Default::default()
})
}
@ -2454,9 +2456,9 @@ impl Debuggable for CpuManager {
.get_regs(cpu_id as u8)
.map_err(DebuggableError::ReadRegs)?;
gregs.regs.regs = regs.x;
gregs.regs.sp = regs.sp;
gregs.regs.pc = regs.pc;
gregs.gpr = regs.x;
gregs.sp = regs.sp;
gregs.pc = regs.pc;
self.set_regs(cpu_id as u8, &gregs)
.map_err(DebuggableError::WriteRegs)?;
@ -2889,10 +2891,10 @@ mod tests {
#[cfg(test)]
mod tests {
use arch::{aarch64::regs, layout};
use hypervisor::arch::aarch64::{StandardRegisters, VcpuInit};
use hypervisor::kvm::aarch64::is_system_register;
use hypervisor::kvm::kvm_bindings::{
kvm_regs, kvm_vcpu_init, user_pt_regs, KVM_REG_ARM64, KVM_REG_ARM64_SYSREG,
KVM_REG_ARM_CORE, KVM_REG_SIZE_U64,
user_pt_regs, KVM_REG_ARM64, KVM_REG_ARM64_SYSREG, KVM_REG_ARM_CORE, KVM_REG_SIZE_U64,
};
use hypervisor::{arm64_core_reg_id, offset_of};
use std::mem;
@ -2907,7 +2909,7 @@ mod tests {
// Must fail when vcpu is not initialized yet.
assert!(res.is_err());
let mut kvi: kvm_vcpu_init = kvm_vcpu_init::default();
let mut kvi = VcpuInit::default();
vm.get_preferred_target(&mut kvi).unwrap();
vcpu.vcpu_init(&kvi).unwrap();
@ -2919,7 +2921,7 @@ mod tests {
let hv = hypervisor::new().unwrap();
let vm = hv.create_vm().unwrap();
let vcpu = vm.create_vcpu(0, None).unwrap();
let mut kvi: kvm_vcpu_init = kvm_vcpu_init::default();
let mut kvi = VcpuInit::default();
vm.get_preferred_target(&mut kvi).unwrap();
// Must fail when vcpu is not initialized yet.
@ -2943,7 +2945,7 @@ mod tests {
let hv = hypervisor::new().unwrap();
let vm = hv.create_vm().unwrap();
let vcpu = vm.create_vcpu(0, None).unwrap();
let mut kvi: kvm_vcpu_init = kvm_vcpu_init::default();
let mut kvi = VcpuInit::default();
vm.get_preferred_target(&mut kvi).unwrap();
// Must fail when vcpu is not initialized yet.
@ -2954,7 +2956,7 @@ mod tests {
"Failed to get core register: Exec format error (os error 8)"
);
let mut state = kvm_regs::default();
let mut state = StandardRegisters::default();
let res = vcpu.set_regs(&state);
assert!(res.is_err());
assert_eq!(
@ -2966,7 +2968,7 @@ mod tests {
let res = vcpu.get_regs();
assert!(res.is_ok());
state = res.unwrap();
assert_eq!(state.regs.pstate, 0x3C5);
assert_eq!(state.pstate, 0x3C5);
assert!(vcpu.set_regs(&state).is_ok());
}
@ -2976,7 +2978,7 @@ mod tests {
let hv = hypervisor::new().unwrap();
let vm = hv.create_vm().unwrap();
let vcpu = vm.create_vcpu(0, None).unwrap();
let mut kvi: kvm_vcpu_init = kvm_vcpu_init::default();
let mut kvi = VcpuInit::default();
vm.get_preferred_target(&mut kvi).unwrap();
let res = vcpu.get_mp_state();