|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/4] x86/vmx: Drop vmx_msr_state infrastructure
To avoid leaking host MSR state into guests, guest LSTAR, STAR and
SYSCALL_MASK state is unconditionally loaded when switching into guest
context.
Attempting to dirty-track the state is pointless; host state is always
restoring upon exit from guest context, meaning that guest state is always
considered dirty.
Drop struct vmx_msr_state, enum VMX_INDEX_MSR_* and msr_index[]. The guests
MSR values are stored plainly in arch_vmx_struct, in the same way as shadow_gs
and cstar are. vmx_restore_guest_msrs() and long_mode_do_msr_write() ensure
that the hardware MSR values are always up-to-date.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Jun Nakajima <jun.nakajima@xxxxxxxxx>
CC: Kevin Tian <kevin.tian@xxxxxxxxx>
---
xen/arch/x86/hvm/vmx/vmcs.c | 3 --
xen/arch/x86/hvm/vmx/vmx.c | 79 ++++++++++----------------------------
xen/include/asm-x86/hvm/vmx/vmcs.h | 21 +++-------
3 files changed, 26 insertions(+), 77 deletions(-)
diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
index a6e1294..e28b649 100644
--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -1088,9 +1088,6 @@ static int construct_vmcs(struct vcpu *v)
vmx_disable_intercept_for_msr(v, MSR_IA32_BNDCFGS, MSR_TYPE_R |
MSR_TYPE_W);
}
- /* All guest MSR state is dirty. */
- v->arch.hvm_vmx.msr_state.flags = ((1u << VMX_MSR_COUNT) - 1);
-
/* I/O access bitmap. */
__vmwrite(IO_BITMAP_A, __pa(d->arch.hvm_domain.io_bitmap));
__vmwrite(IO_BITMAP_B, __pa(d->arch.hvm_domain.io_bitmap) + PAGE_SIZE);
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index 33e18af..ec3193c 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -358,24 +358,10 @@ static void vmx_vcpu_destroy(struct vcpu *v)
passive_domain_destroy(v);
}
-static const u32 msr_index[VMX_MSR_COUNT] =
-{
- [VMX_INDEX_MSR_LSTAR] = MSR_LSTAR,
- [VMX_INDEX_MSR_STAR] = MSR_STAR,
- [VMX_INDEX_MSR_SYSCALL_MASK] = MSR_SYSCALL_MASK
-};
-
-#define WRITE_MSR(address) do { \
- guest_msr_state->msrs[VMX_INDEX_MSR_ ## address] = msr_content; \
- __set_bit(VMX_INDEX_MSR_ ## address, &guest_msr_state->flags); \
- wrmsrl(MSR_ ## address, msr_content); \
- } while ( 0 )
-
static enum handler_return
long_mode_do_msr_read(unsigned int msr, uint64_t *msr_content)
{
struct vcpu *v = current;
- struct vmx_msr_state *guest_msr_state = &v->arch.hvm_vmx.msr_state;
switch ( msr )
{
@@ -392,11 +378,11 @@ long_mode_do_msr_read(unsigned int msr, uint64_t
*msr_content)
break;
case MSR_STAR:
- *msr_content = guest_msr_state->msrs[VMX_INDEX_MSR_STAR];
+ *msr_content = v->arch.hvm_vmx.star;
break;
case MSR_LSTAR:
- *msr_content = guest_msr_state->msrs[VMX_INDEX_MSR_LSTAR];
+ *msr_content = v->arch.hvm_vmx.lstar;
break;
case MSR_CSTAR:
@@ -404,7 +390,7 @@ long_mode_do_msr_read(unsigned int msr, uint64_t
*msr_content)
break;
case MSR_SYSCALL_MASK:
- *msr_content = guest_msr_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK];
+ *msr_content = v->arch.hvm_vmx.sfmask;
break;
default:
@@ -420,7 +406,6 @@ static enum handler_return
long_mode_do_msr_write(unsigned int msr, uint64_t msr_content)
{
struct vcpu *v = current;
- struct vmx_msr_state *guest_msr_state = &v->arch.hvm_vmx.msr_state;
HVM_DBG_LOG(DBG_LEVEL_MSR, "msr %#x content %#"PRIx64, msr, msr_content);
@@ -442,13 +427,15 @@ long_mode_do_msr_write(unsigned int msr, uint64_t
msr_content)
break;
case MSR_STAR:
- WRITE_MSR(STAR);
+ v->arch.hvm_vmx.star = msr_content;
+ wrmsrl(MSR_STAR, msr_content);
break;
case MSR_LSTAR:
if ( !is_canonical_address(msr_content) )
goto uncanonical_address;
- WRITE_MSR(LSTAR);
+ v->arch.hvm_vmx.lstar = msr_content;
+ wrmsrl(MSR_LSTAR, msr_content);
break;
case MSR_CSTAR:
@@ -458,7 +445,8 @@ long_mode_do_msr_write(unsigned int msr, uint64_t
msr_content)
break;
case MSR_SYSCALL_MASK:
- WRITE_MSR(SYSCALL_MASK);
+ v->arch.hvm_vmx.sfmask = msr_content;
+ wrmsrl(MSR_SYSCALL_MASK, msr_content);
break;
default:
@@ -498,26 +486,10 @@ static void vmx_save_guest_msrs(struct vcpu *v)
static void vmx_restore_guest_msrs(struct vcpu *v)
{
- struct vmx_msr_state *guest_msr_state;
- unsigned long guest_flags;
- int i;
-
- guest_msr_state = &v->arch.hvm_vmx.msr_state;
-
wrmsrl(MSR_SHADOW_GS_BASE, v->arch.hvm_vmx.shadow_gs);
-
- guest_flags = guest_msr_state->flags;
-
- while ( guest_flags )
- {
- i = find_first_set_bit(guest_flags);
-
- HVM_DBG_LOG(DBG_LEVEL_2,
- "restore guest's index %d msr %x with value %lx",
- i, msr_index[i], guest_msr_state->msrs[i]);
- wrmsrl(msr_index[i], guest_msr_state->msrs[i]);
- __clear_bit(i, &guest_flags);
- }
+ wrmsrl(MSR_STAR, v->arch.hvm_vmx.star);
+ wrmsrl(MSR_LSTAR, v->arch.hvm_vmx.lstar);
+ wrmsrl(MSR_SYSCALL_MASK, v->arch.hvm_vmx.sfmask);
if ( (v->arch.hvm_vcpu.guest_efer ^ read_efer()) & EFER_SCE )
{
@@ -755,30 +727,21 @@ static int vmx_vmcs_restore(struct vcpu *v, struct
hvm_hw_cpu *c)
static void vmx_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
{
- struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state;
-
- data->shadow_gs = v->arch.hvm_vmx.shadow_gs;
- data->msr_cstar = v->arch.hvm_vmx.cstar;
-
- /* save msrs */
+ data->shadow_gs = v->arch.hvm_vmx.shadow_gs;
data->msr_flags = 0;
- data->msr_lstar = guest_state->msrs[VMX_INDEX_MSR_LSTAR];
- data->msr_star = guest_state->msrs[VMX_INDEX_MSR_STAR];
- data->msr_syscall_mask = guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK];
+ data->msr_lstar = v->arch.hvm_vmx.lstar;
+ data->msr_star = v->arch.hvm_vmx.star;
+ data->msr_cstar = v->arch.hvm_vmx.cstar;
+ data->msr_syscall_mask = v->arch.hvm_vmx.sfmask;
}
static void vmx_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
{
- struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state;
-
- /* restore msrs */
- guest_state->flags = ((1u << VMX_MSR_COUNT) - 1);
- guest_state->msrs[VMX_INDEX_MSR_LSTAR] = data->msr_lstar;
- guest_state->msrs[VMX_INDEX_MSR_STAR] = data->msr_star;
- guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK] = data->msr_syscall_mask;
-
- v->arch.hvm_vmx.cstar = data->msr_cstar;
v->arch.hvm_vmx.shadow_gs = data->shadow_gs;
+ v->arch.hvm_vmx.star = data->msr_star;
+ v->arch.hvm_vmx.lstar = data->msr_lstar;
+ v->arch.hvm_vmx.cstar = data->msr_cstar;
+ v->arch.hvm_vmx.sfmask = data->msr_syscall_mask;
}
diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h
b/xen/include/asm-x86/hvm/vmx/vmcs.h
index 99dde44..199932e 100644
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h
@@ -40,19 +40,6 @@ struct vmx_msr_entry {
u64 data;
};
-enum {
- VMX_INDEX_MSR_LSTAR = 0,
- VMX_INDEX_MSR_STAR,
- VMX_INDEX_MSR_SYSCALL_MASK,
-
- VMX_MSR_COUNT
-};
-
-struct vmx_msr_state {
- unsigned long flags;
- unsigned long msrs[VMX_MSR_COUNT];
-};
-
#define EPT_DEFAULT_MT MTRR_TYPE_WRBACK
struct ept_data {
@@ -124,9 +111,11 @@ struct arch_vmx_struct {
u32 secondary_exec_control;
u32 exception_bitmap;
- struct vmx_msr_state msr_state;
- unsigned long shadow_gs;
- unsigned long cstar;
+ uint64_t shadow_gs;
+ uint64_t star;
+ uint64_t lstar;
+ uint64_t cstar;
+ uint64_t sfmask;
unsigned long *msr_bitmap;
unsigned int msr_count;
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |