X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_xed.c;h=bd0d4f09b85eaec5764482963ca0a454be2be384;hb=82b8b87c344fcd1eab22e3f3be5ad54cbb3f8f68;hp=7c1c13e5065ce3589b83bde1fe16bf0f028bc332;hpb=2f94a8dfea7209ee001ab014f5668c360320f14f;p=palacios.git diff --git a/palacios/src/palacios/vmm_xed.c b/palacios/src/palacios/vmm_xed.c index 7c1c13e..bd0d4f0 100644 --- a/palacios/src/palacios/vmm_xed.c +++ b/palacios/src/palacios/vmm_xed.c @@ -35,7 +35,7 @@ -#ifndef DEBUG_XED +#ifndef CONFIG_DEBUG_XED #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -102,7 +102,7 @@ static int xed_reg_to_v3_reg(struct guest_info * info, xed_reg_enum_t xed_reg, a static int get_memory_operand(struct guest_info * info, xed_decoded_inst_t * xed_instr, uint_t index, struct x86_operand * operand); static int set_decoder_mode(struct guest_info * info, xed_state_t * state) { - switch (info->cpu_mode) { + switch (v3_get_vm_cpu_mode(info)) { case REAL: if (state->mmode != XED_MACHINE_MODE_LEGACY_16) { xed_state_init(state, @@ -147,17 +147,16 @@ static int set_decoder_mode(struct guest_info * info, xed_state_t * state) { } /* -static int is_flags_reg(xed_reg_enum_t xed_reg) { - switch (xed_reg) { - case XED_REG_FLAGS: - case XED_REG_EFLAGS: - case XED_REG_RFLAGS: - return 1; - default: - return 0; - } -} - + static int is_flags_reg(xed_reg_enum_t xed_reg) { + switch (xed_reg) { + case XED_REG_FLAGS: + case XED_REG_EFLAGS: + case XED_REG_RFLAGS: + return 1; + default: + return 0; + } + } */ int v3_init_decoder(struct guest_info * info) { @@ -326,7 +325,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins xed_iform_enum_t iform = xed_decoded_inst_get_iform_enum(&xed_instr); -#ifdef DEBUG_XED +#ifdef CONFIG_DEBUG_XED xed_iclass_enum_t iclass = xed_decoded_inst_get_iclass(&xed_instr); PrintDebug("iform=%s, iclass=%s\n", xed_iform_enum_t2str(iform), xed_iclass_enum_t2str(iclass)); @@ -433,8 +432,6 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins default: PrintError("Unhandled Operand Type\n"); return -1; - - } } } @@ -472,10 +469,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins } v3_op->type = REG_OPERAND; - - } else { - switch (op_enum) { case XED_OPERAND_MEM0: @@ -517,7 +511,6 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins return -1; } } - } // set third operand @@ -545,17 +538,12 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins instr->third_operand.type = REG_OPERAND; - } else { PrintError("Unhandled third operand type %s\n", xed_operand_type_enum_t2str(op_type)); - return -1; + instr->num_operands = 2; } - - } - - return 0; } @@ -577,10 +565,11 @@ static int get_memory_operand(struct guest_info * info, xed_decoded_inst_t * xe addr_t scale; addr_t index; ullong_t displacement; - int addr_width = v3_get_addr_width(info);; + int addr_width = v3_get_addr_width(info); + v3_cpu_mode_t cpu_mode = v3_get_vm_cpu_mode(info); // struct v3_segment * seg_reg; - PrintDebug("Xen mode = %s\n", xed_machine_mode_enum_t2str(xed_state_get_machine_mode(info->decoder_state))); + PrintDebug("Xed mode = %s\n", xed_machine_mode_enum_t2str(xed_state_get_machine_mode(info->decoder_state))); PrintDebug("Address width: %s\n", xed_address_width_enum_t2str(xed_state_get_address_width(info->decoder_state))); PrintDebug("Stack Address width: %s\n", @@ -657,7 +646,7 @@ static int get_memory_operand(struct guest_info * info, xed_decoded_inst_t * xe // This is a horrendous hack... // XED really screwed the pooch in calculating the displacement - if (v3_get_cpu_mode(info) == LONG) { + if (cpu_mode == LONG) { displacement = mem_op.displacement; } else { displacement = MASK(mem_op.displacement, mem_op.displacement_size); @@ -666,7 +655,11 @@ static int get_memory_operand(struct guest_info * info, xed_decoded_inst_t * xe PrintDebug("Seg=%p, base=%p, index=%p, scale=%p, displacement=%p\n", (void *)seg, (void *)base, (void *)index, (void *)scale, (void *)(addr_t)displacement); - operand->operand = MASK((seg + base + (scale * index) + displacement), addr_width); + if (cpu_mode == REAL) { + operand->operand = seg + MASK((base + (scale * index) + displacement), addr_width); + } else { + operand->operand = MASK((seg + base + (scale * index) + displacement), addr_width); + } return 0; }