All of lore.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 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.