X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_xed.c;h=eaac5bd62f927c876ecee34cf2ba51fc5c91faf2;hb=dff04423dfb6d70291862c33114d845fc418fe71;hp=35693fe9f8658647fe8f6205f4c43163a768e011;hpb=266af4b5b19da7bee8e7445288c7c1cb3ee194c7;p=palacios-OLD.git diff --git a/palacios/src/palacios/vmm_xed.c b/palacios/src/palacios/vmm_xed.c index 35693fe..eaac5bd 100644 --- a/palacios/src/palacios/vmm_xed.c +++ b/palacios/src/palacios/vmm_xed.c @@ -146,18 +146,18 @@ static int set_decoder_mode(struct guest_info * info, xed_state_t * state) { return 0; } -static int is_flags_reg(xed_reg_enum_t xed_reg) { - switch (xed_reg) { - case XED_REG_FLAGS: - case XED_REG_EFLAGS: - case XED_REG_RFLAGS: - return 1; - default: - return 0; - } -} - - +/* + static int is_flags_reg(xed_reg_enum_t xed_reg) { + switch (xed_reg) { + case XED_REG_FLAGS: + case XED_REG_EFLAGS: + case XED_REG_RFLAGS: + return 1; + default: + return 0; + } + } +*/ int v3_init_decoder(struct guest_info * info) { // Global library initialization, only do it once @@ -347,26 +347,25 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins instr->str_op_length = 0; } - instr->num_operands = xed_decoded_inst_noperands(&xed_instr); - if (instr->num_operands > 3) { - PrintDebug("Special Case Not Handled\n"); - return -1; - // special case - } else if (instr->num_operands == 3) { - const xed_operand_t * op = xed_inst_operand(xi, 2); - xed_operand_enum_t op_enum = xed_operand_name(op); - - if ((!xed_operand_is_register(op_enum)) || - (!is_flags_reg(xed_decoded_inst_get_reg(&xed_instr, op_enum)))) { - // special case - PrintError("Special Case not handled\n"); - return -1; - } - } - - + /* + if (instr->num_operands > 3) { + PrintDebug("Special Case Not Handled (more than 3 operands) (iform=%s)\n", xed_iform_enum_t2str(iform) + return -1; + // special case + } else if (instr->num_operands == 3) { + const xed_operand_t * op = xed_inst_operand(xi, 2); + xed_operand_enum_t op_enum = xed_operand_name(op); + + if ((!xed_operand_is_register(op_enum)) || + (!is_flags_reg(xed_decoded_inst_get_reg(&xed_instr, op_enum)))) { + // special case + PrintError("Special Case not handled (iform=%s)\n", xed_iform_enum_t2str(iform)); + return -1; + } + } + */ //PrintDebug("Number of operands: %d\n", instr->num_operands); //PrintDebug("INSTR length: %d\n", instr->instr_length); @@ -548,7 +547,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins } else { PrintError("Unhandled third operand type %s\n", xed_operand_type_enum_t2str(op_type)); - return -1; + instr->num_operands = 2; } @@ -1266,12 +1265,14 @@ static v3_op_type_t get_opcode(xed_iform_enum_t iform) { // Write case XED_IFORM_MOV_MEMv_GPRv: case XED_IFORM_MOV_MEMb_GPR8: + case XED_IFORM_MOV_MEMv_OrAX: case XED_IFORM_MOV_MEMb_AL: case XED_IFORM_MOV_MEMv_IMM: case XED_IFORM_MOV_MEMb_IMM: // Read case XED_IFORM_MOV_GPRv_MEMv: case XED_IFORM_MOV_GPR8_MEMb: + case XED_IFORM_MOV_OrAX_MEMv: case XED_IFORM_MOV_AL_MEMb: return V3_OP_MOV;