X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=misc%2Fdecoder_test%2Fvmm_xed.c;h=bb5729bb3bfc493aa4948016b5dea6c1859ea2be;hb=7bb0986868fca4e2618c52139f914efd1edb0839;hp=fc676a960784a896d80fb4c993696a290ee4bc63;hpb=9e5b4c4140241b45094c87ac15f75fead726981f;p=palacios.git diff --git a/misc/decoder_test/vmm_xed.c b/misc/decoder_test/vmm_xed.c index fc676a9..bb5729b 100644 --- a/misc/decoder_test/vmm_xed.c +++ b/misc/decoder_test/vmm_xed.c @@ -11,6 +11,7 @@ #include #include + #endif static xed_state_t decoder_state; @@ -115,6 +116,59 @@ int init_decoder() { } + +int v3_basic_mem_decode(struct guest_info * info, addr_t instr_ptr, struct basic_instr_info * instr_info) { + xed_decoded_inst_t xed_instr; + xed_error_enum_t xed_error; + + + if (set_decoder_mode(info, &decoder_state) == -1) { + PrintError("Could not set decoder mode\n"); + return -1; + } + + + xed_decoded_inst_zero_set_mode(&xed_instr, &decoder_state); + + xed_error = xed_decode(&xed_instr, + REINTERPRET_CAST(const xed_uint8_t *, instr_ptr), + XED_MAX_INSTRUCTION_BYTES); + + if (xed_error != XED_ERROR_NONE) { + PrintError("Xed error: %s\n", xed_error_enum_t2str(xed_error)); + return -1; + } + + instr_info->instr_length = xed_decoded_inst_get_length(&xed_instr); + + + if (xed_decoded_inst_number_of_memory_operands(&xed_instr) == 0) { + PrintError("Tried to decode memory operation with no memory operands\n"); + return -1; + } + + instr_info->op_size = xed_decoded_inst_get_memory_operand_length(&xed_instr, 0); + + + xed_category_enum_t cat = xed_decoded_inst_get_category(&xed_instr); + if (cat == XED_CATEGORY_STRINGOP) { + instr_info->str_op = 1; + } else { + instr_info->str_op = 0; + } + + xed_operand_values_t * operands = xed_decoded_inst_operands(&xed_instr); + if (xed_operand_values_has_real_rep(operands)) { + instr_info->has_rep = 1; + } else { + instr_info->has_rep = 0; + } + + return 0; +} + + + int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * instr) { xed_decoded_inst_t xed_instr; xed_error_enum_t xed_error;