diff --git a/hypervisor/src/mshv/mod.rs b/hypervisor/src/mshv/mod.rs index 671abedd4..490f6f030 100644 --- a/hypervisor/src/mshv/mod.rs +++ b/hypervisor/src/mshv/mod.rs @@ -8,3 +8,7 @@ #![allow(unused_variables)] #![allow(unused_macros)] #![allow(non_upper_case_globals)] + +// x86_64 dependencies +#[cfg(target_arch = "x86_64")] +pub mod x86_64; diff --git a/hypervisor/src/mshv/x86_64/mod.rs b/hypervisor/src/mshv/x86_64/mod.rs new file mode 100644 index 000000000..51fd5a6ca --- /dev/null +++ b/hypervisor/src/mshv/x86_64/mod.rs @@ -0,0 +1,148 @@ +// Copyright © 2019 Intel Corporation +// +// SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause +// +// Copyright © 2020, Microsoft Corporation +// +// Copyright 2018-2019 CrowdStrike, Inc. +// +// + +use crate::arch::x86::{msr_index, SegmentRegisterOps, MTRR_ENABLE, MTRR_MEM_TYPE_WB}; +use serde_derive::{Deserialize, Serialize}; +/// +/// Export generically-named wrappers of mshv_bindings for Unix-based platforms +/// +pub use { + mshv_bindings::mshv_user_mem_region as MemoryRegion, mshv_bindings::msr_entry as MsrEntry, + mshv_bindings::CpuId, mshv_bindings::DebugRegisters, + mshv_bindings::FloatingPointUnit as FpuState, mshv_bindings::LapicState, + mshv_bindings::MsrList, mshv_bindings::Msrs as MsrEntries, mshv_bindings::Msrs, + mshv_bindings::SegmentRegister, mshv_bindings::SpecialRegisters, + mshv_bindings::StandardRegisters, mshv_bindings::VcpuEvents, mshv_bindings::XSave as Xsave, + mshv_bindings::Xcrs as ExtendedControlRegisters, +}; + +#[derive(Clone, Serialize, Deserialize)] +pub struct VcpuMshvState { + pub msrs: MsrEntries, + pub vcpu_events: VcpuEvents, + pub regs: StandardRegisters, + pub sregs: SpecialRegisters, + pub fpu: FpuState, + pub xcrs: ExtendedControlRegisters, + pub lapic: LapicState, + pub dbg: DebugRegisters, + pub xsave: Xsave, +} + +pub struct CreateDevice {} +pub struct DeviceAttr {} +pub struct IrqRouting {} +pub enum VcpuExit {} +pub struct MpState {} + +#[derive(Eq, PartialEq, Hash, Clone, Debug, Copy)] +pub enum IoEventAddress { + /// Representation of an programmable I/O address. + Pio(u64), + /// Representation of an memory mapped I/O address. + Mmio(u64), +} +macro_rules! msr { + ($msr:expr) => { + MsrEntry { + index: $msr, + data: 0x0, + ..Default::default() + } + }; +} +macro_rules! msr_data { + ($msr:expr, $data:expr) => { + MsrEntry { + index: $msr, + data: $data, + ..Default::default() + } + }; +} + +impl SegmentRegisterOps for SegmentRegister { + fn segment_type(&self) -> u8 { + self.type_ + } + fn set_segment_type(&mut self, val: u8) { + self.type_ = val; + } + + fn dpl(&self) -> u8 { + self.dpl + } + + fn set_dpl(&mut self, val: u8) { + self.dpl = val; + } + + fn present(&self) -> u8 { + self.present + } + + fn set_present(&mut self, val: u8) { + self.present = val; + } + + fn long(&self) -> u8 { + self.l + } + + fn set_long(&mut self, val: u8) { + self.l = val; + } + + fn avl(&self) -> u8 { + self.avl + } + + fn set_avl(&mut self, val: u8) { + self.avl = val; + } + + fn desc_type(&self) -> u8 { + self.s + } + + fn set_desc_type(&mut self, val: u8) { + self.s = val; + } + + fn granularity(&self) -> u8 { + self.g + } + + fn set_granularity(&mut self, val: u8) { + self.g = val; + } + + fn db(&self) -> u8 { + self.db + } + + fn set_db(&mut self, val: u8) { + self.db = val; + } +} + +pub fn boot_msr_entries() -> MsrEntries { + MsrEntries::from_entries(&[ + msr!(msr_index::MSR_IA32_SYSENTER_CS), + msr!(msr_index::MSR_IA32_SYSENTER_ESP), + msr!(msr_index::MSR_IA32_SYSENTER_EIP), + msr!(msr_index::MSR_STAR), + msr!(msr_index::MSR_CSTAR), + msr!(msr_index::MSR_LSTAR), + msr!(msr_index::MSR_KERNEL_GS_BASE), + msr!(msr_index::MSR_SYSCALL_MASK), + msr!(msr_index::MSR_IA32_TSC), + ]) +}