public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/13] Emulator group simplification
@ 2010-07-26 11:37 Avi Kivity
  2010-07-26 11:37 ` [PATCH 01/13] KVM: x86 emulator: add macros for repetitive instructions Avi Kivity
                   ` (13 more replies)
  0 siblings, 14 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

This patchset simplifies the x86 emulator group decoding, cleans up the decoder
tables (and adds a missing Lock marker as well).

Avi Kivity (13):
  KVM: x86 emulator: add macros for repetitive instructions
  KVM: x86 emulator: consolidate inc/dec reg decoding
  KVM: x86 emulator: consolidate push/pop reg decoding
  KVM: X86 emulator: consolidate Jcc rel8 decoding
  KVM: x86 emulator: consolidate MOV reg, imm decoding
  KVM: x86 emulator: consolidate CMOVcc decoding
  KVM: x86 emulator: consolidate Jcc rel32 decoding
  KVM: x86 emulator: Make group storage bits separate from operand bits
  KVM: x86 emulator: add Undefined decode flag
  KVM: x86 emulator: mix decode bits from opcode and group decode
    tables
  KVM: x86 emulator: simplify Group 1 decoding
  KVM: x86 emulator: Allow LOCK prefix for NEG and NOT
  KVM: x86 emulator: unify the two Group 3 variants

 arch/x86/kvm/emulate.c |  143 ++++++++++++++++--------------------------------
 1 files changed, 47 insertions(+), 96 deletions(-)


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

* [PATCH 01/13] KVM: x86 emulator: add macros for repetitive instructions
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 02/13] KVM: x86 emulator: consolidate inc/dec reg decoding Avi Kivity
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Some instructions are repetitive in the opcode space, add macros for
consolidating them.

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index b38bd8b..4285cb0 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -94,6 +94,15 @@
 #define Src2One     (3<<29)
 #define Src2Mask    (7<<29)
 
