1 #include <palacios/vmm_decoder.h>
2 #include <palacios/vmm_xed.h>
3 #include <xed/xed-interface.h>
8 int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * instr) {
11 xed_decoded_inst_t xedd;
13 xed_uint8_t itext[100] = {0x01,0x00,0x00,0x00,0x12,0x00,0x55,0x48,0x89,0xe5,0x48,0x89,0x7d,0xf8,0x89,0x75,0xf4,0x89,0x55,0xf0,0x89,0x4d,0xec,0x48,0x8b,0x55,0xf8,0x8b,0x45,0xf4,0x89,0x02,0x48,0x8b,0x55,0xf8,0x8b,0x45,0xf0,0x89,0x42,0x04,0x48,0x8b,0x55,0xf8,0x8b,0x45,0xec,0x89,0x42,0x08,0xc9,0xc3,0x55,0x48,0x89,0xe5,0x48,0x89,0x7d,0xf8,0x48,0x8b,0x45,0xf8,0x8b,0x40,0x08,0xc9,0xc3,0x90,0x0};
14 xed_bool_t long_mode = true;
15 unsigned int first_argv;
19 for (i=0, num=1; i<100; i += length, num++){
21 xed_state_zero(&dstate);
22 //if (argc > 2 && strcmp(argv[1], "-64") == 0)
27 dstate.mmode=XED_MACHINE_MODE_LONG_64;
31 xed_state_init(&dstate,
32 XED_MACHINE_MODE_LEGACY_32,
33 XED_ADDRESS_WIDTH_32b,
34 XED_ADDRESS_WIDTH_32b);
37 xed_decoded_inst_zero_set_mode(&xedd, &dstate);
38 xed_error_enum_t xed_error = xed_decode(&xedd,
39 REINTERPRET_CAST(const xed_uint8_t*,&itext[i]),
40 XED_MAX_INSTRUCTION_BYTES);
44 case XED_ERROR_BUFFER_TOO_SHORT:
45 PrintDebug("Not enough bytes provided\n");
47 case XED_ERROR_GENERAL_ERROR:
48 PrintDebug("Could not decode given input.\n");
51 PrintDebug("Unhandled error code \n");
55 length = xed_decoded_inst_get_length (&xedd);
57 PrintDebug("\nThe %dth instruction:", num);
59 PrintDebug("\ncategory: ");
60 PrintDebug(" %s\n", xed_category_enum_t2str(xed_decoded_inst_get_category(&xedd)));;
61 PrintDebug("ISA-extension:%s\n ",xed_extension_enum_t2str(xed_decoded_inst_get_extension(&xedd)));
62 PrintDebug(" instruction-length: %d\n ", xed_decoded_inst_get_length(&xedd));
63 PrintDebug(" operand-size:%d\n ", xed_operand_values_get_effective_operand_width(xed_decoded_inst_operands_const(&xedd)));
64 PrintDebug("address-size:%d\n ", xed_operand_values_get_effective_address_width(xed_decoded_inst_operands_const(&xedd)));
65 PrintDebug("iform-enum-name:%s\n ",xed_iform_enum_t2str(xed_decoded_inst_get_iform_enum(&xedd)));
66 PrintDebug("iform-enum-name-dispatch (zero based):%d\n ", xed_decoded_inst_get_iform_enum_dispatch(&xedd));
67 PrintDebug("iclass-max-iform-dispatch: %d\n ", xed_iform_max_per_iclass(xed_decoded_inst_get_iclass(&xedd)));
70 // print_operands(&xedd);
73 // print_memops(&xedd);
79 //print_attributes(&xedd);*/
88 int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf) {