From: Jack Lange Date: Wed, 23 Jul 2008 19:06:20 +0000 (+0000) Subject: integrated decoder X-Git-Tag: vmmhack1-ramdisk-boot-iso-puppy~48 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=6f089682a19a99474faf05f74b44f9f71f58b30b integrated decoder --- diff --git a/palacios/include/palacios/vm_guest.h b/palacios/include/palacios/vm_guest.h index 9083b62..9475597 100644 --- a/palacios/include/palacios/vm_guest.h +++ b/palacios/include/palacios/vm_guest.h @@ -81,7 +81,7 @@ struct vm_ctrl_ops { typedef enum {SHADOW_PAGING, NESTED_PAGING} vmm_paging_mode_t; -typedef enum {REAL, /*UNREAL,*/ PROTECTED, PROTECTED_PAE, LONG} vm_cpu_mode_t; +typedef enum {REAL, /*UNREAL,*/ PROTECTED, PROTECTED_PAE, LONG, LONG_32_COMPAT, LONG_16_COMPAT} vm_cpu_mode_t; typedef enum {PHYSICAL_MEM, VIRTUAL_MEM} vm_mem_mode_t; struct guest_info { diff --git a/palacios/include/palacios/vmm_decoder.h b/palacios/include/palacios/vmm_decoder.h index 4d956b4..ac3e83b 100644 --- a/palacios/include/palacios/vmm_decoder.h +++ b/palacios/include/palacios/vmm_decoder.h @@ -61,6 +61,12 @@ struct x86_instr { This is an External API definition that must be implemented by a decoder */ + +/* + * Initializes a decoder + */ +int init_decoder(); + /* * Decodes an instruction * All addresses in arguments are in the host address space diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index 8b04b51..b103c32 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -4,6 +4,7 @@ #include #include #include +#include v3_cpu_arch_t v3_cpu_type; struct vmm_os_hooks * os_hooks = NULL; @@ -23,6 +24,8 @@ void Init_V3(struct vmm_os_hooks * hooks, struct vmm_ctrl_ops * vmm_ops) { v3_cpu_type = V3_INVALID_CPU; + init_decoder(); + if (is_svm_capable()) { PrintDebug("Machine is SVM Capable\n"); diff --git a/palacios/src/palacios/vmm_ctrl_regs.c b/palacios/src/palacios/vmm_ctrl_regs.c index b21dc85..b31fcaa 100644 --- a/palacios/src/palacios/vmm_ctrl_regs.c +++ b/palacios/src/palacios/vmm_ctrl_regs.c @@ -43,7 +43,14 @@ int handle_cr0_write(struct guest_info * info) { PrintDebug("Could not read instruction (ret=%d)\n", ret); return -1; } + /* + { + struct x86_instr dec_instr; + v3_decode(info, (addr_t)instr, &dec_instr); + return -1; + } + */ while (is_prefix_byte(instr[index])) { switch(instr[index]) { case PREFIX_CS_OVERRIDE: diff --git a/palacios/src/palacios/vmm_xed.c b/palacios/src/palacios/vmm_xed.c index 9a05797..f0117f2 100644 --- a/palacios/src/palacios/vmm_xed.c +++ b/palacios/src/palacios/vmm_xed.c @@ -1,11 +1,109 @@ #include #include #include +#include +static xed_state_t decoder_state; +static int set_decoder_mode(struct guest_info * info, xed_state_t * state) { + switch (info->cpu_mode) { + case REAL: + if (state->mmode != XED_MACHINE_MODE_LEGACY_16) { + xed_state_init(state, + XED_MACHINE_MODE_LEGACY_16, + XED_ADDRESS_WIDTH_16b, + XED_ADDRESS_WIDTH_16b); + } + break; + case PROTECTED: + case PROTECTED_PAE: + if (state->mmode != XED_MACHINE_MODE_LEGACY_32) { + xed_state_init(state, + XED_MACHINE_MODE_LEGACY_32, + XED_ADDRESS_WIDTH_32b, + XED_ADDRESS_WIDTH_32b); + } + break; + case LONG: + if (state->mmode != XED_MACHINE_MODE_LONG_64) { + state->mmode = XED_MACHINE_MODE_LONG_64; + } + break; + default: + return -1; + } + return 0; +} + + +int init_decoder() { + xed_tables_init(); + xed_state_zero(&decoder_state); + 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; + + 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->instr_length = xed_decoded_inst_get_length (&xed_instr); + + + PrintDebug("category: %s\n", xed_category_enum_t2str(xed_decoded_inst_get_category(&xed_instr)));; + PrintDebug("ISA-extension:%s\n ",xed_extension_enum_t2str(xed_decoded_inst_get_extension(&xed_instr))); + PrintDebug(" instruction-length: %d\n ", xed_decoded_inst_get_length(&xed_instr)); + PrintDebug(" operand-size:%d\n ", xed_operand_values_get_effective_operand_width(xed_decoded_inst_operands_const(&xed_instr))); + PrintDebug("address-size:%d\n ", xed_operand_values_get_effective_address_width(xed_decoded_inst_operands_const(&xed_instr))); + PrintDebug("iform-enum-name:%s\n ",xed_iform_enum_t2str(xed_decoded_inst_get_iform_enum(&xed_instr))); + PrintDebug("iform-enum-name-dispatch (zero based):%d\n ", xed_decoded_inst_get_iform_enum_dispatch(&xed_instr)); + PrintDebug("iclass-max-iform-dispatch: %d\n ", xed_iform_max_per_iclass(xed_decoded_inst_get_iclass(&xed_instr))); + + // operands + // print_operands(&xed_instr); + + // memops + // print_memops(&xed_instr); + + // flags + //print_flags(&xed_instr); + + // attributes + //print_attributes(&xed_instr);*/ + + + + return -1; +} + + +int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf) { + + return -1; +} + + + + +/* xed_state_t dstate; xed_decoded_inst_t xedd; @@ -76,16 +174,9 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins //print_flags(&xedd); // attributes - //print_attributes(&xedd);*/ + //print_attributes(&xedd); } - return -1; -} - - -int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf) { - - return -1; -} +*/