summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/vmx
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kvm/vmx')
-rw-r--r--arch/x86/kvm/vmx/vmcs.h9
-rw-r--r--arch/x86/kvm/vmx/vmx.h22
2 files changed, 16 insertions, 15 deletions
diff --git a/arch/x86/kvm/vmx/vmcs.h b/arch/x86/kvm/vmx/vmcs.h
index 971a46c69df4..52f12d78e4fa 100644
--- a/arch/x86/kvm/vmx/vmcs.h
+++ b/arch/x86/kvm/vmx/vmcs.h
@@ -42,6 +42,14 @@ struct vmcs_host_state {
#endif
};
+struct vmcs_controls_shadow {
+ u32 vm_entry;
+ u32 vm_exit;
+ u32 pin;
+ u32 exec;
+ u32 secondary_exec;
+};
+
/*
* Track a VMCS that may be loaded on a certain CPU. If it is (cpu!=-1), also
* remember whether it was VMLAUNCHed, and maintain a linked list of all VMCSs
@@ -61,6 +69,7 @@ struct loaded_vmcs {
unsigned long *msr_bitmap;
struct list_head loaded_vmcss_on_cpu_link;
struct vmcs_host_state host_state;
+ struct vmcs_controls_shadow controls_shadow;
};
static inline bool is_exception_n(u32 intr_info, u8 vector)
diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h
index bde6c43eea16..ec11ecf6f040 100644
--- a/arch/x86/kvm/vmx/vmx.h
+++ b/arch/x86/kvm/vmx/vmx.h
@@ -85,14 +85,6 @@ struct pt_desc {
struct pt_ctx guest;
};
-struct vmx_controls_shadow {
- u32 vm_entry;
- u32 vm_exit;
- u32 pin;
- u32 exec;
- u32 secondary_exec;
-};
-
/*
* The nested_vmx structure is part of vcpu_vmx, and holds information we need
* for correct emulation of VMX (i.e., nested VMX) on this vcpu.
@@ -209,8 +201,6 @@ struct vcpu_vmx {
u32 idt_vectoring_info;
ulong rflags;
- struct vmx_controls_shadow controls_shadow;
-
struct shared_msr_entry *guest_msrs;
int nmsrs;
int save_nmsrs;
@@ -400,21 +390,23 @@ static inline u8 vmx_get_rvi(void)
#define BUILD_CONTROLS_SHADOW(lname, uname) \
static inline void lname##_controls_reset_shadow(struct vcpu_vmx *vmx) \
{ \
- vmx->controls_shadow.lname = vmcs_read32(uname); \
+ vmx->loaded_vmcs->controls_shadow.lname = vmcs_read32(uname); \
} \
static inline void lname##_controls_init(struct vcpu_vmx *vmx, u32 val) \
{ \
vmcs_write32(uname, val); \
- vmx->controls_shadow.lname = val; \
+ vmx->loaded_vmcs->controls_shadow.lname = val; \
} \
static inline void lname##_controls_set(struct vcpu_vmx *vmx, u32 val) \
{ \
- if (vmx->controls_shadow.lname != val) \
- lname##_controls_init(vmx, val); \
+ if (vmx->loaded_vmcs->controls_shadow.lname != val) { \
+ vmcs_write32(uname, val); \
+ vmx->loaded_vmcs->controls_shadow.lname = val; \
+ } \
} \
static inline u32 lname##_controls_get(struct vcpu_vmx *vmx) \
{ \
- return vmx->controls_shadow.lname; \
+ return vmx->loaded_vmcs->controls_shadow.lname; \
} \
static inline void lname##_controls_setbit(struct vcpu_vmx *vmx, u32 val) \
{ \