public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <Laurent.Vivier-6ktuUTfB/bM@public.gmane.org>
To: kvm-devel <kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
Subject: [PATCH 2/5] group all prefix decoding results in a structure called x86_prefix
Date: Wed, 01 Aug 2007 11:13:29 +0200	[thread overview]
Message-ID: <46B04EB9.5010103@bull.net> (raw)
In-Reply-To: <46B04DD6.7010702-6ktuUTfB/bM@public.gmane.org>


[-- Attachment #1.1.1: Type: text/plain, Size: 345 bytes --]

To be able to extract easily prefix decoding from x86_emulate_memop(), group all
prefix decoding results in a structure called x86_prefix.

Signed-off-by: Laurent Vivier <Laurent.Vivier-6ktuUTfB/bM@public.gmane.org>
-- 
------------- Laurent.Vivier-6ktuUTfB/bM@public.gmane.org  --------------
          "Software is hard" - Donald Knuth

[-- Attachment #1.1.2: x86_prefix --]
[-- Type: text/plain, Size: 18464 bytes --]

Index: kvm/drivers/kvm/x86_emulate.h
===================================================================
--- kvm.orig/drivers/kvm/x86_emulate.h	2007-07-31 17:00:22.000000000 +0200
+++ kvm/drivers/kvm/x86_emulate.h	2007-07-31 17:03:26.000000000 +0200
@@ -141,6 +141,21 @@
 #define X86EMUL_MODE_PROT32   4	/* 32-bit protected mode. */
 #define X86EMUL_MODE_PROT64   8	/* 64-bit (long) mode.    */
 
+struct x86_prefix {
+	unsigned int op_bytes;
+	unsigned int ad_bytes;
+	int override_base;
+
+	u8 lock;	/* LOCK prefix */
+	u8 rep;		/* REP prefix */
+	u8 rex;		/* REX prefix */
+
+	int index_reg;
+	int base_reg;
+	u8 modrm_reg;
+	u8 modrm_rm;
+};
+
 /* Host execution mode. */
 #if defined(__i386__)
 #define X86EMUL_MODE_HOST X86EMUL_MODE_PROT32
Index: kvm/drivers/kvm/x86_emulate.c
===================================================================
--- kvm.orig/drivers/kvm/x86_emulate.c	2007-07-31 17:01:52.000000000 +0200
+++ kvm/drivers/kvm/x86_emulate.c	2007-07-31 17:07:30.000000000 +0200
@@ -430,18 +430,18 @@
 
 /* Access/update address held in a register, based on addressing mode. */
 #define register_address(base, reg)                                     \
-	((base) + ((ad_bytes == sizeof(unsigned long)) ? (reg) :	\
-		   ((reg) & ((1UL << (ad_bytes << 3)) - 1))))
+	((base) + ((prefix.ad_bytes == sizeof(unsigned long)) ? (reg) :	\
+		   ((reg) & ((1UL << (prefix.ad_bytes << 3)) - 1))))
 
 #define register_address_increment(reg, inc)                            \
 	do {								\
 		/* signed type ensures sign extension to long */        \
 		int _inc = (inc);					\
-		if ( ad_bytes == sizeof(unsigned long) )		\
+		if ( prefix.ad_bytes == sizeof(unsigned long) )		\
 			(reg) += _inc;					\
 		else							\
-			(reg) = ((reg) & ~((1UL << (ad_bytes << 3)) - 1)) | \
-			   (((reg) + _inc) & ((1UL << (ad_bytes << 3)) - 1)); \
+			(reg) = ((reg) & ~((1UL << (prefix.ad_bytes << 3)) - 1)) | \
+			   (((reg) + _inc) & ((1UL << (prefix.ad_bytes << 3)) - 1)); \
 	} while (0)
 
 /*
@@ -483,18 +483,18 @@
 x86_emulate_memop(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
 {
 	unsigned d;
-	u8 b, sib, twobyte = 0, rex_prefix = 0;
-	u8 modrm, modrm_mod = 0, modrm_reg = 0, modrm_rm = 0;
-	int override_base = -1;
-	unsigned int op_bytes, ad_bytes, lock_prefix = 0, rep_prefix = 0, i;
+	u8 b, sib, twobyte = 0;
+	u8 modrm, modrm_mod = 0;
+	unsigned int i;
 	int rc = 0;
 	struct operand src, dst;
 	unsigned long cr2 = ctxt->cr2;
 	int mode = ctxt->mode;
 	unsigned long modrm_ea;
-	int use_modrm_ea, index_reg = 0, base_reg = 0, scale, rip_relative = 0;
+	int use_modrm_ea, scale, rip_relative = 0;
 	int no_wb = 0;
 	u64 msr_data;
+	struct x86_prefix prefix;
 
 	/* Shadow copy of register state. Committed on successful emulation. */
 	unsigned long _regs[NR_VCPU_REGS];
@@ -502,19 +502,21 @@
 	unsigned long modrm_val = 0;
 
 	memcpy(_regs, ctxt->vcpu->regs, sizeof _regs);
+	memset(&prefix, 0, sizeof(prefix));
+	prefix.override_base = -1;
 
 	switch (mode) {
 	case X86EMUL_MODE_REAL:
 	case X86EMUL_MODE_PROT16:
-		op_bytes = ad_bytes = 2;
+		prefix.op_bytes = prefix.ad_bytes = 2;
 		break;
 	case X86EMUL_MODE_PROT32:
-		op_bytes = ad_bytes = 4;
+		prefix.op_bytes = prefix.ad_bytes = 4;
 		break;
 #ifdef CONFIG_X86_64
 	case X86EMUL_MODE_PROT64:
-		op_bytes = 4;
-		ad_bytes = 8;
+		prefix.op_bytes = 4;
+		prefix.ad_bytes = 8;
 		break;
 #endif
 	default:
@@ -525,37 +527,37 @@
 	for (i = 0; i < 8; i++) {
 		switch (b = insn_fetch(u8, 1, _eip)) {
 		case 0x66:	/* operand-size override */
-			op_bytes ^= 6;	/* switch between 2/4 bytes */
+			prefix.op_bytes ^= 6;	/* switch between 2/4 bytes */
 			break;
 		case 0x67:	/* address-size override */
 			if (mode == X86EMUL_MODE_PROT64)
-				ad_bytes ^= 12;	/* switch between 4/8 bytes */
+				prefix.ad_bytes ^= 12;	/* switch between 4/8 bytes */
 			else
-				ad_bytes ^= 6;	/* switch between 2/4 bytes */
+				prefix.ad_bytes ^= 6;	/* switch between 2/4 bytes */
 			break;
 		case 0x2e:	/* CS override */
-			override_base = X86EMUL_BASE_CS;
+			prefix.override_base = X86EMUL_BASE_CS;
 			break;
 		case 0x3e:	/* DS override */
-			override_base = X86EMUL_BASE_DS;
+			prefix.override_base = X86EMUL_BASE_DS;
 			break;
 		case 0x26:	/* ES override */
-			override_base = X86EMUL_BASE_ES;
+			prefix.override_base = X86EMUL_BASE_ES;
 			break;
 		case 0x64:	/* FS override */
-			override_base = X86EMUL_BASE_FS;
+			prefix.override_base = X86EMUL_BASE_FS;
 			break;
 		case 0x65:	/* GS override */
-			override_base = X86EMUL_BASE_GS;
+			prefix.override_base = X86EMUL_BASE_GS;
 			break;
 		case 0x36:	/* SS override */
-			override_base = X86EMUL_BASE_SS;
+			prefix.override_base = X86EMUL_BASE_SS;
 			break;
 		case 0xf0:	/* LOCK */
-			lock_prefix = 1;
+			prefix.lock = 1;
 			break;
 		case 0xf3:	/* REP/REPE/REPZ */
-			rep_prefix = 1;
+			prefix.rep = 1;
 			break;
 		case 0xf2:	/* REPNE/REPNZ */
 			break;
@@ -568,12 +570,12 @@
 
 	/* REX prefix. */
 	if ((mode == X86EMUL_MODE_PROT64) && ((b & 0xf0) == 0x40)) {
-		rex_prefix = b;
+		prefix.rex = b;
 		if (b & 8)
-			op_bytes = 8;	/* REX.W */
-		modrm_reg = (b & 4) << 1;	/* REX.R */
-		index_reg = (b & 2) << 2; /* REX.X */
-		modrm_rm = base_reg = (b & 1) << 3; /* REG.B */
+			prefix.op_bytes = 8;	/* REX.W */
+		prefix.modrm_reg = (b & 4) << 1;	/* REX.R */
+		prefix.index_reg = (b & 2) << 2; /* REX.X */
+		prefix.modrm_rm = prefix.base_reg = (b & 1) << 3; /* REG.B */
 		b = insn_fetch(u8, 1, _eip);
 	}
 
@@ -596,18 +598,18 @@
 	if (d & ModRM) {
 		modrm = insn_fetch(u8, 1, _eip);
 		modrm_mod |= (modrm & 0xc0) >> 6;
-		modrm_reg |= (modrm & 0x38) >> 3;
-		modrm_rm |= (modrm & 0x07);
+		prefix.modrm_reg |= (modrm & 0x38) >> 3;
+		prefix.modrm_rm |= (modrm & 0x07);
 		modrm_ea = 0;
 		use_modrm_ea = 1;
 
 		if (modrm_mod == 3) {
 			modrm_val = *(unsigned long *)
-				decode_register(modrm_rm, _regs, d & ByteOp);
+				decode_register(prefix.modrm_rm, _regs, d & ByteOp);
 			goto modrm_done;
 		}
 
-		if (ad_bytes == 2) {
+		if (prefix.ad_bytes == 2) {
 			unsigned bx = _regs[VCPU_REGS_RBX];
 			unsigned bp = _regs[VCPU_REGS_RBP];
 			unsigned si = _regs[VCPU_REGS_RSI];
@@ -616,7 +618,7 @@
 			/* 16-bit ModR/M decode. */
 			switch (modrm_mod) {
 			case 0:
-				if (modrm_rm == 6)
+				if (prefix.modrm_rm == 6)
 					modrm_ea += insn_fetch(u16, 2, _eip);
 				break;
 			case 1:
@@ -626,7 +628,7 @@
 				modrm_ea += insn_fetch(u16, 2, _eip);
 				break;
 			}
-			switch (modrm_rm) {
+			switch (prefix.modrm_rm) {
 			case 0:
 				modrm_ea += bx + si;
 				break;
@@ -653,52 +655,52 @@
 				modrm_ea += bx;
 				break;
 			}
-			if (modrm_rm == 2 || modrm_rm == 3 ||
-			    (modrm_rm == 6 && modrm_mod != 0))
-				if (override_base == -1)
-					override_base = X86EMUL_BASE_SS;
+			if (prefix.modrm_rm == 2 || prefix.modrm_rm == 3 ||
+			    (prefix.modrm_rm == 6 && modrm_mod != 0))
+				if (prefix.override_base == -1)
+					prefix.override_base = X86EMUL_BASE_SS;
 			modrm_ea = (u16)modrm_ea;
 		} else {
 			/* 32/64-bit ModR/M decode. */
-			switch (modrm_rm) {
+			switch (prefix.modrm_rm) {
 			case 4:
 			case 12:
 				sib = insn_fetch(u8, 1, _eip);
-				index_reg |= (sib >> 3) & 7;
-				base_reg |= sib & 7;
+				prefix.index_reg |= (sib >> 3) & 7;
+				prefix.base_reg |= sib & 7;
 				scale = sib >> 6;
 
-				switch (base_reg) {
+				switch (prefix.base_reg) {
 				case 5:
 					if (modrm_mod != 0)
-						modrm_ea += _regs[base_reg];
+						modrm_ea += _regs[prefix.base_reg];
 					else
 						modrm_ea += insn_fetch(s32, 4, _eip);
 					break;
 				default:
-					modrm_ea += _regs[base_reg];
+					modrm_ea += _regs[prefix.base_reg];
 				}
-				switch (index_reg) {
+				switch (prefix.index_reg) {
 				case 4:
 					break;
 				default:
-					modrm_ea += _regs[index_reg] << scale;
+					modrm_ea += _regs[prefix.index_reg] << scale;
 
 				}
 				break;
 			case 5:
 				if (modrm_mod != 0)
-					modrm_ea += _regs[modrm_rm];
+					modrm_ea += _regs[prefix.modrm_rm];
 				else if (mode == X86EMUL_MODE_PROT64)
 					rip_relative = 1;
 				break;
 			default:
-				modrm_ea += _regs[modrm_rm];
+				modrm_ea += _regs[prefix.modrm_rm];
 				break;
 			}
 			switch (modrm_mod) {
 			case 0:
-				if (modrm_rm == 5)
+				if (prefix.modrm_rm == 5)
 					modrm_ea += insn_fetch(s32, 4, _eip);
 				break;
 			case 1:
@@ -709,15 +711,15 @@
 				break;
 			}
 		}
-		if (override_base == -1)
-			override_base = X86EMUL_BASE_DS;
+		if (prefix.override_base == -1)
+			prefix.override_base = X86EMUL_BASE_DS;
 		if (mode == X86EMUL_MODE_PROT64 &&
-		    override_base != X86EMUL_BASE_FS &&
-		    override_base != X86EMUL_BASE_GS)
-			override_base = -1;
+		    prefix.override_base != X86EMUL_BASE_FS &&
+		    prefix.override_base != X86EMUL_BASE_GS)
+			prefix.override_base = -1;
 
-		if (override_base != -1)
-			modrm_ea += ctxt->base[override_base];
+		if (prefix.override_base != -1)
+			modrm_ea += ctxt->base[prefix.override_base];
 
 		if (rip_relative) {
 			modrm_ea += _eip;
@@ -729,13 +731,13 @@
 				if (d & ByteOp)
 					modrm_ea += 1;
 				else
-					if (op_bytes == 8)
+					if (prefix.op_bytes == 8)
 						modrm_ea += 4;
 					else
-						modrm_ea += op_bytes;
+						modrm_ea += prefix.op_bytes;
 			}
 		}
-		if (ad_bytes != 8)
+		if (prefix.ad_bytes != 8)
 			modrm_ea = (u32)modrm_ea;
 		cr2 = modrm_ea;
 	modrm_done:
@@ -752,13 +754,13 @@
 	case SrcReg:
 		src.type = OP_REG;
 		if (d & ByteOp) {
-			src.ptr = decode_register(modrm_reg, _regs,
-						  (rex_prefix == 0));
+			src.ptr = decode_register(prefix.modrm_reg, _regs,
+						  (prefix.rex == 0));
 			src.val = src.orig_val = *(u8 *) src.ptr;
 			src.bytes = 1;
 		} else {
-			src.ptr = decode_register(modrm_reg, _regs, 0);
-			switch ((src.bytes = op_bytes)) {
+			src.ptr = decode_register(prefix.modrm_reg, _regs, 0);
+			switch ((src.bytes = prefix.op_bytes)) {
 			case 2:
 				src.val = src.orig_val = *(u16 *) src.ptr;
 				break;
@@ -778,7 +780,7 @@
 		src.bytes = 4;
 		goto srcmem_common;
 	case SrcMem:
-		src.bytes = (d & ByteOp) ? 1 : op_bytes;
+		src.bytes = (d & ByteOp) ? 1 : prefix.op_bytes;
 	      srcmem_common:
 		src.type = OP_MEM;
 		src.ptr = (unsigned long *)cr2;
@@ -790,7 +792,7 @@
 	case SrcImm:
 		src.type = OP_IMM;
 		src.ptr = (unsigned long *)_eip;
-		src.bytes = (d & ByteOp) ? 1 : op_bytes;
+		src.bytes = (d & ByteOp) ? 1 : prefix.op_bytes;
 		if (src.bytes == 8)
 			src.bytes = 4;
 		/* NB. Immediates are sign-extended as necessary. */
@@ -823,13 +825,13 @@
 		dst.type = OP_REG;
 		if ((d & ByteOp)
 		    && !(twobyte && (b == 0xb6 || b == 0xb7))) {
-			dst.ptr = decode_register(modrm_reg, _regs,
-						  (rex_prefix == 0));
+			dst.ptr = decode_register(prefix.modrm_reg, _regs,
+						  (prefix.rex == 0));
 			dst.val = *(u8 *) dst.ptr;
 			dst.bytes = 1;
 		} else {
-			dst.ptr = decode_register(modrm_reg, _regs, 0);
-			switch ((dst.bytes = op_bytes)) {
+			dst.ptr = decode_register(prefix.modrm_reg, _regs, 0);
+			switch ((dst.bytes = prefix.op_bytes)) {
 			case 2:
 				dst.val = *(u16 *)dst.ptr;
 				break;
@@ -845,7 +847,7 @@
 	case DstMem:
 		dst.type = OP_MEM;
 		dst.ptr = (unsigned long *)cr2;
-		dst.bytes = (d & ByteOp) ? 1 : op_bytes;
+		dst.bytes = (d & ByteOp) ? 1 : prefix.op_bytes;
 		if (d & BitOp) {
 			unsigned long mask = ~(dst.bytes * 8 - 1);
 
@@ -901,7 +903,7 @@
 		dst.val = (s32) src.val;
 		break;
 	case 0x80 ... 0x83:	/* Grp1 */
-		switch (modrm_reg) {
+		switch (prefix.modrm_reg) {
 		case 0:
 			goto add;
 		case 1:
@@ -945,16 +947,16 @@
 		 * prefix.
 		 */
 		dst.val = src.val;
-		lock_prefix = 1;
+		prefix.lock = 1;
 		break;
 	case 0xa0 ... 0xa1:	/* mov */
 		dst.ptr = (unsigned long *)&_regs[VCPU_REGS_RAX];
 		dst.val = src.val;
-		_eip += ad_bytes;	/* skip src displacement */
+		_eip += prefix.ad_bytes;	/* skip src displacement */
 		break;
 	case 0xa2 ... 0xa3:	/* mov */
 		dst.val = (unsigned long)_regs[VCPU_REGS_RAX];
-		_eip += ad_bytes;	/* skip dst displacement */
+		_eip += prefix.ad_bytes;	/* skip dst displacement */
 		break;
 	case 0x88 ... 0x8b:	/* mov */
 	case 0xc6 ... 0xc7:	/* mov (sole member of Grp11) */
@@ -973,7 +975,7 @@
 		break;
 	case 0xc0 ... 0xc1:
 	      grp2:		/* Grp2 */
-		switch (modrm_reg) {
+		switch (prefix.modrm_reg) {
 		case 0:	/* rol */
 			emulate_2op_SrcB("rol", src, dst, _eflags);
 			break;
@@ -1005,7 +1007,7 @@
 		src.val = _regs[VCPU_REGS_RCX];
 		goto grp2;
 	case 0xf6 ... 0xf7:	/* Grp3 */
-		switch (modrm_reg) {
+		switch (prefix.modrm_reg) {
 		case 0 ... 1:	/* test */
 			/*
 			 * Special case in Grp3: test has an immediate
@@ -1013,7 +1015,7 @@
 			 */
 			src.type = OP_IMM;
 			src.ptr = (unsigned long *)_eip;
-			src.bytes = (d & ByteOp) ? 1 : op_bytes;
+			src.bytes = (d & ByteOp) ? 1 : prefix.op_bytes;
 			if (src.bytes == 8)
 				src.bytes = 4;
 			switch (src.bytes) {
@@ -1039,7 +1041,7 @@
 		}
 		break;
 	case 0xfe ... 0xff:	/* Grp4/Grp5 */
-		switch (modrm_reg) {
+		switch (prefix.modrm_reg) {
 		case 0:	/* inc */
 			emulate_1op("inc", dst, _eflags);
 			break;
@@ -1091,7 +1093,7 @@
 			}
 			break;
 		case OP_MEM:
-			if (lock_prefix)
+			if (prefix.lock)
 				rc = ops->cmpxchg_emulated((unsigned long)dst.
 							   ptr, &dst.orig_val,
 							   &dst.val, dst.bytes,
@@ -1118,7 +1120,7 @@
 special_insn:
 	if (twobyte)
 		goto twobyte_special_insn;
-	if (rep_prefix) {
+	if (prefix.rep) {
 		if (_regs[VCPU_REGS_RCX] == 0) {
 			ctxt->vcpu->rip = _eip;
 			goto done;
@@ -1129,13 +1131,13 @@
 	switch (b) {
 	case 0xa4 ... 0xa5:	/* movs */
 		dst.type = OP_MEM;
-		dst.bytes = (d & ByteOp) ? 1 : op_bytes;
+		dst.bytes = (d & ByteOp) ? 1 : prefix.op_bytes;
 		dst.ptr = (unsigned long *)register_address(
 						ctxt->base[X86EMUL_BASE_ES],
 							_regs[VCPU_REGS_RDI]);
 		if ((rc = ops->read_emulated(register_address(
-		      (override_base != -1) ?
-		      	ctxt->base[override_base] : ctxt->base[X86EMUL_BASE_DS],
+		      (prefix.override_base != -1) ?
+		      	ctxt->base[prefix.override_base] : ctxt->base[X86EMUL_BASE_DS],
 		      _regs[VCPU_REGS_RSI]), &dst.val, dst.bytes, ctxt->vcpu)) != 0)
 			goto done;
 		register_address_increment(_regs[VCPU_REGS_RSI],
@@ -1148,7 +1150,7 @@
 		goto cannot_emulate;
 	case 0xaa ... 0xab:	/* stos */
 		dst.type = OP_MEM;
-		dst.bytes = (d & ByteOp) ? 1 : op_bytes;
+		dst.bytes = (d & ByteOp) ? 1 : prefix.op_bytes;
 		dst.ptr = (unsigned long *)cr2;
 		dst.val = _regs[VCPU_REGS_RAX];
 		register_address_increment(_regs[VCPU_REGS_RDI],
@@ -1156,7 +1158,7 @@
 		break;
 	case 0xac ... 0xad:	/* lods */
 		dst.type = OP_REG;
-		dst.bytes = (d & ByteOp) ? 1 : op_bytes;
+		dst.bytes = (d & ByteOp) ? 1 : prefix.op_bytes;
 		dst.ptr = (unsigned long *)&_regs[VCPU_REGS_RAX];
 		if ((rc = ops->read_emulated(cr2, &dst.val, dst.bytes,
 					     ctxt->vcpu)) != 0)
@@ -1179,11 +1181,11 @@
 pop_instruction:
 		if ((rc = ops->read_std(
 			register_address(ctxt->base[X86EMUL_BASE_SS],
-			_regs[VCPU_REGS_RSP]), dst.ptr, op_bytes, ctxt->vcpu))
+			_regs[VCPU_REGS_RSP]), dst.ptr, prefix.op_bytes, ctxt->vcpu))
 			!= 0)
 			goto done;
 
-		register_address_increment(_regs[VCPU_REGS_RSP], op_bytes);
+		register_address_increment(_regs[VCPU_REGS_RSP], prefix.op_bytes);
 		no_wb = 1; /* Disable writeback. */
 		break;
 	}
@@ -1194,20 +1196,20 @@
 	case 0x01: /* lgdt, lidt, lmsw */
 		/* Disable writeback. */
 		no_wb = 1;
-		switch (modrm_reg) {
+		switch (prefix.modrm_reg) {
 			u16 size;
 			unsigned long address;
 
 		case 2: /* lgdt */
 			rc = read_descriptor(ctxt, ops, src.ptr,
-					     &size, &address, op_bytes);
+					     &size, &address, prefix.op_bytes);
 			if (rc)
 				goto done;
 			realmode_lgdt(ctxt->vcpu, size, address);
 			break;
 		case 3: /* lidt */
 			rc = read_descriptor(ctxt, ops, src.ptr,
-					     &size, &address, op_bytes);
+					     &size, &address, prefix.op_bytes);
 			if (rc)
 				goto done;
 			realmode_lidt(ctxt->vcpu, size, address);
@@ -1215,7 +1217,7 @@
 		case 4: /* smsw */
 			if (modrm_mod != 3)
 				goto cannot_emulate;
-			*(u16 *)&_regs[modrm_rm]
+			*(u16 *)&_regs[prefix.modrm_rm]
 				= realmode_get_cr(ctxt->vcpu, 0);
 			break;
 		case 6: /* lmsw */
@@ -1233,12 +1235,12 @@
 	case 0x21: /* mov from dr to reg */
 		if (modrm_mod != 3)
 			goto cannot_emulate;
-		rc = emulator_get_dr(ctxt, modrm_reg, &_regs[modrm_rm]);
+		rc = emulator_get_dr(ctxt, prefix.modrm_reg, &_regs[prefix.modrm_rm]);
 		break;
 	case 0x23: /* mov from reg to dr */
 		if (modrm_mod != 3)
 			goto cannot_emulate;
-		rc = emulator_set_dr(ctxt, modrm_reg, _regs[modrm_rm]);
+		rc = emulator_set_dr(ctxt, prefix.modrm_reg, _regs[prefix.modrm_rm]);
 		break;
 	case 0x40 ... 0x4f:	/* cmov */
 		dst.val = dst.orig_val = src.val;
@@ -1310,7 +1312,7 @@
 		emulate_2op_SrcV_nobyte("bts", src, dst, _eflags);
 		break;
 	case 0xb6 ... 0xb7:	/* movzx */
-		dst.bytes = op_bytes;
+		dst.bytes = prefix.op_bytes;
 		dst.val = (d & ByteOp) ? (u8) src.val : (u16) src.val;
 		break;
 	case 0xbb:
@@ -1319,7 +1321,7 @@
 		emulate_2op_SrcV_nobyte("btc", src, dst, _eflags);
 		break;
 	case 0xba:		/* Grp8 */
-		switch (modrm_reg & 3) {
+		switch (prefix.modrm_reg & 3) {
 		case 0:
 			goto bt;
 		case 1:
@@ -1331,7 +1333,7 @@
 		}
 		break;
 	case 0xbe ... 0xbf:	/* movsx */
-		dst.bytes = op_bytes;
+		dst.bytes = prefix.op_bytes;
 		dst.val = (d & ByteOp) ? (s8) src.val : (s16) src.val;
 		break;
 	}
@@ -1352,12 +1354,12 @@
 	case 0x20: /* mov cr, reg */
 		if (modrm_mod != 3)
 			goto cannot_emulate;
-		_regs[modrm_rm] = realmode_get_cr(ctxt->vcpu, modrm_reg);
+		_regs[prefix.modrm_rm] = realmode_get_cr(ctxt->vcpu, prefix.modrm_reg);
 		break;
 	case 0x22: /* mov reg, cr */
 		if (modrm_mod != 3)
 			goto cannot_emulate;
-		realmode_set_cr(ctxt->vcpu, modrm_reg, modrm_val, &_eflags);
+		realmode_set_cr(ctxt->vcpu, prefix.modrm_reg, modrm_val, &_eflags);
 		break;
 	case 0x30:
 		/* wrmsr */

[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

[-- Attachment #2: Type: text/plain, Size: 315 bytes --]

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

[-- Attachment #3: Type: text/plain, Size: 186 bytes --]

_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel

  parent reply	other threads:[~2007-08-01  9:13 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-01  9:05 PATCH 0/5] Consolidate the insb/outsb emulation into x86_emulate.c Laurent Vivier
     [not found] ` <46B04CCA.2010503-6ktuUTfB/bM@public.gmane.org>
2007-08-01  9:09   ` [PATCH 1/5] change ctxt.*_base to an array ctxt.base[X86EMUL_BASE_*] Laurent Vivier
     [not found]     ` <46B04DD6.7010702-6ktuUTfB/bM@public.gmane.org>
2007-08-01  9:13       ` Laurent Vivier [this message]
     [not found]         ` <46B04EB9.5010103-6ktuUTfB/bM@public.gmane.org>
2007-08-01  9:16           ` [PATCH 3/5] extract prefix decoding part from x86_emulate_memop() to x86_decode_prefix() Laurent Vivier
     [not found]             ` <46B04F56.60607-6ktuUTfB/bM@public.gmane.org>
2007-08-01  9:19               ` [PATCH 4/5] vmx.c uses x86_decode_prefix() instead of get_io_count() Laurent Vivier
     [not found]                 ` <46B0501C.6060409-6ktuUTfB/bM@public.gmane.org>
2007-08-01  9:22                   ` [PATCH 5/5] svm.c uses x86_decode_prefix() instead of io_address() and io_get_override() Laurent Vivier
2007-08-02  8:48                   ` [PATCH 4/5] vmx.c uses x86_decode_prefix() instead of get_io_count() Avi Kivity
     [not found]                     ` <46B19A7B.2030109-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-02  9:34                       ` Laurent Vivier
     [not found]                         ` <46B1A51C.2040104-6ktuUTfB/bM@public.gmane.org>
2007-08-02  9:41                           ` Avi Kivity
     [not found]                             ` <46B1A6B8.7020404-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-02 16:46                               ` Laurent Vivier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=46B04EB9.5010103@bull.net \
    --to=laurent.vivier-6ktuutfb/bm@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox