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>
27 void v3_get_prefixes(uchar_t * instr, struct x86_prefixes * prefixes) {
34 case 0xF2: // REPNE/REPNZ
39 case 0xF3: // REP or REPE/REPZ
45 case 0x2E: // CS override or Branch hint not taken (with Jcc instrs)
46 prefixes->cs_override = 1;
47 prefixes->br_not_taken = 1;
50 case 0x36: // SS override
51 prefixes->ss_override = 1;
54 case 0x3E: // DS override or Branch hint taken (with Jcc instrs)
55 prefixes->ds_override = 1;
56 prefixes->br_taken = 1;
59 case 0x26: // ES override
60 prefixes->es_override = 1;
63 case 0x64: // FS override
64 prefixes->fs_override = 1;
67 case 0x65: // GS override
68 prefixes->gs_override = 1;
71 case 0x66: // operand size override
72 prefixes->op_size = 1;
75 case 0x67: // address size override
76 prefixes->addr_size = 1;
88 void v3_strip_rep_prefix(uchar_t * instr, int length) {
93 while (read_ctr < length) {
95 ( (instr[read_ctr] == 0xF2) ||
96 (instr[read_ctr] == 0xF3))) {
100 instr[write_ctr] = instr[read_ctr];