-#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,
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;
- }
-}
-
-
+/*
+ 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) {
// Global library initialization, only do it once
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));
instr->num_operands = xed_decoded_inst_noperands(&xed_instr);
/*
- if (instr->num_operands > 3) {
- PrintDebug("Special Case Not Handled (more than 3 operands) (iform=%s)\n", xed_iform_enum_t2str(iform)
- return -1;
- // special case
- } else if (instr->num_operands == 3) {
- const xed_operand_t * op = xed_inst_operand(xi, 2);
- xed_operand_enum_t op_enum = xed_operand_name(op);
-
- if ((!xed_operand_is_register(op_enum)) ||
- (!is_flags_reg(xed_decoded_inst_get_reg(&xed_instr, op_enum)))) {
- // special case
- PrintError("Special Case not handled (iform=%s)\n", xed_iform_enum_t2str(iform));
- return -1;
- }
- }
+ if (instr->num_operands > 3) {
+ PrintDebug("Special Case Not Handled (more than 3 operands) (iform=%s)\n", xed_iform_enum_t2str(iform)
+ return -1;
+ // special case
+ } else if (instr->num_operands == 3) {
+ const xed_operand_t * op = xed_inst_operand(xi, 2);
+ xed_operand_enum_t op_enum = xed_operand_name(op);
+
+ if ((!xed_operand_is_register(op_enum)) ||
+ (!is_flags_reg(xed_decoded_inst_get_reg(&xed_instr, op_enum)))) {
+ // special case
+ PrintError("Special Case not handled (iform=%s)\n", xed_iform_enum_t2str(iform));
+ return -1;
+ }
+ }
*/
//PrintDebug("Number of operands: %d\n", instr->num_operands);
default:
PrintError("Unhandled Operand Type\n");
return -1;
-
-
}
}
}
}
v3_op->type = REG_OPERAND;
-
-
} else {
-
switch (op_enum) {
case XED_OPERAND_MEM0:
return -1;
}
}
-
}
// set third operand
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;
}
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;
}