X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_decoder.c;h=a67887e4f3460a91ab059eab3b13a3720a88f597;hp=77ece9b1a93d001e676d5e3ead50937d5ff12379;hb=f7cc83b3bae64c853f5b7b63e2830b1ea92dfed9;hpb=abf911f47d91375cfbe41bee04e980aa829d26f3 diff --git a/palacios/src/palacios/vmm_decoder.c b/palacios/src/palacios/vmm_decoder.c index 77ece9b..a67887e 100644 --- a/palacios/src/palacios/vmm_decoder.c +++ b/palacios/src/palacios/vmm_decoder.c @@ -1,37 +1,86 @@ #include +#if VMM_XED +#include +#endif +int parse() { +#if !VMM_XED + PrintDebug("XED is not included in this kernel\n"); +#else + xed_state_t dstate; + xed_decoded_inst_t xedd; + xed_uint_t i, length; + 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}; + xed_bool_t long_mode = true; + unsigned int first_argv; + int num; + -/* The full blown instruction parser... */ -int v3_parse_instr(struct guest_info * info, - char * instr_ptr, - uint_t * instr_length, - addr_t * opcode, - uint_t * opcode_length, - struct x86_prefix_list * prefixes, - struct x86_operand * src_operand, - struct x86_operand * dst_operand, - struct x86_operand * extra_operand) { + for (i=0, num=1; i<100; i += length, num++){ + xed_tables_init(); + xed_state_zero(&dstate); + //if (argc > 2 && strcmp(argv[1], "-64") == 0) + long_mode = true; - V3_ASSERT(src_operand != NULL); - V3_ASSERT(dst_operand != NULL); - V3_ASSERT(extra_operand != NULL); - V3_ASSERT(instr_length != NULL); - V3_ASSERT(info != NULL); + if (long_mode) { + first_argv = 2; + dstate.mmode=XED_MACHINE_MODE_LONG_64; + } + else { + first_argv=1; + xed_state_init(&dstate, + XED_MACHINE_MODE_LEGACY_32, + XED_ADDRESS_WIDTH_32b, + XED_ADDRESS_WIDTH_32b); + } - - // Ignore prefixes for now - while (is_prefix_byte(*instr_ptr)) { - instr_ptr++; - *instr_length++; - } + xed_decoded_inst_zero_set_mode(&xedd, &dstate); + xed_error_enum_t xed_error = xed_decode(&xedd, + REINTERPRET_CAST(const xed_uint8_t*,&itext[i]), + XED_MAX_INSTRUCTION_BYTES); + switch(xed_error) { + case XED_ERROR_NONE: + break; + case XED_ERROR_BUFFER_TOO_SHORT: + PrintDebug("Not enough bytes provided\n"); + return 1; + case XED_ERROR_GENERAL_ERROR: + PrintDebug("Could not decode given input.\n"); + return 1; + default: + PrintDebug("Unhandled error code \n"); + return 1;; + } + length = xed_decoded_inst_get_length (&xedd); - // Opcode table lookup, see xen/kvm + PrintDebug("\nThe %dth instruction:", num); + PrintDebug("\ncategory: "); + PrintDebug(" %s\n", xed_category_enum_t2str(xed_decoded_inst_get_category(&xedd)));; + PrintDebug("ISA-extension:%s\n ",xed_extension_enum_t2str(xed_decoded_inst_get_extension(&xedd))); + PrintDebug(" instruction-length: %d\n ", xed_decoded_inst_get_length(&xedd)); + PrintDebug(" operand-size:%d\n ", xed_operand_values_get_effective_operand_width(xed_decoded_inst_operands_const(&xedd))); + PrintDebug("address-size:%d\n ", xed_operand_values_get_effective_address_width(xed_decoded_inst_operands_const(&xedd))); + PrintDebug("iform-enum-name:%s\n ",xed_iform_enum_t2str(xed_decoded_inst_get_iform_enum(&xedd))); + PrintDebug("iform-enum-name-dispatch (zero based):%d\n ", xed_decoded_inst_get_iform_enum_dispatch(&xedd)); + PrintDebug("iclass-max-iform-dispatch: %d\n ", xed_iform_max_per_iclass(xed_decoded_inst_get_iclass(&xedd))); + // operands + // print_operands(&xedd); + + // memops + // print_memops(&xedd); + + // flags + //print_flags(&xedd); + // attributes + //print_attributes(&xedd);*/ + } +#endif - return 0; + return 0; }