+#define X2(x) (x), (x)
+#define X3(x) X2(x), (x)
+#define X4(x) X2(x), X2(x)
+#define X5(x) X4(x), (x)
+#define X6(x) X4(x), X2(x)
+#define X7(x) X4(x), X3(x)
+#define X8(x) X4(x), X4(x)
+#define X16(x) X8(x), X8(x)
+
 enum {
 	Group1_80, Group1_81, Group1_82, Group1_83,
 	Group1A, Group3_Byte, Group3, Group4, Group5, Group7,
-- 
1.7.1


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

* [PATCH 02/13] KVM: x86 emulator: consolidate inc/dec reg decoding
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
  2010-07-26 11:37 ` [PATCH 01/13] KVM: x86 emulator: add macros for repetitive instructions Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 03/13] KVM: x86 emulator: consolidate push/pop " Avi Kivity
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 4285cb0..16b191f 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -147,10 +147,8 @@ static u32 opcode_table[256] = {
 	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
 	ByteOp | DstAcc | SrcImm, DstAcc | SrcImm,
 	0, 0,
-	/* 0x40 - 0x47 */
-	DstReg, DstReg, DstReg, DstReg, DstReg, DstReg, DstReg, DstReg,
-	/* 0x48 - 0x4F */
-	DstReg, DstReg, DstReg, DstReg,	DstReg, DstReg, DstReg, DstReg,
+	/* 0x40 - 0x4F */
+	X16(DstReg),
 	/* 0x50 - 0x57 */
 	SrcReg | Stack, SrcReg | Stack, SrcReg | Stack, SrcReg | Stack,
 	SrcReg | Stack, SrcReg | Stack, SrcReg | Stack, SrcReg | Stack,
-- 
1.7.1


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

* [PATCH 03/13] KVM: x86 emulator: consolidate push/pop reg decoding
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
  2010-07-26 11:37 ` [PATCH 01/13] KVM: x86 emulator: add macros for repetitive instructions Avi Kivity
  2010-07-26 11:37 ` [PATCH 02/13] KVM: x86 emulator: consolidate inc/dec reg decoding Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 04/13] KVM: X86 emulator: consolidate Jcc rel8 decoding Avi Kivity
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 16b191f..216bf3c 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -150,11 +150,9 @@ static u32 opcode_table[256] = {
 	/* 0x40 - 0x4F */
 	X16(DstReg),
 	/* 0x50 - 0x57 */
-	SrcReg | Stack, SrcReg | Stack, SrcReg | Stack, SrcReg | Stack,
-	SrcReg | Stack, SrcReg | Stack, SrcReg | Stack, SrcReg | Stack,
+	X8(SrcReg | Stack),
 	/* 0x58 - 0x5F */
-	DstReg | Stack, DstReg | Stack, DstReg | Stack, DstReg | Stack,
-	DstReg | Stack, DstReg | Stack, DstReg | Stack, DstReg | Stack,
+	X8(DstReg | Stack),
 	/* 0x60 - 0x67 */
 	ImplicitOps | Stack | No64, ImplicitOps | Stack | No64,
 	0, DstReg | SrcMem32 | ModRM | Mov /* movsxd (x86/64) */ ,
-- 
1.7.1


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

* [PATCH 04/13] KVM: X86 emulator: consolidate Jcc rel8 decoding
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (2 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 03/13] KVM: x86 emulator: consolidate push/pop " Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 05/13] KVM: x86 emulator: consolidate MOV reg, imm decoding Avi Kivity
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 216bf3c..c6eda06 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -161,12 +161,8 @@ static u32 opcode_table[256] = {
 	SrcImm | Mov | Stack, 0, SrcImmByte | Mov | Stack, 0,
 	DstDI | ByteOp | Mov | String, DstDI | Mov | String, /* insb, insw/insd */
 	SrcSI | ByteOp | ImplicitOps | String, SrcSI | ImplicitOps | String, /* outsb, outsw/outsd */
-	/* 0x70 - 0x77 */
-	SrcImmByte, SrcImmByte, SrcImmByte, SrcImmByte,
-	SrcImmByte, SrcImmByte, SrcImmByte, SrcImmByte,
-	/* 0x78 - 0x7F */
-	SrcImmByte, SrcImmByte, SrcImmByte, SrcImmByte,
-	SrcImmByte, SrcImmByte, SrcImmByte, SrcImmByte,
+	/* 0x70 - 0x7F */
+	X16(SrcImmByte),
 	/* 0x80 - 0x87 */
 	Group | Group1_80, Group | Group1_81,
 	Group | Group1_82, Group | Group1_83,
-- 
1.7.1


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

* [PATCH 05/13] KVM: x86 emulator: consolidate MOV reg, imm decoding
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (3 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 04/13] KVM: X86 emulator: consolidate Jcc rel8 decoding Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 06/13] KVM: x86 emulator: consolidate CMOVcc decoding Avi Kivity
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index c6eda06..e4560f6 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -188,15 +188,9 @@ static u32 opcode_table[256] = {
 	ByteOp | SrcSI | DstAcc | Mov | String, SrcSI | DstAcc | Mov | String,
 	ByteOp | DstDI | String, DstDI | String,
 	/* 0xB0 - 0xB7 */
-	ByteOp | DstReg | SrcImm | Mov, ByteOp | DstReg | SrcImm | Mov,
-	ByteOp | DstReg | SrcImm | Mov, ByteOp | DstReg | SrcImm | Mov,
-	ByteOp | DstReg | SrcImm | Mov, ByteOp | DstReg | SrcImm | Mov,
-	ByteOp | DstReg | SrcImm | Mov, ByteOp | DstReg | SrcImm | Mov,
+	X8(ByteOp | DstReg | SrcImm | Mov),
 	/* 0xB8 - 0xBF */
-	DstReg | SrcImm | Mov, DstReg | SrcImm | Mov,
-	DstReg | SrcImm | Mov, DstReg | SrcImm | Mov,
-	DstReg | SrcImm | Mov, DstReg | SrcImm | Mov,
-	DstReg | SrcImm | Mov, DstReg | SrcImm | Mov,
+	X8(DstReg | SrcImm | Mov),
 	/* 0xC0 - 0xC7 */
 	ByteOp | DstMem | SrcImm | ModRM, DstMem | SrcImmByte | ModRM,
 	0, ImplicitOps | Stack, 0, 0,
-- 
1.7.1


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

* [PATCH 06/13] KVM: x86 emulator: consolidate CMOVcc decoding
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (4 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 05/13] KVM: x86 emulator: consolidate MOV reg, imm decoding Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 07/13] KVM: x86 emulator: consolidate Jcc rel32 decoding Avi Kivity
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index e4560f6..f2e8a27 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -238,16 +238,8 @@ static u32 twobyte_table[256] = {
 	ImplicitOps | Priv, 0, ImplicitOps | Priv, 0,
 	ImplicitOps, ImplicitOps | Priv, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0,
-	/* 0x40 - 0x47 */
-	DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
-	DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
-	DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
-	DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
-	/* 0x48 - 0x4F */
-	DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
-	DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
-	DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
-	DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
+	/* 0x40 - 0x4F */
+	X16(DstReg | SrcMem | ModRM | Mov),
 	/* 0x50 - 0x5F */
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	/* 0x60 - 0x6F */
-- 
1.7.1


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

* [PATCH 07/13] KVM: x86 emulator: consolidate Jcc rel32 decoding
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (5 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 06/13] KVM: x86 emulator: consolidate CMOVcc decoding Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 08/13] KVM: x86 emulator: Make group storage bits separate from operand bits Avi Kivity
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index f2e8a27..efed4db 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -247,8 +247,7 @@ static u32 twobyte_table[256] = {
 	/* 0x70 - 0x7F */
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	/* 0x80 - 0x8F */
-	SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm,
-	SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm,
+	X16(SrcImm),
 	/* 0x90 - 0x9F */
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	/* 0xA0 - 0xA7 */
-- 
1.7.1


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

* [PATCH 08/13] KVM: x86 emulator: Make group storage bits separate from operand bits
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (6 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 07/13] KVM: x86 emulator: consolidate Jcc rel32 decoding Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 09/13] KVM: x86 emulator: add Undefined decode flag Avi Kivity
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Currently group bits are stored in bits 0:7, where operand bits are stored.

Make group bits be 0:3, and move the existing bits 0:3 to 16:19, so we can
mix group and operand bits.

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index efed4db..434ac8f 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -46,15 +46,15 @@
  */
 
 /* Operand sizes: 8-bit operands or specified/overridden size. */
-#define ByteOp      (1<<0)	/* 8-bit operands. */
+#define ByteOp      (1<<16)	/* 8-bit operands. */
 /* Destination operand type. */
-#define ImplicitOps (1<<1)	/* Implicit in opcode. No generic decode. */
-#define DstReg      (2<<1)	/* Register operand. */
-#define DstMem      (3<<1)	/* Memory operand. */
-#define DstAcc      (4<<1)      /* Destination Accumulator */
-#define DstDI       (5<<1)	/* Destination is in ES:(E)DI */
-#define DstMem64    (6<<1)	/* 64bit memory operand */
-#define DstMask     (7<<1)
+#define ImplicitOps (1<<17)	/* Implicit in opcode. No generic decode. */
+#define DstReg      (2<<17)	/* Register operand. */
+#define DstMem      (3<<17)	/* Memory operand. */
+#define DstAcc      (4<<17)	/* Destination Accumulator */
+#define DstDI       (5<<17)	/* Destination is in ES:(E)DI */
+#define DstMem64    (6<<17)	/* 64bit memory operand */
+#define DstMask     (7<<17)
 /* Source operand type. */
 #define SrcNone     (0<<4)	/* No source operand. */
 #define SrcImplicit (0<<4)	/* Source operand is implicit in the opcode. */
@@ -82,7 +82,7 @@
 #define Stack       (1<<13)     /* Stack instruction (push/pop) */
 #define Group       (1<<14)     /* Bits 3:5 of modrm byte extend opcode */
 #define GroupDual   (1<<15)     /* Alternate decoding of mod == 3 */
-#define GroupMask   0xff        /* Group number stored in bits 0:7 */
+#define GroupMask   0x0f        /* Group number stored in bits 0:3 */
 /* Misc flags */
 #define Lock        (1<<26) /* lock prefix is allowed for the instruction */
 #define Priv        (1<<27) /* instruction generates #GP if current CPL != 0 */
-- 
1.7.1


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

* [PATCH 09/13] KVM: x86 emulator: add Undefined decode flag
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (7 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 08/13] KVM: x86 emulator: Make group storage bits separate from operand bits Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 10/13] KVM: x86 emulator: mix decode bits from opcode and group decode tables Avi Kivity
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Add a decode flag to indicate the instruction is invalid.  Will come in useful
later, when we mix decode bits from the opcode and group table.

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 434ac8f..9a2db88 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -84,6 +84,7 @@
 #define GroupDual   (1<<15)     /* Alternate decoding of mod == 3 */
 #define GroupMask   0x0f        /* Group number stored in bits 0:3 */
 /* Misc flags */
+#define Undefined   (1<<25) /* No Such Instruction */
 #define Lock        (1<<26) /* lock prefix is allowed for the instruction */
 #define Priv        (1<<27) /* instruction generates #GP if current CPL != 0 */
 #define No64	    (1<<28)
@@ -1065,7 +1066,7 @@ done_prefixes:
 	}
 
 	/* Unrecognised? */
-	if (c->d == 0) {
+	if (c->d == 0 || (c->d & Undefined)) {
 		DPRINTF("Cannot emulate %02x\n", c->b);
 		return -1;
 	}
-- 
1.7.1


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

* [PATCH 10/13] KVM: x86 emulator: mix decode bits from opcode and group decode tables
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (8 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 09/13] KVM: x86 emulator: add Undefined decode flag Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 11/13] KVM: x86 emulator: simplify Group 1 decoding Avi Kivity
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Allow bits that are common to all members of a group to be specified in the
opcode table instead of the group table.  This allows some simplification
of the decode tables.

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 9a2db88..8834672 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -955,7 +955,7 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
 	struct decode_cache *c = &ctxt->decode;
 	int rc = X86EMUL_CONTINUE;
 	int mode = ctxt->mode;
-	int def_op_bytes, def_ad_bytes, group;
+	int def_op_bytes, def_ad_bytes, group, dual;
 
 
 	/* we cannot decode insn before we complete previous rep insn */
@@ -1055,14 +1055,16 @@ done_prefixes:
 
 	if (c->d & Group) {
 		group = c->d & GroupMask;
+		dual = c->d & GroupDual;
 		c->modrm = insn_fetch(u8, 1, c->eip);
 		--c->eip;
 
 		group = (group << 3) + ((c->modrm >> 3) & 7);
-		if ((c->d & GroupDual) && (c->modrm >> 6) == 3)
-			c->d = group2_table[group];
+		c->d &= ~(Group | GroupDual | GroupMask);
+		if (dual && (c->modrm >> 6) == 3)
+			c->d |= group2_table[group];
 		else
-			c->d = group_table[group];
+			c->d |= group_table[group];
 	}
 
 	/* Unrecognised? */
-- 
1.7.1


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

* [PATCH 11/13] KVM: x86 emulator: simplify Group 1 decoding
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (9 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 10/13] KVM: x86 emulator: mix decode bits from opcode and group decode tables Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 12/13] KVM: x86 emulator: Allow LOCK prefix for NEG and NOT Avi Kivity
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Move operand decoding to the opcode table, keep lock decoding in the group
table.  This allows us to get consolidate the four variants of Group 1 into one
group.

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 8834672..09ee418 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -105,8 +105,7 @@
 #define X16(x) X8(x), X8(x)
 
 enum {
-	Group1_80, Group1_81, Group1_82, Group1_83,
-	Group1A, Group3_Byte, Group3, Group4, Group5, Group7,
+	Group1, Group1A, Group3_Byte, Group3, Group4, Group5, Group7,
 	Group8, Group9,
 };
 
@@ -165,8 +164,10 @@ static u32 opcode_table[256] = {
 	/* 0x70 - 0x7F */
 	X16(SrcImmByte),
 	/* 0x80 - 0x87 */
-	Group | Group1_80, Group | Group1_81,
-	Group | Group1_82, Group | Group1_83,
+	ByteOp | DstMem | SrcImm | ModRM | Group | Group1,
+	DstMem | SrcImm | ModRM | Group | Group1,
+	ByteOp | DstMem | SrcImm | ModRM | No64 | Group | Group1,
+	DstMem | SrcImmByte | ModRM | Group | Group1,
 	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
 	ByteOp | DstMem | SrcReg | ModRM | Lock, DstMem | SrcReg | ModRM | Lock,
 	/* 0x88 - 0x8F */
@@ -285,42 +286,8 @@ static u32 twobyte_table[256] = {
 };
 
 static u32 group_table[] = {
-	[Group1_80*8] =
-	ByteOp | DstMem | SrcImm | ModRM | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | Lock,
-	ByteOp | DstMem | SrcImm | ModRM,
-	[Group1_81*8] =
-	DstMem | SrcImm | ModRM | Lock,
-	DstMem | SrcImm | ModRM | Lock,
-	DstMem | SrcImm | ModRM | Lock,
-	DstMem | SrcImm | ModRM | Lock,
-	DstMem | SrcImm | ModRM | Lock,
-	DstMem | SrcImm | ModRM | Lock,
-	DstMem | SrcImm | ModRM | Lock,
-	DstMem | SrcImm | ModRM,
-	[Group1_82*8] =
-	ByteOp | DstMem | SrcImm | ModRM | No64 | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | No64 | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | No64 | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | No64 | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | No64 | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | No64 | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | No64 | Lock,
-	ByteOp | DstMem | SrcImm | ModRM | No64,
-	[Group1_83*8] =
-	DstMem | SrcImmByte | ModRM | Lock,
-	DstMem | SrcImmByte | ModRM | Lock,
-	DstMem | SrcImmByte | ModRM | Lock,
-	DstMem | SrcImmByte | ModRM | Lock,
-	DstMem | SrcImmByte | ModRM | Lock,
-	DstMem | SrcImmByte | ModRM | Lock,
-	DstMem | SrcImmByte | ModRM | Lock,
-	DstMem | SrcImmByte | ModRM,
+	[Group1*8] =
+	X7(Lock), 0,
 	[Group1A*8] =
 	DstMem | SrcNone | ModRM | Mov | Stack, 0, 0, 0, 0, 0, 0, 0,
 	[Group3_Byte*8] =
-- 
1.7.1


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

* [PATCH 12/13] KVM: x86 emulator: Allow LOCK prefix for NEG and NOT
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (10 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 11/13] KVM: x86 emulator: simplify Group 1 decoding Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-26 11:37 ` [PATCH 13/13] KVM: x86 emulator: unify the two Group 3 variants Avi Kivity
  2010-07-27 23:21 ` [PATCH 00/13] Emulator group simplification Marcelo Tosatti
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Opcodes F6/2, F6/3, F7/2, F7/3.

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 09ee418..206c009 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -292,11 +292,11 @@ static u32 group_table[] = {
 	DstMem | SrcNone | ModRM | Mov | Stack, 0, 0, 0, 0, 0, 0, 0,
 	[Group3_Byte*8] =
 	ByteOp | SrcImm | DstMem | ModRM, ByteOp | SrcImm | DstMem | ModRM,
-	ByteOp | DstMem | SrcNone | ModRM, ByteOp | DstMem | SrcNone | ModRM,
+	ByteOp | DstMem | SrcNone | ModRM | Lock, ByteOp | DstMem | SrcNone | ModRM | Lock,
 	0, 0, 0, 0,
 	[Group3*8] =
 	DstMem | SrcImm | ModRM, DstMem | SrcImm | ModRM,
-	DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM,
+	DstMem | SrcNone | ModRM | Lock, DstMem | SrcNone | ModRM | Lock,
 	0, 0, 0, 0,
 	[Group4*8] =
 	ByteOp | DstMem | SrcNone | ModRM | Lock, ByteOp | DstMem | SrcNone | ModRM | Lock,
-- 
1.7.1


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

* [PATCH 13/13] KVM: x86 emulator: unify the two Group 3 variants
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (11 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 12/13] KVM: x86 emulator: Allow LOCK prefix for NEG and NOT Avi Kivity
@ 2010-07-26 11:37 ` Avi Kivity
  2010-07-27 23:21 ` [PATCH 00/13] Emulator group simplification Marcelo Tosatti
  13 siblings, 0 replies; 15+ messages in thread
From: Avi Kivity @ 2010-07-26 11:37 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Use just one group table for byte (F6) and word (F7) opcodes.

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

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 206c009..ac2477b 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -105,8 +105,7 @@
 #define X16(x) X8(x), X8(x)
 
 enum {
-	Group1, Group1A, Group3_Byte, Group3, Group4, Group5, Group7,
-	Group8, Group9,
+	Group1, Group1A, Group3, Group4, Group5, Group7, Group8, Group9,
 };
 
 static u32 opcode_table[256] = {
@@ -217,7 +216,7 @@ static u32 opcode_table[256] = {
 	SrcNone | ByteOp | DstAcc, SrcNone | DstAcc,
 	/* 0xF0 - 0xF7 */
 	0, 0, 0, 0,
-	ImplicitOps | Priv, ImplicitOps, Group | Group3_Byte, Group | Group3,
+	ImplicitOps | Priv, ImplicitOps, ByteOp | Group | Group3, Group | Group3,
 	/* 0xF8 - 0xFF */
 	ImplicitOps, 0, ImplicitOps, ImplicitOps,
 	ImplicitOps, ImplicitOps, Group | Group4, Group | Group5,
@@ -290,14 +289,10 @@ static u32 group_table[] = {
 	X7(Lock), 0,
 	[Group1A*8] =
 	DstMem | SrcNone | ModRM | Mov | Stack, 0, 0, 0, 0, 0, 0, 0,
-	[Group3_Byte*8] =
-	ByteOp | SrcImm | DstMem | ModRM, ByteOp | SrcImm | DstMem | ModRM,
-	ByteOp | DstMem | SrcNone | ModRM | Lock, ByteOp | DstMem | SrcNone | ModRM | Lock,
-	0, 0, 0, 0,
 	[Group3*8] =
 	DstMem | SrcImm | ModRM, DstMem | SrcImm | ModRM,
 	DstMem | SrcNone | ModRM | Lock, DstMem | SrcNone | ModRM | Lock,
-	0, 0, 0, 0,
+	X4(Undefined),
 	[Group4*8] =
 	ByteOp | DstMem | SrcNone | ModRM | Lock, ByteOp | DstMem | SrcNone | ModRM | Lock,
 	0, 0, 0, 0, 0, 0,
-- 
1.7.1


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

* Re: [PATCH 00/13] Emulator group simplification
  2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
                   ` (12 preceding siblings ...)
  2010-07-26 11:37 ` [PATCH 13/13] KVM: x86 emulator: unify the two Group 3 variants Avi Kivity
@ 2010-07-27 23:21 ` Marcelo Tosatti
  13 siblings, 0 replies; 15+ messages in thread
From: Marcelo Tosatti @ 2010-07-27 23:21 UTC (permalink / raw)
  To: Avi Kivity; +Cc: kvm

On Mon, Jul 26, 2010 at 02:37:38PM +0300, Avi Kivity wrote:
> This patchset simplifies the x86 emulator group decoding, cleans up the decoder
> tables (and adds a missing Lock marker as well).
> 
> Avi Kivity (13):
>   KVM: x86 emulator: add macros for repetitive instructions
>   KVM: x86 emulator: consolidate inc/dec reg decoding
>   KVM: x86 emulator: consolidate push/pop reg decoding
>   KVM: X86 emulator: consolidate Jcc rel8 decoding
>   KVM: x86 emulator: consolidate MOV reg, imm decoding
>   KVM: x86 emulator: consolidate CMOVcc decoding
>   KVM: x86 emulator: consolidate Jcc rel32 decoding
>   KVM: x86 emulator: Make group storage bits separate from operand bits
>   KVM: x86 emulator: add Undefined decode flag
>   KVM: x86 emulator: mix decode bits from opcode and group decode
>     tables
>   KVM: x86 emulator: simplify Group 1 decoding
>   KVM: x86 emulator: Allow LOCK prefix for NEG and NOT
>   KVM: x86 emulator: unify the two Group 3 variants
> 
>  arch/x86/kvm/emulate.c |  143 ++++++++++++++++--------------------------------
>  1 files changed, 47 insertions(+), 96 deletions(-)

Applied, thanks.

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

end of thread, other threads:[~2010-07-28 15:05 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-26 11:37 [PATCH 00/13] Emulator group simplification Avi Kivity
2010-07-26 11:37 ` [PATCH 01/13] KVM: x86 emulator: add macros for repetitive instructions Avi Kivity
2010-07-26 11:37 ` [PATCH 02/13] KVM: x86 emulator: consolidate inc/dec reg decoding Avi Kivity
2010-07-26 11:37 ` [PATCH 03/13] KVM: x86 emulator: consolidate push/pop " Avi Kivity
2010-07-26 11:37 ` [PATCH 04/13] KVM: X86 emulator: consolidate Jcc rel8 decoding Avi Kivity
2010-07-26 11:37 ` [PATCH 05/13] KVM: x86 emulator: consolidate MOV reg, imm decoding Avi Kivity
2010-07-26 11:37 ` [PATCH 06/13] KVM: x86 emulator: consolidate CMOVcc decoding Avi Kivity
2010-07-26 11:37 ` [PATCH 07/13] KVM: x86 emulator: consolidate Jcc rel32 decoding Avi Kivity
2010-07-26 11:37 ` [PATCH 08/13] KVM: x86 emulator: Make group storage bits separate from operand bits Avi Kivity
2010-07-26 11:37 ` [PATCH 09/13] KVM: x86 emulator: add Undefined decode flag Avi Kivity
2010-07-26 11:37 ` [PATCH 10/13] KVM: x86 emulator: mix decode bits from opcode and group decode tables Avi Kivity
2010-07-26 11:37 ` [PATCH 11/13] KVM: x86 emulator: simplify Group 1 decoding Avi Kivity
2010-07-26 11:37 ` [PATCH 12/13] KVM: x86 emulator: Allow LOCK prefix for NEG and NOT Avi Kivity
2010-07-26 11:37 ` [PATCH 13/13] KVM: x86 emulator: unify the two Group 3 variants Avi Kivity
2010-07-27 23:21 ` [PATCH 00/13] Emulator group simplification Marcelo Tosatti

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox