X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_decoder.c;h=54c77c431d889242ca3bcc8c0cc498e886414136;hb=2166b2c5f57341f9674821c4b2af0de607f63c2f;hp=8aca0e6bb0d9f46477384f3a6b7bc66f0064715e;hpb=e70e95962c26832628d586e07f9cd1a2e1852d72;p=palacios-OLD.git diff --git a/palacios/src/palacios/vmm_decoder.c b/palacios/src/palacios/vmm_decoder.c index 8aca0e6..54c77c4 100644 --- a/palacios/src/palacios/vmm_decoder.c +++ b/palacios/src/palacios/vmm_decoder.c @@ -21,7 +21,7 @@ #include -int opcode_cmp(const uchar_t * op1, const uchar_t * op2) { +int v3_opcode_cmp(const uchar_t * op1, const uchar_t * op2) { if (op1[0] != op2[0]) { return op1[0] - op2[0];; } else { @@ -30,7 +30,68 @@ int opcode_cmp(const uchar_t * op1, const uchar_t * op2) { } -void strip_rep_prefix(uchar_t * instr, int length) { +void v3_get_prefixes(uchar_t * instr, struct x86_prefixes * prefixes) { + while (1) { + switch (*instr) { + case 0xF0: // lock + prefixes->lock = 1; + break; + + case 0xF2: // REPNE/REPNZ + prefixes->repnz = 1; + prefixes->repne = 1; + break; + + case 0xF3: // REP or REPE/REPZ + prefixes->rep = 1; + prefixes->repe = 1; + prefixes->repz = 1; + break; + + case 0x2E: // CS override or Branch hint not taken (with Jcc instrs) + prefixes->cs_override = 1; + prefixes->br_not_taken = 1; + break; + + case 0x36: // SS override + prefixes->ss_override = 1; + break; + + case 0x3E: // DS override or Branch hint taken (with Jcc instrs) + prefixes->ds_override = 1; + prefixes->br_taken = 1; + break; + + case 0x26: // ES override + prefixes->es_override = 1; + break; + + case 0x64: // FS override + prefixes->fs_override = 1; + break; + + case 0x65: // GS override + prefixes->gs_override = 1; + break; + + case 0x66: // operand size override + prefixes->op_size = 1; + break; + + case 0x67: // address size override + prefixes->addr_size = 1; + break; + + default: + return; + } + + instr++; + } + +} + +void v3_strip_rep_prefix(uchar_t * instr, int length) { int read_ctr = 0; int write_ctr = 0; int found = 0;