-/* (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> */
-/* (c) 2008, The V3VEE Project <http://www.v3vee.org> */
-
+/*
+ * 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"
#endif
+
+
+#ifndef DEBUG_XED
+#undef PrintDebug
+#define PrintDebug(fmt, args...)
+#endif
+
+
+
static xed_state_t decoder_state;
#define GPR_REGISTER 0
break;
case PROTECTED:
case PROTECTED_PAE:
+ case LONG_32_COMPAT:
if (state->mmode != XED_MACHINE_MODE_LEGACY_32) {
xed_state_init(state,
XED_MACHINE_MODE_LEGACY_32,
}
break;
default:
+ PrintError("Unsupported CPU mode: %d\n", info->cpu_mode);
return -1;
}
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;
if ((!xed_operand_is_register(op_enum)) ||
(!is_flags_reg(xed_decoded_inst_get_reg(&xed_instr, op_enum)))) {
// special case
- PrintDebug("Special Case not handled\n");
+ PrintError("Special Case not handled\n");
return -1;
}
}
if (get_opcode(iform, &(instr->opcode)) == -1) {
- PrintDebug("Could not get opcode. (iform=%s)\n", xed_iform_enum_t2str(iform));
+ PrintError("Could not get opcode. (iform=%s)\n", xed_iform_enum_t2str(iform));
return -1;
}
// set third operand
if (instr->num_operands >= 3) {
const xed_operand_t * op = xed_inst_operand(xi, 2);
- // xed_operand_type_enum_t op_type = xed_operand_type(op);
+ xed_operand_type_enum_t op_type = xed_operand_type(op);
xed_operand_enum_t op_enum = xed_operand_name(op);
if (xed_operand_is_register(op_enum)) {
} else {
- // PrintError("Unhandled third operand type %s\n", xed_operand_type_enum_t2str(op_type));
+ PrintError("Unhandled third operand type %s\n", xed_operand_type_enum_t2str(op_type));
return -1;
}
*opcode = (addr_t)&V3_OPCODE_MOV2CR;
break;
+ case XED_IFORM_SMSW_GPRv:
+ *opcode = (addr_t)&V3_OPCODE_SMSW;
+ break;
case XED_IFORM_LMSW_GPR16:
*opcode = (addr_t)&V3_OPCODE_LMSW;
*opcode = (addr_t)&V3_OPCODE_CLTS;
break;
+
+
default:
*opcode = 0;
return -1;