#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
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)
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.
u32 idt_vectoring_info;
ulong rflags;
- struct vmx_controls_shadow controls_shadow;
-
struct shared_msr_entry *guest_msrs;
int nmsrs;
int save_nmsrs;
#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) \
{ \