All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 01/10] Add decoding of 16bit second immediate argument.
@ 2009-04-12 10:36 Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 02/10] Add lcall decoding Gleb Natapov
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:36 UTC (permalink / raw)
  To: avi; +Cc: kvm

Such as segment number in lcall/ljmp

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/kvm/x86_emulate.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index d7c9f6f..c015063 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -76,6 +76,7 @@
 #define Src2CL      (1<<29)
 #define Src2ImmByte (2<<29)
 #define Src2One     (3<<29)
+#define Src2Imm16   (4<<29)
 #define Src2Mask    (7<<29)
 
 enum {
@@ -1072,6 +1073,12 @@ done_prefixes:
 		c->src2.bytes = 1;
 		c->src2.val = insn_fetch(u8, 1, c->eip);
 		break;
+	case Src2Imm16:
+		c->src2.type = OP_IMM;
+		c->src2.ptr = (unsigned long *)c->eip;
+		c->src2.bytes = 2;
+		c->src2.val = insn_fetch(u16, 2, c->eip);
+		break;
 	case Src2One:
 		c->src2.bytes = 1;
 		c->src2.val = 1;


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

* [PATCH v3 02/10] Add lcall decoding.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
@ 2009-04-12 10:36 ` Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 03/10] Complete ljmp decoding at decode stage Gleb Natapov
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:36 UTC (permalink / raw)
  To: avi; +Cc: kvm

No emulation yet.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/kvm/x86_emulate.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index c015063..71b4bee 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -154,7 +154,8 @@ static u32 opcode_table[256] = {
 	/* 0x90 - 0x97 */
 	DstReg, DstReg, DstReg, DstReg,	DstReg, DstReg, DstReg, DstReg,
 	/* 0x98 - 0x9F */
-	0, 0, 0, 0, ImplicitOps | Stack, ImplicitOps | Stack, 0, 0,
+	0, 0, SrcImm | Src2Imm16, 0,
+	ImplicitOps | Stack, ImplicitOps | Stack, 0, 0,
 	/* 0xA0 - 0xA7 */
 	ByteOp | DstReg | SrcMem | Mov | MemAbs, DstReg | SrcMem | Mov | MemAbs,
 	ByteOp | DstMem | SrcReg | Mov | MemAbs, DstMem | SrcReg | Mov | MemAbs,


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

* [PATCH v3 03/10] Complete ljmp decoding at decode stage.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 02/10] Add lcall decoding Gleb Natapov
@ 2009-04-12 10:36 ` Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 04/10] Complete short/near jcc decoding in " Gleb Natapov
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:36 UTC (permalink / raw)
  To: avi; +Cc: kvm

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/kvm/x86_emulate.c |   25 +++++--------------------
 1 files changed, 5 insertions(+), 20 deletions(-)

diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index 71b4bee..8779cf2 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -193,7 +193,7 @@ static u32 opcode_table[256] = {
 	SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
 	/* 0xE8 - 0xEF */
 	ImplicitOps | Stack, SrcImm | ImplicitOps,
-	ImplicitOps, SrcImmByte | ImplicitOps,
+	SrcImm | Src2Imm16, SrcImmByte | ImplicitOps,
 	SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
 	SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
 	/* 0xF0 - 0xF7 */
@@ -1805,30 +1805,15 @@ special_insn:
 	}
 	case 0xe9: /* jmp rel */
 		goto jmp;
