All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/3] Vendor specific instructions and the emulator
@ 2011-02-01 14:32 Avi Kivity
  2011-02-01 14:32 ` [PATCH v3 1/3] KVM: Drop bogus x86_decode_insn() error check Avi Kivity
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Avi Kivity @ 2011-02-01 14:32 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Currently we have some ad-hoc code in x86.c to restrict #UD emulation to
expected instructions (that is, vendor specific instructions).  This patchset
replaces the ad-hoc code with proper emulator support using decode tables.

Avi Kivity (3):
  KVM: Drop bogus x86_decode_insn() error check
    v2: replaces v1's first two patches
  KVM: x86 emulator: vendor specific instructions
  KVM: Drop ad-hoc vendor specific instruction restriction
    v3: preserve early-exit on #UD (reexecute_instruction() isn't reliable
        since we don't have a valid cr2)

 arch/x86/include/asm/kvm_emulate.h |    1 +
 arch/x86/kvm/emulate.c             |   12 +++++++++---
 arch/x86/kvm/x86.c                 |   36 +++++-------------------------------
 3 files changed, 15 insertions(+), 34 deletions(-)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v3 1/3] KVM: Drop bogus x86_decode_insn() error check
  2011-02-01 14:32 [PATCH v3 0/3] Vendor specific instructions and the emulator Avi Kivity
@ 2011-02-01 14:32 ` Avi Kivity
  2011-02-01 14:32 ` [PATCH v3 2/3] KVM: x86 emulator: vendor specific instructions Avi Kivity
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Avi Kivity @ 2011-02-01 14:32 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

x86_decode_insn() doesn't return X86EMUL_* values, so the check
for X86EMUL_PROPOGATE_FAULT will always fail.  There is a proper
check later on, so there is no need for a replacement for this
code.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/kvm/x86.c |    3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index a7f65aa..803604f 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -4388,8 +4388,6 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu,
 		vcpu->arch.emulate_ctxt.perm_ok = false;
 
 		r = x86_decode_insn(&vcpu->arch.emulate_ctxt, insn, insn_len);
-		if (r == X86EMUL_PROPAGATE_FAULT)
-			goto done;
 
 		trace_kvm_emulate_insn_start(vcpu);
 
@@ -4449,7 +4447,6 @@ restart:
 		return handle_emulation_failure(vcpu);
 	}
 
-done:
 	if (vcpu->arch.emulate_ctxt.have_exception) {
 		inject_emulated_exception(vcpu);
 		r = EMULATE_DONE;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 2/3] KVM: x86 emulator: vendor specific instructions
  2011-02-01 14:32 [PATCH v3 0/3] Vendor specific instructions and the emulator Avi Kivity
  2011-02-01 14:32 ` [PATCH v3 1/3] KVM: Drop bogus x86_decode_insn() error check Avi Kivity
