| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500 | 
							- From fa637dcaf7f19a746fe507349db8b56f49ab03b0 Mon Sep 17 00:00:00 2001
 
- From: Paolo Bonzini <[email protected]>
 
- Date: Wed, 26 Oct 2022 14:47:45 +0200
 
- Subject: [PATCH] KVM: x86: do not go through ctxt->ops when emulating rsm
 
- Now that RSM is implemented in a single emulator callback, there is no
 
- point in going through other callbacks for the sake of modifying
 
- processor state.  Just invoke KVM's own internal functions directly,
 
- and remove the callbacks that were only used by em_rsm; the only
 
- substantial difference is in the handling of the segment registers
 
- and descriptor cache, which have to be parsed into a struct kvm_segment
 
- instead of a struct desc_struct.
 
- This also fixes a bug where emulator_set_segment was shifting the
 
- limit left by 12 if the G bit is set, but the limit had not been
 
- shifted right upon entry to SMM.
 
- The emulator context is still used to restore EIP and the general
 
- purpose registers.
 
- Signed-off-by: Paolo Bonzini <[email protected]>
 
- ---
 
-  arch/x86/kvm/kvm_emulate.h |  13 ---
 
-  arch/x86/kvm/smm.c         | 177 +++++++++++++++++--------------------
 
-  arch/x86/kvm/x86.c         |  33 -------
 
-  3 files changed, 81 insertions(+), 142 deletions(-)
 
- diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h
 
- index d7afbc448dd2..84b1f2661463 100644
 
- --- a/arch/x86/kvm/kvm_emulate.h
 
- +++ b/arch/x86/kvm/kvm_emulate.h
 
- @@ -116,16 +116,6 @@ struct x86_emulate_ops {
 
-  			unsigned int bytes,
 
-  			struct x86_exception *fault, bool system);
 
-  
 
- -	/*
 
- -	 * read_phys: Read bytes of standard (non-emulated/special) memory.
 
- -	 *            Used for descriptor reading.
 
- -	 *  @addr:  [IN ] Physical address from which to read.
 
- -	 *  @val:   [OUT] Value read from memory.
 
- -	 *  @bytes: [IN ] Number of bytes to read from memory.
 
- -	 */
 
- -	int (*read_phys)(struct x86_emulate_ctxt *ctxt, unsigned long addr,
 
- -			void *val, unsigned int bytes);
 
- -
 
