2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
21 #include <palacios/vmm_decoder.h>
24 int v3_opcode_cmp(const uchar_t * op1, const uchar_t * op2) {
25 if (op1[0] != op2[0]) {
26 return op1[0] - op2[0];;
28 return memcmp(op1 + 1, op2 + 1, op1[0]);
33 void v3_get_prefixes(uchar_t * instr, struct x86_prefixes * prefixes) {
40 case 0xF2: // REPNE/REPNZ
45 case 0xF3: // REP or REPE/REPZ
51 case 0x2E: // CS override or Branch hint not taken (with Jcc instrs)
52 prefixes->cs_override = 1;
53 prefixes->br_not_taken = 1;
56 case 0x36: // SS override
57 prefixes->ss_override = 1;
60 case 0x3E: // DS override or Branch hint taken (with Jcc instrs)
61 prefixes->ds_override = 1;
62 prefixes->br_taken = 1;
65 case 0x26: // ES override
66 prefixes->es_override = 1;
69 case 0x64: // FS override
70 prefixes->fs_override = 1;
73 case 0x65: // GS override
74 prefixes->gs_override = 1;
77 case 0x66: // operand size override
78 prefixes->op_size = 1;
81 case 0x67: // address size override
82 prefixes->addr_size = 1;
94 void v3_strip_rep_prefix(uchar_t * instr, int length) {
99 while (read_ctr < length) {
101 ( (instr[read_ctr] == 0xF2) ||
102 (instr[read_ctr] == 0xF3))) {
106 instr[write_ctr] = instr[read_ctr];