-#ifndef DEBUG_XED
+#ifndef CONFIG_DEBUG_XED
#undef PrintDebug
#define PrintDebug(fmt, args...)
#endif
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,
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));
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",
// 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);
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;
}