-  	/*
 
-  	 * write_std: Write bytes of standard (non-emulated/special) memory.
 
-  	 *            Used for descriptor writing.
 
- @@ -209,11 +199,8 @@ struct x86_emulate_ops {
 
-  	int (*cpl)(struct x86_emulate_ctxt *ctxt);
 
-  	void (*get_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong *dest);
 
-  	int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value);
 
- -	u64 (*get_smbase)(struct x86_emulate_ctxt *ctxt);
 
- -	void (*set_smbase)(struct x86_emulate_ctxt *ctxt, u64 smbase);
 
-  	int (*set_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data);
 
-  	int (*get_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata);
 
- -	int (*set_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data);
 
-  	int (*get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata);
 
-  	int (*check_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc);
 
-  	int (*read_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc, u64 *pdata);
 
- diff --git a/arch/x86/kvm/smm.c b/arch/x86/kvm/smm.c
 
- index 773e07b6397d..41ca128478fc 100644
 
- --- a/arch/x86/kvm/smm.c
 
- +++ b/arch/x86/kvm/smm.c
 
- @@ -271,71 +271,59 @@ void enter_smm(struct kvm_vcpu *vcpu)
 
-  	kvm_mmu_reset_context(vcpu);
 
-  }
 
-  
 
- -static int emulator_has_longmode(struct x86_emulate_ctxt *ctxt)
 
- -{
 
- -#ifdef CONFIG_X86_64
 
- -	return ctxt->ops->guest_has_long_mode(ctxt);
 
- -#else
 
- -	return false;
 
- -#endif
 
- -}
 
- -
 
- -static void rsm_set_desc_flags(struct desc_struct *desc, u32 flags)
 
- +static void rsm_set_desc_flags(struct kvm_segment *desc, u32 flags)
 
-  {
 
-  	desc->g    = (flags >> 23) & 1;
 
- -	desc->d    = (flags >> 22) & 1;
 
- +	desc->db   = (flags >> 22) & 1;
 
-  	desc->l    = (flags >> 21) & 1;
 
-  	desc->avl  = (flags >> 20) & 1;
 
- -	desc->p    = (flags >> 15) & 1;
 
- +	desc->present = (flags >> 15) & 1;
 
-  	desc->dpl  = (flags >> 13) & 3;
 
-  	desc->s    = (flags >> 12) & 1;
 
-  	desc->type = (flags >>  8) & 15;
 
- +
 
- +	desc->unusable = !desc->present;
 
- +	desc->padding = 0;
 
-  }
 
-  
 
- -static int rsm_load_seg_32(struct x86_emulate_ctxt *ctxt, const char *smstate,
 
- +static int rsm_load_seg_32(struct kvm_vcpu *vcpu, const char *smstate,
 
-  			   int n)
 
-  {
 
- -	struct desc_struct desc;
 
- +	struct kvm_segment desc;
 
-  	int offset;
 
- -	u16 selector;
 
- -
 
- -	selector = GET_SMSTATE(u32, smstate, 0x7fa8 + n * 4);
 
-  
 
-  	if (n < 3)
 
-  		offset = 0x7f84 + n * 12;
 
-  	else
 
-  		offset = 0x7f2c + (n - 3) * 12;
 
-  
 
- -	set_desc_base(&desc,      GET_SMSTATE(u32, smstate, offset + 8));
 
- -	set_desc_limit(&desc,     GET_SMSTATE(u32, smstate, offset + 4));
 
- +	desc.selector =           GET_SMSTATE(u32, smstate, 0x7fa8 + n * 4);
 
- +	desc.base =               GET_SMSTATE(u32, smstate, offset + 8);
 
- +	desc.limit =              GET_SMSTATE(u32, smstate, offset + 4);
 
-  	rsm_set_desc_flags(&desc, GET_SMSTATE(u32, smstate, offset));
 
- -	ctxt->ops->set_segment(ctxt, selector, &desc, 0, n);
 
- +	kvm_set_segment(vcpu, &desc, n);
 
-  	return X86EMUL_CONTINUE;
 
-  }
 
-  
 
-  #ifdef CONFIG_X86_64
 
- -static int rsm_load_seg_64(struct x86_emulate_ctxt *ctxt, const char *smstate,
 
- +static int rsm_load_seg_64(struct kvm_vcpu *vcpu, const char *smstate,
 
-  			   int n)
 
-  {
 
- -	struct desc_struct desc;
 
- +	struct kvm_segment desc;
 
-  	int offset;
 
- -	u16 selector;
 
- -	u32 base3;
 
-  
 
-  	offset = 0x7e00 + n * 16;
 
-  
 
- -	selector =                GET_SMSTATE(u16, smstate, offset);
 
- +	desc.selector =           GET_SMSTATE(u16, smstate, offset);
 
-  	rsm_set_desc_flags(&desc, GET_SMSTATE(u16, smstate, offset + 2) << 8);
 
- -	set_desc_limit(&desc,     GET_SMSTATE(u32, smstate, offset + 4));
 
- -	set_desc_base(&desc,      GET_SMSTATE(u32, smstate, offset + 8));
 
- -	base3 =                   GET_SMSTATE(u32, smstate, offset + 12);
 
- -
 
- -	ctxt->ops->set_segment(ctxt, selector, &desc, base3, n);
 
- +	desc.limit =              GET_SMSTATE(u32, smstate, offset + 4);
 
- +	desc.base =               GET_SMSTATE(u64, smstate, offset + 8);
 
- +	kvm_set_segment(vcpu, &desc, n);
 
-  	return X86EMUL_CONTINUE;
 
-  }
 
-  #endif
 
-  
 
- -static int rsm_enter_protected_mode(struct x86_emulate_ctxt *ctxt,
 
- +static int rsm_enter_protected_mode(struct kvm_vcpu *vcpu,
 
-  				    u64 cr0, u64 cr3, u64 cr4)
 
-  {
 
-  	int bad;
 
- @@ -348,7 +336,7 @@ static int rsm_enter_protected_mode(struct x86_emulate_ctxt *ctxt,
 
-  		cr3 &= ~0xfff;
 
-  	}
 
-  
 
- -	bad = ctxt->ops->set_cr(ctxt, 3, cr3);
 
- +	bad = kvm_set_cr3(vcpu, cr3);
 
-  	if (bad)
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
- @@ -357,20 +345,20 @@ static int rsm_enter_protected_mode(struct x86_emulate_ctxt *ctxt,
 
-  	 * Then enable protected mode.	However, PCID cannot be enabled
 
-  	 * if EFER.LMA=0, so set it separately.
 
-  	 */
 
