From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sheng Yang Subject: [PATCH] KVM: x86 emulator: Discard CR2 in x86 emulator Date: Fri, 16 Nov 2007 16:30:34 +0800 Message-ID: <200711161630.34137.sheng.yang@intel.com> Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_qUVPHYjylPEdZpz" To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org --Boundary-00=_qUVPHYjylPEdZpz Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =46rom f8aca5afbc018e71dc37d2e6001bcec376499939 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Fri, 16 Nov 2007 16:29:15 +0800 Subject: [PATCH] KVM: x86 emulator: Discard CR2 in x86 emulator =46or CR2 is unreliable and unavailable in many condition, this patch completely decode memory operand instead of using CR2 in x86 emulator. Signed-off-by: Sheng Yang =2D-- drivers/kvm/x86.c | 1 - drivers/kvm/x86_emulate.c | 18 +++++++++--------- drivers/kvm/x86_emulate.h | 1 - 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c index 6d7f384..16b32bc 100644 =2D-- a/drivers/kvm/x86.c +++ b/drivers/kvm/x86.c @@ -1352,7 +1352,6 @@ int emulate_instruction(struct kvm_vcpu *vcpu, =20 vcpu->emulate_ctxt.vcpu =3D vcpu; vcpu->emulate_ctxt.eflags =3D kvm_x86_ops->get_rflags(vcpu); =2D vcpu->emulate_ctxt.cr2 =3D cr2; vcpu->emulate_ctxt.mode =3D (vcpu->emulate_ctxt.eflags & X86_EFLAGS_VM) ? X86EMUL_MODE_REAL : cs_l diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c index b9d2781..cbd50dd 100644 =2D-- a/drivers/kvm/x86_emulate.c +++ b/drivers/kvm/x86_emulate.c @@ -1090,13 +1090,13 @@ static inline int emulate_grp45(struct=20 x86_emulate_ctxt *ctxt, =20 static inline int emulate_grp9(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops, =2D unsigned long cr2) + unsigned long memop) { struct decode_cache *c =3D &ctxt->decode; u64 old, new; int rc; =20 =2D rc =3D ops->read_emulated(cr2, &old, 8, ctxt->vcpu); + rc =3D ops->read_emulated(memop, &old, 8, ctxt->vcpu); if (rc !=3D 0) return rc; =20 @@ -1111,7 +1111,7 @@ static inline int emulate_grp9(struct x86_emulate_ctx= t=20 *ctxt, new =3D ((u64)c->regs[VCPU_REGS_RCX] << 32) | (u32) c->regs[VCPU_REGS_RBX]; =20 =2D rc =3D ops->cmpxchg_emulated(cr2, &old, &new, 8, ctxt->vcpu); + rc =3D ops->cmpxchg_emulated(memop, &old, &new, 8, ctxt->vcpu); if (rc !=3D 0) return rc; ctxt->eflags |=3D EFLG_ZF; @@ -1174,7 +1174,7 @@ static inline int writeback(struct x86_emulate_ctxt=20 *ctxt, int x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *op= s) { =2D unsigned long cr2 =3D ctxt->cr2; + unsigned long memop =3D 0; u64 msr_data; unsigned long saved_eip; struct decode_cache *c =3D &ctxt->decode; @@ -1189,10 +1189,10 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, str= uct=20 x86_emulate_ops *ops) saved_eip =3D c->eip; =20 if (((c->d & ModRM) && (c->modrm_mod !=3D 3)) || (c->d & MemAbs)) =2D cr2 =3D c->modrm_ea; + memop =3D c->modrm_ea; =20 if (c->src.type =3D=3D OP_MEM) { =2D c->src.ptr =3D (unsigned long *)cr2; + c->src.ptr =3D (unsigned long *)memop; c->src.val =3D 0; rc =3D ops->read_emulated((unsigned long)c->src.ptr, &c->src.val, @@ -1208,7 +1208,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struc= t=20 x86_emulate_ops *ops) =20 =20 if (c->dst.type =3D=3D OP_MEM) { =2D c->dst.ptr =3D (unsigned long *)cr2; + c->dst.ptr =3D (unsigned long *)memop; c->dst.bytes =3D (c->d & ByteOp) ? 1 : c->op_bytes; c->dst.val =3D 0; if (c->d & BitOp) { @@ -1647,7 +1647,7 @@ twobyte_insn: &ctxt->eflags); break; case 7: /* invlpg*/ =2D emulate_invlpg(ctxt->vcpu, cr2); + emulate_invlpg(ctxt->vcpu, memop); break; default: goto cannot_emulate; @@ -1818,7 +1818,7 @@ twobyte_special_insn: break; } case 0xc7: /* Grp9 (cmpxchg8b) */ =2D rc =3D emulate_grp9(ctxt, ops, cr2); + rc =3D emulate_grp9(ctxt, ops, memop); if (rc !=3D 0) goto done; break; diff --git a/drivers/kvm/x86_emulate.h b/drivers/kvm/x86_emulate.h index e34868b..c0a89c9 100644 =2D-- a/drivers/kvm/x86_emulate.h +++ b/drivers/kvm/x86_emulate.h @@ -149,7 +149,6 @@ struct x86_emulate_ctxt { =20 /* Linear faulting address (if emulating a page-faulting instruction). */ unsigned long eflags; =2D unsigned long cr2; =20 /* Emulated execution mode, represented by an X86EMUL_MODE value. */ int mode; =2D-=20 1.5.3.4 --Boundary-00=_qUVPHYjylPEdZpz Content-Type: text/x-diff; charset="utf-8"; name="0001-KVM-x86-emulator-Discard-CR2-in-x86-emulator.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0001-KVM-x86-emulator-Discard-CR2-in-x86-emulator.patch" =46rom f8aca5afbc018e71dc37d2e6001bcec376499939 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Fri, 16 Nov 2007 16:29:15 +0800 Subject: [PATCH] KVM: x86 emulator: Discard CR2 in x86 emulator =46or CR2 is unreliable and unavailable in many condition, this patch completely decode memory operand instead of using CR2 in x86 emulator. Signed-off-by: Sheng Yang =2D-- drivers/kvm/x86.c | 1 - drivers/kvm/x86_emulate.c | 18 +++++++++--------- drivers/kvm/x86_emulate.h | 1 - 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c index 6d7f384..16b32bc 100644 =2D-- a/drivers/kvm/x86.c +++ b/drivers/kvm/x86.c @@ -1352,7 +1352,6 @@ int emulate_instruction(struct kvm_vcpu *vcpu, =20 vcpu->emulate_ctxt.vcpu =3D vcpu; vcpu->emulate_ctxt.eflags =3D kvm_x86_ops->get_rflags(vcpu); =2D vcpu->emulate_ctxt.cr2 =3D cr2; vcpu->emulate_ctxt.mode =3D (vcpu->emulate_ctxt.eflags & X86_EFLAGS_VM) ? X86EMUL_MODE_REAL : cs_l diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c index b9d2781..cbd50dd 100644 =2D-- a/drivers/kvm/x86_emulate.c +++ b/drivers/kvm/x86_emulate.c @@ -1090,13 +1090,13 @@ static inline int emulate_grp45(struct x86_emulate_= ctxt *ctxt, =20 static inline int emulate_grp9(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops, =2D unsigned long cr2) + unsigned long memop) { struct decode_cache *c =3D &ctxt->decode; u64 old, new; int rc; =20 =2D rc =3D ops->read_emulated(cr2, &old, 8, ctxt->vcpu); + rc =3D ops->read_emulated(memop, &old, 8, ctxt->vcpu); if (rc !=3D 0) return rc; =20 @@ -1111,7 +1111,7 @@ static inline int emulate_grp9(struct x86_emulate_ctx= t *ctxt, new =3D ((u64)c->regs[VCPU_REGS_RCX] << 32) | (u32) c->regs[VCPU_REGS_RBX]; =20 =2D rc =3D ops->cmpxchg_emulated(cr2, &old, &new, 8, ctxt->vcpu); + rc =3D ops->cmpxchg_emulated(memop, &old, &new, 8, ctxt->vcpu); if (rc !=3D 0) return rc; ctxt->eflags |=3D EFLG_ZF; @@ -1174,7 +1174,7 @@ static inline int writeback(struct x86_emulate_ctxt *= ctxt, int x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *op= s) { =2D unsigned long cr2 =3D ctxt->cr2; + unsigned long memop =3D 0; u64 msr_data; unsigned long saved_eip; struct decode_cache *c =3D &ctxt->decode; @@ -1189,10 +1189,10 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, str= uct x86_emulate_ops *ops) saved_eip =3D c->eip; =20 if (((c->d & ModRM) && (c->modrm_mod !=3D 3)) || (c->d & MemAbs)) =2D cr2 =3D c->modrm_ea; + memop =3D c->modrm_ea; =20 if (c->src.type =3D=3D OP_MEM) { =2D c->src.ptr =3D (unsigned long *)cr2; + c->src.ptr =3D (unsigned long *)memop; c->src.val =3D 0; rc =3D ops->read_emulated((unsigned long)c->src.ptr, &c->src.val, @@ -1208,7 +1208,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struc= t x86_emulate_ops *ops) =20 =20 if (c->dst.type =3D=3D OP_MEM) { =2D c->dst.ptr =3D (unsigned long *)cr2; + c->dst.ptr =3D (unsigned long *)memop; c->dst.bytes =3D (c->d & ByteOp) ? 1 : c->op_bytes; c->dst.val =3D 0; if (c->d & BitOp) { @@ -1647,7 +1647,7 @@ twobyte_insn: &ctxt->eflags); break; case 7: /* invlpg*/ =2D emulate_invlpg(ctxt->vcpu, cr2); + emulate_invlpg(ctxt->vcpu, memop); break; default: goto cannot_emulate; @@ -1818,7 +1818,7 @@ twobyte_special_insn: break; } case 0xc7: /* Grp9 (cmpxchg8b) */ =2D rc =3D emulate_grp9(ctxt, ops, cr2); + rc =3D emulate_grp9(ctxt, ops, memop); if (rc !=3D 0) goto done; break; diff --git a/drivers/kvm/x86_emulate.h b/drivers/kvm/x86_emulate.h index e34868b..c0a89c9 100644 =2D-- a/drivers/kvm/x86_emulate.h +++ b/drivers/kvm/x86_emulate.h @@ -149,7 +149,6 @@ struct x86_emulate_ctxt { =20 /* Linear faulting address (if emulating a page-faulting instruction). */ unsigned long eflags; =2D unsigned long cr2; =20 /* Emulated execution mode, represented by an X86EMUL_MODE value. */ int mode; =2D-=20 1.5.3.4 --Boundary-00=_qUVPHYjylPEdZpz Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ --Boundary-00=_qUVPHYjylPEdZpz Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --Boundary-00=_qUVPHYjylPEdZpz--