diff mbox

x86 emulator: Add pop es instruction (opcode 0x07)

Message ID 20090225213929.GA22725@mohd-laptop (mailing list archive)
State New, archived
Headers show

Commit Message

Mohammed Gamal Feb. 25, 2009, 9:39 p.m. UTC
Add pop es instruction

Signed-off-by: Mohammed Gamal <m.gamal005@gmail.com>
---
 arch/x86/kvm/x86_emulate.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

Comments

Avi Kivity Feb. 26, 2009, 7:13 a.m. UTC | #1
Mohammed Gamal wrote:
> Add pop es instruction
>
>   

Hi again...

> @@ -1446,6 +1446,9 @@ special_insn:
>  	      add:		/* add */
>  		emulate_2op_SrcV("add", c->src, c->dst, ctxt->eflags);
>  		break;
> +	case 0x07:		/* pop es */
> +		emulate_pop(ctxt, ops, &c->regs[VCPU_SREG_ES], c->op_bytes); 
> +		break;
>  	case 0x08 ... 0x0d:
>  	      or:		/* or */
>  		emulate_2op_SrcV("or", c->src, c->dst, ctxt->eflags);
>   

... but this is insufficient.  You need to load the segment cache, see 
kvm_load_segment_descriptor().
diff mbox

Patch

diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index ca91749..8c292b6 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -87,7 +87,7 @@  static u32 opcode_table[256] = {
 	/* 0x00 - 0x07 */
 	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
 	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
-	ByteOp | DstAcc | SrcImm, DstAcc | SrcImm, 0, 0,
+	ByteOp | DstAcc | SrcImm, DstAcc | SrcImm, 0, DstReg | ModRM,
 	/* 0x08 - 0x0F */
 	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
 	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
@@ -1446,6 +1446,9 @@  special_insn:
 	      add:		/* add */
 		emulate_2op_SrcV("add", c->src, c->dst, ctxt->eflags);
 		break;
+	case 0x07:		/* pop es */
+		emulate_pop(ctxt, ops, &c->regs[VCPU_SREG_ES], c->op_bytes); 
+		break;
 	case 0x08 ... 0x0d:
 	      or:		/* or */
 		emulate_2op_SrcV("or", c->src, c->dst, ctxt->eflags);