-#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,
+int v3_deinit_decoder(struct guest_info * core) {
+ V3_Free(core->decoder_state);
+
+ return 0;
+}
+
+
int v3_basic_mem_decode(struct guest_info * info, addr_t instr_ptr, struct basic_instr_info * instr_info) {
xed_decoded_inst_t xed_instr;
xed_error_enum_t xed_error;
+int v3_disasm(struct guest_info * info, void *instr_ptr, addr_t * rip, int mark) {
+ char buffer[256];
+ int i;
+ unsigned length;
+ xed_decoded_inst_t xed_instr;
+ xed_error_enum_t xed_error;
+
+ /* disassemble the specified instruction */
+ if (set_decoder_mode(info, info->decoder_state) == -1) {
+ PrintError("Could not set decoder mode\n");
+ return -1;
+ }
+
+ xed_decoded_inst_zero_set_mode(&xed_instr, info->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;
+ }
+
+ /* obtain string representation in AT&T syntax */
+ if (!xed_format_att(&xed_instr, buffer, sizeof(buffer), *rip)) {
+ PrintError("Xed error: cannot disaaemble\n");
+ return -1;
+ }
+
+ /* print address, opcode bytes and the disassembled instruction */
+ length = xed_decoded_inst_get_length(&xed_instr);
+ V3_Print("0x%p %c ", (void *) *rip, mark ? '*' : ' ');
+ for (i = 0; i < length; i++) {
+ unsigned char b = ((unsigned char *) instr_ptr)[i];
+ V3_Print("%x%x ", b >> 4, b & 0xf);
+ }
+ while (i++ < 8) {
+ V3_Print(" ");
+ }
+ V3_Print("%s\n", buffer);
+
+ /* move on to next instruction */
+ *rip += length;
+ 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;
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("Xed mode = %s\n", xed_machine_mode_enum_t2str(xed_state_get_machine_mode(info->decoder_state)));
// This is a horrendous hack...
// XED really screwed the pooch in calculating the displacement
- if (v3_get_vm_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;
}