@ 2011-02-01 14:32 ` Avi Kivity
  2011-02-01 14:32 ` [PATCH v3 3/3] KVM: Drop ad-hoc vendor specific instruction restriction Avi Kivity
  2011-02-04 13:25 ` [PATCH v3 0/3] Vendor specific instructions and the emulator Marcelo Tosatti
  3 siblings, 0 replies; 5+ messages in thread
From: Avi Kivity @ 2011-02-01 14:32 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Mark some instructions as vendor specific, and allow the caller to request
emulation only of vendor specific instructions.  This is useful in some
circumstances (responding to a #UD fault).

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/include/asm/kvm_emulate.h |    1 +
 arch/x86/kvm/emulate.c             |   12 +++++++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h
index 8e37deb..50ebc32 100644
--- a/arch/x86/include/asm/kvm_emulate.h
+++ b/arch/x86/include/asm/kvm_emulate.h
@@ -239,6 +239,7 @@ struct x86_emulate_ctxt {
 	int interruptibility;
 
 	bool perm_ok; /* do not check permissions if true */
+	bool only_vendor_specific_insn;
 
 	bool have_exception;
 	struct x86_exception exception;
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 02a0041..ad46239 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -76,6 +76,7 @@
 #define Group       (1<<14)     /* Bits 3:5 of modrm byte extend opcode */
 #define GroupDual   (1<<15)     /* Alternate decoding of mod == 3 */
 /* Misc flags */
+#define VendorSpecific (1<<22) /* Vendor specific instruction */
 #define NoAccess    (1<<23) /* Don't access memory (lea/invlpg/verr etc) */
 #define Op3264      (1<<24) /* Operand is 64b in long mode, 32b otherwise */
 #define Undefined   (1<<25) /* No Such Instruction */
@@ -2365,7 +2366,8 @@ static struct group_dual group7 = { {
 	D(SrcMem16 | ModRM | Mov | Priv),
 	D(SrcMem | ModRM | ByteOp | Priv | NoAccess),
 }, {
-	D(SrcNone | ModRM | Priv), N, N, D(SrcNone | ModRM | Priv),
+	D(SrcNone | ModRM | Priv | VendorSpecific), N,
+	N, D(SrcNone | ModRM | Priv | VendorSpecific),
 	D(SrcNone | ModRM | DstMem | Mov), N,
 	D(SrcMem16 | ModRM | Mov | Priv), N,
 } };
@@ -2489,7 +2491,7 @@ static struct opcode opcode_table[256] = {
 static struct opcode twobyte_table[256] = {
 	/* 0x00 - 0x0F */
 	N, GD(0, &group7), N, N,
-	N, D(ImplicitOps), D(ImplicitOps | Priv), N,
+	N, D(ImplicitOps | VendorSpecific), D(ImplicitOps | Priv), N,
 	D(ImplicitOps | Priv), D(ImplicitOps | Priv), N, N,
 	N, D(ImplicitOps | ModRM), N, N,
 	/* 0x10 - 0x1F */
@@ -2502,7 +2504,8 @@ static struct opcode twobyte_table[256] = {
 	/* 0x30 - 0x3F */
 	D(ImplicitOps | Priv), I(ImplicitOps, em_rdtsc),
 	D(ImplicitOps | Priv), N,
-	D(ImplicitOps), D(ImplicitOps | Priv), N, N,
+	D(ImplicitOps | VendorSpecific), D(ImplicitOps | Priv | VendorSpecific),
+	N, N,
 	N, N, N, N, N, N, N, N,
 	/* 0x40 - 0x4F */
 	X16(D(DstReg | SrcMem | ModRM | Mov)),
@@ -2741,6 +2744,9 @@ done_prefixes:
 	if (c->d == 0 || (c->d & Undefined))
 		return -1;
 
+	if (!(c->d & VendorSpecific) && ctxt->only_vendor_specific_insn)
+		return -1;
+
 	if (mode == X86EMUL_MODE_PROT64 && (c->d & Stack))
 		c->op_bytes = 8;
 
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 3/3] KVM: Drop ad-hoc vendor specific instruction restriction
  2011-02-01 14:32 [PATCH v3 0/3] Vendor specific instructions and the emulator Avi Kivity
  2011-02-01 14:32 ` [PATCH v3 1/3] KVM: Drop bogus x86_decode_insn() error check Avi Kivity
  2011-02-01 14:32 ` [PATCH v3 2/3] KVM: x86 emulator: vendor specific instructions Avi Kivity
@ 2011-02-01 14:32 ` Avi Kivity
  2011-02-04 13:25 ` [PATCH v3 0/3] Vendor specific instructions and the emulator Marcelo Tosatti
  3 siblings, 0 replies; 5+ messages in thread
From: Avi Kivity @ 2011-02-01 14:32 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Use the new support in the emulator, and drop the ad-hoc code in x86.c.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/kvm/x86.c |   33 +++++----------------------------
 1 files changed, 5 insertions(+), 28 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 803604f..bdbe2e8 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -4387,39 +4387,16 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu,
 		vcpu->arch.emulate_ctxt.have_exception = false;
 		vcpu->arch.emulate_ctxt.perm_ok = false;
 
+		vcpu->arch.emulate_ctxt.only_vendor_specific_insn
+			= emulation_type & EMULTYPE_TRAP_UD;
+
 		r = x86_decode_insn(&vcpu->arch.emulate_ctxt, insn, insn_len);
 
 		trace_kvm_emulate_insn_start(vcpu);
-
-		/* Only allow emulation of specific instructions on #UD
-		 * (namely VMMCALL, sysenter, sysexit, syscall)*/
-		if (emulation_type & EMULTYPE_TRAP_UD) {
-			if (!c->twobyte)
-				return EMULATE_FAIL;
-			switch (c->b) {
-			case 0x01: /* VMMCALL */
-				if (c->modrm_mod != 3 || c->modrm_rm != 1)
-					return EMULATE_FAIL;
-				break;
-			case 0x34: /* sysenter */
-			case 0x35: /* sysexit */
-				if (c->modrm_mod != 0 || c->modrm_rm != 0)
-					return EMULATE_FAIL;
-				break;
-			case 0x05: /* syscall */
-				if (c->modrm_mod != 0 || c->modrm_rm != 0)
-					return EMULATE_FAIL;
-				break;
-			default:
-				return EMULATE_FAIL;
-			}
-
-			if (!(c->modrm_reg == 0 || c->modrm_reg == 3))
-				return EMULATE_FAIL;
-		}
-
 		++vcpu->stat.insn_emulation;
 		if (r)  {
+			if (emulation_type & EMULTYPE_TRAP_UD)
+				return EMULATE_FAIL;
 			if (reexecute_instruction(vcpu, cr2))
 				return EMULATE_DONE;
 			if (emulation_type & EMULTYPE_SKIP)
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 0/3] Vendor specific instructions and the emulator
  2011-02-01 14:32 [PATCH v3 0/3] Vendor specific instructions and the emulator Avi Kivity
                   ` (2 preceding siblings ...)
  2011-02-01 14:32 ` [PATCH v3 3/3] KVM: Drop ad-hoc vendor specific instruction restriction Avi Kivity
@ 2011-02-04 13:25 ` Marcelo Tosatti
  3 siblings, 0 replies; 5+ messages in thread
