mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2025-01-03 11:25:20 +00:00
hypervisor: mshv: Add x86_64 module
Add x86_64 specific definitions as we only plan to support x86_64 for the moment. Signed-off-by: Muminul Islam <muislam@microsoft.com>
This commit is contained in:
parent
e664fa386b
commit
7fe5d276a3
@ -8,3 +8,7 @@
|
|||||||
#![allow(unused_variables)]
|
#![allow(unused_variables)]
|
||||||
#![allow(unused_macros)]
|
#![allow(unused_macros)]
|
||||||
#![allow(non_upper_case_globals)]
|
#![allow(non_upper_case_globals)]
|
||||||
|
|
||||||
|
// x86_64 dependencies
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
pub mod x86_64;
|
||||||
|
148
hypervisor/src/mshv/x86_64/mod.rs
Normal file
148
hypervisor/src/mshv/x86_64/mod.rs
Normal file
@ -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),
|
||||||
|
])
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user