- -	bad = ctxt->ops->set_cr(ctxt, 4, cr4 & ~X86_CR4_PCIDE);
 
- +	bad = kvm_set_cr4(vcpu, cr4 & ~X86_CR4_PCIDE);
 
-  	if (bad)
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
- -	bad = ctxt->ops->set_cr(ctxt, 0, cr0);
 
- +	bad = kvm_set_cr0(vcpu, cr0);
 
-  	if (bad)
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
-  	if (cr4 & X86_CR4_PCIDE) {
 
- -		bad = ctxt->ops->set_cr(ctxt, 4, cr4);
 
- +		bad = kvm_set_cr4(vcpu, cr4);
 
-  		if (bad)
 
-  			return X86EMUL_UNHANDLEABLE;
 
-  		if (pcid) {
 
- -			bad = ctxt->ops->set_cr(ctxt, 3, cr3 | pcid);
 
- +			bad = kvm_set_cr3(vcpu, cr3 | pcid);
 
-  			if (bad)
 
-  				return X86EMUL_UNHANDLEABLE;
 
-  		}
 
- @@ -383,9 +371,9 @@ static int rsm_enter_protected_mode(struct x86_emulate_ctxt *ctxt,
 
-  static int rsm_load_state_32(struct x86_emulate_ctxt *ctxt,
 
-  			     const char *smstate)
 
-  {
 
- -	struct desc_struct desc;
 
- +	struct kvm_vcpu *vcpu = ctxt->vcpu;
 
- +	struct kvm_segment desc;
 
-  	struct desc_ptr dt;
 
- -	u16 selector;
 
-  	u32 val, cr0, cr3, cr4;
 
-  	int i;
 
-  
 
- @@ -399,56 +387,55 @@ static int rsm_load_state_32(struct x86_emulate_ctxt *ctxt,
 
-  
 
-  	val = GET_SMSTATE(u32, smstate, 0x7fcc);
 
-  
 
- -	if (ctxt->ops->set_dr(ctxt, 6, val))
 
- +	if (kvm_set_dr(vcpu, 6, val))
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
-  	val = GET_SMSTATE(u32, smstate, 0x7fc8);
 
-  
 
- -	if (ctxt->ops->set_dr(ctxt, 7, val))
 
- +	if (kvm_set_dr(vcpu, 7, val))
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
- -	selector =                 GET_SMSTATE(u32, smstate, 0x7fc4);
 
- -	set_desc_base(&desc,       GET_SMSTATE(u32, smstate, 0x7f64));
 
- -	set_desc_limit(&desc,      GET_SMSTATE(u32, smstate, 0x7f60));
 
- +	desc.selector =            GET_SMSTATE(u32, smstate, 0x7fc4);
 
- +	desc.base =                GET_SMSTATE(u32, smstate, 0x7f64);
 
- +	desc.limit =               GET_SMSTATE(u32, smstate, 0x7f60);
 
-  	rsm_set_desc_flags(&desc,  GET_SMSTATE(u32, smstate, 0x7f5c));
 
- -	ctxt->ops->set_segment(ctxt, selector, &desc, 0, VCPU_SREG_TR);
 
- +	kvm_set_segment(vcpu, &desc, VCPU_SREG_TR);
 
-  
 
- -	selector =                 GET_SMSTATE(u32, smstate, 0x7fc0);
 
- -	set_desc_base(&desc,       GET_SMSTATE(u32, smstate, 0x7f80));
 
- -	set_desc_limit(&desc,      GET_SMSTATE(u32, smstate, 0x7f7c));
 
- +	desc.selector =            GET_SMSTATE(u32, smstate, 0x7fc0);
 
- +	desc.base =                GET_SMSTATE(u32, smstate, 0x7f80);
 
- +	desc.limit =               GET_SMSTATE(u32, smstate, 0x7f7c);
 
-  	rsm_set_desc_flags(&desc,  GET_SMSTATE(u32, smstate, 0x7f78));
 
- -	ctxt->ops->set_segment(ctxt, selector, &desc, 0, VCPU_SREG_LDTR);
 
- +	kvm_set_segment(vcpu, &desc, VCPU_SREG_LDTR);
 
-  
 
-  	dt.address =               GET_SMSTATE(u32, smstate, 0x7f74);
 
-  	dt.size =                  GET_SMSTATE(u32, smstate, 0x7f70);
 
- -	ctxt->ops->set_gdt(ctxt, &dt);
 
- +	static_call(kvm_x86_set_gdt)(vcpu, &dt);
 
-  
 
-  	dt.address =               GET_SMSTATE(u32, smstate, 0x7f58);
 
-  	dt.size =                  GET_SMSTATE(u32, smstate, 0x7f54);
 
- -	ctxt->ops->set_idt(ctxt, &dt);
 
- +	static_call(kvm_x86_set_idt)(vcpu, &dt);
 
-  
 
-  	for (i = 0; i < 6; i++) {
 
- -		int r = rsm_load_seg_32(ctxt, smstate, i);
 
- +		int r = rsm_load_seg_32(vcpu, smstate, i);
 
-  		if (r != X86EMUL_CONTINUE)
 
-  			return r;
 
-  	}
 
-  
 
-  	cr4 = GET_SMSTATE(u32, smstate, 0x7f14);
 
-  
 
- -	ctxt->ops->set_smbase(ctxt, GET_SMSTATE(u32, smstate, 0x7ef8));
 
- +	vcpu->arch.smbase = GET_SMSTATE(u32, smstate, 0x7ef8);
 
-  
 
- -	return rsm_enter_protected_mode(ctxt, cr0, cr3, cr4);
 
- +	return rsm_enter_protected_mode(vcpu, cr0, cr3, cr4);
 
-  }
 
-  
 
-  #ifdef CONFIG_X86_64
 
-  static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt,
 
-  			     const char *smstate)
 
-  {
 
- -	struct desc_struct desc;
 
- +	struct kvm_vcpu *vcpu = ctxt->vcpu;
 
- +	struct kvm_segment desc;
 
-  	struct desc_ptr dt;
 
-  	u64 val, cr0, cr3, cr4;
 
- -	u32 base3;
 
- -	u16 selector;
 
-  	int i, r;
 
-  
 
-  	for (i = 0; i < NR_EMULATOR_GPRS; i++)
 
- @@ -459,51 +446,49 @@ static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt,
 
-  
 
-  	val = GET_SMSTATE(u64, smstate, 0x7f68);
 
-  
 
- -	if (ctxt->ops->set_dr(ctxt, 6, val))
 
- +	if (kvm_set_dr(vcpu, 6, val))
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
-  	val = GET_SMSTATE(u64, smstate, 0x7f60);
 
-  
 
- -	if (ctxt->ops->set_dr(ctxt, 7, val))
 
- +	if (kvm_set_dr(vcpu, 7, val))
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
-  	cr0 =                       GET_SMSTATE(u64, smstate, 0x7f58);
 
-  	cr3 =                       GET_SMSTATE(u64, smstate, 0x7f50);
 
-  	cr4 =                       GET_SMSTATE(u64, smstate, 0x7f48);
 
- -	ctxt->ops->set_smbase(ctxt, GET_SMSTATE(u32, smstate, 0x7f00));
 
- +	vcpu->arch.smbase =         GET_SMSTATE(u32, smstate, 0x7f00);
 
-  	val =                       GET_SMSTATE(u64, smstate, 0x7ed0);
 
-  
 
- -	if (ctxt->ops->set_msr(ctxt, MSR_EFER, val & ~EFER_LMA))
 
- +	if (kvm_set_msr(vcpu, MSR_EFER, val & ~EFER_LMA))
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
- -	selector =                  GET_SMSTATE(u32, smstate, 0x7e90);
 
- +	desc.selector =             GET_SMSTATE(u32, smstate, 0x7e90);
 
-  	rsm_set_desc_flags(&desc,   GET_SMSTATE(u32, smstate, 0x7e92) << 8);
 
- -	set_desc_limit(&desc,       GET_SMSTATE(u32, smstate, 0x7e94));
 
- -	set_desc_base(&desc,        GET_SMSTATE(u32, smstate, 0x7e98));
 
- -	base3 =                     GET_SMSTATE(u32, smstate, 0x7e9c);
 
- -	ctxt->ops->set_segment(ctxt, selector, &desc, base3, VCPU_SREG_TR);
 
- +	desc.limit =                GET_SMSTATE(u32, smstate, 0x7e94);
 
- +	desc.base =                 GET_SMSTATE(u64, smstate, 0x7e98);
 
- +	kvm_set_segment(vcpu, &desc, VCPU_SREG_TR);
 
-  
 
-  	dt.size =                   GET_SMSTATE(u32, smstate, 0x7e84);
 
-  	dt.address =                GET_SMSTATE(u64, smstate, 0x7e88);
 
- -	ctxt->ops->set_idt(ctxt, &dt);
 
- +	static_call(kvm_x86_set_idt)(vcpu, &dt);
 
-  
 
- -	selector =                  GET_SMSTATE(u32, smstate, 0x7e70);
 
- +	desc.selector =             GET_SMSTATE(u32, smstate, 0x7e70);
 
-  	rsm_set_desc_flags(&desc,   GET_SMSTATE(u32, smstate, 0x7e72) << 8);
 
- -	set_desc_limit(&desc,       GET_SMSTATE(u32, smstate, 0x7e74));
 
- -	set_desc_base(&desc,        GET_SMSTATE(u32, smstate, 0x7e78));
 
- -	base3 =                     GET_SMSTATE(u32, smstate, 0x7e7c);
 
- -	ctxt->ops->set_segment(ctxt, selector, &desc, base3, VCPU_SREG_LDTR);
 
- +	desc.limit =                GET_SMSTATE(u32, smstate, 0x7e74);
 
- +	desc.base =                 GET_SMSTATE(u64, smstate, 0x7e78);
 
- +	kvm_set_segment(vcpu, &desc, VCPU_SREG_LDTR);
 
-  
 
-  	dt.size =                   GET_SMSTATE(u32, smstate, 0x7e64);
 
-  	dt.address =                GET_SMSTATE(u64, smstate, 0x7e68);
 
- -	ctxt->ops->set_gdt(ctxt, &dt);
 
- +	static_call(kvm_x86_set_gdt)(vcpu, &dt);
 
-  
 
- -	r = rsm_enter_protected_mode(ctxt, cr0, cr3, cr4);
 
- +	r = rsm_enter_protected_mode(vcpu, cr0, cr3, cr4);
 
-  	if (r != X86EMUL_CONTINUE)
 
-  		return r;
 
-  
 
-  	for (i = 0; i < 6; i++) {
 
- -		r = rsm_load_seg_64(ctxt, smstate, i);
 
- +		r = rsm_load_seg_64(vcpu, smstate, i);
 
-  		if (r != X86EMUL_CONTINUE)
 
-  			return r;
 
-  	}
 
- @@ -520,14 +505,14 @@ int emulator_leave_smm(struct x86_emulate_ctxt *ctxt)
 
-  	u64 smbase;
 
-  	int ret;
 
-  
 
- -	smbase = ctxt->ops->get_smbase(ctxt);
 
- +	smbase = vcpu->arch.smbase;
 
-  
 
- -	ret = ctxt->ops->read_phys(ctxt, smbase + 0xfe00, buf, sizeof(buf));
 
- -	if (ret != X86EMUL_CONTINUE)
 
- +	ret = kvm_vcpu_read_guest(vcpu, smbase + 0xfe00, buf, sizeof(buf));
 
- +	if (ret < 0)
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
- -	if ((ctxt->ops->get_hflags(ctxt) & X86EMUL_SMM_INSIDE_NMI_MASK) == 0)
 
- -		ctxt->ops->set_nmi_mask(ctxt, false);
 
- +	if ((vcpu->arch.hflags & HF_SMM_INSIDE_NMI_MASK) == 0)
 
- +		static_call(kvm_x86_set_nmi_mask)(vcpu, false);
 
-  
 
-  	kvm_smm_changed(vcpu, false);
 
-  
 
- @@ -535,41 +520,41 @@ int emulator_leave_smm(struct x86_emulate_ctxt *ctxt)
 
-  	 * Get back to real mode, to prepare a safe state in which to load
 
-  	 * CR0/CR3/CR4/EFER.  It's all a bit more complicated if the vCPU
 
-  	 * supports long mode.
 
- -	 *
 
- -	 * The ctxt->ops callbacks will handle all side effects when writing
 
- -	 * writing MSRs and CRs, e.g. MMU context resets, CPUID
 
- -	 * runtime updates, etc.
 
-  	 */
 
- -	if (emulator_has_longmode(ctxt)) {
 
- -		struct desc_struct cs_desc;
 
- +#ifdef CONFIG_X86_64
 
- +	if (guest_cpuid_has(vcpu, X86_FEATURE_LM)) {
 
- +		struct kvm_segment cs_desc;
 
-  
 
-  		/* Zero CR4.PCIDE before CR0.PG.  */
 
- -		cr4 = ctxt->ops->get_cr(ctxt, 4);
 
- +		cr4 = kvm_read_cr4(vcpu);
 
-  		if (cr4 & X86_CR4_PCIDE)
 
- -			ctxt->ops->set_cr(ctxt, 4, cr4 & ~X86_CR4_PCIDE);
 
- +			kvm_set_cr4(vcpu, cr4 & ~X86_CR4_PCIDE);
 
-  
 
-  		/* A 32-bit code segment is required to clear EFER.LMA.  */
 
-  		memset(&cs_desc, 0, sizeof(cs_desc));
 
-  		cs_desc.type = 0xb;
 
- -		cs_desc.s = cs_desc.g = cs_desc.p = 1;
 
- -		ctxt->ops->set_segment(ctxt, 0, &cs_desc, 0, VCPU_SREG_CS);
 
- +		cs_desc.s = cs_desc.g = cs_desc.present = 1;
 
- +		kvm_set_segment(vcpu, &cs_desc, VCPU_SREG_CS);
 
-  	}
 
- +#endif
 
-  
 
-  	/* For the 64-bit case, this will clear EFER.LMA.  */
 
- -	cr0 = ctxt->ops->get_cr(ctxt, 0);
 
- +	cr0 = kvm_read_cr0(vcpu);
 
-  	if (cr0 & X86_CR0_PE)
 
- -		ctxt->ops->set_cr(ctxt, 0, cr0 & ~(X86_CR0_PG | X86_CR0_PE));
 
- +		kvm_set_cr0(vcpu, cr0 & ~(X86_CR0_PG | X86_CR0_PE));
 
-  
 
- -	if (emulator_has_longmode(ctxt)) {
 
- +#ifdef CONFIG_X86_64
 
- +	if (guest_cpuid_has(vcpu, X86_FEATURE_LM)) {
 
-  		/* Clear CR4.PAE before clearing EFER.LME. */
 
- -		cr4 = ctxt->ops->get_cr(ctxt, 4);
 
- +		cr4 = kvm_read_cr4(vcpu);
 
-  		if (cr4 & X86_CR4_PAE)
 
- -			ctxt->ops->set_cr(ctxt, 4, cr4 & ~X86_CR4_PAE);
 
- +			kvm_set_cr4(vcpu, cr4 & ~X86_CR4_PAE);
 
-  
 
-  		/* And finally go back to 32-bit mode.  */
 
-  		efer = 0;
 
- -		ctxt->ops->set_msr(ctxt, MSR_EFER, efer);
 
- +		kvm_set_msr(vcpu, MSR_EFER, efer);
 
-  	}
 
- +#endif
 
-  
 
-  	/*
 
-  	 * Give leave_smm() a chance to make ISA-specific changes to the vCPU
 
- @@ -580,7 +565,7 @@ int emulator_leave_smm(struct x86_emulate_ctxt *ctxt)
 
-  		return X86EMUL_UNHANDLEABLE;
 
-  
 
-  #ifdef CONFIG_X86_64
 
- -	if (emulator_has_longmode(ctxt))
 
- +	if (guest_cpuid_has(vcpu, X86_FEATURE_LM))
 
-  		return rsm_load_state_64(ctxt, buf);
 
-  	else
 
-  #endif
 
- diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
 
- index dae68ef0c3c8..77e0ca43ee27 100644
 
- --- a/arch/x86/kvm/x86.c
 
- +++ b/arch/x86/kvm/x86.c
 
- @@ -7171,15 +7171,6 @@ static int emulator_read_std(struct x86_emulate_ctxt *ctxt,
 
-  	return kvm_read_guest_virt_helper(addr, val, bytes, vcpu, access, exception);
 
-  }
 
-  
 
- -static int kvm_read_guest_phys_system(struct x86_emulate_ctxt *ctxt,
 
- -		unsigned long addr, void *val, unsigned int bytes)
 
- -{
 
- -	struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
 
- -	int r = kvm_vcpu_read_guest(vcpu, addr, val, bytes);
 
- -
 
- -	return r < 0 ? X86EMUL_IO_NEEDED : X86EMUL_CONTINUE;
 
- -}
 
- -
 
-  static int kvm_write_guest_virt_helper(gva_t addr, void *val, unsigned int bytes,
 
-  				      struct kvm_vcpu *vcpu, u64 access,
 
-  				      struct x86_exception *exception)
 
- @@ -7956,26 +7947,6 @@ static int emulator_get_msr(struct x86_emulate_ctxt *ctxt,
 
-  	return kvm_get_msr(emul_to_vcpu(ctxt), msr_index, pdata);
 
-  }
 
-  
 
- -static int emulator_set_msr(struct x86_emulate_ctxt *ctxt,
 
- -			    u32 msr_index, u64 data)
 
- -{
 
- -	return kvm_set_msr(emul_to_vcpu(ctxt), msr_index, data);
 
- -}
 
- -
 
- -static u64 emulator_get_smbase(struct x86_emulate_ctxt *ctxt)
 
- -{
 
- -	struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
 
- -
 
- -	return vcpu->arch.smbase;
 
- -}
 
- -
 
- -static void emulator_set_smbase(struct x86_emulate_ctxt *ctxt, u64 smbase)
 
- -{
 
- -	struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
 
- -
 
- -	vcpu->arch.smbase = smbase;
 
- -}
 
- -
 
-  static int emulator_check_pmc(struct x86_emulate_ctxt *ctxt,
 
-  			      u32 pmc)
 
-  {
 
- @@ -8074,7 +8045,6 @@ static const struct x86_emulate_ops emulate_ops = {
 
-  	.write_gpr           = emulator_write_gpr,
 
-  	.read_std            = emulator_read_std,
 
-  	.write_std           = emulator_write_std,
 
- -	.read_phys           = kvm_read_guest_phys_system,
 
-  	.fetch               = kvm_fetch_guest_virt,
 
-  	.read_emulated       = emulator_read_emulated,
 
-  	.write_emulated      = emulator_write_emulated,
 
- @@ -8094,11 +8064,8 @@ static const struct x86_emulate_ops emulate_ops = {
 
-  	.cpl                 = emulator_get_cpl,
 
-  	.get_dr              = emulator_get_dr,
 
-  	.set_dr              = emulator_set_dr,
 
- -	.get_smbase          = emulator_get_smbase,
 
- -	.set_smbase          = emulator_set_smbase,
 
-  	.set_msr_with_filter = emulator_set_msr_with_filter,
 
-  	.get_msr_with_filter = emulator_get_msr_with_filter,
 
- -	.set_msr             = emulator_set_msr,
 
-  	.get_msr             = emulator_get_msr,
 
-  	.check_pmc	     = emulator_check_pmc,
 
-  	.read_pmc            = emulator_read_pmc,
 
- -- 
 
- 2.38.1
 
 
  |