From: Marcelo Tosatti @ 2011-02-04 13:25 UTC (permalink / raw)
  To: Avi Kivity; +Cc: kvm

On Tue, Feb 01, 2011 at 04:32:01PM +0200, Avi Kivity wrote:
> Currently we have some ad-hoc code in x86.c to restrict #UD emulation to
> expected instructions (that is, vendor specific instructions).  This patchset
> replaces the ad-hoc code with proper emulator support using decode tables.
> 
> Avi Kivity (3):
>   KVM: Drop bogus x86_decode_insn() error check
>     v2: replaces v1's first two patches
>   KVM: x86 emulator: vendor specific instructions
>   KVM: Drop ad-hoc vendor specific instruction restriction
>     v3: preserve early-exit on #UD (reexecute_instruction() isn't reliable
>         since we don't have a valid cr2)
> 
>  arch/x86/include/asm/kvm_emulate.h |    1 +
>  arch/x86/kvm/emulate.c             |   12 +++++++++---
>  arch/x86/kvm/x86.c                 |   36 +++++-------------------------------
>  3 files changed, 15 insertions(+), 34 deletions(-)

Applied, thanks.


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-02-04 14:37 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-02-01 14:32 [PATCH v3 0/3] Vendor specific instructions and the emulator Avi Kivity
2011-02-01 14:32 ` [PATCH v3 1/3] KVM: Drop bogus x86_decode_insn() error check Avi Kivity
2011-02-01 14:32 ` [PATCH v3 2/3] KVM: x86 emulator: vendor specific instructions Avi Kivity
2011-02-01 14:32 ` [PATCH v3 3/3] KVM: Drop ad-hoc vendor specific instruction restriction Avi Kivity
2011-02-04 13:25 ` [PATCH v3 0/3] Vendor specific instructions and the emulator Marcelo Tosatti

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.