x86_emulate.c 44.9 KB
Newer Older
A
Avi Kivity 已提交
1 2 3 4 5 6 7 8
/******************************************************************************
 * x86_emulate.c
 *
 * Generic x86 (32-bit and 64-bit) instruction decoder and emulator.
 *
 * Copyright (c) 2005 Keir Fraser
 *
 * Linux coding style, mod r/m decoder, segment base fixes, real-mode
9
 * privileged instructions:
A
Avi Kivity 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
 *
 * Copyright (C) 2006 Qumranet
 *
 *   Avi Kivity <avi@qumranet.com>
 *   Yaniv Kamay <yaniv@qumranet.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 * From: xen-unstable 10676:af9809f51f81a3c43f276f00c81a52ef558afda4
 */

#ifndef __KERNEL__
#include <stdio.h>
#include <stdint.h>
#include <public/xen.h>
#define DPRINTF(_f, _a ...) printf( _f , ## _a )
#else
#include "kvm.h"
#define DPRINTF(x...) do {} while (0)
#endif
#include "x86_emulate.h"
#include <linux/module.h>

/*
 * Opcode effective-address decode tables.
 * Note that we only emulate instructions that have at least one memory
 * operand (excluding implicit stack references). We assume that stack
 * references and instruction fetches will never occur in special memory
 * areas that require emulation. So, for example, 'mov <imm>,<reg>' need
 * not be handled.
 */

/* Operand sizes: 8-bit operands or specified/overridden size. */
#define ByteOp      (1<<0)	/* 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 DstMask     (3<<1)
/* Source operand type. */
#define SrcNone     (0<<3)	/* No source operand. */
#define SrcImplicit (0<<3)	/* Source operand is implicit in the opcode. */
#define SrcReg      (1<<3)	/* Register operand. */
#define SrcMem      (2<<3)	/* Memory operand. */
#define SrcMem16    (3<<3)	/* Memory operand (16-bit). */
#define SrcMem32    (4<<3)	/* Memory operand (32-bit). */
#define SrcImm      (5<<3)	/* Immediate operand. */
#define SrcImmByte  (6<<3)	/* 8-bit sign-extended immediate operand. */
#define SrcMask     (7<<3)
/* Generic ModRM decode. */
#define ModRM       (1<<6)
/* Destination is only written; never read. */
#define Mov         (1<<7)
64
#define BitOp       (1<<8)
A
Avi Kivity 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

static u8 opcode_table[256] = {
	/* 0x00 - 0x07 */
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
	0, 0, 0, 0,
	/* 0x08 - 0x0F */
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
	0, 0, 0, 0,
	/* 0x10 - 0x17 */
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
	0, 0, 0, 0,
	/* 0x18 - 0x1F */
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
	0, 0, 0, 0,
	/* 0x20 - 0x27 */
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
86
	SrcImmByte, SrcImm, 0, 0,
A
Avi Kivity 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100
	/* 0x28 - 0x2F */
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
	0, 0, 0, 0,
	/* 0x30 - 0x37 */
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
	0, 0, 0, 0,
	/* 0x38 - 0x3F */
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	ByteOp | DstReg | SrcMem | ModRM, DstReg | SrcMem | ModRM,
	0, 0, 0, 0,
	/* 0x40 - 0x4F */
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
101
	/* 0x50 - 0x57 */
102 103
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
104 105 106
	/* 0x58 - 0x5F */
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
N
Nitin A Kamble 已提交
107
	/* 0x60 - 0x67 */
A
Avi Kivity 已提交
108
	0, 0, 0, DstReg | SrcMem32 | ModRM | Mov /* movsxd (x86/64) */ ,
N
Nitin A Kamble 已提交
109 110 111
	0, 0, 0, 0,
	/* 0x68 - 0x6F */
	0, 0, ImplicitOps|Mov, 0,
112 113
	SrcNone  | ByteOp  | ImplicitOps, SrcNone  | ImplicitOps, /* insb, insw/insd */
	SrcNone  | ByteOp  | ImplicitOps, SrcNone  | ImplicitOps, /* outsb, outsw/outsd */
114 115 116 117 118 119
	/* 0x70 - 0x77 */
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
	/* 0x78 - 0x7F */
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
A
Avi Kivity 已提交
120 121 122 123 124 125 126 127
	/* 0x80 - 0x87 */
	ByteOp | DstMem | SrcImm | ModRM, DstMem | SrcImm | ModRM,
	ByteOp | DstMem | SrcImm | ModRM, DstMem | SrcImmByte | ModRM,
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM,
	/* 0x88 - 0x8F */
	ByteOp | DstMem | SrcReg | ModRM | Mov, DstMem | SrcReg | ModRM | Mov,
	ByteOp | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
N
Nitin A Kamble 已提交
128
	0, ModRM | DstReg, 0, DstMem | SrcNone | ModRM | Mov,
A
Avi Kivity 已提交
129
	/* 0x90 - 0x9F */
N
Nitin A Kamble 已提交
130
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ImplicitOps, ImplicitOps, 0, 0,
A
Avi Kivity 已提交
131 132 133 134 135 136 137 138 139 140 141 142
	/* 0xA0 - 0xA7 */
	ByteOp | DstReg | SrcMem | Mov, DstReg | SrcMem | Mov,
	ByteOp | DstMem | SrcReg | Mov, DstMem | SrcReg | Mov,
	ByteOp | ImplicitOps | Mov, ImplicitOps | Mov,
	ByteOp | ImplicitOps, ImplicitOps,
	/* 0xA8 - 0xAF */
	0, 0, ByteOp | ImplicitOps | Mov, ImplicitOps | Mov,
	ByteOp | ImplicitOps | Mov, ImplicitOps | Mov,
	ByteOp | ImplicitOps, ImplicitOps,
	/* 0xB0 - 0xBF */
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/* 0xC0 - 0xC7 */
143 144 145
	ByteOp | DstMem | SrcImm | ModRM, DstMem | SrcImmByte | ModRM,
	0, ImplicitOps, 0, 0,
	ByteOp | DstMem | SrcImm | ModRM | Mov, DstMem | SrcImm | ModRM | Mov,
A
Avi Kivity 已提交
146 147 148 149 150 151 152 153
	/* 0xC8 - 0xCF */
	0, 0, 0, 0, 0, 0, 0, 0,
	/* 0xD0 - 0xD7 */
	ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM,
	ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM,
	0, 0, 0, 0,
	/* 0xD8 - 0xDF */
	0, 0, 0, 0, 0, 0, 0, 0,
154 155 156
	/* 0xE0 - 0xE7 */
	0, 0, 0, 0, 0, 0, 0, 0,
	/* 0xE8 - 0xEF */
N
Nitin A Kamble 已提交
157
	ImplicitOps, SrcImm|ImplicitOps, 0, SrcImmByte|ImplicitOps, 0, 0, 0, 0,
A
Avi Kivity 已提交
158 159
	/* 0xF0 - 0xF7 */
	0, 0, 0, 0,
160 161
	ImplicitOps, 0,
	ByteOp | DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM,
A
Avi Kivity 已提交
162 163 164 165 166
	/* 0xF8 - 0xFF */
	0, 0, 0, 0,
	0, 0, ByteOp | DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM
};

