From d2b194c4f149293b3cf6f1d9d3aaf1405688a198 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 14 Jul 2022 21:48:08 +0000 Subject: [PATCH] hypervisor: x86: provide a generic DescriptorTable structure Signed-off-by: Wei Liu --- hypervisor/src/arch/x86/mod.rs | 7 +++++++ hypervisor/src/kvm/x86_64/mod.rs | 23 +++++++++++++++++++++-- hypervisor/src/mshv/x86_64/mod.rs | 22 ++++++++++++++++++++-- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/hypervisor/src/arch/x86/mod.rs b/hypervisor/src/arch/x86/mod.rs index d110149e8..deb3996e1 100644 --- a/hypervisor/src/arch/x86/mod.rs +++ b/hypervisor/src/arch/x86/mod.rs @@ -198,3 +198,10 @@ pub struct StandardRegisters { pub rip: u64, pub rflags: u64, } + +#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "with-serde", derive(Deserialize, Serialize))] +pub struct DescriptorTable { + pub base: u64, + pub limit: u16, +} diff --git a/hypervisor/src/kvm/x86_64/mod.rs b/hypervisor/src/kvm/x86_64/mod.rs index de0139f38..f44e451c0 100644 --- a/hypervisor/src/kvm/x86_64/mod.rs +++ b/hypervisor/src/kvm/x86_64/mod.rs @@ -8,7 +8,7 @@ // // -use crate::arch::x86::{SegmentRegister, StandardRegisters}; +use crate::arch::x86::{DescriptorTable, SegmentRegister, StandardRegisters}; use crate::kvm::{Cap, Kvm, KvmError, KvmResult}; use serde::{Deserialize, Serialize}; @@ -16,7 +16,7 @@ use serde::{Deserialize, Serialize}; /// Export generically-named wrappers of kvm-bindings for Unix-based platforms /// pub use { - kvm_bindings::kvm_cpuid_entry2 as CpuIdEntry, kvm_bindings::kvm_dtable as DescriptorTable, + kvm_bindings::kvm_cpuid_entry2 as CpuIdEntry, kvm_bindings::kvm_dtable, kvm_bindings::kvm_fpu as FpuState, kvm_bindings::kvm_lapic_state as LapicState, kvm_bindings::kvm_mp_state as MpState, kvm_bindings::kvm_msr_entry as MsrEntry, kvm_bindings::kvm_regs, kvm_bindings::kvm_segment, kvm_bindings::kvm_sregs as SpecialRegisters, @@ -152,3 +152,22 @@ impl From for SegmentRegister { } } } + +impl From for kvm_dtable { + fn from(dt: DescriptorTable) -> Self { + Self { + base: dt.base, + limit: dt.limit, + ..Default::default() + } + } +} + +impl From for DescriptorTable { + fn from(dt: kvm_dtable) -> Self { + Self { + base: dt.base, + limit: dt.limit, + } + } +} diff --git a/hypervisor/src/mshv/x86_64/mod.rs b/hypervisor/src/mshv/x86_64/mod.rs index 522e40e7b..06c567216 100644 --- a/hypervisor/src/mshv/x86_64/mod.rs +++ b/hypervisor/src/mshv/x86_64/mod.rs @@ -7,7 +7,7 @@ // Copyright 2018-2019 CrowdStrike, Inc. // // -use crate::arch::x86::{SegmentRegister, StandardRegisters}; +use crate::arch::x86::{DescriptorTable, SegmentRegister, StandardRegisters}; use serde::{Deserialize, Serialize}; use std::fmt; @@ -23,7 +23,7 @@ pub use { mshv_bindings::Msrs as MsrEntries, mshv_bindings::Msrs, mshv_bindings::SegmentRegister as MshvSegmentRegister, mshv_bindings::SpecialRegisters, mshv_bindings::StandardRegisters as MshvStandardRegisters, mshv_bindings::SuspendRegisters, - mshv_bindings::VcpuEvents, mshv_bindings::XSave as Xsave, + mshv_bindings::TableRegister, mshv_bindings::VcpuEvents, mshv_bindings::XSave as Xsave, mshv_bindings::Xcrs as ExtendedControlRegisters, }; @@ -155,3 +155,21 @@ impl From for SegmentRegister { } } } + +impl From for TableRegister { + fn from(dt: DescriptorTable) -> Self { + Self { + base: dt.base, + limit: dt.limit, + } + } +} + +impl From for DescriptorTable { + fn from(dt: TableRegister) -> Self { + Self { + base: dt.base, + limit: dt.limit, + } + } +}