X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_xed.c;h=f4408f2161f7aaf279456bbfb3b923ff5541e33a;hb=65ffa7d1ac6dfb3399ba2b217d27519e258ee00a;hp=bd0d4f09b85eaec5764482963ca0a454be2be384;hpb=82b8b87c344fcd1eab22e3f3be5ad54cbb3f8f68;p=palacios.releases.git diff --git a/palacios/src/palacios/vmm_xed.c b/palacios/src/palacios/vmm_xed.c index bd0d4f0..f4408f2 100644 --- a/palacios/src/palacios/vmm_xed.c +++ b/palacios/src/palacios/vmm_xed.c @@ -180,6 +180,13 @@ int v3_init_decoder(struct guest_info * info) { +int v3_deinit_decoder(struct guest_info * core) { + V3_Free(core->decoder_state); + + return 0; +} + + 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; @@ -294,6 +301,55 @@ static int decode_string_op(struct guest_info * info, +int v3_disasm(struct guest_info * info, void *instr_ptr, addr_t * rip, int mark) { + char buffer[256]; + int i; + unsigned length; + xed_decoded_inst_t xed_instr; + xed_error_enum_t xed_error; + + /* disassemble the specified instruction */ + if (set_decoder_mode(info, info->decoder_state) == -1) { + PrintError("Could not set decoder mode\n"); + return -1; + } + + xed_decoded_inst_zero_set_mode(&xed_instr, info->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; + } + + /* obtain string representation in AT&T syntax */ + if (!xed_format_att(&xed_instr, buffer, sizeof(buffer), *rip)) { + PrintError("Xed error: cannot disaaemble\n"); + return -1; + } + + /* print address, opcode bytes and the disassembled instruction */ + length = xed_decoded_inst_get_length(&xed_instr); + V3_Print("0x%p %c ", (void *) *rip, mark ? '*' : ' '); + for (i = 0; i < length; i++) { + unsigned char b = ((unsigned char *) instr_ptr)[i]; + V3_Print("%x%x ", b >> 4, b & 0xf); + } + while (i++ < 8) { + V3_Print(" "); + } + V3_Print("%s\n", buffer); + + /* move on to next instruction */ + *rip += length; + 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;