X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_xed.c;h=e35b4b09126d45fb7d99a5348bd8c34c5a47785a;hb=cfd5e43722796b4951faf721c64f3a74ab81ff2b;hp=e23ace081b1cfab99754dc93b78468d48dcdccf1;hpb=b3e5aa263c35961c74e0b7ed96b8510e8c6d7d0d;p=palacios.git diff --git a/palacios/src/palacios/vmm_xed.c b/palacios/src/palacios/vmm_xed.c index e23ace0..e35b4b0 100644 --- a/palacios/src/palacios/vmm_xed.c +++ b/palacios/src/palacios/vmm_xed.c @@ -35,7 +35,7 @@ -#ifndef CONFIG_DEBUG_XED +#ifndef V3_CONFIG_DEBUG_DECODER #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -203,11 +203,15 @@ static int decode_string_op(struct guest_info * info, return -1; } + if (get_memory_operand(info, xed_instr, 1, &(instr->src_operand)) == -1) { PrintError("Could not get Source memory operand\n"); return -1; } + instr->dst_operand.write = 1; + instr->src_operand.read = 1; + if (instr->prefixes.rep == 1) { addr_t reg_addr = 0; uint_t reg_length = 0; @@ -232,11 +236,15 @@ static int decode_string_op(struct guest_info * info, &(instr->src_operand.size)); instr->src_operand.type = REG_OPERAND; + instr->src_operand.read = 1; + instr->dst_operand.write = 1; + if (instr->prefixes.rep == 1) { addr_t reg_addr = 0; uint_t reg_length = 0; - xed_reg_to_v3_reg(info, xed_decoded_inst_get_reg(xed_instr, XED_OPERAND_REG1), ®_addr, ®_length); + xed_reg_to_v3_reg(info, xed_decoded_inst_get_reg(xed_instr, XED_OPERAND_REG1), + ®_addr, ®_length); instr->str_op_length = MASK(*(addr_t *)reg_addr, reg_length); } else { instr->str_op_length = 1; @@ -305,6 +313,8 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins xed_decoded_inst_t xed_instr; xed_error_enum_t xed_error; + memset(instr, 0, sizeof(struct x86_instr)); + v3_get_prefixes((uchar_t *)instr_ptr, &(instr->prefixes)); @@ -332,7 +342,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins xed_iform_enum_t iform = xed_decoded_inst_get_iform_enum(&xed_instr); -#ifdef CONFIG_DEBUG_XED +#ifdef V3_CONFIG_DEBUG_DECODER 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)); @@ -433,6 +443,19 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins case XED_OPERAND_IMM0: + { + v3_op->size = xed_decoded_inst_get_immediate_width(&xed_instr); + + if (v3_op->size > 4) { + PrintError("Unhandled 64 bit immediates\n"); + return -1; + } + v3_op->operand = xed_decoded_inst_get_unsigned_immediate(&xed_instr); + + v3_op->type = IMM_OPERAND; + + } + break; case XED_OPERAND_AGEN: case XED_OPERAND_PTR: case XED_OPERAND_RELBR: @@ -441,6 +464,18 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins return -1; } } + +// V3_Print("Operand 0 mode: %s\n", xed_operand_action_enum_t2str(xed_operand_rw(op))); + + + if (xed_operand_read(op)) { + v3_op->read = 1; + } + + if (xed_operand_written(op)) { + v3_op->write = 1; + } + } // set second operand @@ -460,6 +495,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins */ v3_op = &(instr->src_operand); + if (xed_operand_is_register(op_enum)) { xed_reg_enum_t xed_reg = xed_decoded_inst_get_reg(&xed_instr, op_enum); int v3_reg_type = xed_reg_to_v3_reg(info, @@ -518,6 +554,17 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins return -1; } } + +// V3_Print("Operand 1 mode: %s\n", xed_operand_action_enum_t2str(xed_operand_rw(op))); + + if (xed_operand_read(op)) { + v3_op->read = 1; + } + + if (xed_operand_written(op)) { + v3_op->write = 1; + } + } // set third operand @@ -526,6 +573,8 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins 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)) { xed_reg_enum_t xed_reg = xed_decoded_inst_get_reg(&xed_instr, op_enum); int v3_reg_type = xed_reg_to_v3_reg(info, @@ -545,6 +594,17 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins instr->third_operand.type = REG_OPERAND; + PrintDebug("Operand 2 mode: %s\n", xed_operand_action_enum_t2str(xed_operand_rw(op))); + + + if (xed_operand_read(op)) { + instr->third_operand.read = 1; + } + + if (xed_operand_written(op)) { + instr->third_operand.write = 1; + } + } else { PrintError("Unhandled third operand type %s\n", xed_operand_type_enum_t2str(op_type)); instr->num_operands = 2; @@ -555,7 +615,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins } -int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf) { +int v3_encode(struct guest_info * info, struct x86_instr * instr, uint8_t * instr_buf) { return -1; } @@ -674,7 +734,8 @@ static int get_memory_operand(struct guest_info * info, xed_decoded_inst_t * xe } -static int xed_reg_to_v3_reg(struct guest_info * info, xed_reg_enum_t xed_reg, addr_t * v3_reg, uint_t * reg_len) { +static int xed_reg_to_v3_reg(struct guest_info * info, xed_reg_enum_t xed_reg, + addr_t * v3_reg, uint_t * reg_len) { PrintDebug("Xed Register: %s\n", xed_reg_enum_t2str(xed_reg)); @@ -1222,6 +1283,9 @@ static v3_op_type_t get_opcode(xed_iform_enum_t iform) { case XED_IFORM_INVLPG_MEMb: return V3_OP_INVLPG; + case XED_IFORM_INT_IMM: + return V3_OP_INT; + /* Data Instructions */