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
instr->str_op_length = 0;
}
-
instr->num_operands = xed_decoded_inst_noperands(&xed_instr);
- if (instr->num_operands > 3) {
- PrintDebug("Special Case Not Handled\n");
- 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);
//PrintDebug("INSTR length: %d\n", instr->instr_length);
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;
}
int addr_width = v3_get_addr_width(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 (v3_get_vm_cpu_mode(info) == LONG) {
displacement = mem_op.displacement;
} else {
displacement = MASK(mem_op.displacement, mem_op.displacement_size);