* [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 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.