+/*
+ * This file is part of the Palacios Virtual Machine Monitor developed
+ * by the V3VEE Project with funding from the United States National
+ * Science Foundation and the Department of Energy.
+ *
+ * The V3VEE Project is a joint project between Northwestern University
+ * and the University of New Mexico. You can find out more at
+ * http://www.v3vee.org
+ *
+ * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
+ * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
+ * All rights reserved.
+ *
+ * Author: Jack Lange <jarusl@cs.northwestern.edu>
+ *
+ * This is free software. You are permitted to use,
+ * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
+ */
+
#ifdef __DECODER_TEST__
#include "vmm_decoder.h"
#include "vmm_xed.h"
#include <palacios/vm_guest.h>
#include <palacios/vmm.h>
+
#endif
+
+
+#ifndef DEBUG_XED
+#undef PrintDebug
+#define PrintDebug(fmt, args...)
+#endif
+
+
+
static xed_state_t decoder_state;
#define GPR_REGISTER 0
return 0;
}
-int is_flags_reg(xed_reg_enum_t xed_reg) {
+static int is_flags_reg(xed_reg_enum_t xed_reg) {
switch (xed_reg) {
case XED_REG_FLAGS:
case XED_REG_EFLAGS:
-int init_decoder() {
+int v3_init_decoder() {
xed_tables_init();
xed_state_zero(&decoder_state);
return 0;
}
-int v3_basic_mem_decode(struct guest_info * info, addr_t instr_ptr, uint_t * size, uint_t * instr_length) {
+
+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;
return -1;
}
- *instr_length = xed_decoded_inst_get_length(&xed_instr);
+ instr_info->instr_length = xed_decoded_inst_get_length(&xed_instr);
if (xed_decoded_inst_number_of_memory_operands(&xed_instr) == 0) {
return -1;
}
- *size = xed_decoded_inst_get_memory_operand_length(&xed_instr,0);
+ instr_info->op_size = xed_decoded_inst_get_memory_operand_length(&xed_instr, 0);
+
+
+ xed_category_enum_t cat = xed_decoded_inst_get_category(&xed_instr);
+ if (cat == XED_CATEGORY_STRINGOP) {
+ instr_info->str_op = 1;
+ } else {
+ instr_info->str_op = 0;
+ }
+
+ xed_operand_values_t * operands = xed_decoded_inst_operands(&xed_instr);
+ if (xed_operand_values_has_real_rep(operands)) {
+ instr_info->has_rep = 1;
+ } else {
+ instr_info->has_rep = 0;
+ }
return 0;
}