-	case 0xea: /* jmp far */ {
-		uint32_t eip;
-		uint16_t sel;
-
-		switch (c->op_bytes) {
-		case 2:
-			eip = insn_fetch(u16, 2, c->eip);
-			break;
-		case 4:
-			eip = insn_fetch(u32, 4, c->eip);
-			break;
-		default:
-			DPRINTF("jmp far: Invalid op_bytes\n");
-			goto cannot_emulate;
-		}
-		sel = insn_fetch(u16, 2, c->eip);
-		if (kvm_load_segment_descriptor(ctxt->vcpu, sel, 9, VCPU_SREG_CS) < 0) {
+	case 0xea: /* jmp far */
+		if (kvm_load_segment_descriptor(ctxt->vcpu, c->src2.val, 9,
+					VCPU_SREG_CS) < 0) {
 			DPRINTF("jmp far: Failed to load CS descriptor\n");
 			goto cannot_emulate;
 		}
 
-		c->eip = eip;
+		c->eip = c->src.val;
 		break;
-	}
 	case 0xeb:
 	      jmp:		/* jmp rel short */
 		jmp_rel(c, c->src.val);


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

* [PATCH v3 04/10] Complete short/near jcc decoding in decode stage.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 02/10] Add lcall decoding Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 03/10] Complete ljmp decoding at decode stage Gleb Natapov
@ 2009-04-12 10:36 ` Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 05/10] Complete decoding of call near " Gleb Natapov
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:36 UTC (permalink / raw)
  To: avi; +Cc: kvm

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/kvm/x86_emulate.c |   42 ++++++++++--------------------------------
 1 files changed, 10 insertions(+), 32 deletions(-)

diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index 8779cf2..14b8ee2 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -136,11 +136,11 @@ static u32 opcode_table[256] = {
 	SrcNone  | ByteOp  | ImplicitOps, SrcNone  | ImplicitOps, /* insb, insw/insd */
 	SrcNone  | ByteOp  | ImplicitOps, SrcNone  | ImplicitOps, /* outsb, outsw/outsd */
 	/* 0x70 - 0x77 */
-	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
-	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
+	SrcImmByte, SrcImmByte, SrcImmByte, SrcImmByte,
+	SrcImmByte, SrcImmByte, SrcImmByte, SrcImmByte,
 	/* 0x78 - 0x7F */
-	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
-	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
+	SrcImmByte, SrcImmByte, SrcImmByte, SrcImmByte,
+	SrcImmByte, SrcImmByte, SrcImmByte, SrcImmByte,
 	/* 0x80 - 0x87 */
 	Group | Group1_80, Group | Group1_81,
 	Group | Group1_82, Group | Group1_83,
@@ -232,10 +232,8 @@ 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 */
-	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
-	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
-	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
-	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
+	SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm,
+	SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm, SrcImm,
 	/* 0x90 - 0x9F */
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	/* 0xA0 - 0xA7 */
@@ -1539,13 +1537,10 @@ special_insn:
 			return -1;
 		}
 		return 0;
-	case 0x70 ... 0x7f: /* jcc (short) */ {
-		int rel = insn_fetch(s8, 1, c->eip);
-
+	case 0x70 ... 0x7f: /* jcc (short) */
 		if (test_cc(c->b, ctxt->eflags))
-			jmp_rel(c, rel);
+			jmp_rel(c, c->src.val);
 		break;
-	}
 	case 0x80 ... 0x83:	/* Grp1 */
 		switch (c->modrm_reg) {
 		case 0:
@@ -2031,28 +2026,11 @@ twobyte_insn:
 		if (!test_cc(c->b, ctxt->eflags))
 			c->dst.type = OP_NONE; /* no writeback */
 		break;
-	case 0x80 ... 0x8f: /* jnz rel, etc*/ {
-		long int rel;
-
-		switch (c->op_bytes) {
-		case 2:
-			rel = insn_fetch(s16, 2, c->eip);
-			break;
-		case 4:
-			rel = insn_fetch(s32, 4, c->eip);
-			break;
-		case 8:
-			rel = insn_fetch(s64, 8, c->eip);
-			break;
-		default:
-			DPRINTF("jnz: Invalid op_bytes\n");
-			goto cannot_emulate;
-		}
+	case 0x80 ... 0x8f: /* jnz rel, etc*/
 		if (test_cc(c->b, ctxt->eflags))
-			jmp_rel(c, rel);
+			jmp_rel(c, c->src.val);
 		c->dst.type = OP_NONE;
 		break;
-	}
 	case 0xa3:
 	      bt:		/* bt */
 		c->dst.type = OP_NONE;


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

* [PATCH v3 05/10] Complete decoding of call near in decode stage.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
                   ` (2 preceding siblings ...)
  2009-04-12 10:36 ` [PATCH v3 04/10] Complete short/near jcc decoding in " Gleb Natapov
@ 2009-04-12 10:36 ` Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 06/10] Add unsigned byte immediate decode Gleb Natapov
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:36 UTC (permalink / raw)
  To: avi; +Cc: kvm

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/kvm/x86_emulate.c |   15 ++-------------
 1 files changed, 2 insertions(+), 13 deletions(-)

diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index 14b8ee2..4a9cd4c 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -192,7 +192,7 @@ static u32 opcode_table[256] = {
 	SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
 	SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
 	/* 0xE8 - 0xEF */
-	ImplicitOps | Stack, SrcImm | ImplicitOps,
+	SrcImm | Stack, SrcImm | ImplicitOps,
 	SrcImm | Src2Imm16, SrcImmByte | ImplicitOps,
 	SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
 	SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
@@ -1781,18 +1781,7 @@ special_insn:
 		io_dir_in = 0;
 		goto do_io;
 	case 0xe8: /* call (near) */ {
-		long int rel;
-		switch (c->op_bytes) {
-		case 2:
-			rel = insn_fetch(s16, 2, c->eip);
-			break;
-		case 4:
-			rel = insn_fetch(s32, 4, c->eip);
-			break;
-		default:
-			DPRINTF("Call: Invalid op_bytes\n");
-			goto cannot_emulate;
-		}
+		long int rel = c->src.val;
 		c->src.val = (unsigned long) c->eip;
 		jmp_rel(c, rel);
 		emulate_push(ctxt);


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

* [PATCH v3 06/10] Add unsigned byte immediate decode.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
                   ` (3 preceding siblings ...)
  2009-04-12 10:36 ` [PATCH v3 05/10] Complete decoding of call near " Gleb Natapov
@ 2009-04-12 10:36 ` Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 07/10] Completely decode in/out at decoding stage Gleb Natapov
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:36 UTC (permalink / raw)
  To: avi; +Cc: kvm

Extend "Source operand type" opcode description field to 4 bites
to accommodate new option.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/kvm/x86_emulate.c |   17 +++++++++++------
 1 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index 4a9cd4c..0988a13 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -59,13 +59,14 @@
 #define SrcImm      (5<<4)	/* Immediate operand. */
 #define SrcImmByte  (6<<4)	/* 8-bit sign-extended immediate operand. */
 #define SrcOne      (7<<4)	/* Implied '1' */
-#define SrcMask     (7<<4)
+#define SrcImmUByte (8<<4)      /* 8-bit unsigned immediate operand. */
+#define SrcMask     (0xf<<4)
 /* Generic ModRM decode. */
-#define ModRM       (1<<7)
+#define ModRM       (1<<8)
 /* Destination is only written; never read. */
-#define Mov         (1<<8)
-#define BitOp       (1<<9)
-#define MemAbs      (1<<10)      /* Memory operand is absolute displacement */
+#define Mov         (1<<9)
+#define BitOp       (1<<10)
+#define MemAbs      (1<<11)      /* Memory operand is absolute displacement */
 #define String      (1<<12)     /* String instruction (rep capable) */
 #define Stack       (1<<13)     /* Stack instruction (push/pop) */
 #define Group       (1<<14)     /* Bits 3:5 of modrm byte extend opcode */
@@ -1044,10 +1045,14 @@ done_prefixes:
 		}
 		break;
 	case SrcImmByte:
+	case SrcImmUByte:
 		c->src.type = OP_IMM;
 		c->src.ptr = (unsigned long *)c->eip;
 		c->src.bytes = 1;
-		c->src.val = insn_fetch(s8, 1, c->eip);
+		if ((c->d & SrcMask) == SrcImmByte)
+			c->src.val = insn_fetch(s8, 1, c->eip);
+		else
+			c->src.val = insn_fetch(u8, 1, c->eip);
 		break;
 	case SrcOne:
 		c->src.bytes = 1;


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

* [PATCH v3 07/10] Completely decode in/out at decoding stage.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
                   ` (4 preceding siblings ...)
  2009-04-12 10:36 ` [PATCH v3 06/10] Add unsigned byte immediate decode Gleb Natapov
@ 2009-04-12 10:36 ` Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 08/10] Decode soft interrupt instructions Gleb Natapov
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:36 UTC (permalink / raw)
  To: avi; +Cc: kvm

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/kvm/x86_emulate.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index 0988a13..c2f55ca 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -190,8 +190,8 @@ static u32 opcode_table[256] = {
 	0, 0, 0, 0, 0, 0, 0, 0,
 	/* 0xE0 - 0xE7 */
 	0, 0, 0, 0,
-	SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
-	SrcNone | ByteOp | ImplicitOps, SrcNone | ImplicitOps,
+	ByteOp | SrcImmUByte, SrcImmUByte,
+	ByteOp | SrcImmUByte, SrcImmUByte,
 	/* 0xE8 - 0xEF */
 	SrcImm | Stack, SrcImm | ImplicitOps,
 	SrcImm | Src2Imm16, SrcImmByte | ImplicitOps,
@@ -1777,12 +1777,12 @@ special_insn:
 		break;
 	case 0xe4: 	/* inb */
 	case 0xe5: 	/* in */
-		port = insn_fetch(u8, 1, c->eip);
+		port = c->src.val;
 		io_dir_in = 1;
 		goto do_io;
 	case 0xe6: /* outb */
 	case 0xe7: /* out */
-		port = insn_fetch(u8, 1, c->eip);
+		port = c->src.val;
 		io_dir_in = 0;
 		goto do_io;
 	case 0xe8: /* call (near) */ {


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

* [PATCH v3 08/10] Decode soft interrupt instructions.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
                   ` (5 preceding siblings ...)
  2009-04-12 10:36 ` [PATCH v3 07/10] Completely decode in/out at decoding stage Gleb Natapov
@ 2009-04-12 10:36 ` Gleb Natapov
  2009-04-12 10:36 ` [PATCH v3 09/10] Add new mode of instruction emulation: skip Gleb Natapov
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:36 UTC (permalink / raw)
  To: avi; +Cc: kvm

Do not emulate them yet.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/kvm/x86_emulate.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index c2f55ca..d2664fc 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -181,7 +181,8 @@ static u32 opcode_table[256] = {
 	0, ImplicitOps | Stack, 0, 0,
 	ByteOp | DstMem | SrcImm | ModRM | Mov, DstMem | SrcImm | ModRM | Mov,
 	/* 0xC8 - 0xCF */
-	0, 0, 0, ImplicitOps | Stack, 0, 0, 0, 0,
+	0, 0, 0, ImplicitOps | Stack,
+	ImplicitOps, SrcImmByte, ImplicitOps, ImplicitOps,
 	/* 0xD0 - 0xD7 */
 	ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM,
 	ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM,


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

* [PATCH v3 09/10] Add new mode of instruction emulation: skip.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
                   ` (6 preceding siblings ...)
  2009-04-12 10:36 ` [PATCH v3 08/10] Decode soft interrupt instructions Gleb Natapov
@ 2009-04-12 10:36 ` Gleb Natapov
  2009-04-12 10:37 ` [PATCH v3 10/10] [AMD] Skip instruction on a task switch only when appropriate Gleb Natapov
  2009-04-12 11:43 ` [PATCH v3 01/10] Add decoding of 16bit second immediate argument Avi Kivity
  9 siblings, 0 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:36 UTC (permalink / raw)
  To: avi; +Cc: kvm

In the new mode instruction is decoded, but not executed. The EIP
is moved to point after the instruction.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/include/asm/kvm_host.h |    1 +
 arch/x86/kvm/x86.c              |    5 +++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 3fc4623..e672ca5 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -565,6 +565,7 @@ enum emulation_result {
 
 #define EMULTYPE_NO_DECODE	    (1 << 0)
 #define EMULTYPE_TRAP_UD	    (1 << 1)
+#define EMULTYPE_SKIP		    (1 << 2)
 int emulate_instruction(struct kvm_vcpu *vcpu, struct kvm_run *run,
 			unsigned long cr2, u16 error_code, int emulation_type);
 void kvm_report_emulation_failure(struct kvm_vcpu *cvpu, const char *context);
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 0bb4131..52c7a29 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2412,6 +2412,11 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
 		}
 	}
 
+	if (emulation_type & EMULTYPE_SKIP) {
+		kvm_rip_write(vcpu, vcpu->arch.emulate_ctxt.decode.eip);
+		return EMULATE_DONE;
+	}
+
 	r = x86_emulate_insn(&vcpu->arch.emulate_ctxt, &emulate_ops);
 
 	if (vcpu->arch.pio.string)


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

* [PATCH v3 10/10] [AMD] Skip instruction on a task switch only when appropriate.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
                   ` (7 preceding siblings ...)
  2009-04-12 10:36 ` [PATCH v3 09/10] Add new mode of instruction emulation: skip Gleb Natapov
@ 2009-04-12 10:37 ` Gleb Natapov
  2009-04-12 11:43 ` [PATCH v3 01/10] Add decoding of 16bit second immediate argument Avi Kivity
  9 siblings, 0 replies; 11+ messages in thread
From: Gleb Natapov @ 2009-04-12 10:37 UTC (permalink / raw)
  To: avi; +Cc: kvm

If a task switch was initiated because off a task gate in IDT and IDT
was accessed because of an external even the instruction should not
be skipped.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 arch/x86/kvm/svm.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 3ffb695..053f3c5 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1826,6 +1826,7 @@ static int task_switch_interception(struct vcpu_svm *svm,
 	int reason;
 	int int_type = svm->vmcb->control.exit_int_info &
 		SVM_EXITINTINFO_TYPE_MASK;
+	int int_vec = svm->vmcb->control.exit_int_info & SVM_EVTINJ_VEC_MASK;
 
 	tss_selector = (u16)svm->vmcb->control.exit_info_1;
 
@@ -1841,8 +1842,14 @@ static int task_switch_interception(struct vcpu_svm *svm,
 		reason = TASK_SWITCH_CALL;
 
 
-	if (reason != TASK_SWITCH_GATE || int_type == SVM_EXITINTINFO_TYPE_SOFT)
-		skip_emulated_instruction(&svm->vcpu);
+	if (reason != TASK_SWITCH_GATE ||
+	    int_type == SVM_EXITINTINFO_TYPE_SOFT ||
+	    (int_type == SVM_EXITINTINFO_TYPE_EXEPT &&
+	     (int_vec == OF_VECTOR || int_vec == BP_VECTOR))) {
+		if (emulate_instruction(&svm->vcpu, kvm_run, 0, 0,
+					EMULTYPE_SKIP) != EMULATE_DONE)
+			return 0;
+	}
 
 	return kvm_task_switch(&svm->vcpu, tss_selector, reason);
 }


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

* Re: [PATCH v3 01/10] Add decoding of 16bit second immediate argument.
  2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
                   ` (8 preceding siblings ...)
  2009-04-12 10:37 ` [PATCH v3 10/10] [AMD] Skip instruction on a task switch only when appropriate Gleb Natapov
@ 2009-04-12 11:43 ` Avi Kivity
  9 siblings, 0 replies; 11+ messages in thread
From: Avi Kivity @ 2009-04-12 11:43 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: kvm

Gleb Natapov wrote:
> Such as segment number in lcall/ljmp
>
>   

Applied all, thanks.

-- 
error compiling committee.c: too many arguments to function


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

end of thread, other threads:[~2009-04-12 11:43 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-12 10:36 [PATCH v3 01/10] Add decoding of 16bit second immediate argument Gleb Natapov
2009-04-12 10:36 ` [PATCH v3 02/10] Add lcall decoding Gleb Natapov
2009-04-12 10:36 ` [PATCH v3 03/10] Complete ljmp decoding at decode stage Gleb Natapov
2009-04-12 10:36 ` [PATCH v3 04/10] Complete short/near jcc decoding in " Gleb Natapov
2009-04-12 10:36 ` [PATCH v3 05/10] Complete decoding of call near " Gleb Natapov
2009-04-12 10:36 ` [PATCH v3 06/10] Add unsigned byte immediate decode Gleb Natapov
2009-04-12 10:36 ` [PATCH v3 07/10] Completely decode in/out at decoding stage Gleb Natapov
2009-04-12 10:36 ` [PATCH v3 08/10] Decode soft interrupt instructions Gleb Natapov
2009-04-12 10:36 ` [PATCH v3 09/10] Add new mode of instruction emulation: skip Gleb Natapov
2009-04-12 10:37 ` [PATCH v3 10/10] [AMD] Skip instruction on a task switch only when appropriate Gleb Natapov
2009-04-12 11:43 ` [PATCH v3 01/10] Add decoding of 16bit second immediate argument Avi Kivity

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.