xref: /freebsd/sys/amd64/vmm/vmm_instruction_emul.c (revision 30b318b92f13d33f63270b76fba2c32d8668ab7a)
1 /*-
2  * Copyright (c) 2012 Sandvine, Inc.
3  * Copyright (c) 2012 NetApp, Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  */
29 
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32 
33 #ifdef _KERNEL
34 #include <sys/param.h>
35 #include <sys/pcpu.h>
36 #include <sys/systm.h>
37 
38 #include <vm/vm.h>
39 #include <vm/pmap.h>
40 
41 #include <machine/pmap.h>
42 #include <machine/vmparam.h>
43 #include <machine/vmm.h>
44 #else	/* !_KERNEL */
45 #include <sys/types.h>
46 #include <sys/errno.h>
47 
48 #include <machine/vmm.h>
49 
50 #include <vmmapi.h>
51 #endif	/* _KERNEL */
52 
53 enum cpu_mode {
54 	CPU_MODE_COMPATIBILITY,		/* IA-32E mode (CS.L = 0) */
55 	CPU_MODE_64BIT,			/* IA-32E mode (CS.L = 1) */
56 };
57 
58 /* struct vie_op.op_type */
59 enum {
60 	VIE_OP_TYPE_NONE = 0,
61 	VIE_OP_TYPE_MOV,
62 	VIE_OP_TYPE_AND,
63 	VIE_OP_TYPE_OR,
64 	VIE_OP_TYPE_LAST
65 };
66 
67 /* struct vie_op.op_flags */
68 #define	VIE_OP_F_IMM		(1 << 0)	/* immediate operand present */
69 #define	VIE_OP_F_IMM8		(1 << 1)	/* 8-bit immediate operand */
70 
71 static const struct vie_op one_byte_opcodes[256] = {
72 	[0x88] = {
73 		.op_byte = 0x88,
74 		.op_type = VIE_OP_TYPE_MOV,
75 	},
76 	[0x89] = {
77 		.op_byte = 0x89,
78 		.op_type = VIE_OP_TYPE_MOV,
79 	},
80 	[0x8A] = {
81 		.op_byte = 0x8A,
82 		.op_type = VIE_OP_TYPE_MOV,
83 	},
84 	[0x8B] = {
85 		.op_byte = 0x8B,
86 		.op_type = VIE_OP_TYPE_MOV,
87 	},
88 	[0xC7] = {
89 		.op_byte = 0xC7,
90 		.op_type = VIE_OP_TYPE_MOV,
91 		.op_flags = VIE_OP_F_IMM,
92 	},
93 	[0x23] = {
94 		.op_byte = 0x23,
95 		.op_type = VIE_OP_TYPE_AND,
96 	},
97 	[0x81] = {
98 		/* XXX Group 1 extended opcode - not just AND */
99 		.op_byte = 0x81,
100 		.op_type = VIE_OP_TYPE_AND,
101 		.op_flags = VIE_OP_F_IMM,
102 	},
103 	[0x83] = {
104 		/* XXX Group 1 extended opcode - not just OR */
105 		.op_byte = 0x83,
106 		.op_type = VIE_OP_TYPE_OR,
107 		.op_flags = VIE_OP_F_IMM8,
108 	},
109 };
110 
111 /* struct vie.mod */
112 #define	VIE_MOD_INDIRECT		0
113 #define	VIE_MOD_INDIRECT_DISP8		1
114 #define	VIE_MOD_INDIRECT_DISP32		2
115 #define	VIE_MOD_DIRECT			3
116 
117 /* struct vie.rm */
118 #define	VIE_RM_SIB			4
119 #define	VIE_RM_DISP32			5
120 
121 #define	GB				(1024 * 1024 * 1024)
122 
123 static enum vm_reg_name gpr_map[16] = {
124 	VM_REG_GUEST_RAX,
125 	VM_REG_GUEST_RCX,
126 	VM_REG_GUEST_RDX,
127 	VM_REG_GUEST_RBX,
128 	VM_REG_GUEST_RSP,
129 	VM_REG_GUEST_RBP,
130 	VM_REG_GUEST_RSI,
131 	VM_REG_GUEST_RDI,
132 	VM_REG_GUEST_R8,
133 	VM_REG_GUEST_R9,
134 	VM_REG_GUEST_R10,
135 	VM_REG_GUEST_R11,
136 	VM_REG_GUEST_R12,
137 	VM_REG_GUEST_R13,
138 	VM_REG_GUEST_R14,
139 	VM_REG_GUEST_R15
140 };
141 
142 static uint64_t size2mask[] = {
143 	[1] = 0xff,
144 	[2] = 0xffff,
145 	[4] = 0xffffffff,
146 	[8] = 0xffffffffffffffff,
147 };
148 
149 static int
150 vie_read_register(void *vm, int vcpuid, enum vm_reg_name reg, uint64_t *rval)
151 {
152 	int error;
153 
154 	error = vm_get_register(vm, vcpuid, reg, rval);
155 
156 	return (error);
157 }
158 
159 static int
160 vie_read_bytereg(void *vm, int vcpuid, struct vie *vie, uint8_t *rval)
161 {
162 	uint64_t val;
163 	int error, rshift;
164 	enum vm_reg_name reg;
165 
166 	rshift = 0;
167 	reg = gpr_map[vie->reg];
168 
169 	/*
170 	 * 64-bit mode imposes limitations on accessing legacy byte registers.
171 	 *
172 	 * The legacy high-byte registers cannot be addressed if the REX
173 	 * prefix is present. In this case the values 4, 5, 6 and 7 of the
174 	 * 'ModRM:reg' field address %spl, %bpl, %sil and %dil respectively.
175 	 *
176 	 * If the REX prefix is not present then the values 4, 5, 6 and 7
177 	 * of the 'ModRM:reg' field address the legacy high-byte registers,
178 	 * %ah, %ch, %dh and %bh respectively.
179 	 */
180 	if (!vie->rex_present) {
181 		if (vie->reg & 0x4) {
182 			/*
183 			 * Obtain the value of %ah by reading %rax and shifting
184 			 * right by 8 bits (same for %bh, %ch and %dh).
185 			 */
186 			rshift = 8;
187 			reg = gpr_map[vie->reg & 0x3];
188 		}
189 	}
190 
191 	error = vm_get_register(vm, vcpuid, reg, &val);
192 	*rval = val >> rshift;
193 	return (error);
194 }
195 
196 static int
197 vie_update_register(void *vm, int vcpuid, enum vm_reg_name reg,
198 		    uint64_t val, int size)
199 {
200 	int error;
201 	uint64_t origval;
202 
203 	switch (size) {
204 	case 1:
205 	case 2:
206 		error = vie_read_register(vm, vcpuid, reg, &origval);
207 		if (error)
208 			return (error);
209 		val &= size2mask[size];
210 		val |= origval & ~size2mask[size];
211 		break;
212 	case 4:
213 		val &= 0xffffffffUL;
214 		break;
215 	case 8:
216 		break;
217 	default:
218 		return (EINVAL);
219 	}
220 
221 	error = vm_set_register(vm, vcpuid, reg, val);
222 	return (error);
223 }
224 
225 /*
226  * The following simplifying assumptions are made during emulation:
227  *
228  * - guest is in 64-bit mode
229  *   - default address size is 64-bits
230  *   - default operand size is 32-bits
231  *
232  * - operand size override is not supported
233  *
234  * - address size override is not supported
235  */
236 static int
237 emulate_mov(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
238 	    mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
239 {
240 	int error, size;
241 	enum vm_reg_name reg;
242 	uint8_t byte;
243 	uint64_t val;
244 
245 	size = 4;
246 	error = EINVAL;
247 
248 	switch (vie->op.op_byte) {
249 	case 0x88:
250 		/*
251 		 * MOV byte from reg (ModRM:reg) to mem (ModRM:r/m)
252 		 * 88/r:	mov r/m8, r8
253 		 * REX + 88/r:	mov r/m8, r8 (%ah, %ch, %dh, %bh not available)
254 		 */
255 		size = 1;
256 		error = vie_read_bytereg(vm, vcpuid, vie, &byte);
257 		if (error == 0)
258 			error = memwrite(vm, vcpuid, gpa, byte, size, arg);
259 		break;
260 	case 0x89:
261 		/*
262 		 * MOV from reg (ModRM:reg) to mem (ModRM:r/m)
263 		 * 89/r:	mov r/m32, r32
264 		 * REX.W + 89/r	mov r/m64, r64
265 		 */
266 		if (vie->rex_w)
267 			size = 8;
268 		reg = gpr_map[vie->reg];
269 		error = vie_read_register(vm, vcpuid, reg, &val);
270 		if (error == 0) {
271 			val &= size2mask[size];
272 			error = memwrite(vm, vcpuid, gpa, val, size, arg);
273 		}
274 		break;
275 	case 0x8A:
276 	case 0x8B:
277 		/*
278 		 * MOV from mem (ModRM:r/m) to reg (ModRM:reg)
279 		 * 8A/r:	mov r/m8, r8
280 		 * REX + 8A/r:	mov r/m8, r8
281 		 * 8B/r:	mov r32, r/m32
282 		 * REX.W 8B/r:	mov r64, r/m64
283 		 */
284 		if (vie->op.op_byte == 0x8A)
285 			size = 1;
286 		else if (vie->rex_w)
287 			size = 8;
288 		error = memread(vm, vcpuid, gpa, &val, size, arg);
289 		if (error == 0) {
290 			reg = gpr_map[vie->reg];
291 			error = vie_update_register(vm, vcpuid, reg, val, size);
292 		}
293 		break;
294 	case 0xC7:
295 		/*
296 		 * MOV from imm32 to mem (ModRM:r/m)
297 		 * C7/0		mov r/m32, imm32
298 		 * REX.W + C7/0	mov r/m64, imm32 (sign-extended to 64-bits)
299 		 */
300 		val = vie->immediate;		/* already sign-extended */
301 
302 		if (vie->rex_w)
303 			size = 8;
304 
305 		if (size != 8)
306 			val &= size2mask[size];
307 
308 		error = memwrite(vm, vcpuid, gpa, val, size, arg);
309 		break;
310 	default:
311 		break;
312 	}
313 
314 	return (error);
315 }
316 
317 static int
318 emulate_and(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
319 	    mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
320 {
321 	int error, size;
322 	enum vm_reg_name reg;
323 	uint64_t val1, val2;
324 
325 	size = 4;
326 	error = EINVAL;
327 
328 	switch (vie->op.op_byte) {
329 	case 0x23:
330 		/*
331 		 * AND reg (ModRM:reg) and mem (ModRM:r/m) and store the
332 		 * result in reg.
333 		 *
334 		 * 23/r		and r32, r/m32
335 		 * REX.W + 23/r	and r64, r/m64
336 		 */
337 		if (vie->rex_w)
338 			size = 8;
339 
340 		/* get the first operand */
341 		reg = gpr_map[vie->reg];
342 		error = vie_read_register(vm, vcpuid, reg, &val1);
343 		if (error)
344 			break;
345 
346 		/* get the second operand */
347 		error = memread(vm, vcpuid, gpa, &val2, size, arg);
348 		if (error)
349 			break;
350 
351 		/* perform the operation and write the result */
352 		val1 &= val2;
353 		error = vie_update_register(vm, vcpuid, reg, val1, size);
354 		break;
355 	case 0x81:
356 		/*
357 		 * AND mem (ModRM:r/m) with immediate and store the
358 		 * result in mem.
359 		 *
360 		 * 81/          and r/m32, imm32
361 		 * REX.W + 81/  and r/m64, imm32 sign-extended to 64
362 		 *
363 		 * Currently, only the AND operation of the 0x81 opcode
364 		 * is implemented (ModRM:reg = b100).
365 		 */
366 		if ((vie->reg & 7) != 4)
367 			break;
368 
369 		if (vie->rex_w)
370 			size = 8;
371 
372 		/* get the first operand */
373                 error = memread(vm, vcpuid, gpa, &val1, size, arg);
374                 if (error)
375 			break;
376 
377                 /*
378 		 * perform the operation with the pre-fetched immediate
379 		 * operand and write the result
380 		 */
381                 val1 &= vie->immediate;
382                 error = memwrite(vm, vcpuid, gpa, val1, size, arg);
383 		break;
384 	default:
385 		break;
386 	}
387 	return (error);
388 }
389 
390 static int
391 emulate_or(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
392 	    mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
393 {
394 	int error, size;
395 	uint64_t val1;
396 
397 	size = 4;
398 	error = EINVAL;
399 
400 	switch (vie->op.op_byte) {
401 	case 0x83:
402 		/*
403 		 * OR mem (ModRM:r/m) with immediate and store the
404 		 * result in mem.
405 		 *
406 		 * 83/          OR r/m32, imm8 sign-extended to 32
407 		 * REX.W + 83/  OR r/m64, imm8 sign-extended to 64
408 		 *
409 		 * Currently, only the OR operation of the 0x83 opcode
410 		 * is implemented (ModRM:reg = b001).
411 		 */
412 		if ((vie->reg & 7) != 1)
413 			break;
414 
415 		if (vie->rex_w)
416 			size = 8;
417 
418 		/* get the first operand */
419                 error = memread(vm, vcpuid, gpa, &val1, size, arg);
420                 if (error)
421 			break;
422 
423                 /*
424 		 * perform the operation with the pre-fetched immediate
425 		 * operand and write the result
426 		 */
427                 val1 |= vie->immediate;
428                 error = memwrite(vm, vcpuid, gpa, val1, size, arg);
429 		break;
430 	default:
431 		break;
432 	}
433 	return (error);
434 }
435 
436 int
437 vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
438 			mem_region_read_t memread, mem_region_write_t memwrite,
439 			void *memarg)
440 {
441 	int error;
442 
443 	if (!vie->decoded)
444 		return (EINVAL);
445 
446 	switch (vie->op.op_type) {
447 	case VIE_OP_TYPE_MOV:
448 		error = emulate_mov(vm, vcpuid, gpa, vie,
449 				    memread, memwrite, memarg);
450 		break;
451 	case VIE_OP_TYPE_AND:
452 		error = emulate_and(vm, vcpuid, gpa, vie,
453 				    memread, memwrite, memarg);
454 		break;
455 	case VIE_OP_TYPE_OR:
456 		error = emulate_or(vm, vcpuid, gpa, vie,
457 				    memread, memwrite, memarg);
458 		break;
459 	default:
460 		error = EINVAL;
461 		break;
462 	}
463 
464 	return (error);
465 }
466 
467 #ifdef _KERNEL
468 void
469 vie_init(struct vie *vie)
470 {
471 
472 	bzero(vie, sizeof(struct vie));
473 
474 	vie->base_register = VM_REG_LAST;
475 	vie->index_register = VM_REG_LAST;
476 }
477 
478 static int
479 gla2gpa(struct vm *vm, uint64_t gla, uint64_t ptpphys,
480 	uint64_t *gpa, uint64_t *gpaend)
481 {
482 	int nlevels, ptpshift, ptpindex;
483 	uint64_t *ptpbase, pte, pgsize;
484 	void *cookie;
485 
486 	/*
487 	 * XXX assumes 64-bit guest with 4 page walk levels
488 	 */
489 	nlevels = 4;
490 	while (--nlevels >= 0) {
491 		/* Zero out the lower 12 bits and the upper 12 bits */
492 		ptpphys >>= 12; ptpphys <<= 24; ptpphys >>= 12;
493 
494 		ptpbase = vm_gpa_hold(vm, ptpphys, PAGE_SIZE, VM_PROT_READ,
495 				      &cookie);
496 		if (ptpbase == NULL)
497 			goto error;
498 
499 		ptpshift = PAGE_SHIFT + nlevels * 9;
500 		ptpindex = (gla >> ptpshift) & 0x1FF;
501 		pgsize = 1UL << ptpshift;
502 
503 		pte = ptpbase[ptpindex];
504 
505 		vm_gpa_release(cookie);
506 
507 		if ((pte & PG_V) == 0)
508 			goto error;
509 
510 		if (pte & PG_PS) {
511 			if (pgsize > 1 * GB)
512 				goto error;
513 			else
514 				break;
515 		}
516 
517 		ptpphys = pte;
518 	}
519 
520 	/* Zero out the lower 'ptpshift' bits and the upper 12 bits */
521 	pte >>= ptpshift; pte <<= (ptpshift + 12); pte >>= 12;
522 	*gpa = pte | (gla & (pgsize - 1));
523 	*gpaend = pte + pgsize;
524 	return (0);
525 
526 error:
527 	return (-1);
528 }
529 
530 int
531 vmm_fetch_instruction(struct vm *vm, int cpuid, uint64_t rip, int inst_length,
532 		      uint64_t cr3, struct vie *vie)
533 {
534 	int n, err, prot;
535 	uint64_t gpa, gpaend, off;
536 	void *hpa, *cookie;
537 
538 	/*
539 	 * XXX cache previously fetched instructions using 'rip' as the tag
540 	 */
541 
542 	prot = VM_PROT_READ | VM_PROT_EXECUTE;
543 	if (inst_length > VIE_INST_SIZE)
544 		panic("vmm_fetch_instruction: invalid length %d", inst_length);
545 
546 	/* Copy the instruction into 'vie' */
547 	while (vie->num_valid < inst_length) {
548 		err = gla2gpa(vm, rip, cr3, &gpa, &gpaend);
549 		if (err)
550 			break;
551 
552 		off = gpa & PAGE_MASK;
553 		n = min(inst_length - vie->num_valid, PAGE_SIZE - off);
554 
555 		if ((hpa = vm_gpa_hold(vm, gpa, n, prot, &cookie)) == NULL)
556 			break;
557 
558 		bcopy(hpa, &vie->inst[vie->num_valid], n);
559 
560 		vm_gpa_release(cookie);
561 
562 		rip += n;
563 		vie->num_valid += n;
564 	}
565 
566 	if (vie->num_valid == inst_length)
567 		return (0);
568 	else
569 		return (-1);
570 }
571 
572 static int
573 vie_peek(struct vie *vie, uint8_t *x)
574 {
575 
576 	if (vie->num_processed < vie->num_valid) {
577 		*x = vie->inst[vie->num_processed];
578 		return (0);
579 	} else
580 		return (-1);
581 }
582 
583 static void
584 vie_advance(struct vie *vie)
585 {
586 
587 	vie->num_processed++;
588 }
589 
590 static int
591 decode_rex(struct vie *vie)
592 {
593 	uint8_t x;
594 
595 	if (vie_peek(vie, &x))
596 		return (-1);
597 
598 	if (x >= 0x40 && x <= 0x4F) {
599 		vie->rex_present = 1;
600 
601 		vie->rex_w = x & 0x8 ? 1 : 0;
602 		vie->rex_r = x & 0x4 ? 1 : 0;
603 		vie->rex_x = x & 0x2 ? 1 : 0;
604 		vie->rex_b = x & 0x1 ? 1 : 0;
605 
606 		vie_advance(vie);
607 	}
608 
609 	return (0);
610 }
611 
612 static int
613 decode_opcode(struct vie *vie)
614 {
615 	uint8_t x;
616 
617 	if (vie_peek(vie, &x))
618 		return (-1);
619 
620 	vie->op = one_byte_opcodes[x];
621 
622 	if (vie->op.op_type == VIE_OP_TYPE_NONE)
623 		return (-1);
624 
625 	vie_advance(vie);
626 	return (0);
627 }
628 
629 static int
630 decode_modrm(struct vie *vie)
631 {
632 	uint8_t x;
633 	enum cpu_mode cpu_mode;
634 
635 	/*
636 	 * XXX assuming that guest is in IA-32E 64-bit mode
637 	 */
638 	cpu_mode = CPU_MODE_64BIT;
639 
640 	if (vie_peek(vie, &x))
641 		return (-1);
642 
643 	vie->mod = (x >> 6) & 0x3;
644 	vie->rm =  (x >> 0) & 0x7;
645 	vie->reg = (x >> 3) & 0x7;
646 
647 	/*
648 	 * A direct addressing mode makes no sense in the context of an EPT
649 	 * fault. There has to be a memory access involved to cause the
650 	 * EPT fault.
651 	 */
652 	if (vie->mod == VIE_MOD_DIRECT)
653 		return (-1);
654 
655 	if ((vie->mod == VIE_MOD_INDIRECT && vie->rm == VIE_RM_DISP32) ||
656 	    (vie->mod != VIE_MOD_DIRECT && vie->rm == VIE_RM_SIB)) {
657 		/*
658 		 * Table 2-5: Special Cases of REX Encodings
659 		 *
660 		 * mod=0, r/m=5 is used in the compatibility mode to
661 		 * indicate a disp32 without a base register.
662 		 *
663 		 * mod!=3, r/m=4 is used in the compatibility mode to
664 		 * indicate that the SIB byte is present.
665 		 *
666 		 * The 'b' bit in the REX prefix is don't care in
667 		 * this case.
668 		 */
669 	} else {
670 		vie->rm |= (vie->rex_b << 3);
671 	}
672 
673 	vie->reg |= (vie->rex_r << 3);
674 
675 	/* SIB */
676 	if (vie->mod != VIE_MOD_DIRECT && vie->rm == VIE_RM_SIB)
677 		goto done;
678 
679 	vie->base_register = gpr_map[vie->rm];
680 
681 	switch (vie->mod) {
682 	case VIE_MOD_INDIRECT_DISP8:
683 		vie->disp_bytes = 1;
684 		break;
685 	case VIE_MOD_INDIRECT_DISP32:
686 		vie->disp_bytes = 4;
687 		break;
688 	case VIE_MOD_INDIRECT:
689 		if (vie->rm == VIE_RM_DISP32) {
690 			vie->disp_bytes = 4;
691 			/*
692 			 * Table 2-7. RIP-Relative Addressing
693 			 *
694 			 * In 64-bit mode mod=00 r/m=101 implies [rip] + disp32
695 			 * whereas in compatibility mode it just implies disp32.
696 			 */
697 
698 			if (cpu_mode == CPU_MODE_64BIT)
699 				vie->base_register = VM_REG_GUEST_RIP;
700 			else
701 				vie->base_register = VM_REG_LAST;
702 		}
703 		break;
704 	}
705 
706 done:
707 	vie_advance(vie);
708 
709 	return (0);
710 }
711 
712 static int
713 decode_sib(struct vie *vie)
714 {
715 	uint8_t x;
716 
717 	/* Proceed only if SIB byte is present */
718 	if (vie->mod == VIE_MOD_DIRECT || vie->rm != VIE_RM_SIB)
719 		return (0);
720 
721 	if (vie_peek(vie, &x))
722 		return (-1);
723 
724 	/* De-construct the SIB byte */
725 	vie->ss = (x >> 6) & 0x3;
726 	vie->index = (x >> 3) & 0x7;
727 	vie->base = (x >> 0) & 0x7;
728 
729 	/* Apply the REX prefix modifiers */
730 	vie->index |= vie->rex_x << 3;
731 	vie->base |= vie->rex_b << 3;
732 
733 	switch (vie->mod) {
734 	case VIE_MOD_INDIRECT_DISP8:
735 		vie->disp_bytes = 1;
736 		break;
737 	case VIE_MOD_INDIRECT_DISP32:
738 		vie->disp_bytes = 4;
739 		break;
740 	}
741 
742 	if (vie->mod == VIE_MOD_INDIRECT &&
743 	    (vie->base == 5 || vie->base == 13)) {
744 		/*
745 		 * Special case when base register is unused if mod = 0
746 		 * and base = %rbp or %r13.
747 		 *
748 		 * Documented in:
749 		 * Table 2-3: 32-bit Addressing Forms with the SIB Byte
750 		 * Table 2-5: Special Cases of REX Encodings
751 		 */
752 		vie->disp_bytes = 4;
753 	} else {
754 		vie->base_register = gpr_map[vie->base];
755 	}
756 
757 	/*
758 	 * All encodings of 'index' are valid except for %rsp (4).
759 	 *
760 	 * Documented in:
761 	 * Table 2-3: 32-bit Addressing Forms with the SIB Byte
762 	 * Table 2-5: Special Cases of REX Encodings
763 	 */
764 	if (vie->index != 4)
765 		vie->index_register = gpr_map[vie->index];
766 
767 	/* 'scale' makes sense only in the context of an index register */
768 	if (vie->index_register < VM_REG_LAST)
769 		vie->scale = 1 << vie->ss;
770 
771 	vie_advance(vie);
772 
773 	return (0);
774 }
775 
776 static int
777 decode_displacement(struct vie *vie)
778 {
779 	int n, i;
780 	uint8_t x;
781 
782 	union {
783 		char	buf[4];
784 		int8_t	signed8;
785 		int32_t	signed32;
786 	} u;
787 
788 	if ((n = vie->disp_bytes) == 0)
789 		return (0);
790 
791 	if (n != 1 && n != 4)
792 		panic("decode_displacement: invalid disp_bytes %d", n);
793 
794 	for (i = 0; i < n; i++) {
795 		if (vie_peek(vie, &x))
796 			return (-1);
797 
798 		u.buf[i] = x;
799 		vie_advance(vie);
800 	}
801 
802 	if (n == 1)
803 		vie->displacement = u.signed8;		/* sign-extended */
804 	else
805 		vie->displacement = u.signed32;		/* sign-extended */
806 
807 	return (0);
808 }
809 
810 static int
811 decode_immediate(struct vie *vie)
812 {
813 	int i, n;
814 	uint8_t x;
815 	union {
816 		char	buf[4];
817 		int8_t	signed8;
818 		int32_t	signed32;
819 	} u;
820 
821 	/* Figure out immediate operand size (if any) */
822 	if (vie->op.op_flags & VIE_OP_F_IMM)
823 		vie->imm_bytes = 4;
824 	else if (vie->op.op_flags & VIE_OP_F_IMM8)
825 		vie->imm_bytes = 1;
826 
827 	if ((n = vie->imm_bytes) == 0)
828 		return (0);
829 
830 	if (n != 1 && n != 4)
831 		panic("decode_immediate: invalid imm_bytes %d", n);
832 
833 	for (i = 0; i < n; i++) {
834 		if (vie_peek(vie, &x))
835 			return (-1);
836 
837 		u.buf[i] = x;
838 		vie_advance(vie);
839 	}
840 
841 	if (n == 1)
842 		vie->immediate = u.signed8;		/* sign-extended */
843 	else
844 		vie->immediate = u.signed32;		/* sign-extended */
845 
846 	return (0);
847 }
848 
849 /*
850  * Verify that all the bytes in the instruction buffer were consumed.
851  */
852 static int
853 verify_inst_length(struct vie *vie)
854 {
855 
856 	if (vie->num_processed == vie->num_valid)
857 		return (0);
858 	else
859 		return (-1);
860 }
861 
862 /*
863  * Verify that the 'guest linear address' provided as collateral of the nested
864  * page table fault matches with our instruction decoding.
865  */
866 static int
867 verify_gla(struct vm *vm, int cpuid, uint64_t gla, struct vie *vie)
868 {
869 	int error;
870 	uint64_t base, idx;
871 
872 	/* Skip 'gla' verification */
873 	if (gla == VIE_INVALID_GLA)
874 		return (0);
875 
876 	base = 0;
877 	if (vie->base_register != VM_REG_LAST) {
878 		error = vm_get_register(vm, cpuid, vie->base_register, &base);
879 		if (error) {
880 			printf("verify_gla: error %d getting base reg %d\n",
881 				error, vie->base_register);
882 			return (-1);
883 		}
884 
885 		/*
886 		 * RIP-relative addressing starts from the following
887 		 * instruction
888 		 */
889 		if (vie->base_register == VM_REG_GUEST_RIP)
890 			base += vie->num_valid;
891 	}
892 
893 	idx = 0;
894 	if (vie->index_register != VM_REG_LAST) {
895 		error = vm_get_register(vm, cpuid, vie->index_register, &idx);
896 		if (error) {
897 			printf("verify_gla: error %d getting index reg %d\n",
898 				error, vie->index_register);
899 			return (-1);
900 		}
901 	}
902 
903 	if (base + vie->scale * idx + vie->displacement != gla) {
904 		printf("verify_gla mismatch: "
905 		       "base(0x%0lx), scale(%d), index(0x%0lx), "
906 		       "disp(0x%0lx), gla(0x%0lx)\n",
907 		       base, vie->scale, idx, vie->displacement, gla);
908 		return (-1);
909 	}
910 
911 	return (0);
912 }
913 
914 int
915 vmm_decode_instruction(struct vm *vm, int cpuid, uint64_t gla, struct vie *vie)
916 {
917 
918 	if (decode_rex(vie))
919 		return (-1);
920 
921 	if (decode_opcode(vie))
922 		return (-1);
923 
924 	if (decode_modrm(vie))
925 		return (-1);
926 
927 	if (decode_sib(vie))
928 		return (-1);
929 
930 	if (decode_displacement(vie))
931 		return (-1);
932 
933 	if (decode_immediate(vie))
934 		return (-1);
935 
936 	if (verify_inst_length(vie))
937 		return (-1);
938 
939 	if (verify_gla(vm, cpuid, gla, vie))
940 		return (-1);
941 
942 	vie->decoded = 1;	/* success */
943 
944 	return (0);
945 }
946 #endif	/* _KERNEL */
947