]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/amd64/vmm/vmm_instruction_emul.c
IFC @r272481
[FreeBSD/FreeBSD.git] / sys / amd64 / vmm / vmm_instruction_emul.c
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 #include <sys/proc.h>
38
39 #include <vm/vm.h>
40 #include <vm/pmap.h>
41
42 #include <machine/vmparam.h>
43 #include <machine/vmm.h>
44 #else   /* !_KERNEL */
45 #include <sys/types.h>
46 #include <sys/errno.h>
47 #include <sys/_iovec.h>
48
49 #include <machine/vmm.h>
50
51 #include <assert.h>
52 #include <vmmapi.h>
53 #define KASSERT(exp,msg)        assert((exp))
54 #endif  /* _KERNEL */
55
56 #include <machine/vmm_instruction_emul.h>
57 #include <x86/psl.h>
58 #include <x86/specialreg.h>
59
60 /* struct vie_op.op_type */
61 enum {
62         VIE_OP_TYPE_NONE = 0,
63         VIE_OP_TYPE_MOV,
64         VIE_OP_TYPE_MOVSX,
65         VIE_OP_TYPE_MOVZX,
66         VIE_OP_TYPE_AND,
67         VIE_OP_TYPE_OR,
68         VIE_OP_TYPE_SUB,
69         VIE_OP_TYPE_TWO_BYTE,
70         VIE_OP_TYPE_PUSH,
71         VIE_OP_TYPE_CMP,
72         VIE_OP_TYPE_LAST
73 };
74
75 /* struct vie_op.op_flags */
76 #define VIE_OP_F_IMM            (1 << 0)  /* 16/32-bit immediate operand */
77 #define VIE_OP_F_IMM8           (1 << 1)  /* 8-bit immediate operand */
78 #define VIE_OP_F_MOFFSET        (1 << 2)  /* 16/32/64-bit immediate moffset */
79 #define VIE_OP_F_NO_MODRM       (1 << 3)
80
81 static const struct vie_op two_byte_opcodes[256] = {
82         [0xB6] = {
83                 .op_byte = 0xB6,
84                 .op_type = VIE_OP_TYPE_MOVZX,
85         },
86         [0xB7] = {
87                 .op_byte = 0xB7,
88                 .op_type = VIE_OP_TYPE_MOVZX,
89         },
90         [0xBE] = {
91                 .op_byte = 0xBE,
92                 .op_type = VIE_OP_TYPE_MOVSX,
93         },
94 };
95
96 static const struct vie_op one_byte_opcodes[256] = {
97         [0x0F] = {
98                 .op_byte = 0x0F,
99                 .op_type = VIE_OP_TYPE_TWO_BYTE
100         },
101         [0x2B] = {
102                 .op_byte = 0x2B,
103                 .op_type = VIE_OP_TYPE_SUB,
104         },
105         [0x3B] = {
106                 .op_byte = 0x3B,
107                 .op_type = VIE_OP_TYPE_CMP,
108         },
109         [0x88] = {
110                 .op_byte = 0x88,
111                 .op_type = VIE_OP_TYPE_MOV,
112         },
113         [0x89] = {
114                 .op_byte = 0x89,
115                 .op_type = VIE_OP_TYPE_MOV,
116         },
117         [0x8A] = {
118                 .op_byte = 0x8A,
119                 .op_type = VIE_OP_TYPE_MOV,
120         },
121         [0x8B] = {
122                 .op_byte = 0x8B,
123                 .op_type = VIE_OP_TYPE_MOV,
124         },
125         [0xA1] = {
126                 .op_byte = 0xA1,
127                 .op_type = VIE_OP_TYPE_MOV,
128                 .op_flags = VIE_OP_F_MOFFSET | VIE_OP_F_NO_MODRM,
129         },
130         [0xA3] = {
131                 .op_byte = 0xA3,
132                 .op_type = VIE_OP_TYPE_MOV,
133                 .op_flags = VIE_OP_F_MOFFSET | VIE_OP_F_NO_MODRM,
134         },
135         [0xC6] = {
136                 /* XXX Group 11 extended opcode - not just MOV */
137                 .op_byte = 0xC6,
138                 .op_type = VIE_OP_TYPE_MOV,
139                 .op_flags = VIE_OP_F_IMM8,
140         },
141         [0xC7] = {
142                 .op_byte = 0xC7,
143                 .op_type = VIE_OP_TYPE_MOV,
144                 .op_flags = VIE_OP_F_IMM,
145         },
146         [0x23] = {
147                 .op_byte = 0x23,
148                 .op_type = VIE_OP_TYPE_AND,
149         },
150         [0x81] = {
151                 /* XXX Group 1 extended opcode - not just AND */
152                 .op_byte = 0x81,
153                 .op_type = VIE_OP_TYPE_AND,
154                 .op_flags = VIE_OP_F_IMM,
155         },
156         [0x83] = {
157                 /* XXX Group 1 extended opcode - not just OR */
158                 .op_byte = 0x83,
159                 .op_type = VIE_OP_TYPE_OR,
160                 .op_flags = VIE_OP_F_IMM8,
161         },
162         [0xFF] = {
163                 /* XXX Group 5 extended opcode - not just PUSH */
164                 .op_byte = 0xFF,
165                 .op_type = VIE_OP_TYPE_PUSH,
166         }
167 };
168
169 /* struct vie.mod */
170 #define VIE_MOD_INDIRECT                0
171 #define VIE_MOD_INDIRECT_DISP8          1
172 #define VIE_MOD_INDIRECT_DISP32         2
173 #define VIE_MOD_DIRECT                  3
174
175 /* struct vie.rm */
176 #define VIE_RM_SIB                      4
177 #define VIE_RM_DISP32                   5
178
179 #define GB                              (1024 * 1024 * 1024)
180
181 static enum vm_reg_name gpr_map[16] = {
182         VM_REG_GUEST_RAX,
183         VM_REG_GUEST_RCX,
184         VM_REG_GUEST_RDX,
185         VM_REG_GUEST_RBX,
186         VM_REG_GUEST_RSP,
187         VM_REG_GUEST_RBP,
188         VM_REG_GUEST_RSI,
189         VM_REG_GUEST_RDI,
190         VM_REG_GUEST_R8,
191         VM_REG_GUEST_R9,
192         VM_REG_GUEST_R10,
193         VM_REG_GUEST_R11,
194         VM_REG_GUEST_R12,
195         VM_REG_GUEST_R13,
196         VM_REG_GUEST_R14,
197         VM_REG_GUEST_R15
198 };
199
200 static uint64_t size2mask[] = {
201         [1] = 0xff,
202         [2] = 0xffff,
203         [4] = 0xffffffff,
204         [8] = 0xffffffffffffffff,
205 };
206
207 static int
208 vie_read_register(void *vm, int vcpuid, enum vm_reg_name reg, uint64_t *rval)
209 {
210         int error;
211
212         error = vm_get_register(vm, vcpuid, reg, rval);
213
214         return (error);
215 }
216
217 static void
218 vie_calc_bytereg(struct vie *vie, enum vm_reg_name *reg, int *lhbr)
219 {
220         *lhbr = 0;
221         *reg = gpr_map[vie->reg];
222
223         /*
224          * 64-bit mode imposes limitations on accessing legacy high byte
225          * registers (lhbr).
226          *
227          * The legacy high-byte registers cannot be addressed if the REX
228          * prefix is present. In this case the values 4, 5, 6 and 7 of the
229          * 'ModRM:reg' field address %spl, %bpl, %sil and %dil respectively.
230          *
231          * If the REX prefix is not present then the values 4, 5, 6 and 7
232          * of the 'ModRM:reg' field address the legacy high-byte registers,
233          * %ah, %ch, %dh and %bh respectively.
234          */
235         if (!vie->rex_present) {
236                 if (vie->reg & 0x4) {
237                         *lhbr = 1;
238                         *reg = gpr_map[vie->reg & 0x3];
239                 }
240         }
241 }
242
243 static int
244 vie_read_bytereg(void *vm, int vcpuid, struct vie *vie, uint8_t *rval)
245 {
246         uint64_t val;
247         int error, lhbr;
248         enum vm_reg_name reg;
249
250         vie_calc_bytereg(vie, &reg, &lhbr);
251         error = vm_get_register(vm, vcpuid, reg, &val);
252
253         /*
254          * To obtain the value of a legacy high byte register shift the
255          * base register right by 8 bits (%ah = %rax >> 8).
256          */
257         if (lhbr)
258                 *rval = val >> 8;
259         else
260                 *rval = val;
261         return (error);
262 }
263
264 static int
265 vie_write_bytereg(void *vm, int vcpuid, struct vie *vie, uint8_t byte)
266 {
267         uint64_t origval, val, mask;
268         int error, lhbr;
269         enum vm_reg_name reg;
270
271         vie_calc_bytereg(vie, &reg, &lhbr);
272         error = vm_get_register(vm, vcpuid, reg, &origval);
273         if (error == 0) {
274                 val = byte;
275                 mask = 0xff;
276                 if (lhbr) {
277                         /*
278                          * Shift left by 8 to store 'byte' in a legacy high
279                          * byte register.
280                          */
281                         val <<= 8;
282                         mask <<= 8;
283                 }
284                 val |= origval & ~mask;
285                 error = vm_set_register(vm, vcpuid, reg, val);
286         }
287         return (error);
288 }
289
290 int
291 vie_update_register(void *vm, int vcpuid, enum vm_reg_name reg,
292                     uint64_t val, int size)
293 {
294         int error;
295         uint64_t origval;
296
297         switch (size) {
298         case 1:
299         case 2:
300                 error = vie_read_register(vm, vcpuid, reg, &origval);
301                 if (error)
302                         return (error);
303                 val &= size2mask[size];
304                 val |= origval & ~size2mask[size];
305                 break;
306         case 4:
307                 val &= 0xffffffffUL;
308                 break;
309         case 8:
310                 break;
311         default:
312                 return (EINVAL);
313         }
314
315         error = vm_set_register(vm, vcpuid, reg, val);
316         return (error);
317 }
318
319 #define RFLAGS_STATUS_BITS    (PSL_C | PSL_PF | PSL_AF | PSL_Z | PSL_N | PSL_V)
320
321 /*
322  * Return the status flags that would result from doing (x - y).
323  */
324 #define GETCC(sz)                                                       \
325 static u_long                                                           \
326 getcc##sz(uint##sz##_t x, uint##sz##_t y)                               \
327 {                                                                       \
328         u_long rflags;                                                  \
329                                                                         \
330         __asm __volatile("sub %2,%1; pushfq; popq %0" :                 \
331             "=r" (rflags), "+r" (x) : "m" (y));                         \
332         return (rflags);                                                \
333 } struct __hack
334
335 GETCC(8);
336 GETCC(16);
337 GETCC(32);
338 GETCC(64);
339
340 static u_long
341 getcc(int opsize, uint64_t x, uint64_t y)
342 {
343         KASSERT(opsize == 1 || opsize == 2 || opsize == 4 || opsize == 8,
344             ("getcc: invalid operand size %d", opsize));
345
346         if (opsize == 1)
347                 return (getcc8(x, y));
348         else if (opsize == 2)
349                 return (getcc16(x, y));
350         else if (opsize == 4)
351                 return (getcc32(x, y));
352         else
353                 return (getcc64(x, y));
354 }
355
356 static int
357 emulate_mov(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
358             mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
359 {
360         int error, size;
361         enum vm_reg_name reg;
362         uint8_t byte;
363         uint64_t val;
364
365         size = vie->opsize;
366         error = EINVAL;
367
368         switch (vie->op.op_byte) {
369         case 0x88:
370                 /*
371                  * MOV byte from reg (ModRM:reg) to mem (ModRM:r/m)
372                  * 88/r:        mov r/m8, r8
373                  * REX + 88/r:  mov r/m8, r8 (%ah, %ch, %dh, %bh not available)
374                  */
375                 size = 1;       /* override for byte operation */
376                 error = vie_read_bytereg(vm, vcpuid, vie, &byte);
377                 if (error == 0)
378                         error = memwrite(vm, vcpuid, gpa, byte, size, arg);
379                 break;
380         case 0x89:
381                 /*
382                  * MOV from reg (ModRM:reg) to mem (ModRM:r/m)
383                  * 89/r:        mov r/m16, r16
384                  * 89/r:        mov r/m32, r32
385                  * REX.W + 89/r mov r/m64, r64
386                  */
387                 reg = gpr_map[vie->reg];
388                 error = vie_read_register(vm, vcpuid, reg, &val);
389                 if (error == 0) {
390                         val &= size2mask[size];
391                         error = memwrite(vm, vcpuid, gpa, val, size, arg);
392                 }
393                 break;
394         case 0x8A:
395                 /*
396                  * MOV byte from mem (ModRM:r/m) to reg (ModRM:reg)
397                  * 8A/r:        mov r8, r/m8
398                  * REX + 8A/r:  mov r8, r/m8
399                  */
400                 size = 1;       /* override for byte operation */
401                 error = memread(vm, vcpuid, gpa, &val, size, arg);
402                 if (error == 0)
403                         error = vie_write_bytereg(vm, vcpuid, vie, val);
404                 break;
405         case 0x8B:
406                 /*
407                  * MOV from mem (ModRM:r/m) to reg (ModRM:reg)
408                  * 8B/r:        mov r16, r/m16
409                  * 8B/r:        mov r32, r/m32
410                  * REX.W 8B/r:  mov r64, r/m64
411                  */
412                 error = memread(vm, vcpuid, gpa, &val, size, arg);
413                 if (error == 0) {
414                         reg = gpr_map[vie->reg];
415                         error = vie_update_register(vm, vcpuid, reg, val, size);
416                 }
417                 break;
418         case 0xA1:
419                 /*
420                  * MOV from seg:moffset to AX/EAX/RAX
421                  * A1:          mov AX, moffs16
422                  * A1:          mov EAX, moffs32
423                  * REX.W + A1:  mov RAX, moffs64
424                  */
425                 error = memread(vm, vcpuid, gpa, &val, size, arg);
426                 if (error == 0) {
427                         reg = VM_REG_GUEST_RAX;
428                         error = vie_update_register(vm, vcpuid, reg, val, size);
429                 }
430                 break;
431         case 0xA3:
432                 /*
433                  * MOV from AX/EAX/RAX to seg:moffset
434                  * A3:          mov moffs16, AX
435                  * A3:          mov moffs32, EAX 
436                  * REX.W + A3:  mov moffs64, RAX
437                  */
438                 error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RAX, &val);
439                 if (error == 0) {
440                         val &= size2mask[size];
441                         error = memwrite(vm, vcpuid, gpa, val, size, arg);
442                 }
443                 break;
444         case 0xC6:
445                 /*
446                  * MOV from imm8 to mem (ModRM:r/m)
447                  * C6/0         mov r/m8, imm8
448                  * REX + C6/0   mov r/m8, imm8
449                  */
450                 size = 1;       /* override for byte operation */
451                 error = memwrite(vm, vcpuid, gpa, vie->immediate, size, arg);
452                 break;
453         case 0xC7:
454                 /*
455                  * MOV from imm16/imm32 to mem (ModRM:r/m)
456                  * C7/0         mov r/m16, imm16
457                  * C7/0         mov r/m32, imm32
458                  * REX.W + C7/0 mov r/m64, imm32 (sign-extended to 64-bits)
459                  */
460                 val = vie->immediate & size2mask[size];
461                 error = memwrite(vm, vcpuid, gpa, val, size, arg);
462                 break;
463         default:
464                 break;
465         }
466
467         return (error);
468 }
469
470 static int
471 emulate_movx(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
472              mem_region_read_t memread, mem_region_write_t memwrite,
473              void *arg)
474 {
475         int error, size;
476         enum vm_reg_name reg;
477         uint64_t val;
478
479         size = vie->opsize;
480         error = EINVAL;
481
482         switch (vie->op.op_byte) {
483         case 0xB6:
484                 /*
485                  * MOV and zero extend byte from mem (ModRM:r/m) to
486                  * reg (ModRM:reg).
487                  *
488                  * 0F B6/r              movzx r16, r/m8
489                  * 0F B6/r              movzx r32, r/m8
490                  * REX.W + 0F B6/r      movzx r64, r/m8
491                  */
492
493                 /* get the first operand */
494                 error = memread(vm, vcpuid, gpa, &val, 1, arg);
495                 if (error)
496                         break;
497
498                 /* get the second operand */
499                 reg = gpr_map[vie->reg];
500
501                 /* zero-extend byte */
502                 val = (uint8_t)val;
503
504                 /* write the result */
505                 error = vie_update_register(vm, vcpuid, reg, val, size);
506                 break;
507         case 0xB7:
508                 /*
509                  * MOV and zero extend word from mem (ModRM:r/m) to
510                  * reg (ModRM:reg).
511                  *
512                  * 0F B7/r              movzx r32, r/m16
513                  * REX.W + 0F B7/r      movzx r64, r/m16
514                  */
515                 error = memread(vm, vcpuid, gpa, &val, 2, arg);
516                 if (error)
517                         return (error);
518
519                 reg = gpr_map[vie->reg];
520
521                 /* zero-extend word */
522                 val = (uint16_t)val;
523
524                 error = vie_update_register(vm, vcpuid, reg, val, size);
525                 break;
526         case 0xBE:
527                 /*
528                  * MOV and sign extend byte from mem (ModRM:r/m) to
529                  * reg (ModRM:reg).
530                  *
531                  * 0F BE/r              movsx r16, r/m8
532                  * 0F BE/r              movsx r32, r/m8
533                  * REX.W + 0F BE/r      movsx r64, r/m8
534                  */
535
536                 /* get the first operand */
537                 error = memread(vm, vcpuid, gpa, &val, 1, arg);
538                 if (error)
539                         break;
540
541                 /* get the second operand */
542                 reg = gpr_map[vie->reg];
543
544                 /* sign extend byte */
545                 val = (int8_t)val;
546
547                 /* write the result */
548                 error = vie_update_register(vm, vcpuid, reg, val, size);
549                 break;
550         default:
551                 break;
552         }
553         return (error);
554 }
555
556 static int
557 emulate_and(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
558             mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
559 {
560         int error, size;
561         enum vm_reg_name reg;
562         uint64_t result, rflags, rflags2, val1, val2;
563
564         size = vie->opsize;
565         error = EINVAL;
566
567         switch (vie->op.op_byte) {
568         case 0x23:
569                 /*
570                  * AND reg (ModRM:reg) and mem (ModRM:r/m) and store the
571                  * result in reg.
572                  *
573                  * 23/r         and r16, r/m16
574                  * 23/r         and r32, r/m32
575                  * REX.W + 23/r and r64, r/m64
576                  */
577
578                 /* get the first operand */
579                 reg = gpr_map[vie->reg];
580                 error = vie_read_register(vm, vcpuid, reg, &val1);
581                 if (error)
582                         break;
583
584                 /* get the second operand */
585                 error = memread(vm, vcpuid, gpa, &val2, size, arg);
586                 if (error)
587                         break;
588
589                 /* perform the operation and write the result */
590                 result = val1 & val2;
591                 error = vie_update_register(vm, vcpuid, reg, result, size);
592                 break;
593         case 0x81:
594                 /*
595                  * AND/OR mem (ModRM:r/m) with immediate and store the
596                  * result in mem.
597                  *
598                  * AND: i = 4
599                  * OR:  i = 1
600                  * 81 /i                op r/m16, imm16
601                  * 81 /i                op r/m32, imm32
602                  * REX.W + 81 /i        op r/m64, imm32 sign-extended to 64
603                  *
604                  */
605
606                 /* get the first operand */
607                 error = memread(vm, vcpuid, gpa, &val1, size, arg);
608                 if (error)
609                         break;
610
611                 /*
612                  * perform the operation with the pre-fetched immediate
613                  * operand and write the result
614                  */
615                 switch (vie->reg & 7) {
616                 case 0x4:
617                         /* modrm:reg == b100, AND */
618                         result = val1 & vie->immediate;
619                         break;
620                 case 0x1:
621                         /* modrm:reg == b001, OR */
622                         result = val1 | vie->immediate;
623                         break;
624                 default:
625                         error = EINVAL;
626                         break;
627                 }
628                 if (error)
629                         break;
630
631                 error = memwrite(vm, vcpuid, gpa, result, size, arg);
632                 break;
633         default:
634                 break;
635         }
636         if (error)
637                 return (error);
638
639         error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, &rflags);
640         if (error)
641                 return (error);
642
643         /*
644          * OF and CF are cleared; the SF, ZF and PF flags are set according
645          * to the result; AF is undefined.
646          *
647          * The updated status flags are obtained by subtracting 0 from 'result'.
648          */
649         rflags2 = getcc(size, result, 0);
650         rflags &= ~RFLAGS_STATUS_BITS;
651         rflags |= rflags2 & (PSL_PF | PSL_Z | PSL_N);
652
653         error = vie_update_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, rflags, 8);
654         return (error);
655 }
656
657 static int
658 emulate_or(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
659             mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
660 {
661         int error, size;
662         uint64_t val1, result, rflags, rflags2;
663
664         size = vie->opsize;
665         error = EINVAL;
666
667         switch (vie->op.op_byte) {
668         case 0x83:
669                 /*
670                  * OR mem (ModRM:r/m) with immediate and store the
671                  * result in mem.
672                  *
673                  * 83 /1                OR r/m16, imm8 sign-extended to 16
674                  * 83 /1                OR r/m32, imm8 sign-extended to 32
675                  * REX.W + 83/1         OR r/m64, imm8 sign-extended to 64
676                  *
677                  * Currently, only the OR operation of the 0x83 opcode
678                  * is implemented (ModRM:reg = b001).
679                  */
680                 if ((vie->reg & 7) != 1)
681                         break;
682
683                 /* get the first operand */
684                 error = memread(vm, vcpuid, gpa, &val1, size, arg);
685                 if (error)
686                         break;
687
688                 /*
689                  * perform the operation with the pre-fetched immediate
690                  * operand and write the result
691                  */
692                 result = val1 | vie->immediate;
693                 error = memwrite(vm, vcpuid, gpa, result, size, arg);
694                 break;
695         default:
696                 break;
697         }
698         if (error)
699                 return (error);
700
701         error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, &rflags);
702         if (error)
703                 return (error);
704
705         /*
706          * OF and CF are cleared; the SF, ZF and PF flags are set according
707          * to the result; AF is undefined.
708          *
709          * The updated status flags are obtained by subtracting 0 from 'result'.
710          */
711         rflags2 = getcc(size, result, 0);
712         rflags &= ~RFLAGS_STATUS_BITS;
713         rflags |= rflags2 & (PSL_PF | PSL_Z | PSL_N);
714
715         error = vie_update_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, rflags, 8);
716         return (error);
717 }
718
719 static int
720 emulate_cmp(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
721             mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
722 {
723         int error, size;
724         uint64_t op1, op2, rflags, rflags2;
725         enum vm_reg_name reg;
726
727         size = vie->opsize;
728         switch (vie->op.op_byte) {
729         case 0x3B:
730                 /*
731                  * 3B/r         CMP r16, r/m16
732                  * 3B/r         CMP r32, r/m32
733                  * REX.W + 3B/r CMP r64, r/m64
734                  *
735                  * Compare first operand (reg) with second operand (r/m) and
736                  * set status flags in EFLAGS register. The comparison is
737                  * performed by subtracting the second operand from the first
738                  * operand and then setting the status flags.
739                  */
740
741                 /* Get the first operand */
742                 reg = gpr_map[vie->reg];
743                 error = vie_read_register(vm, vcpuid, reg, &op1);
744                 if (error)
745                         return (error);
746
747                 /* Get the second operand */
748                 error = memread(vm, vcpuid, gpa, &op2, size, arg);
749                 if (error)
750                         return (error);
751
752                 break;
753         default:
754                 return (EINVAL);
755         }
756         rflags2 = getcc(size, op1, op2);
757         error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, &rflags);
758         if (error)
759                 return (error);
760         rflags &= ~RFLAGS_STATUS_BITS;
761         rflags |= rflags2 & RFLAGS_STATUS_BITS;
762
763         error = vie_update_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, rflags, 8);
764         return (error);
765 }
766
767 static int
768 emulate_sub(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
769             mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
770 {
771         int error, size;
772         uint64_t nval, rflags, rflags2, val1, val2;
773         enum vm_reg_name reg;
774
775         size = vie->opsize;
776         error = EINVAL;
777
778         switch (vie->op.op_byte) {
779         case 0x2B:
780                 /*
781                  * SUB r/m from r and store the result in r
782                  * 
783                  * 2B/r            SUB r16, r/m16
784                  * 2B/r            SUB r32, r/m32
785                  * REX.W + 2B/r    SUB r64, r/m64
786                  */
787
788                 /* get the first operand */
789                 reg = gpr_map[vie->reg];
790                 error = vie_read_register(vm, vcpuid, reg, &val1);
791                 if (error)
792                         break;
793
794                 /* get the second operand */
795                 error = memread(vm, vcpuid, gpa, &val2, size, arg);
796                 if (error)
797                         break;
798
799                 /* perform the operation and write the result */
800                 nval = val1 - val2;
801                 error = vie_update_register(vm, vcpuid, reg, nval, size);
802                 break;
803         default:
804                 break;
805         }
806
807         if (!error) {
808                 rflags2 = getcc(size, val1, val2);
809                 error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RFLAGS,
810                     &rflags);
811                 if (error)
812                         return (error);
813
814                 rflags &= ~RFLAGS_STATUS_BITS;
815                 rflags |= rflags2 & RFLAGS_STATUS_BITS;
816                 error = vie_update_register(vm, vcpuid, VM_REG_GUEST_RFLAGS,
817                     rflags, 8);
818         }
819
820         return (error);
821 }
822
823 static int
824 emulate_push(void *vm, int vcpuid, uint64_t mmio_gpa, struct vie *vie,
825     struct vm_guest_paging *paging, mem_region_read_t memread,
826     mem_region_write_t memwrite, void *arg)
827 {
828 #ifdef _KERNEL
829         struct vm_copyinfo copyinfo[2];
830 #else
831         struct iovec copyinfo[2];
832 #endif
833         struct seg_desc ss_desc;
834         uint64_t cr0, rflags, rsp, stack_gla, val;
835         int error, size, stackaddrsize;
836
837         /*
838          * Table A-6, "Opcode Extensions", Intel SDM, Vol 2.
839          *
840          * PUSH is part of the group 5 extended opcodes and is identified
841          * by ModRM:reg = b110.
842          */
843         if ((vie->reg & 7) != 6)
844                 return (EINVAL);
845
846         size = vie->opsize;
847         /*
848          * From "Address-Size Attributes for Stack Accesses", Intel SDL, Vol 1
849          */
850         if (paging->cpu_mode == CPU_MODE_REAL) {
851                 stackaddrsize = 2;
852         } else if (paging->cpu_mode == CPU_MODE_64BIT) {
853                 /*
854                  * "Stack Manipulation Instructions in 64-bit Mode", SDM, Vol 3
855                  * - Stack pointer size is always 64-bits.
856                  * - PUSH/POP of 32-bit values is not possible in 64-bit mode.
857                  * - 16-bit PUSH/POP is supported by using the operand size
858                  *   override prefix (66H).
859                  */
860                 stackaddrsize = 8;
861                 size = vie->opsize_override ? 2 : 8;
862         } else {
863                 /*
864                  * In protected or compability mode the 'B' flag in the
865                  * stack-segment descriptor determines the size of the
866                  * stack pointer.
867                  */
868                 error = vm_get_seg_desc(vm, vcpuid, VM_REG_GUEST_SS, &ss_desc);
869                 KASSERT(error == 0, ("%s: error %d getting SS descriptor",
870                     __func__, error));
871                 if (SEG_DESC_DEF32(ss_desc.access))
872                         stackaddrsize = 4;
873                 else
874                         stackaddrsize = 2;
875         }
876
877         error = vie_read_register(vm, vcpuid, VM_REG_GUEST_CR0, &cr0);
878         KASSERT(error == 0, ("%s: error %d getting cr0", __func__, error));
879
880         error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, &rflags);
881         KASSERT(error == 0, ("%s: error %d getting rflags", __func__, error));
882
883         error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RSP, &rsp);
884         KASSERT(error == 0, ("%s: error %d getting rsp", __func__, error));
885
886         rsp -= size;
887         if (vie_calculate_gla(paging->cpu_mode, VM_REG_GUEST_SS, &ss_desc,
888             rsp, size, stackaddrsize, PROT_WRITE, &stack_gla)) {
889                 vm_inject_ss(vm, vcpuid, 0);
890                 return (0);
891         }
892
893         if (vie_canonical_check(paging->cpu_mode, stack_gla)) {
894                 vm_inject_ss(vm, vcpuid, 0);
895                 return (0);
896         }
897
898         if (vie_alignment_check(paging->cpl, size, cr0, rflags, stack_gla)) {
899                 vm_inject_ac(vm, vcpuid, 0);
900                 return (0);
901         }
902
903         error = vm_copy_setup(vm, vcpuid, paging, stack_gla, size, PROT_WRITE,
904             copyinfo, nitems(copyinfo));
905         if (error == -1) {
906                 /*
907                  * XXX cannot return a negative error value here because it
908                  * ends up being the return value of the VM_RUN() ioctl and
909                  * is interpreted as a pseudo-error (for e.g. ERESTART).
910                  */
911                 return (EFAULT);
912         } else if (error == 1) {
913                 /* Resume guest execution to handle page fault */
914                 return (0);
915         }
916
917         error = memread(vm, vcpuid, mmio_gpa, &val, size, arg);
918         if (error == 0) {
919                 vm_copyout(vm, vcpuid, &val, copyinfo, size);
920                 error = vie_update_register(vm, vcpuid, VM_REG_GUEST_RSP, rsp,
921                     stackaddrsize);
922                 KASSERT(error == 0, ("error %d updating rsp", error));
923         }
924 #ifdef _KERNEL
925         vm_copy_teardown(vm, vcpuid, copyinfo, nitems(copyinfo));
926 #endif
927         return (error);
928 }
929
930 int
931 vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
932     struct vm_guest_paging *paging, mem_region_read_t memread,
933     mem_region_write_t memwrite, void *memarg)
934 {
935         int error;
936
937         if (!vie->decoded)
938                 return (EINVAL);
939
940         switch (vie->op.op_type) {
941         case VIE_OP_TYPE_PUSH:
942                 error = emulate_push(vm, vcpuid, gpa, vie, paging, memread,
943                     memwrite, memarg);
944                 break;
945         case VIE_OP_TYPE_CMP:
946                 error = emulate_cmp(vm, vcpuid, gpa, vie,
947                                     memread, memwrite, memarg);
948                 break;
949         case VIE_OP_TYPE_MOV:
950                 error = emulate_mov(vm, vcpuid, gpa, vie,
951                                     memread, memwrite, memarg);
952                 break;
953         case VIE_OP_TYPE_MOVSX:
954         case VIE_OP_TYPE_MOVZX:
955                 error = emulate_movx(vm, vcpuid, gpa, vie,
956                                      memread, memwrite, memarg);
957                 break;
958         case VIE_OP_TYPE_AND:
959                 error = emulate_and(vm, vcpuid, gpa, vie,
960                                     memread, memwrite, memarg);
961                 break;
962         case VIE_OP_TYPE_OR:
963                 error = emulate_or(vm, vcpuid, gpa, vie,
964                                     memread, memwrite, memarg);
965                 break;
966         case VIE_OP_TYPE_SUB:
967                 error = emulate_sub(vm, vcpuid, gpa, vie,
968                                     memread, memwrite, memarg);
969                 break;
970         default:
971                 error = EINVAL;
972                 break;
973         }
974
975         return (error);
976 }
977
978 int
979 vie_alignment_check(int cpl, int size, uint64_t cr0, uint64_t rf, uint64_t gla)
980 {
981         KASSERT(size == 1 || size == 2 || size == 4 || size == 8,
982             ("%s: invalid size %d", __func__, size));
983         KASSERT(cpl >= 0 && cpl <= 3, ("%s: invalid cpl %d", __func__, cpl));
984
985         if (cpl != 3 || (cr0 & CR0_AM) == 0 || (rf & PSL_AC) == 0)
986                 return (0);
987
988         return ((gla & (size - 1)) ? 1 : 0);
989 }
990
991 int
992 vie_canonical_check(enum vm_cpu_mode cpu_mode, uint64_t gla)
993 {
994         uint64_t mask;
995
996         if (cpu_mode != CPU_MODE_64BIT)
997                 return (0);
998
999         /*
1000          * The value of the bit 47 in the 'gla' should be replicated in the
1001          * most significant 16 bits.
1002          */
1003         mask = ~((1UL << 48) - 1);
1004         if (gla & (1UL << 47))
1005                 return ((gla & mask) != mask);
1006         else
1007                 return ((gla & mask) != 0);
1008 }
1009
1010 uint64_t
1011 vie_size2mask(int size)
1012 {
1013         KASSERT(size == 1 || size == 2 || size == 4 || size == 8,
1014             ("vie_size2mask: invalid size %d", size));
1015         return (size2mask[size]);
1016 }
1017
1018 int
1019 vie_calculate_gla(enum vm_cpu_mode cpu_mode, enum vm_reg_name seg,
1020     struct seg_desc *desc, uint64_t offset, int length, int addrsize,
1021     int prot, uint64_t *gla)
1022 {
1023         uint64_t firstoff, low_limit, high_limit, segbase;
1024         int glasize, type;
1025
1026         KASSERT(seg >= VM_REG_GUEST_ES && seg <= VM_REG_GUEST_GS,
1027             ("%s: invalid segment %d", __func__, seg));
1028         KASSERT(length == 1 || length == 2 || length == 4 || length == 8,
1029             ("%s: invalid operand size %d", __func__, length));
1030         KASSERT((prot & ~(PROT_READ | PROT_WRITE)) == 0,
1031             ("%s: invalid prot %#x", __func__, prot));
1032
1033         firstoff = offset;
1034         if (cpu_mode == CPU_MODE_64BIT) {
1035                 KASSERT(addrsize == 4 || addrsize == 8, ("%s: invalid address "
1036                     "size %d for cpu_mode %d", __func__, addrsize, cpu_mode));
1037                 glasize = 8;
1038         } else {
1039                 KASSERT(addrsize == 2 || addrsize == 4, ("%s: invalid address "
1040                     "size %d for cpu mode %d", __func__, addrsize, cpu_mode));
1041                 glasize = 4;
1042                 /*
1043                  * If the segment selector is loaded with a NULL selector
1044                  * then the descriptor is unusable and attempting to use
1045                  * it results in a #GP(0).
1046                  */
1047                 if (SEG_DESC_UNUSABLE(desc->access))
1048                         return (-1);
1049
1050                 /* 
1051                  * The processor generates a #NP exception when a segment
1052                  * register is loaded with a selector that points to a
1053                  * descriptor that is not present. If this was the case then
1054                  * it would have been checked before the VM-exit.
1055                  */
1056                 KASSERT(SEG_DESC_PRESENT(desc->access),
1057                     ("segment %d not present: %#x", seg, desc->access));
1058
1059                 /*
1060                  * The descriptor type must indicate a code/data segment.
1061                  */
1062                 type = SEG_DESC_TYPE(desc->access);
1063                 KASSERT(type >= 16 && type <= 31, ("segment %d has invalid "
1064                     "descriptor type %#x", seg, type));
1065
1066                 if (prot & PROT_READ) {
1067                         /* #GP on a read access to a exec-only code segment */
1068                         if ((type & 0xA) == 0x8)
1069                                 return (-1);
1070                 }
1071
1072                 if (prot & PROT_WRITE) {
1073                         /*
1074                          * #GP on a write access to a code segment or a
1075                          * read-only data segment.
1076                          */
1077                         if (type & 0x8)                 /* code segment */
1078                                 return (-1);
1079
1080                         if ((type & 0xA) == 0)          /* read-only data seg */
1081                                 return (-1);
1082                 }
1083
1084                 /*
1085                  * 'desc->limit' is fully expanded taking granularity into
1086                  * account.
1087                  */
1088                 if ((type & 0xC) == 0x4) {
1089                         /* expand-down data segment */
1090                         low_limit = desc->limit + 1;
1091                         high_limit = SEG_DESC_DEF32(desc->access) ?
1092                             0xffffffff : 0xffff;
1093                 } else {
1094                         /* code segment or expand-up data segment */
1095                         low_limit = 0;
1096                         high_limit = desc->limit;
1097                 }
1098
1099                 while (length > 0) {
1100                         offset &= vie_size2mask(addrsize);
1101                         if (offset < low_limit || offset > high_limit)
1102                                 return (-1);
1103                         offset++;
1104                         length--;
1105                 }
1106         }
1107
1108         /*
1109          * In 64-bit mode all segments except %fs and %gs have a segment
1110          * base address of 0.
1111          */
1112         if (cpu_mode == CPU_MODE_64BIT && seg != VM_REG_GUEST_FS &&
1113             seg != VM_REG_GUEST_GS) {
1114                 segbase = 0;
1115         } else {
1116                 segbase = desc->base;
1117         }
1118
1119         /*
1120          * Truncate 'firstoff' to the effective address size before adding
1121          * it to the segment base.
1122          */
1123         firstoff &= vie_size2mask(addrsize);
1124         *gla = (segbase + firstoff) & vie_size2mask(glasize);
1125         return (0);
1126 }
1127
1128 #ifdef _KERNEL
1129 void
1130 vie_init(struct vie *vie, const char *inst_bytes, int inst_length)
1131 {
1132         KASSERT(inst_length >= 0 && inst_length <= VIE_INST_SIZE,
1133             ("%s: invalid instruction length (%d)", __func__, inst_length));
1134
1135         bzero(vie, sizeof(struct vie));
1136
1137         vie->base_register = VM_REG_LAST;
1138         vie->index_register = VM_REG_LAST;
1139
1140         if (inst_length) {
1141                 bcopy(inst_bytes, vie->inst, inst_length);
1142                 vie->num_valid = inst_length;
1143         }
1144 }
1145
1146 static int
1147 pf_error_code(int usermode, int prot, int rsvd, uint64_t pte)
1148 {
1149         int error_code = 0;
1150
1151         if (pte & PG_V)
1152                 error_code |= PGEX_P;
1153         if (prot & VM_PROT_WRITE)
1154                 error_code |= PGEX_W;
1155         if (usermode)
1156                 error_code |= PGEX_U;
1157         if (rsvd)
1158                 error_code |= PGEX_RSV;
1159         if (prot & VM_PROT_EXECUTE)
1160                 error_code |= PGEX_I;
1161
1162         return (error_code);
1163 }
1164
1165 static void
1166 ptp_release(void **cookie)
1167 {
1168         if (*cookie != NULL) {
1169                 vm_gpa_release(*cookie);
1170                 *cookie = NULL;
1171         }
1172 }
1173
1174 static void *
1175 ptp_hold(struct vm *vm, vm_paddr_t ptpphys, size_t len, void **cookie)
1176 {
1177         void *ptr;
1178
1179         ptp_release(cookie);
1180         ptr = vm_gpa_hold(vm, ptpphys, len, VM_PROT_RW, cookie);
1181         return (ptr);
1182 }
1183
1184 int
1185 vmm_gla2gpa(struct vm *vm, int vcpuid, struct vm_guest_paging *paging,
1186     uint64_t gla, int prot, uint64_t *gpa)
1187 {
1188         int nlevels, pfcode, ptpshift, ptpindex, retval, usermode, writable;
1189         u_int retries;
1190         uint64_t *ptpbase, ptpphys, pte, pgsize;
1191         uint32_t *ptpbase32, pte32;
1192         void *cookie;
1193
1194         usermode = (paging->cpl == 3 ? 1 : 0);
1195         writable = prot & VM_PROT_WRITE;
1196         cookie = NULL;
1197         retval = 0;
1198         retries = 0;
1199 restart:
1200         ptpphys = paging->cr3;          /* root of the page tables */
1201         ptp_release(&cookie);
1202         if (retries++ > 0)
1203                 maybe_yield();
1204
1205         if (vie_canonical_check(paging->cpu_mode, gla)) {
1206                 /*
1207                  * XXX assuming a non-stack reference otherwise a stack fault
1208                  * should be generated.
1209                  */
1210                 vm_inject_gp(vm, vcpuid);
1211                 goto fault;
1212         }
1213
1214         if (paging->paging_mode == PAGING_MODE_FLAT) {
1215                 *gpa = gla;
1216                 goto done;
1217         }
1218
1219         if (paging->paging_mode == PAGING_MODE_32) {
1220                 nlevels = 2;
1221                 while (--nlevels >= 0) {
1222                         /* Zero out the lower 12 bits. */
1223                         ptpphys &= ~0xfff;
1224
1225                         ptpbase32 = ptp_hold(vm, ptpphys, PAGE_SIZE, &cookie);
1226
1227                         if (ptpbase32 == NULL)
1228                                 goto error;
1229
1230                         ptpshift = PAGE_SHIFT + nlevels * 10;
1231                         ptpindex = (gla >> ptpshift) & 0x3FF;
1232                         pgsize = 1UL << ptpshift;
1233
1234                         pte32 = ptpbase32[ptpindex];
1235
1236                         if ((pte32 & PG_V) == 0 ||
1237                             (usermode && (pte32 & PG_U) == 0) ||
1238                             (writable && (pte32 & PG_RW) == 0)) {
1239                                 pfcode = pf_error_code(usermode, prot, 0,
1240                                     pte32);
1241                                 vm_inject_pf(vm, vcpuid, pfcode, gla);
1242                                 goto fault;
1243                         }
1244
1245                         /*
1246                          * Emulate the x86 MMU's management of the accessed
1247                          * and dirty flags. While the accessed flag is set
1248                          * at every level of the page table, the dirty flag
1249                          * is only set at the last level providing the guest
1250                          * physical address.
1251                          */
1252                         if ((pte32 & PG_A) == 0) {
1253                                 if (atomic_cmpset_32(&ptpbase32[ptpindex],
1254                                     pte32, pte32 | PG_A) == 0) {
1255                                         goto restart;
1256                                 }
1257                         }
1258
1259                         /* XXX must be ignored if CR4.PSE=0 */
1260                         if (nlevels > 0 && (pte32 & PG_PS) != 0)
1261                                 break;
1262
1263                         ptpphys = pte32;
1264                 }
1265
1266                 /* Set the dirty bit in the page table entry if necessary */
1267                 if (writable && (pte32 & PG_M) == 0) {
1268                         if (atomic_cmpset_32(&ptpbase32[ptpindex],
1269                             pte32, pte32 | PG_M) == 0) {
1270                                 goto restart;
1271                         }
1272                 }
1273
1274                 /* Zero out the lower 'ptpshift' bits */
1275                 pte32 >>= ptpshift; pte32 <<= ptpshift;
1276                 *gpa = pte32 | (gla & (pgsize - 1));
1277                 goto done;
1278         }
1279
1280         if (paging->paging_mode == PAGING_MODE_PAE) {
1281                 /* Zero out the lower 5 bits and the upper 32 bits */
1282                 ptpphys &= 0xffffffe0UL;
1283
1284                 ptpbase = ptp_hold(vm, ptpphys, sizeof(*ptpbase) * 4, &cookie);
1285                 if (ptpbase == NULL)
1286                         goto error;
1287
1288                 ptpindex = (gla >> 30) & 0x3;
1289
1290                 pte = ptpbase[ptpindex];
1291
1292                 if ((pte & PG_V) == 0) {
1293                         pfcode = pf_error_code(usermode, prot, 0, pte);
1294                         vm_inject_pf(vm, vcpuid, pfcode, gla);
1295                         goto fault;
1296                 }
1297
1298                 ptpphys = pte;
1299
1300                 nlevels = 2;
1301         } else
1302                 nlevels = 4;
1303         while (--nlevels >= 0) {
1304                 /* Zero out the lower 12 bits and the upper 12 bits */
1305                 ptpphys >>= 12; ptpphys <<= 24; ptpphys >>= 12;
1306
1307                 ptpbase = ptp_hold(vm, ptpphys, PAGE_SIZE, &cookie);
1308                 if (ptpbase == NULL)
1309                         goto error;
1310
1311                 ptpshift = PAGE_SHIFT + nlevels * 9;
1312                 ptpindex = (gla >> ptpshift) & 0x1FF;
1313                 pgsize = 1UL << ptpshift;
1314
1315                 pte = ptpbase[ptpindex];
1316
1317                 if ((pte & PG_V) == 0 ||
1318                     (usermode && (pte & PG_U) == 0) ||
1319                     (writable && (pte & PG_RW) == 0)) {
1320                         pfcode = pf_error_code(usermode, prot, 0, pte);
1321                         vm_inject_pf(vm, vcpuid, pfcode, gla);
1322                         goto fault;
1323                 }
1324
1325                 /* Set the accessed bit in the page table entry */
1326                 if ((pte & PG_A) == 0) {
1327                         if (atomic_cmpset_64(&ptpbase[ptpindex],
1328                             pte, pte | PG_A) == 0) {
1329                                 goto restart;
1330                         }
1331                 }
1332
1333                 if (nlevels > 0 && (pte & PG_PS) != 0) {
1334                         if (pgsize > 1 * GB) {
1335                                 pfcode = pf_error_code(usermode, prot, 1, pte);
1336                                 vm_inject_pf(vm, vcpuid, pfcode, gla);
1337                                 goto fault;
1338                         }
1339                         break;
1340                 }
1341
1342                 ptpphys = pte;
1343         }
1344
1345         /* Set the dirty bit in the page table entry if necessary */
1346         if (writable && (pte & PG_M) == 0) {
1347                 if (atomic_cmpset_64(&ptpbase[ptpindex], pte, pte | PG_M) == 0)
1348                         goto restart;
1349         }
1350
1351         /* Zero out the lower 'ptpshift' bits and the upper 12 bits */
1352         pte >>= ptpshift; pte <<= (ptpshift + 12); pte >>= 12;
1353         *gpa = pte | (gla & (pgsize - 1));
1354 done:
1355         ptp_release(&cookie);
1356         return (retval);
1357 error:
1358         retval = -1;
1359         goto done;
1360 fault:
1361         retval = 1;
1362         goto done;
1363 }
1364
1365 int
1366 vmm_fetch_instruction(struct vm *vm, int vcpuid, struct vm_guest_paging *paging,
1367     uint64_t rip, int inst_length, struct vie *vie)
1368 {
1369         struct vm_copyinfo copyinfo[2];
1370         int error, prot;
1371
1372         if (inst_length > VIE_INST_SIZE)
1373                 panic("vmm_fetch_instruction: invalid length %d", inst_length);
1374
1375         prot = PROT_READ | PROT_EXEC;
1376         error = vm_copy_setup(vm, vcpuid, paging, rip, inst_length, prot,
1377             copyinfo, nitems(copyinfo));
1378         if (error == 0) {
1379                 vm_copyin(vm, vcpuid, copyinfo, vie->inst, inst_length);
1380                 vm_copy_teardown(vm, vcpuid, copyinfo, nitems(copyinfo));
1381                 vie->num_valid = inst_length;
1382         }
1383         return (error);
1384 }
1385
1386 static int
1387 vie_peek(struct vie *vie, uint8_t *x)
1388 {
1389
1390         if (vie->num_processed < vie->num_valid) {
1391                 *x = vie->inst[vie->num_processed];
1392                 return (0);
1393         } else
1394                 return (-1);
1395 }
1396
1397 static void
1398 vie_advance(struct vie *vie)
1399 {
1400
1401         vie->num_processed++;
1402 }
1403
1404 static int
1405 decode_prefixes(struct vie *vie, enum vm_cpu_mode cpu_mode, int cs_d)
1406 {
1407         uint8_t x;
1408
1409         while (1) {
1410                 if (vie_peek(vie, &x))
1411                         return (-1);
1412
1413                 if (x == 0x66)
1414                         vie->opsize_override = 1;
1415                 else if (x == 0x67)
1416                         vie->addrsize_override = 1;
1417                 else
1418                         break;
1419
1420                 vie_advance(vie);
1421         }
1422
1423         /*
1424          * From section 2.2.1, "REX Prefixes", Intel SDM Vol 2:
1425          * - Only one REX prefix is allowed per instruction.
1426          * - The REX prefix must immediately precede the opcode byte or the
1427          *   escape opcode byte.
1428          * - If an instruction has a mandatory prefix (0x66, 0xF2 or 0xF3)
1429          *   the mandatory prefix must come before the REX prefix.
1430          */
1431         if (cpu_mode == CPU_MODE_64BIT && x >= 0x40 && x <= 0x4F) {
1432                 vie->rex_present = 1;
1433                 vie->rex_w = x & 0x8 ? 1 : 0;
1434                 vie->rex_r = x & 0x4 ? 1 : 0;
1435                 vie->rex_x = x & 0x2 ? 1 : 0;
1436                 vie->rex_b = x & 0x1 ? 1 : 0;
1437                 vie_advance(vie);
1438         }
1439
1440         /*
1441          * Section "Operand-Size And Address-Size Attributes", Intel SDM, Vol 1
1442          */
1443         if (cpu_mode == CPU_MODE_64BIT) {
1444                 /*
1445                  * Default address size is 64-bits and default operand size
1446                  * is 32-bits.
1447                  */
1448                 vie->addrsize = vie->addrsize_override ? 4 : 8;
1449                 if (vie->rex_w)
1450                         vie->opsize = 8;
1451                 else if (vie->opsize_override)
1452                         vie->opsize = 2;
1453                 else
1454                         vie->opsize = 4;
1455         } else if (cs_d) {
1456                 /* Default address and operand sizes are 32-bits */
1457                 vie->addrsize = vie->addrsize_override ? 2 : 4;
1458                 vie->opsize = vie->opsize_override ? 2 : 4;
1459         } else {
1460                 /* Default address and operand sizes are 16-bits */
1461                 vie->addrsize = vie->addrsize_override ? 4 : 2;
1462                 vie->opsize = vie->opsize_override ? 4 : 2;
1463         }
1464         return (0);
1465 }
1466
1467 static int
1468 decode_two_byte_opcode(struct vie *vie)
1469 {
1470         uint8_t x;
1471
1472         if (vie_peek(vie, &x))
1473                 return (-1);
1474
1475         vie->op = two_byte_opcodes[x];
1476
1477         if (vie->op.op_type == VIE_OP_TYPE_NONE)
1478                 return (-1);
1479
1480         vie_advance(vie);
1481         return (0);
1482 }
1483
1484 static int
1485 decode_opcode(struct vie *vie)
1486 {
1487         uint8_t x;
1488
1489         if (vie_peek(vie, &x))
1490                 return (-1);
1491
1492         vie->op = one_byte_opcodes[x];
1493
1494         if (vie->op.op_type == VIE_OP_TYPE_NONE)
1495                 return (-1);
1496
1497         vie_advance(vie);
1498
1499         if (vie->op.op_type == VIE_OP_TYPE_TWO_BYTE)
1500                 return (decode_two_byte_opcode(vie));
1501
1502         return (0);
1503 }
1504
1505 static int
1506 decode_modrm(struct vie *vie, enum vm_cpu_mode cpu_mode)
1507 {
1508         uint8_t x;
1509
1510         if (cpu_mode == CPU_MODE_REAL)
1511                 return (-1);
1512
1513         if (vie->op.op_flags & VIE_OP_F_NO_MODRM)
1514                 return (0);
1515
1516         if (vie_peek(vie, &x))
1517                 return (-1);
1518
1519         vie->mod = (x >> 6) & 0x3;
1520         vie->rm =  (x >> 0) & 0x7;
1521         vie->reg = (x >> 3) & 0x7;
1522
1523         /*
1524          * A direct addressing mode makes no sense in the context of an EPT
1525          * fault. There has to be a memory access involved to cause the
1526          * EPT fault.
1527          */
1528         if (vie->mod == VIE_MOD_DIRECT)
1529                 return (-1);
1530
1531         if ((vie->mod == VIE_MOD_INDIRECT && vie->rm == VIE_RM_DISP32) ||
1532             (vie->mod != VIE_MOD_DIRECT && vie->rm == VIE_RM_SIB)) {
1533                 /*
1534                  * Table 2-5: Special Cases of REX Encodings
1535                  *
1536                  * mod=0, r/m=5 is used in the compatibility mode to
1537                  * indicate a disp32 without a base register.
1538                  *
1539                  * mod!=3, r/m=4 is used in the compatibility mode to
1540                  * indicate that the SIB byte is present.
1541                  *
1542                  * The 'b' bit in the REX prefix is don't care in
1543                  * this case.
1544                  */
1545         } else {
1546                 vie->rm |= (vie->rex_b << 3);
1547         }
1548
1549         vie->reg |= (vie->rex_r << 3);
1550
1551         /* SIB */
1552         if (vie->mod != VIE_MOD_DIRECT && vie->rm == VIE_RM_SIB)
1553                 goto done;
1554
1555         vie->base_register = gpr_map[vie->rm];
1556
1557         switch (vie->mod) {
1558         case VIE_MOD_INDIRECT_DISP8:
1559                 vie->disp_bytes = 1;
1560                 break;
1561         case VIE_MOD_INDIRECT_DISP32:
1562                 vie->disp_bytes = 4;
1563                 break;
1564         case VIE_MOD_INDIRECT:
1565                 if (vie->rm == VIE_RM_DISP32) {
1566                         vie->disp_bytes = 4;
1567                         /*
1568                          * Table 2-7. RIP-Relative Addressing
1569                          *
1570                          * In 64-bit mode mod=00 r/m=101 implies [rip] + disp32
1571                          * whereas in compatibility mode it just implies disp32.
1572                          */
1573
1574                         if (cpu_mode == CPU_MODE_64BIT)
1575                                 vie->base_register = VM_REG_GUEST_RIP;
1576                         else
1577                                 vie->base_register = VM_REG_LAST;
1578                 }
1579                 break;
1580         }
1581
1582 done:
1583         vie_advance(vie);
1584
1585         return (0);
1586 }
1587
1588 static int
1589 decode_sib(struct vie *vie)
1590 {
1591         uint8_t x;
1592
1593         /* Proceed only if SIB byte is present */
1594         if (vie->mod == VIE_MOD_DIRECT || vie->rm != VIE_RM_SIB)
1595                 return (0);
1596
1597         if (vie_peek(vie, &x))
1598                 return (-1);
1599
1600         /* De-construct the SIB byte */
1601         vie->ss = (x >> 6) & 0x3;
1602         vie->index = (x >> 3) & 0x7;
1603         vie->base = (x >> 0) & 0x7;
1604
1605         /* Apply the REX prefix modifiers */
1606         vie->index |= vie->rex_x << 3;
1607         vie->base |= vie->rex_b << 3;
1608
1609         switch (vie->mod) {
1610         case VIE_MOD_INDIRECT_DISP8:
1611                 vie->disp_bytes = 1;
1612                 break;
1613         case VIE_MOD_INDIRECT_DISP32:
1614                 vie->disp_bytes = 4;
1615                 break;
1616         }
1617
1618         if (vie->mod == VIE_MOD_INDIRECT &&
1619             (vie->base == 5 || vie->base == 13)) {
1620                 /*
1621                  * Special case when base register is unused if mod = 0
1622                  * and base = %rbp or %r13.
1623                  *
1624                  * Documented in:
1625                  * Table 2-3: 32-bit Addressing Forms with the SIB Byte
1626                  * Table 2-5: Special Cases of REX Encodings
1627                  */
1628                 vie->disp_bytes = 4;
1629         } else {
1630                 vie->base_register = gpr_map[vie->base];
1631         }
1632
1633         /*
1634          * All encodings of 'index' are valid except for %rsp (4).
1635          *
1636          * Documented in:
1637          * Table 2-3: 32-bit Addressing Forms with the SIB Byte
1638          * Table 2-5: Special Cases of REX Encodings
1639          */
1640         if (vie->index != 4)
1641                 vie->index_register = gpr_map[vie->index];
1642
1643         /* 'scale' makes sense only in the context of an index register */
1644         if (vie->index_register < VM_REG_LAST)
1645                 vie->scale = 1 << vie->ss;
1646
1647         vie_advance(vie);
1648
1649         return (0);
1650 }
1651
1652 static int
1653 decode_displacement(struct vie *vie)
1654 {
1655         int n, i;
1656         uint8_t x;
1657
1658         union {
1659                 char    buf[4];
1660                 int8_t  signed8;
1661                 int32_t signed32;
1662         } u;
1663
1664         if ((n = vie->disp_bytes) == 0)
1665                 return (0);
1666
1667         if (n != 1 && n != 4)
1668                 panic("decode_displacement: invalid disp_bytes %d", n);
1669
1670         for (i = 0; i < n; i++) {
1671                 if (vie_peek(vie, &x))
1672                         return (-1);
1673
1674                 u.buf[i] = x;
1675                 vie_advance(vie);
1676         }
1677
1678         if (n == 1)
1679                 vie->displacement = u.signed8;          /* sign-extended */
1680         else
1681                 vie->displacement = u.signed32;         /* sign-extended */
1682
1683         return (0);
1684 }
1685
1686 static int
1687 decode_immediate(struct vie *vie)
1688 {
1689         int i, n;
1690         uint8_t x;
1691         union {
1692                 char    buf[4];
1693                 int8_t  signed8;
1694                 int16_t signed16;
1695                 int32_t signed32;
1696         } u;
1697
1698         /* Figure out immediate operand size (if any) */
1699         if (vie->op.op_flags & VIE_OP_F_IMM) {
1700                 /*
1701                  * Section 2.2.1.5 "Immediates", Intel SDM:
1702                  * In 64-bit mode the typical size of immediate operands
1703                  * remains 32-bits. When the operand size if 64-bits, the
1704                  * processor sign-extends all immediates to 64-bits prior
1705                  * to their use.
1706                  */
1707                 if (vie->opsize == 4 || vie->opsize == 8)
1708                         vie->imm_bytes = 4;
1709                 else
1710                         vie->imm_bytes = 2;
1711         } else if (vie->op.op_flags & VIE_OP_F_IMM8) {
1712                 vie->imm_bytes = 1;
1713         }
1714
1715         if ((n = vie->imm_bytes) == 0)
1716                 return (0);
1717
1718         KASSERT(n == 1 || n == 2 || n == 4,
1719             ("%s: invalid number of immediate bytes: %d", __func__, n));
1720
1721         for (i = 0; i < n; i++) {
1722                 if (vie_peek(vie, &x))
1723                         return (-1);
1724
1725                 u.buf[i] = x;
1726                 vie_advance(vie);
1727         }
1728
1729         /* sign-extend the immediate value before use */
1730         if (n == 1)
1731                 vie->immediate = u.signed8;
1732         else if (n == 2)
1733                 vie->immediate = u.signed16;
1734         else
1735                 vie->immediate = u.signed32;
1736
1737         return (0);
1738 }
1739
1740 static int
1741 decode_moffset(struct vie *vie)
1742 {
1743         int i, n;
1744         uint8_t x;
1745         union {
1746                 char    buf[8];
1747                 uint64_t u64;
1748         } u;
1749
1750         if ((vie->op.op_flags & VIE_OP_F_MOFFSET) == 0)
1751                 return (0);
1752
1753         /*
1754          * Section 2.2.1.4, "Direct Memory-Offset MOVs", Intel SDM:
1755          * The memory offset size follows the address-size of the instruction.
1756          */
1757         n = vie->addrsize;
1758         KASSERT(n == 2 || n == 4 || n == 8, ("invalid moffset bytes: %d", n));
1759
1760         u.u64 = 0;
1761         for (i = 0; i < n; i++) {
1762                 if (vie_peek(vie, &x))
1763                         return (-1);
1764
1765                 u.buf[i] = x;
1766                 vie_advance(vie);
1767         }
1768         vie->displacement = u.u64;
1769         return (0);
1770 }
1771
1772 /*
1773  * Verify that all the bytes in the instruction buffer were consumed.
1774  */
1775 static int
1776 verify_inst_length(struct vie *vie)
1777 {
1778
1779         if (vie->num_processed)
1780                 return (0);
1781         else
1782                 return (-1);
1783 }
1784
1785 /*
1786  * Verify that the 'guest linear address' provided as collateral of the nested
1787  * page table fault matches with our instruction decoding.
1788  */
1789 static int
1790 verify_gla(struct vm *vm, int cpuid, uint64_t gla, struct vie *vie)
1791 {
1792         int error;
1793         uint64_t base, idx, gla2;
1794
1795         /* Skip 'gla' verification */
1796         if (gla == VIE_INVALID_GLA)
1797                 return (0);
1798
1799         base = 0;
1800         if (vie->base_register != VM_REG_LAST) {
1801                 error = vm_get_register(vm, cpuid, vie->base_register, &base);
1802                 if (error) {
1803                         printf("verify_gla: error %d getting base reg %d\n",
1804                                 error, vie->base_register);
1805                         return (-1);
1806                 }
1807
1808                 /*
1809                  * RIP-relative addressing starts from the following
1810                  * instruction
1811                  */
1812                 if (vie->base_register == VM_REG_GUEST_RIP)
1813                         base += vie->num_valid;
1814         }
1815
1816         idx = 0;
1817         if (vie->index_register != VM_REG_LAST) {
1818                 error = vm_get_register(vm, cpuid, vie->index_register, &idx);
1819                 if (error) {
1820                         printf("verify_gla: error %d getting index reg %d\n",
1821                                 error, vie->index_register);
1822                         return (-1);
1823                 }
1824         }
1825
1826         /* XXX assuming that the base address of the segment is 0 */
1827         gla2 = base + vie->scale * idx + vie->displacement;
1828         gla2 &= size2mask[vie->addrsize];
1829         if (gla != gla2) {
1830                 printf("verify_gla mismatch: "
1831                        "base(0x%0lx), scale(%d), index(0x%0lx), "
1832                        "disp(0x%0lx), gla(0x%0lx), gla2(0x%0lx)\n",
1833                        base, vie->scale, idx, vie->displacement, gla, gla2);
1834                 return (-1);
1835         }
1836
1837         return (0);
1838 }
1839
1840 int
1841 vmm_decode_instruction(struct vm *vm, int cpuid, uint64_t gla,
1842                        enum vm_cpu_mode cpu_mode, int cs_d, struct vie *vie)
1843 {
1844
1845         if (decode_prefixes(vie, cpu_mode, cs_d))
1846                 return (-1);
1847
1848         if (decode_opcode(vie))
1849                 return (-1);
1850
1851         if (decode_modrm(vie, cpu_mode))
1852                 return (-1);
1853
1854         if (decode_sib(vie))
1855                 return (-1);
1856
1857         if (decode_displacement(vie))
1858                 return (-1);
1859
1860         if (decode_immediate(vie))
1861                 return (-1);
1862
1863         if (decode_moffset(vie))
1864                 return (-1);
1865
1866         if (verify_inst_length(vie))
1867                 return (-1);
1868
1869         if (verify_gla(vm, cpuid, gla, vie))
1870                 return (-1);
1871
1872         vie->decoded = 1;       /* success */
1873
1874         return (0);
1875 }
1876 #endif  /* _KERNEL */