167
static u16 twobyte_table[256] = {
A
Avi Kivity 已提交
168 169
	/* 0x00 - 0x0F */
	0, SrcMem | ModRM | DstReg, 0, 0, 0, 0, ImplicitOps, 0,
A
Avi Kivity 已提交
170
	ImplicitOps, ImplicitOps, 0, 0, 0, ImplicitOps | ModRM, 0, 0,
A
Avi Kivity 已提交
171 172 173 174 175 176
	/* 0x10 - 0x1F */
	0, 0, 0, 0, 0, 0, 0, 0, ImplicitOps | ModRM, 0, 0, 0, 0, 0, 0, 0,
	/* 0x20 - 0x2F */
	ModRM | ImplicitOps, ModRM, ModRM | ImplicitOps, ModRM, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0,
	/* 0x30 - 0x3F */
177
	ImplicitOps, 0, ImplicitOps, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
A
Avi Kivity 已提交
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
	/* 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,
	/* 0x50 - 0x5F */
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/* 0x60 - 0x6F */
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/* 0x70 - 0x7F */
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/* 0x80 - 0x8F */
195 196 197 198
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
	ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps,
A
Avi Kivity 已提交
199 200 201
	/* 0x90 - 0x9F */
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/* 0xA0 - 0xA7 */
202
	0, 0, 0, DstMem | SrcReg | ModRM | BitOp, 0, 0, 0, 0,
A
Avi Kivity 已提交
203
	/* 0xA8 - 0xAF */
204
	0, 0, 0, DstMem | SrcReg | ModRM | BitOp, 0, 0, 0, 0,
A
Avi Kivity 已提交
205 206
	/* 0xB0 - 0xB7 */
	ByteOp | DstMem | SrcReg | ModRM, DstMem | SrcReg | ModRM, 0,
207
	    DstMem | SrcReg | ModRM | BitOp,
A
Avi Kivity 已提交
208 209 210
	0, 0, ByteOp | DstReg | SrcMem | ModRM | Mov,
	    DstReg | SrcMem16 | ModRM | Mov,
	/* 0xB8 - 0xBF */
211
	0, 0, DstMem | SrcImmByte | ModRM, DstMem | SrcReg | ModRM | BitOp,
A
Avi Kivity 已提交
212 213 214
	0, 0, ByteOp | DstReg | SrcMem | ModRM | Mov,
	    DstReg | SrcMem16 | ModRM | Mov,
	/* 0xC0 - 0xCF */
215 216
	0, 0, 0, DstMem | SrcReg | ModRM | Mov, 0, 0, 0, ImplicitOps | ModRM,
	0, 0, 0, 0, 0, 0, 0, 0,
A
Avi Kivity 已提交
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
	/* 0xD0 - 0xDF */
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/* 0xE0 - 0xEF */
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/* 0xF0 - 0xFF */
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

/* EFLAGS bit definitions. */
#define EFLG_OF (1<<11)
#define EFLG_DF (1<<10)
#define EFLG_SF (1<<7)
#define EFLG_ZF (1<<6)
#define EFLG_AF (1<<4)
#define EFLG_PF (1<<2)
#define EFLG_CF (1<<0)

/*
 * Instruction emulation:
 * Most instructions are emulated directly via a fragment of inline assembly
 * code. This allows us to save/restore EFLAGS and thus very easily pick up
 * any modified flags.
 */

241
#if defined(CONFIG_X86_64)
A
Avi Kivity 已提交
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
#define _LO32 "k"		/* force 32-bit operand */
#define _STK  "%%rsp"		/* stack pointer */
#elif defined(__i386__)
#define _LO32 ""		/* force 32-bit operand */
#define _STK  "%%esp"		/* stack pointer */
#endif

/*
 * These EFLAGS bits are restored from saved value during emulation, and
 * any changes are written back to the saved value after emulation.
 */
#define EFLAGS_MASK (EFLG_OF|EFLG_SF|EFLG_ZF|EFLG_AF|EFLG_PF|EFLG_CF)

/* Before executing instruction: restore necessary bits in EFLAGS. */
#define _PRE_EFLAGS(_sav, _msk, _tmp) \
	/* EFLAGS = (_sav & _msk) | (EFLAGS & ~_msk); */	\
	"push %"_sav"; "					\
	"movl %"_msk",%"_LO32 _tmp"; "				\
	"andl %"_LO32 _tmp",("_STK"); "				\
	"pushf; "						\
	"notl %"_LO32 _tmp"; "					\
	"andl %"_LO32 _tmp",("_STK"); "				\
	"pop  %"_tmp"; "					\
	"orl  %"_LO32 _tmp",("_STK"); "				\
	"popf; "						\
	/* _sav &= ~msk; */					\
	"movl %"_msk",%"_LO32 _tmp"; "				\
	"notl %"_LO32 _tmp"; "					\
	"andl %"_LO32 _tmp",%"_sav"; "

/* After executing instruction: write-back necessary bits in EFLAGS. */
#define _POST_EFLAGS(_sav, _msk, _tmp) \
	/* _sav |= EFLAGS & _msk; */		\
	"pushf; "				\
	"pop  %"_tmp"; "			\
	"andl %"_msk",%"_LO32 _tmp"; "		\
	"orl  %"_LO32 _tmp",%"_sav"; "

/* Raw emulation: instruction has two explicit operands. */
#define __emulate_2op_nobyte(_op,_src,_dst,_eflags,_wx,_wy,_lx,_ly,_qx,_qy) \
	do { 								    \
		unsigned long _tmp;					    \
									    \
		switch ((_dst).bytes) {					    \
		case 2:							    \
			__asm__ __volatile__ (				    \
				_PRE_EFLAGS("0","4","2")		    \
				_op"w %"_wx"3,%1; "			    \
				_POST_EFLAGS("0","4","2")		    \
				: "=m" (_eflags), "=m" ((_dst).val),        \
				  "=&r" (_tmp)				    \
				: _wy ((_src).val), "i" (EFLAGS_MASK) );    \
			break;						    \
		case 4:							    \
			__asm__ __volatile__ (				    \
				_PRE_EFLAGS("0","4","2")		    \
				_op"l %"_lx"3,%1; "			    \
				_POST_EFLAGS("0","4","2")		    \
				: "=m" (_eflags), "=m" ((_dst).val),	    \
				  "=&r" (_tmp)				    \
				: _ly ((_src).val), "i" (EFLAGS_MASK) );    \
			break;						    \
		case 8:							    \
			__emulate_2op_8byte(_op, _src, _dst,		    \
					    _eflags, _qx, _qy);		    \
			break;						    \
		}							    \
	} while (0)

#define __emulate_2op(_op,_src,_dst,_eflags,_bx,_by,_wx,_wy,_lx,_ly,_qx,_qy) \
	do {								     \
		unsigned long _tmp;					     \
		switch ( (_dst).bytes )					     \
		{							     \
		case 1:							     \
			__asm__ __volatile__ (				     \
				_PRE_EFLAGS("0","4","2")		     \
				_op"b %"_bx"3,%1; "			     \
				_POST_EFLAGS("0","4","2")		     \
				: "=m" (_eflags), "=m" ((_dst).val),	     \
				  "=&r" (_tmp)				     \
				: _by ((_src).val), "i" (EFLAGS_MASK) );     \
			break;						     \
		default:						     \
			__emulate_2op_nobyte(_op, _src, _dst, _eflags,	     \
					     _wx, _wy, _lx, _ly, _qx, _qy);  \
			break;						     \
		}							     \
	} while (0)

/* Source operand is byte-sized and may be restricted to just %cl. */
#define emulate_2op_SrcB(_op, _src, _dst, _eflags)                      \
	__emulate_2op(_op, _src, _dst, _eflags,				\
		      "b", "c", "b", "c", "b", "c", "b", "c")

/* Source operand is byte, word, long or quad sized. */
#define emulate_2op_SrcV(_op, _src, _dst, _eflags)                      \
	__emulate_2op(_op, _src, _dst, _eflags,				\
		      "b", "q", "w", "r", _LO32, "r", "", "r")

/* Source operand is word, long or quad sized. */
#define emulate_2op_SrcV_nobyte(_op, _src, _dst, _eflags)               \
	__emulate_2op_nobyte(_op, _src, _dst, _eflags,			\
			     "w", "r", _LO32, "r", "", "r")

/* Instruction has only one explicit operand (no source operand). */
#define emulate_1op(_op, _dst, _eflags)                                    \
	do {								\
		unsigned long _tmp;					\
									\
		switch ( (_dst).bytes )					\
		{							\
		case 1:							\
			__asm__ __volatile__ (				\
				_PRE_EFLAGS("0","3","2")		\
				_op"b %1; "				\
				_POST_EFLAGS("0","3","2")		\
				: "=m" (_eflags), "=m" ((_dst).val),	\
				  "=&r" (_tmp)				\
				: "i" (EFLAGS_MASK) );			\
			break;						\
		case 2:							\
			__asm__ __volatile__ (				\
				_PRE_EFLAGS("0","3","2")		\
				_op"w %1; "				\
				_POST_EFLAGS("0","3","2")		\
				: "=m" (_eflags), "=m" ((_dst).val),	\
				  "=&r" (_tmp)				\
				: "i" (EFLAGS_MASK) );			\
			break;						\
		case 4:							\
			__asm__ __volatile__ (				\
				_PRE_EFLAGS("0","3","2")		\
				_op"l %1; "				\
				_POST_EFLAGS("0","3","2")		\
				: "=m" (_eflags), "=m" ((_dst).val),	\
				  "=&r" (_tmp)				\
				: "i" (EFLAGS_MASK) );			\
			break;						\
		case 8:							\
			__emulate_1op_8byte(_op, _dst, _eflags);	\
			break;						\
		}							\
	} while (0)

/* Emulate an instruction with quadword operands (x86/64 only). */
388
#if defined(CONFIG_X86_64)
A
Avi Kivity 已提交
389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417
#define __emulate_2op_8byte(_op, _src, _dst, _eflags, _qx, _qy)           \
	do {								  \
		__asm__ __volatile__ (					  \
			_PRE_EFLAGS("0","4","2")			  \
			_op"q %"_qx"3,%1; "				  \
			_POST_EFLAGS("0","4","2")			  \
			: "=m" (_eflags), "=m" ((_dst).val), "=&r" (_tmp) \
			: _qy ((_src).val), "i" (EFLAGS_MASK) );	  \
	} while (0)

#define __emulate_1op_8byte(_op, _dst, _eflags)                           \
	do {								  \
		__asm__ __volatile__ (					  \
			_PRE_EFLAGS("0","3","2")			  \
			_op"q %1; "					  \
			_POST_EFLAGS("0","3","2")			  \
			: "=m" (_eflags), "=m" ((_dst).val), "=&r" (_tmp) \
			: "i" (EFLAGS_MASK) );				  \
	} while (0)

#elif defined(__i386__)
#define __emulate_2op_8byte(_op, _src, _dst, _eflags, _qx, _qy)
#define __emulate_1op_8byte(_op, _dst, _eflags)
#endif				/* __i386__ */

/* Fetch next part of the instruction being emulated. */
#define insn_fetch(_type, _size, _eip)                                  \
({	unsigned long _x;						\
	rc = ops->read_std((unsigned long)(_eip) + ctxt->cs_base, &_x,	\
418
                                                  (_size), ctxt->vcpu); \
A
Avi Kivity 已提交
419 420 421 422 423 424 425
	if ( rc != 0 )							\
		goto done;						\
	(_eip) += (_size);						\
	(_type)_x;							\
})

/* Access/update address held in a register, based on addressing mode. */
426
#define address_mask(reg)						\
427 428
	((c->ad_bytes == sizeof(unsigned long)) ? 			\
		(reg) :	((reg) & ((1UL << (c->ad_bytes << 3)) - 1)))
A
Avi Kivity 已提交
429
#define register_address(base, reg)                                     \
430
	((base) + address_mask(reg))
A
Avi Kivity 已提交
431 432 433 434
#define register_address_increment(reg, inc)                            \
	do {								\
		/* signed type ensures sign extension to long */        \
		int _inc = (inc);					\
435
		if (c->ad_bytes == sizeof(unsigned long))		\
A
Avi Kivity 已提交
436 437
			(reg) += _inc;					\
		else							\
438 439 440 441
			(reg) = ((reg) & 				\
				 ~((1UL << (c->ad_bytes << 3)) - 1)) |	\
				(((reg) + _inc) &			\
				 ((1UL << (c->ad_bytes << 3)) - 1));	\
A
Avi Kivity 已提交
442 443
	} while (0)

444 445
#define JMP_REL(rel) 							\
	do {								\
446
		register_address_increment(c->eip, rel);		\
447 448
	} while (0)

449 450 451 452 453 454 455
/*
 * Given the 'reg' portion of a ModRM byte, and a register block, return a
 * pointer into the block that addresses the relevant register.
 * @highbyte_regs specifies whether to decode AH,CH,DH,BH.
 */
static void *decode_register(u8 modrm_reg, unsigned long *regs,
			     int highbyte_regs)
A
Avi Kivity 已提交
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474
{
	void *p;

	p = &regs[modrm_reg];
	if (highbyte_regs && modrm_reg >= 4 && modrm_reg < 8)
		p = (unsigned char *)&regs[modrm_reg & 3] + 1;
	return p;
}

static int read_descriptor(struct x86_emulate_ctxt *ctxt,
			   struct x86_emulate_ops *ops,
			   void *ptr,
			   u16 *size, unsigned long *address, int op_bytes)
{
	int rc;

	if (op_bytes == 2)
		op_bytes = 3;
	*address = 0;
475 476
	rc = ops->read_std((unsigned long)ptr, (unsigned long *)size, 2,
			   ctxt->vcpu);
A
Avi Kivity 已提交
477 478
	if (rc)
		return rc;
479 480
	rc = ops->read_std((unsigned long)ptr + 2, address, op_bytes,
			   ctxt->vcpu);
A
Avi Kivity 已提交
481 482 483
	return rc;
}

484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
static int test_cc(unsigned int condition, unsigned int flags)
{
	int rc = 0;

	switch ((condition & 15) >> 1) {
	case 0: /* o */
		rc |= (flags & EFLG_OF);
		break;
	case 1: /* b/c/nae */
		rc |= (flags & EFLG_CF);
		break;
	case 2: /* z/e */
		rc |= (flags & EFLG_ZF);
		break;
	case 3: /* be/na */
		rc |= (flags & (EFLG_CF|EFLG_ZF));
		break;
	case 4: /* s */
		rc |= (flags & EFLG_SF);
		break;
	case 5: /* p/pe */
		rc |= (flags & EFLG_PF);
		break;
	case 7: /* le/ng */
		rc |= (flags & EFLG_ZF);
		/* fall through */
	case 6: /* l/nge */
		rc |= (!(flags & EFLG_SF) != !(flags & EFLG_OF));
		break;
	}

	/* Odd condition identifiers (lsb == 1) have inverted sense. */
	return (!!rc ^ (condition & 1));
}

A
Avi Kivity 已提交
519
int
520
x86_decode_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
A
Avi Kivity 已提交
521
{
522 523 524
	struct decode_cache *c = &ctxt->decode;
	u8 sib, rex_prefix = 0;
	unsigned int i;
A
Avi Kivity 已提交
525 526
	int rc = 0;
	int mode = ctxt->mode;
527
	int index_reg = 0, base_reg = 0, scale, rip_relative = 0;
A
Avi Kivity 已提交
528 529 530

	/* Shadow copy of register state. Committed on successful emulation. */

531 532 533
	memset(c, 0, sizeof(struct decode_cache));
	c->eip = ctxt->vcpu->rip;
	memcpy(c->regs, ctxt->vcpu->regs, sizeof c->regs);
A
Avi Kivity 已提交
534 535 536 537

	switch (mode) {
	case X86EMUL_MODE_REAL:
	case X86EMUL_MODE_PROT16:
538
		c->op_bytes = c->ad_bytes = 2;
A
Avi Kivity 已提交
539 540
		break;
	case X86EMUL_MODE_PROT32:
541
		c->op_bytes = c->ad_bytes = 4;
A
Avi Kivity 已提交
542
		break;
543
#ifdef CONFIG_X86_64
A
Avi Kivity 已提交
544
	case X86EMUL_MODE_PROT64:
545 546
		c->op_bytes = 4;
		c->ad_bytes = 8;
A
Avi Kivity 已提交
547 548 549 550 551 552 553 554
		break;
#endif
	default:
		return -1;
	}

	/* Legacy prefixes. */
	for (i = 0; i < 8; i++) {
555
		switch (c->b = insn_fetch(u8, 1, c->eip)) {
A
Avi Kivity 已提交
556
		case 0x66:	/* operand-size override */
557
			c->op_bytes ^= 6;	/* switch between 2/4 bytes */
A
Avi Kivity 已提交
558 559 560
			break;
		case 0x67:	/* address-size override */
			if (mode == X86EMUL_MODE_PROT64)
561 562
				/* switch between 4/8 bytes */
				c->ad_bytes ^= 12;
A
Avi Kivity 已提交
563
			else
564 565
				/* switch between 2/4 bytes */
				c->ad_bytes ^= 6;
A
Avi Kivity 已提交
566 567
			break;
		case 0x2e:	/* CS override */
568
			c->override_base = &ctxt->cs_base;
A
Avi Kivity 已提交
569 570
			break;
		case 0x3e:	/* DS override */
571
			c->override_base = &ctxt->ds_base;
A
Avi Kivity 已提交
572 573
			break;
		case 0x26:	/* ES override */
574
			c->override_base = &ctxt->es_base;
A
Avi Kivity 已提交
575 576
			break;
		case 0x64:	/* FS override */
577
			c->override_base = &ctxt->fs_base;
A
Avi Kivity 已提交
578 579
			break;
		case 0x65:	/* GS override */
580
			c->override_base = &ctxt->gs_base;
A
Avi Kivity 已提交
581 582
			break;
		case 0x36:	/* SS override */
583
			c->override_base = &ctxt->ss_base;
A
Avi Kivity 已提交
584 585
			break;
		case 0xf0:	/* LOCK */
586
			c->lock_prefix = 1;
A
Avi Kivity 已提交
587
			break;
588
		case 0xf2:	/* REPNE/REPNZ */
A
Avi Kivity 已提交
589
		case 0xf3:	/* REP/REPE/REPZ */
590
			c->rep_prefix = 1;
A
Avi Kivity 已提交
591 592 593 594 595 596 597 598 599
			break;
		default:
			goto done_prefixes;
		}
	}

done_prefixes:

	/* REX prefix. */
600 601 602 603 604 605 606 607
	if ((mode == X86EMUL_MODE_PROT64) && ((c->b & 0xf0) == 0x40)) {
		rex_prefix = c->b;
		if (c->b & 8)
			c->op_bytes = 8;	/* REX.W */
		c->modrm_reg = (c->b & 4) << 1;	/* REX.R */
		index_reg = (c->b & 2) << 2; /* REX.X */
		c->modrm_rm = base_reg = (c->b & 1) << 3; /* REG.B */
		c->b = insn_fetch(u8, 1, c->eip);
A
Avi Kivity 已提交
608 609 610
	}

	/* Opcode byte(s). */
611 612
	c->d = opcode_table[c->b];
	if (c->d == 0) {
A
Avi Kivity 已提交
613
		/* Two-byte opcode? */
614 615 616 617
		if (c->b == 0x0f) {
			c->twobyte = 1;
			c->b = insn_fetch(u8, 1, c->eip);
			c->d = twobyte_table[c->b];
A
Avi Kivity 已提交
618 619 620
		}

		/* Unrecognised? */
621 622 623 624
		if (c->d == 0) {
			DPRINTF("Cannot emulate %02x\n", c->b);
			return -1;
		}
A
Avi Kivity 已提交
625 626 627
	}

	/* ModRM and SIB bytes. */
628 629 630 631 632 633 634 635 636 637 638
	if (c->d & ModRM) {
		c->modrm = insn_fetch(u8, 1, c->eip);
		c->modrm_mod |= (c->modrm & 0xc0) >> 6;
		c->modrm_reg |= (c->modrm & 0x38) >> 3;
		c->modrm_rm |= (c->modrm & 0x07);
		c->modrm_ea = 0;
		c->use_modrm_ea = 1;

		if (c->modrm_mod == 3) {
			c->modrm_val = *(unsigned long *)
			  decode_register(c->modrm_rm, c->regs, c->d & ByteOp);
A
Avi Kivity 已提交
639 640 641
			goto modrm_done;
		}

642 643 644 645 646
		if (c->ad_bytes == 2) {
			unsigned bx = c->regs[VCPU_REGS_RBX];
			unsigned bp = c->regs[VCPU_REGS_RBP];
			unsigned si = c->regs[VCPU_REGS_RSI];
			unsigned di = c->regs[VCPU_REGS_RDI];
A
Avi Kivity 已提交
647 648

			/* 16-bit ModR/M decode. */
649
			switch (c->modrm_mod) {
A
Avi Kivity 已提交
650
			case 0:
651 652 653
				if (c->modrm_rm == 6)
					c->modrm_ea +=
						insn_fetch(u16, 2, c->eip);
A
Avi Kivity 已提交
654 655
				break;
			case 1:
656
				c->modrm_ea += insn_fetch(s8, 1, c->eip);
A
Avi Kivity 已提交
657 658
				break;
			case 2:
659
				c->modrm_ea += insn_fetch(u16, 2, c->eip);
A
Avi Kivity 已提交
660 661
				break;
			}
662
			switch (c->modrm_rm) {
A
Avi Kivity 已提交
663
			case 0:
664
				c->modrm_ea += bx + si;
A
Avi Kivity 已提交
665 666
				break;
			case 1:
667
				c->modrm_ea += bx + di;
A
Avi Kivity 已提交
668 669
				break;
			case 2:
670
				c->modrm_ea += bp + si;
A
Avi Kivity 已提交
671 672
				break;
			case 3:
673
				c->modrm_ea += bp + di;
A
Avi Kivity 已提交
674 675
				break;
			case 4:
676
				c->modrm_ea += si;
A
Avi Kivity 已提交
677 678
				break;
			case 5:
679
				c->modrm_ea += di;
A
Avi Kivity 已提交
680 681
				break;
			case 6:
682 683
				if (c->modrm_mod != 0)
					c->modrm_ea += bp;
A
Avi Kivity 已提交
684 685
				break;
			case 7:
686
				c->modrm_ea += bx;
A
Avi Kivity 已提交
687 688
				break;
			}
689 690 691 692 693
			if (c->modrm_rm == 2 || c->modrm_rm == 3 ||
			    (c->modrm_rm == 6 && c->modrm_mod != 0))
				if (!c->override_base)
					c->override_base = &ctxt->ss_base;
			c->modrm_ea = (u16)c->modrm_ea;
A
Avi Kivity 已提交
694 695
		} else {
			/* 32/64-bit ModR/M decode. */
696
			switch (c->modrm_rm) {
A
Avi Kivity 已提交
697 698
			case 4:
			case 12:
699
				sib = insn_fetch(u8, 1, c->eip);
A
Avi Kivity 已提交
700 701 702 703 704 705
				index_reg |= (sib >> 3) & 7;
				base_reg |= sib & 7;
				scale = sib >> 6;

				switch (base_reg) {
				case 5:
706 707 708
					if (c->modrm_mod != 0)
						c->modrm_ea +=
							c->regs[base_reg];
A
Avi Kivity 已提交
709
					else
710 711
						c->modrm_ea +=
						    insn_fetch(s32, 4, c->eip);
A
Avi Kivity 已提交
712 713
					break;
				default:
714
					c->modrm_ea += c->regs[base_reg];
A
Avi Kivity 已提交
715 716 717 718 719
				}
				switch (index_reg) {
				case 4:
					break;
				default:
720 721
					c->modrm_ea +=
						c->regs[index_reg] << scale;
A
Avi Kivity 已提交
722 723 724 725

				}
				break;
			case 5:
726 727
				if (c->modrm_mod != 0)
					c->modrm_ea += c->regs[c->modrm_rm];
A
Avi Kivity 已提交
728 729 730 731
				else if (mode == X86EMUL_MODE_PROT64)
					rip_relative = 1;
				break;
			default:
732
				c->modrm_ea += c->regs[c->modrm_rm];
A
Avi Kivity 已提交
733 734
				break;
			}
735
			switch (c->modrm_mod) {
A
Avi Kivity 已提交
736
			case 0:
737 738 739
				if (c->modrm_rm == 5)
					c->modrm_ea +=
						insn_fetch(s32, 4, c->eip);
A
Avi Kivity 已提交
740 741
				break;
			case 1:
742
				c->modrm_ea += insn_fetch(s8, 1, c->eip);
A
Avi Kivity 已提交
743 744
				break;
			case 2:
745
				c->modrm_ea += insn_fetch(s32, 4, c->eip);
A
Avi Kivity 已提交
746 747 748
				break;
			}
		}
749 750
		if (!c->override_base)
			c->override_base = &ctxt->ds_base;
A
Avi Kivity 已提交
751
		if (mode == X86EMUL_MODE_PROT64 &&
752 753 754
		    c->override_base != &ctxt->fs_base &&
		    c->override_base != &ctxt->gs_base)
			c->override_base = NULL;
A
Avi Kivity 已提交
755

756 757
		if (c->override_base)
			c->modrm_ea += *c->override_base;
A
Avi Kivity 已提交
758 759

		if (rip_relative) {
760 761
			c->modrm_ea += c->eip;
			switch (c->d & SrcMask) {
A
Avi Kivity 已提交
762
			case SrcImmByte:
763
				c->modrm_ea += 1;
A
Avi Kivity 已提交
764 765
				break;
			case SrcImm:
766 767
				if (c->d & ByteOp)
					c->modrm_ea += 1;
A
Avi Kivity 已提交
768
				else
769 770
					if (c->op_bytes == 8)
						c->modrm_ea += 4;
A
Avi Kivity 已提交
771
					else
772
						c->modrm_ea += c->op_bytes;
A
Avi Kivity 已提交
773 774
			}
		}
775 776
		if (c->ad_bytes != 8)
			c->modrm_ea = (u32)c->modrm_ea;
A
Avi Kivity 已提交
777 778 779 780 781 782 783 784
	modrm_done:
		;
	}

	/*
	 * Decode and fetch the source operand: register, memory
	 * or immediate.
	 */
785
	switch (c->d & SrcMask) {
A
Avi Kivity 已提交
786 787 788
	case SrcNone:
		break;
	case SrcReg:
789 790 791 792
		c->src.type = OP_REG;
		if (c->d & ByteOp) {
			c->src.ptr =
				decode_register(c->modrm_reg, c->regs,
A
Avi Kivity 已提交
793
						  (rex_prefix == 0));
794 795
			c->src.val = c->src.orig_val = *(u8 *)c->src.ptr;
			c->src.bytes = 1;
A
Avi Kivity 已提交
796
		} else {
797 798 799
			c->src.ptr =
			    decode_register(c->modrm_reg, c->regs, 0);
			switch ((c->src.bytes = c->op_bytes)) {
A
Avi Kivity 已提交
800
			case 2:
801 802
				c->src.val = c->src.orig_val =
						       *(u16 *) c->src.ptr;
A
Avi Kivity 已提交
803 804
				break;
			case 4:
805 806
				c->src.val = c->src.orig_val =
						       *(u32 *) c->src.ptr;
A
Avi Kivity 已提交
807 808
				break;
			case 8:
809 810
				c->src.val = c->src.orig_val =
						       *(u64 *) c->src.ptr;
A
Avi Kivity 已提交
811 812 813 814 815
				break;
			}
		}
		break;
	case SrcMem16:
816
		c->src.bytes = 2;
A
Avi Kivity 已提交
817 818
		goto srcmem_common;
	case SrcMem32:
819
		c->src.bytes = 4;
A
Avi Kivity 已提交
820 821
		goto srcmem_common;
	case SrcMem:
822 823
		c->src.bytes = (c->d & ByteOp) ? 1 :
							   c->op_bytes;
824
		/* Don't fetch the address for invlpg: it could be unmapped. */
825 826
		if (c->twobyte && c->b == 0x01
				    && c->modrm_reg == 7)
827
			break;
A
Avi Kivity 已提交
828
	      srcmem_common:
829 830 831 832
		/*
		 * For instructions with a ModR/M byte, switch to register
		 * access if Mod = 3.
		 */
833 834
		if ((c->d & ModRM) && c->modrm_mod == 3) {
			c->src.type = OP_REG;
835 836
			break;
		}
837
		c->src.type = OP_MEM;
A
Avi Kivity 已提交
838 839
		break;
	case SrcImm:
840 841 842 843 844
		c->src.type = OP_IMM;
		c->src.ptr = (unsigned long *)c->eip;
		c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
		if (c->src.bytes == 8)
			c->src.bytes = 4;
A
Avi Kivity 已提交
845
		/* NB. Immediates are sign-extended as necessary. */
846
		switch (c->src.bytes) {
A
Avi Kivity 已提交
847
		case 1:
848
			c->src.val = insn_fetch(s8, 1, c->eip);
A
Avi Kivity 已提交
849 850
			break;
		case 2:
851
			c->src.val = insn_fetch(s16, 2, c->eip);
A
Avi Kivity 已提交
852 853
			break;
		case 4:
854
			c->src.val = insn_fetch(s32, 4, c->eip);
A
Avi Kivity 已提交
855 856 857 858
			break;
		}
		break;
	case SrcImmByte:
859 860 861 862
		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);
A
Avi Kivity 已提交
863 864 865
		break;
	}

866
	/* Decode and fetch the destination operand: register or memory. */
867
	switch (c->d & DstMask) {
868 869
	case ImplicitOps:
		/* Special instructions do their own operand decoding. */
870
		return 0;
871
	case DstReg:
872 873 874 875 876 877
		c->dst.type = OP_REG;
		if ((c->d & ByteOp)
		    && !(c->twobyte &&
			(c->b == 0xb6 || c->b == 0xb7))) {
			c->dst.ptr =
				decode_register(c->modrm_reg, c->regs,
878
						  (rex_prefix == 0));
879 880
			c->dst.val = *(u8 *) c->dst.ptr;
			c->dst.bytes = 1;
881
		} else {
882 883 884
			c->dst.ptr =
			    decode_register(c->modrm_reg, c->regs, 0);
			switch ((c->dst.bytes = c->op_bytes)) {
885
			case 2:
886
				c->dst.val = *(u16 *)c->dst.ptr;
887 888
				break;
			case 4:
889
				c->dst.val = *(u32 *)c->dst.ptr;
890 891
				break;
			case 8:
892
				c->dst.val = *(u64 *)c->dst.ptr;
893 894 895 896 897
				break;
			}
		}
		break;
	case DstMem:
898 899
		if ((c->d & ModRM) && c->modrm_mod == 3) {
			c->dst.type = OP_REG;
900 901
			break;
		}
902 903 904 905 906 907 908 909 910
		c->dst.type = OP_MEM;
		break;
	}

done:
	return (rc == X86EMUL_UNHANDLEABLE) ? -1 : 0;
}

int
911
x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
912 913 914 915 916 917
{
	unsigned long cr2 = ctxt->cr2;
	int no_wb = 0;
	u64 msr_data;
	unsigned long _eflags = ctxt->eflags;
	struct decode_cache *c = &ctxt->decode;
918
	int rc = 0;
919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941

	if ((c->d & ModRM) && (c->modrm_mod != 3))
		cr2 = c->modrm_ea;

	if (c->src.type == OP_MEM) {
		c->src.ptr = (unsigned long *)cr2;
		c->src.val = 0;
		if ((rc = ops->read_emulated((unsigned long)c->src.ptr,
					     &c->src.val,
					     c->src.bytes,
					     ctxt->vcpu)) != 0)
			goto done;
		c->src.orig_val = c->src.val;
	}

	if ((c->d & DstMask) == ImplicitOps)
		goto special_insn;


	if (c->dst.type == OP_MEM) {
		c->dst.ptr = (unsigned long *)cr2;
		c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
		c->dst.val = 0;
942 943
		if (c->d & BitOp) {
			unsigned long mask = ~(c->dst.bytes * 8 - 1);
944

945 946
			c->dst.ptr = (void *)c->dst.ptr +
						   (c->src.val & mask) / 8;
947
		}
948 949 950 951 952
		if (!(c->d & Mov) &&
				   /* optimisation - avoid slow emulated read */
		    ((rc = ops->read_emulated((unsigned long)c->dst.ptr,
					   &c->dst.val,
					  c->dst.bytes, ctxt->vcpu)) != 0))
953 954
			goto done;
	}
955
	c->dst.orig_val = c->dst.val;
956

957
	if (c->twobyte)
A
Avi Kivity 已提交
958 959
		goto twobyte_insn;

960
	switch (c->b) {
A
Avi Kivity 已提交
961 962
	case 0x00 ... 0x05:
	      add:		/* add */
963
		emulate_2op_SrcV("add", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
964 965 966
		break;
	case 0x08 ... 0x0d:
	      or:		/* or */
967
		emulate_2op_SrcV("or", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
968 969 970
		break;
	case 0x10 ... 0x15:
	      adc:		/* adc */
971
		emulate_2op_SrcV("adc", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
972 973 974
		break;
	case 0x18 ... 0x1d:
	      sbb:		/* sbb */
975
		emulate_2op_SrcV("sbb", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
976
		break;
977
	case 0x20 ... 0x23:
A
Avi Kivity 已提交
978
	      and:		/* and */
979
		emulate_2op_SrcV("and", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
980
		break;
981
	case 0x24:              /* and al imm8 */
982 983 984 985 986
		c->dst.type = OP_REG;
		c->dst.ptr = &c->regs[VCPU_REGS_RAX];
		c->dst.val = *(u8 *)c->dst.ptr;
		c->dst.bytes = 1;
		c->dst.orig_val = c->dst.val;
987 988
		goto and;
	case 0x25:              /* and ax imm16, or eax imm32 */
989 990 991 992 993
		c->dst.type = OP_REG;
		c->dst.bytes = c->op_bytes;
		c->dst.ptr = &c->regs[VCPU_REGS_RAX];
		if (c->op_bytes == 2)
			c->dst.val = *(u16 *)c->dst.ptr;
994
		else
995 996
			c->dst.val = *(u32 *)c->dst.ptr;
		c->dst.orig_val = c->dst.val;
997
		goto and;
A
Avi Kivity 已提交
998 999
	case 0x28 ... 0x2d:
	      sub:		/* sub */
1000
		emulate_2op_SrcV("sub", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1001 1002 1003
		break;
	case 0x30 ... 0x35:
	      xor:		/* xor */
1004
		emulate_2op_SrcV("xor", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1005 1006 1007
		break;
	case 0x38 ... 0x3d:
	      cmp:		/* cmp */
1008
		emulate_2op_SrcV("cmp", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1009 1010
		break;
	case 0x63:		/* movsxd */
1011
		if (ctxt->mode != X86EMUL_MODE_PROT64)
A
Avi Kivity 已提交
1012
			goto cannot_emulate;
1013
		c->dst.val = (s32) c->src.val;
A
Avi Kivity 已提交
1014 1015
		break;
	case 0x80 ... 0x83:	/* Grp1 */
1016
		switch (c->modrm_reg) {
A
Avi Kivity 已提交
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
		case 0:
			goto add;
		case 1:
			goto or;
		case 2:
			goto adc;
		case 3:
			goto sbb;
		case 4:
			goto and;
		case 5:
			goto sub;
		case 6:
			goto xor;
		case 7:
			goto cmp;
		}
		break;
	case 0x84 ... 0x85:
	      test:		/* test */
1037
		emulate_2op_SrcV("test", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1038 1039 1040
		break;
	case 0x86 ... 0x87:	/* xchg */
		/* Write back the register source. */
1041
		switch (c->dst.bytes) {
A
Avi Kivity 已提交
1042
		case 1:
1043
			*(u8 *) c->src.ptr = (u8) c->dst.val;
A
Avi Kivity 已提交
1044 1045
			break;
		case 2:
1046
			*(u16 *) c->src.ptr = (u16) c->dst.val;
A
Avi Kivity 已提交
1047 1048
			break;
		case 4:
1049
			*c->src.ptr = (u32) c->dst.val;
A
Avi Kivity 已提交
1050 1051
			break;	/* 64b reg: zero-extend */
		case 8:
1052
			*c->src.ptr = c->dst.val;
A
Avi Kivity 已提交
1053 1054 1055 1056 1057 1058
			break;
		}
		/*
		 * Write back the memory destination with implicit LOCK
		 * prefix.
		 */
1059 1060
		c->dst.val = c->src.val;
		c->lock_prefix = 1;
A
Avi Kivity 已提交
1061 1062
		break;
	case 0x88 ... 0x8b:	/* mov */
1063
		goto mov;
N
Nitin A Kamble 已提交
1064
	case 0x8d: /* lea r16/r32, m */
1065
		c->dst.val = c->modrm_val;
N
Nitin A Kamble 已提交
1066
		break;
A
Avi Kivity 已提交
1067 1068
	case 0x8f:		/* pop (sole member of Grp1a) */
		/* 64-bit mode: POP always pops a 64-bit operand. */
1069
		if (ctxt->mode == X86EMUL_MODE_PROT64)
1070 1071 1072 1073 1074 1075 1076
			c->dst.bytes = 8;
		if ((rc = ops->read_std(register_address(
						   ctxt->ss_base,
						   c->regs[VCPU_REGS_RSP]),
						   &c->dst.val,
						   c->dst.bytes,
						   ctxt->vcpu)) != 0)
A
Avi Kivity 已提交
1077
			goto done;
1078 1079
		register_address_increment(c->regs[VCPU_REGS_RSP],
					   c->dst.bytes);
A
Avi Kivity 已提交
1080
		break;
1081
	case 0xa0 ... 0xa1:	/* mov */
1082 1083 1084 1085
		c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX];
		c->dst.val = c->src.val;
		/* skip src displacement */
		c->eip += c->ad_bytes;
1086 1087
		break;
	case 0xa2 ... 0xa3:	/* mov */
1088 1089 1090
		c->dst.val = (unsigned long)c->regs[VCPU_REGS_RAX];
		/* skip c->dst displacement */
		c->eip += c->ad_bytes;
1091
		break;
A
Avi Kivity 已提交
1092 1093
	case 0xc0 ... 0xc1:
	      grp2:		/* Grp2 */
1094
		switch (c->modrm_reg) {
A
Avi Kivity 已提交
1095
		case 0:	/* rol */
1096
			emulate_2op_SrcB("rol", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1097 1098
			break;
		case 1:	/* ror */
1099
			emulate_2op_SrcB("ror", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1100 1101
			break;
		case 2:	/* rcl */
1102
			emulate_2op_SrcB("rcl", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1103 1104
			break;
		case 3:	/* rcr */
1105
			emulate_2op_SrcB("rcr", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1106 1107 1108
			break;
		case 4:	/* sal/shl */
		case 6:	/* sal/shl */
1109
			emulate_2op_SrcB("sal", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1110 1111
			break;
		case 5:	/* shr */
1112
			emulate_2op_SrcB("shr", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1113 1114
			break;
		case 7:	/* sar */
1115
			emulate_2op_SrcB("sar", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1116 1117 1118
			break;
		}
		break;
1119 1120
	case 0xc6 ... 0xc7:	/* mov (sole member of Grp11) */
	mov:
1121
		c->dst.val = c->src.val;
1122
		break;
A
Avi Kivity 已提交
1123
	case 0xd0 ... 0xd1:	/* Grp2 */
1124
		c->src.val = 1;
A
Avi Kivity 已提交
1125 1126
		goto grp2;
	case 0xd2 ... 0xd3:	/* Grp2 */
1127
		c->src.val = c->regs[VCPU_REGS_RCX];
A
Avi Kivity 已提交
1128 1129
		goto grp2;
	case 0xf6 ... 0xf7:	/* Grp3 */
1130
		switch (c->modrm_reg) {
A
Avi Kivity 已提交
1131 1132 1133 1134 1135
		case 0 ... 1:	/* test */
			/*
			 * Special case in Grp3: test has an immediate
			 * source operand.
			 */
1136 1137 1138 1139 1140 1141 1142
			c->src.type = OP_IMM;
			c->src.ptr = (unsigned long *)c->eip;
			c->src.bytes = (c->d & ByteOp) ? 1 :
							       c->op_bytes;
			if (c->src.bytes == 8)
				c->src.bytes = 4;
			switch (c->src.bytes) {
A
Avi Kivity 已提交
1143
			case 1:
1144
				c->src.val = insn_fetch(s8, 1, c->eip);
A
Avi Kivity 已提交
1145 1146
				break;
			case 2:
1147
				c->src.val = insn_fetch(s16, 2, c->eip);
A
Avi Kivity 已提交
1148 1149
				break;
			case 4:
1150
				c->src.val = insn_fetch(s32, 4, c->eip);
A
Avi Kivity 已提交
1151 1152 1153 1154
				break;
			}
			goto test;
		case 2:	/* not */
1155
			c->dst.val = ~c->dst.val;
A
Avi Kivity 已提交
1156 1157
			break;
		case 3:	/* neg */
1158
			emulate_1op("neg", c->dst, _eflags);
A
Avi Kivity 已提交
1159 1160 1161 1162 1163 1164
			break;
		default:
			goto cannot_emulate;
		}
		break;
	case 0xfe ... 0xff:	/* Grp4/Grp5 */
1165
		switch (c->modrm_reg) {
A
Avi Kivity 已提交
1166
		case 0:	/* inc */
1167
			emulate_1op("inc", c->dst, _eflags);
A
Avi Kivity 已提交
1168 1169
			break;
		case 1:	/* dec */
1170
			emulate_1op("dec", c->dst, _eflags);
A
Avi Kivity 已提交
1171
			break;
N
Nitin A Kamble 已提交
1172
		case 4: /* jmp abs */
1173 1174
			if (c->b == 0xff)
				c->eip = c->dst.val;
N
Nitin A Kamble 已提交
1175 1176 1177
			else
				goto cannot_emulate;
			break;
A
Avi Kivity 已提交
1178 1179
		case 6:	/* push */
			/* 64-bit mode: PUSH always pushes a 64-bit operand. */
1180
			if (ctxt->mode == X86EMUL_MODE_PROT64) {
1181 1182 1183 1184 1185
				c->dst.bytes = 8;
				if ((rc = ops->read_std(
						 (unsigned long)c->dst.ptr,
						 &c->dst.val, 8,
						 ctxt->vcpu)) != 0)
A
Avi Kivity 已提交
1186 1187
					goto done;
			}
1188 1189
			register_address_increment(c->regs[VCPU_REGS_RSP],
						   -c->dst.bytes);
1190
			if ((rc = ops->write_emulated(
A
Avi Kivity 已提交
1191
				     register_address(ctxt->ss_base,
1192 1193 1194
					  c->regs[VCPU_REGS_RSP]),
					  &c->dst.val,
					   c->dst.bytes, ctxt->vcpu)) != 0)
A
Avi Kivity 已提交
1195
				goto done;
1196
			no_wb = 1;
A
Avi Kivity 已提交
1197 1198 1199 1200 1201 1202 1203 1204
			break;
		default:
			goto cannot_emulate;
		}
		break;
	}

writeback:
1205
	if (!no_wb) {
1206
		switch (c->dst.type) {
A
Avi Kivity 已提交
1207
		case OP_REG:
1208 1209 1210 1211
			/* The 4-byte case *is* correct:
			 * in 64-bit mode we zero-extend.
			 */
			switch (c->dst.bytes) {
A
Avi Kivity 已提交
1212
			case 1:
1213
				*(u8 *)c->dst.ptr = (u8)c->dst.val;
A
Avi Kivity 已提交
1214 1215
				break;
			case 2:
1216
				*(u16 *)c->dst.ptr = (u16)c->dst.val;
A
Avi Kivity 已提交
1217 1218
				break;
			case 4:
1219
				*c->dst.ptr = (u32)c->dst.val;
A
Avi Kivity 已提交
1220 1221
				break;	/* 64b: zero-ext */
			case 8:
1222
				*c->dst.ptr = c->dst.val;
A
Avi Kivity 已提交
1223 1224 1225 1226
				break;
			}
			break;
		case OP_MEM:
1227 1228 1229 1230 1231 1232 1233
			if (c->lock_prefix)
				rc = ops->cmpxchg_emulated(
						(unsigned long)c->dst.ptr,
						&c->dst.orig_val,
						&c->dst.val,
						c->dst.bytes,
						ctxt->vcpu);
A
Avi Kivity 已提交
1234
			else
1235 1236 1237 1238 1239
				rc = ops->write_emulated(
						(unsigned long)c->dst.ptr,
						&c->dst.val,
						c->dst.bytes,
						ctxt->vcpu);
A
Avi Kivity 已提交
1240 1241 1242 1243 1244 1245 1246 1247
			if (rc != 0)
				goto done;
		default:
			break;
		}
	}

	/* Commit shadow register state. */
1248
	memcpy(ctxt->vcpu->regs, c->regs, sizeof c->regs);
A
Avi Kivity 已提交
1249
	ctxt->eflags = _eflags;
1250
	ctxt->vcpu->rip = c->eip;
A
Avi Kivity 已提交
1251 1252 1253 1254 1255

done:
	return (rc == X86EMUL_UNHANDLEABLE) ? -1 : 0;

special_insn:
1256
	if (c->twobyte)
A
Avi Kivity 已提交
1257
		goto twobyte_special_insn;
1258
	switch (c->b) {
1259
	case 0x50 ... 0x57:  /* push reg */
1260 1261
		if (c->op_bytes == 2)
			c->src.val = (u16) c->regs[c->b & 0x7];
1262
		else
1263 1264 1265 1266 1267 1268 1269 1270
			c->src.val = (u32) c->regs[c->b & 0x7];
		c->dst.type  = OP_MEM;
		c->dst.bytes = c->op_bytes;
		c->dst.val = c->src.val;
		register_address_increment(c->regs[VCPU_REGS_RSP],
					   -c->op_bytes);
		c->dst.ptr = (void *) register_address(
			ctxt->ss_base, c->regs[VCPU_REGS_RSP]);
1271
		break;
1272
	case 0x58 ... 0x5f: /* pop reg */
1273 1274
		c->dst.ptr =
				(unsigned long *)&c->regs[c->b & 0x7];
1275 1276
	pop_instruction:
		if ((rc = ops->read_std(register_address(ctxt->ss_base,
1277 1278
			c->regs[VCPU_REGS_RSP]), c->dst.ptr,
			c->op_bytes, ctxt->vcpu)) != 0)
1279 1280
			goto done;

1281 1282
		register_address_increment(c->regs[VCPU_REGS_RSP],
					   c->op_bytes);
1283 1284
		no_wb = 1; /* Disable writeback. */
		break;
1285
	case 0x6a: /* push imm8 */
1286 1287 1288 1289 1290 1291 1292 1293 1294 1295
		c->src.val = 0L;
		c->src.val = insn_fetch(s8, 1, c->eip);
push:
		c->dst.type  = OP_MEM;
		c->dst.bytes = c->op_bytes;
		c->dst.val = c->src.val;
		register_address_increment(c->regs[VCPU_REGS_RSP],
					   -c->op_bytes);
		c->dst.ptr = (void *) register_address(ctxt->ss_base,
						       c->regs[VCPU_REGS_RSP]);
1296
		break;
1297 1298
	case 0x6c:		/* insb */
	case 0x6d:		/* insw/insd */
L
Laurent Vivier 已提交
1299
		 if (kvm_emulate_pio_string(ctxt->vcpu, NULL,
1300 1301 1302 1303 1304
				1,
				(c->d & ByteOp) ? 1 : c->op_bytes,
				c->rep_prefix ?
				address_mask(c->regs[VCPU_REGS_RCX]) : 1,
				(_eflags & EFLG_DF),
1305
				register_address(ctxt->es_base,
1306 1307 1308
						 c->regs[VCPU_REGS_RDI]),
				c->rep_prefix,
				c->regs[VCPU_REGS_RDX]) == 0)
1309 1310 1311 1312
			return -1;
		return 0;
	case 0x6e:		/* outsb */
	case 0x6f:		/* outsw/outsd */
L
Laurent Vivier 已提交
1313
		if (kvm_emulate_pio_string(ctxt->vcpu, NULL,
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324
				0,
				(c->d & ByteOp) ? 1 : c->op_bytes,
				c->rep_prefix ?
				address_mask(c->regs[VCPU_REGS_RCX]) : 1,
				(_eflags & EFLG_DF),
				register_address(c->override_base ?
							*c->override_base :
							ctxt->ds_base,
						 c->regs[VCPU_REGS_RSI]),
				c->rep_prefix,
				c->regs[VCPU_REGS_RDX]) == 0)
1325 1326
			return -1;
		return 0;
1327
	case 0x70 ... 0x7f: /* jcc (short) */ {
1328
		int rel = insn_fetch(s8, 1, c->eip);
1329

1330
		if (test_cc(c->b, _eflags))
1331 1332 1333
		JMP_REL(rel);
		break;
	}
N
Nitin A Kamble 已提交
1334
	case 0x9c: /* pushf */
1335
		c->src.val =  (unsigned long) _eflags;
N
Nitin A Kamble 已提交
1336
		goto push;
N
Nitin A Kamble 已提交
1337
	case 0x9d: /* popf */
1338
		c->dst.ptr = (unsigned long *) &_eflags;
N
Nitin A Kamble 已提交
1339
		goto pop_instruction;
1340
	case 0xc3: /* ret */
1341
		c->dst.ptr = &c->eip;
1342 1343 1344 1345
		goto pop_instruction;
	case 0xf4:              /* hlt */
		ctxt->vcpu->halt_request = 1;
		goto done;
1346
	}
1347 1348 1349
	if (c->rep_prefix) {
		if (c->regs[VCPU_REGS_RCX] == 0) {
			ctxt->vcpu->rip = c->eip;
A
Avi Kivity 已提交
1350 1351
			goto done;
		}
1352 1353
		c->regs[VCPU_REGS_RCX]--;
		c->eip = ctxt->vcpu->rip;
A
Avi Kivity 已提交
1354
	}
1355
	switch (c->b) {
A
Avi Kivity 已提交
1356
	case 0xa4 ... 0xa5:	/* movs */
1357 1358 1359 1360 1361
		c->dst.type = OP_MEM;
		c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
		c->dst.ptr = (unsigned long *)register_address(
						   ctxt->es_base,
						   c->regs[VCPU_REGS_RDI]);
A
Avi Kivity 已提交
1362
		if ((rc = ops->read_emulated(register_address(
1363 1364 1365 1366 1367
		      c->override_base ? *c->override_base :
					ctxt->ds_base,
					c->regs[VCPU_REGS_RSI]),
					&c->dst.val,
					c->dst.bytes, ctxt->vcpu)) != 0)
A
Avi Kivity 已提交
1368
			goto done;
1369 1370 1371 1372 1373 1374
		register_address_increment(c->regs[VCPU_REGS_RSI],
				       (_eflags & EFLG_DF) ? -c->dst.bytes
							   : c->dst.bytes);
		register_address_increment(c->regs[VCPU_REGS_RDI],
				       (_eflags & EFLG_DF) ? -c->dst.bytes
							   : c->dst.bytes);
A
Avi Kivity 已提交
1375 1376 1377 1378 1379
		break;
	case 0xa6 ... 0xa7:	/* cmps */
		DPRINTF("Urk! I don't handle CMPS.\n");
		goto cannot_emulate;
	case 0xaa ... 0xab:	/* stos */
1380 1381 1382 1383 1384 1385 1386
		c->dst.type = OP_MEM;
		c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
		c->dst.ptr = (unsigned long *)cr2;
		c->dst.val = c->regs[VCPU_REGS_RAX];
		register_address_increment(c->regs[VCPU_REGS_RDI],
				       (_eflags & EFLG_DF) ? -c->dst.bytes
							   : c->dst.bytes);
A
Avi Kivity 已提交
1387 1388
		break;
	case 0xac ... 0xad:	/* lods */
1389 1390 1391 1392 1393
		c->dst.type = OP_REG;
		c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
		c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX];
		if ((rc = ops->read_emulated(cr2, &c->dst.val,
					     c->dst.bytes,
1394
					     ctxt->vcpu)) != 0)
A
Avi Kivity 已提交
1395
			goto done;
1396 1397 1398
		register_address_increment(c->regs[VCPU_REGS_RSI],
				       (_eflags & EFLG_DF) ? -c->dst.bytes
							   : c->dst.bytes);
A
Avi Kivity 已提交
1399 1400 1401 1402
		break;
	case 0xae ... 0xaf:	/* scas */
		DPRINTF("Urk! I don't handle SCAS.\n");
		goto cannot_emulate;
1403 1404
	case 0xe8: /* call (near) */ {
		long int rel;
1405
		switch (c->op_bytes) {
1406
		case 2:
1407
			rel = insn_fetch(s16, 2, c->eip);
1408 1409
			break;
		case 4:
1410
			rel = insn_fetch(s32, 4, c->eip);
1411 1412
			break;
		case 8:
1413
			rel = insn_fetch(s64, 8, c->eip);
1414 1415 1416 1417 1418
			break;
		default:
			DPRINTF("Call: Invalid op_bytes\n");
			goto cannot_emulate;
		}
1419
		c->src.val = (unsigned long) c->eip;
1420
		JMP_REL(rel);
1421
		c->op_bytes = c->ad_bytes;
1422 1423 1424 1425
		goto push;
	}
	case 0xe9: /* jmp rel */
	case 0xeb: /* jmp rel short */
1426
		JMP_REL(c->src.val);
1427 1428 1429
		no_wb = 1; /* Disable writeback. */
		break;

1430

A
Avi Kivity 已提交
1431 1432 1433 1434
	}
	goto writeback;

twobyte_insn:
1435
	switch (c->b) {
A
Avi Kivity 已提交
1436
	case 0x01: /* lgdt, lidt, lmsw */
1437 1438
		/* Disable writeback. */
		no_wb = 1;
1439
		switch (c->modrm_reg) {
A
Avi Kivity 已提交
1440 1441 1442
			u16 size;
			unsigned long address;

1443
		case 0: /* vmcall */
1444
			if (c->modrm_mod != 3 || c->modrm_rm != 1)
1445 1446
				goto cannot_emulate;

1447 1448 1449 1450 1451
			rc = kvm_fix_hypercall(ctxt->vcpu);
			if (rc)
				goto done;

			kvm_emulate_hypercall(ctxt->vcpu);
1452
			break;
A
Avi Kivity 已提交
1453
		case 2: /* lgdt */
1454 1455
			rc = read_descriptor(ctxt, ops, c->src.ptr,
					     &size, &address, c->op_bytes);
A
Avi Kivity 已提交
1456 1457 1458 1459
			if (rc)
				goto done;
			realmode_lgdt(ctxt->vcpu, size, address);
			break;
1460
		case 3: /* lidt/vmmcall */
1461
			if (c->modrm_mod == 3 && c->modrm_rm == 1) {
1462 1463 1464 1465
				rc = kvm_fix_hypercall(ctxt->vcpu);
				if (rc)
					goto done;
				kvm_emulate_hypercall(ctxt->vcpu);
1466
			} else {
1467
				rc = read_descriptor(ctxt, ops, c->src.ptr,
1468
						     &size, &address,
1469
						     c->op_bytes);
1470 1471 1472 1473
				if (rc)
					goto done;
				realmode_lidt(ctxt->vcpu, size, address);
			}
A
Avi Kivity 已提交
1474 1475
			break;
		case 4: /* smsw */
1476
			if (c->modrm_mod != 3)
A
Avi Kivity 已提交
1477
				goto cannot_emulate;
1478
			*(u16 *)&c->regs[c->modrm_rm]
A
Avi Kivity 已提交
1479 1480 1481
				= realmode_get_cr(ctxt->vcpu, 0);
			break;
		case 6: /* lmsw */
1482
			if (c->modrm_mod != 3)
A
Avi Kivity 已提交
1483
				goto cannot_emulate;
1484
			realmode_lmsw(ctxt->vcpu, (u16)c->modrm_val, &_eflags);
A
Avi Kivity 已提交
1485 1486 1487 1488 1489 1490 1491 1492 1493
			break;
		case 7: /* invlpg*/
			emulate_invlpg(ctxt->vcpu, cr2);
			break;
		default:
			goto cannot_emulate;
		}
		break;
	case 0x21: /* mov from dr to reg */
1494
		no_wb = 1;
1495
		if (c->modrm_mod != 3)
A
Avi Kivity 已提交
1496
			goto cannot_emulate;
1497 1498
		rc = emulator_get_dr(ctxt, c->modrm_reg,
				     &c->regs[c->modrm_rm]);
A
Avi Kivity 已提交
1499 1500
		break;
	case 0x23: /* mov from reg to dr */
1501
		no_wb = 1;
1502
		if (c->modrm_mod != 3)
A
Avi Kivity 已提交
1503
			goto cannot_emulate;
1504 1505
		rc = emulator_set_dr(ctxt, c->modrm_reg,
				     c->regs[c->modrm_rm]);
A
Avi Kivity 已提交
1506 1507
		break;
	case 0x40 ... 0x4f:	/* cmov */
1508
		c->dst.val = c->dst.orig_val = c->src.val;
1509
		no_wb = 1;
A
Avi Kivity 已提交
1510 1511 1512 1513
		/*
		 * First, assume we're decoding an even cmov opcode
		 * (lsb == 0).
		 */
1514
		switch ((c->b & 15) >> 1) {
A
Avi Kivity 已提交
1515
		case 0:	/* cmovo */
1516
			no_wb = (_eflags & EFLG_OF) ? 0 : 1;
A
Avi Kivity 已提交
1517 1518
			break;
		case 1:	/* cmovb/cmovc/cmovnae */
1519
			no_wb = (_eflags & EFLG_CF) ? 0 : 1;
A
Avi Kivity 已提交
1520 1521
			break;
		case 2:	/* cmovz/cmove */
1522
			no_wb = (_eflags & EFLG_ZF) ? 0 : 1;
A
Avi Kivity 已提交
1523 1524
			break;
		case 3:	/* cmovbe/cmovna */
1525
			no_wb = (_eflags & (EFLG_CF | EFLG_ZF)) ? 0 : 1;
A
Avi Kivity 已提交
1526 1527
			break;
		case 4:	/* cmovs */
1528
			no_wb = (_eflags & EFLG_SF) ? 0 : 1;
A
Avi Kivity 已提交
1529 1530
			break;
		case 5:	/* cmovp/cmovpe */
1531
			no_wb = (_eflags & EFLG_PF) ? 0 : 1;
A
Avi Kivity 已提交
1532 1533
			break;
		case 7:	/* cmovle/cmovng */
1534
			no_wb = (_eflags & EFLG_ZF) ? 0 : 1;
A
Avi Kivity 已提交
1535 1536
			/* fall through */
		case 6:	/* cmovl/cmovnge */
1537 1538
			no_wb &= (!(_eflags & EFLG_SF) !=
			      !(_eflags & EFLG_OF)) ? 0 : 1;
A
Avi Kivity 已提交
1539 1540 1541
			break;
		}
		/* Odd cmov opcodes (lsb == 1) have inverted sense. */
1542
		no_wb ^= c->b & 1;
A
Avi Kivity 已提交
1543
		break;
1544 1545
	case 0xa3:
	      bt:		/* bt */
1546 1547 1548
		/* only subword offset */
		c->src.val &= (c->dst.bytes << 3) - 1;
		emulate_2op_SrcV_nobyte("bt", c->src, c->dst, _eflags);
1549 1550 1551
		break;
	case 0xab:
	      bts:		/* bts */
1552 1553 1554
		/* only subword offset */
		c->src.val &= (c->dst.bytes << 3) - 1;
		emulate_2op_SrcV_nobyte("bts", c->src, c->dst, _eflags);
1555
		break;
A
Avi Kivity 已提交
1556 1557 1558 1559 1560
	case 0xb0 ... 0xb1:	/* cmpxchg */
		/*
		 * Save real source value, then compare EAX against
		 * destination.
		 */
1561 1562 1563
		c->src.orig_val = c->src.val;
		c->src.val = c->regs[VCPU_REGS_RAX];
		emulate_2op_SrcV("cmp", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1564 1565
		if (_eflags & EFLG_ZF) {
			/* Success: write back to memory. */
1566
			c->dst.val = c->src.orig_val;
A
Avi Kivity 已提交
1567 1568
		} else {
			/* Failure: write the value we saw to EAX. */
1569 1570
			c->dst.type = OP_REG;
			c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX];
A
Avi Kivity 已提交
1571 1572 1573 1574
		}
		break;
	case 0xb3:
	      btr:		/* btr */
1575 1576 1577
		/* only subword offset */
		c->src.val &= (c->dst.bytes << 3) - 1;
		emulate_2op_SrcV_nobyte("btr", c->src, c->dst, _eflags);
A
Avi Kivity 已提交
1578 1579
		break;
	case 0xb6 ... 0xb7:	/* movzx */
1580 1581 1582
		c->dst.bytes = c->op_bytes;
		c->dst.val = (c->d & ByteOp) ? (u8) c->src.val
						       : (u16) c->src.val;
A
Avi Kivity 已提交
1583 1584
		break;
	case 0xba:		/* Grp8 */
1585
		switch (c->modrm_reg & 3) {
A
Avi Kivity 已提交
1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
		case 0:
			goto bt;
		case 1:
			goto bts;
		case 2:
			goto btr;
		case 3:
			goto btc;
		}
		break;
1596 1597
	case 0xbb:
	      btc:		/* btc */
1598 1599 1600
		/* only subword offset */
		c->src.val &= (c->dst.bytes << 3) - 1;
		emulate_2op_SrcV_nobyte("btc", c->src, c->dst, _eflags);
1601
		break;
A
Avi Kivity 已提交
1602
	case 0xbe ... 0xbf:	/* movsx */
1603 1604 1605
		c->dst.bytes = c->op_bytes;
		c->dst.val = (c->d & ByteOp) ? (s8) c->src.val :
							(s16) c->src.val;
A
Avi Kivity 已提交
1606
		break;
1607
	case 0xc3:		/* movnti */
1608 1609 1610
		c->dst.bytes = c->op_bytes;
		c->dst.val = (c->op_bytes == 4) ? (u32) c->src.val :
							(u64) c->src.val;
1611
		break;
A
Avi Kivity 已提交
1612 1613 1614 1615 1616
	}
	goto writeback;

twobyte_special_insn:
	/* Disable writeback. */
1617
	no_wb = 1;
1618
	switch (c->b) {
1619 1620 1621
	case 0x06:
		emulate_clts(ctxt->vcpu);
		break;
A
Avi Kivity 已提交
1622 1623
	case 0x08:		/* invd */
		break;
A
Avi Kivity 已提交
1624 1625
	case 0x09:		/* wbinvd */
		break;
A
Avi Kivity 已提交
1626 1627 1628 1629
	case 0x0d:		/* GrpP (prefetch) */
	case 0x18:		/* Grp16 (prefetch/nop) */
		break;
	case 0x20: /* mov cr, reg */
1630
		if (c->modrm_mod != 3)
A
Avi Kivity 已提交
1631
			goto cannot_emulate;
1632 1633
		c->regs[c->modrm_rm] =
				realmode_get_cr(ctxt->vcpu, c->modrm_reg);
A
Avi Kivity 已提交
1634 1635
		break;
	case 0x22: /* mov reg, cr */
1636
		if (c->modrm_mod != 3)
A
Avi Kivity 已提交
1637
			goto cannot_emulate;
1638 1639
		realmode_set_cr(ctxt->vcpu,
				c->modrm_reg, c->modrm_val, &_eflags);
A
Avi Kivity 已提交
1640
		break;
1641 1642
	case 0x30:
		/* wrmsr */
1643 1644 1645
		msr_data = (u32)c->regs[VCPU_REGS_RAX]
			| ((u64)c->regs[VCPU_REGS_RDX] << 32);
		rc = kvm_set_msr(ctxt->vcpu, c->regs[VCPU_REGS_RCX], msr_data);
1646
		if (rc) {
1647
			kvm_x86_ops->inject_gp(ctxt->vcpu, 0);
1648
			c->eip = ctxt->vcpu->rip;
1649 1650 1651 1652 1653
		}
		rc = X86EMUL_CONTINUE;
		break;
	case 0x32:
		/* rdmsr */
1654 1655
		rc = kvm_get_msr(ctxt->vcpu,
				 c->regs[VCPU_REGS_RCX], &msr_data);
1656
		if (rc) {
1657
			kvm_x86_ops->inject_gp(ctxt->vcpu, 0);
1658
			c->eip = ctxt->vcpu->rip;
1659
		} else {
1660 1661
			c->regs[VCPU_REGS_RAX] = (u32)msr_data;
			c->regs[VCPU_REGS_RDX] = msr_data >> 32;
1662 1663 1664
		}
		rc = X86EMUL_CONTINUE;
		break;
1665 1666 1667
	case 0x80 ... 0x8f: /* jnz rel, etc*/ {
		long int rel;

1668
		switch (c->op_bytes) {
1669
		case 2:
1670
			rel = insn_fetch(s16, 2, c->eip);
1671 1672
			break;
		case 4:
1673
			rel = insn_fetch(s32, 4, c->eip);
1674 1675
			break;
		case 8:
1676
			rel = insn_fetch(s64, 8, c->eip);
1677 1678 1679 1680 1681
			break;
		default:
			DPRINTF("jnz: Invalid op_bytes\n");
			goto cannot_emulate;
		}
1682
		if (test_cc(c->b, _eflags))
1683 1684 1685
			JMP_REL(rel);
		break;
	}
A
Avi Kivity 已提交
1686 1687
	case 0xc7:		/* Grp9 (cmpxchg8b) */
		{
1688
			u64 old, new;
1689 1690
			if ((rc = ops->read_emulated(cr2, &old, 8, ctxt->vcpu))
									!= 0)
A
Avi Kivity 已提交
1691
				goto done;
1692 1693 1694 1695 1696 1697
			if (((u32) (old >> 0) !=
					(u32) c->regs[VCPU_REGS_RAX]) ||
			    ((u32) (old >> 32) !=
					(u32) c->regs[VCPU_REGS_RDX])) {
				c->regs[VCPU_REGS_RAX] = (u32) (old >> 0);
				c->regs[VCPU_REGS_RDX] = (u32) (old >> 32);
A
Avi Kivity 已提交
1698 1699
				_eflags &= ~EFLG_ZF;
			} else {
1700 1701
				new = ((u64)c->regs[VCPU_REGS_RCX] << 32)
					| (u32) c->regs[VCPU_REGS_RBX];
1702
				if ((rc = ops->cmpxchg_emulated(cr2, &old,
1703
							  &new, 8, ctxt->vcpu)) != 0)
A
Avi Kivity 已提交
1704 1705 1706 1707 1708 1709 1710 1711 1712
					goto done;
				_eflags |= EFLG_ZF;
			}
			break;
		}
	}
	goto writeback;

cannot_emulate:
1713
	DPRINTF("Cannot emulate %02x\n", c->b);
A
Avi Kivity 已提交
1714 1715
	return -1;
}