From: Jack Lange Date: Thu, 2 Jun 2011 21:26:26 +0000 (-0500) Subject: decoder fixes X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=5614cff13837121053e831419f569b4e6e32bcd9;p=palacios.git decoder fixes --- diff --git a/palacios/include/palacios/vmm_decoder.h b/palacios/include/palacios/vmm_decoder.h index aba2d40..7b703a8 100644 --- a/palacios/include/palacios/vmm_decoder.h +++ b/palacios/include/palacios/vmm_decoder.h @@ -48,30 +48,35 @@ struct x86_operand { } __attribute__((packed)); struct x86_prefixes { - uint_t lock : 1; // 0xF0 - uint_t repne : 1; // 0xF2 - uint_t repnz : 1; // 0xF2 - uint_t rep : 1; // 0xF3 - uint_t repe : 1; // 0xF3 - uint_t repz : 1; // 0xF3 - uint_t cs_override : 1; // 0x2E - uint_t ss_override : 1; // 0x36 - uint_t ds_override : 1; // 0x3E - uint_t es_override : 1; // 0x26 - uint_t fs_override : 1; // 0x64 - uint_t gs_override : 1; // 0x65 - uint_t br_not_taken : 1; // 0x2E - uint_t br_taken : 1; // 0x3E - uint_t op_size : 1; // 0x66 - uint_t addr_size : 1; // 0x67 - - uint_t rex : 1; + union { + uint32_t val; + + struct { + uint_t lock : 1; // 0xF0 + uint_t repne : 1; // 0xF2 + uint_t repnz : 1; // 0xF2 + uint_t rep : 1; // 0xF3 + uint_t repe : 1; // 0xF3 + uint_t repz : 1; // 0xF3 + uint_t cs_override : 1; // 0x2E + uint_t ss_override : 1; // 0x36 + uint_t ds_override : 1; // 0x3E + uint_t es_override : 1; // 0x26 + uint_t fs_override : 1; // 0x64 + uint_t gs_override : 1; // 0x65 + uint_t br_not_taken : 1; // 0x2E + uint_t br_taken : 1; // 0x3E + uint_t op_size : 1; // 0x66 + uint_t addr_size : 1; // 0x67 + + uint_t rex : 1; - uint_t rex_rm : 1; // REX.B - uint_t rex_sib_idx : 1; // REX.X - uint_t rex_reg : 1; // REX.R - uint_t rex_op_size : 1; // REX.W - + uint_t rex_rm : 1; // REX.B + uint_t rex_sib_idx : 1; // REX.X + uint_t rex_reg : 1; // REX.R + uint_t rex_op_size : 1; // REX.W + } __attribute__((packed)); + } __attribute__((packed)); } __attribute__((packed)); diff --git a/palacios/include/palacios/vmm_instr_decoder.h b/palacios/include/palacios/vmm_instr_decoder.h index f36a738..623ca4d 100644 --- a/palacios/include/palacios/vmm_instr_decoder.h +++ b/palacios/include/palacios/vmm_instr_decoder.h @@ -261,6 +261,8 @@ static int get_operand_width(struct guest_info * info, struct x86_instr * instr, case LONG: if (instr->prefixes.rex_op_size) { return 8; + } else { + return 4; } case PROTECTED: case PROTECTED_PAE: @@ -333,6 +335,7 @@ static int get_operand_width(struct guest_info * info, struct x86_instr * instr, return -1; } + return 0; } diff --git a/palacios/src/palacios/vmm_decoder.c b/palacios/src/palacios/vmm_decoder.c index ca52e8a..a2f260c 100644 --- a/palacios/src/palacios/vmm_decoder.c +++ b/palacios/src/palacios/vmm_decoder.c @@ -192,7 +192,7 @@ static const ullong_t mask_8 = 0xffffffffffffffffLL; void v3_print_instr(struct x86_instr * instr) { V3_Print("Instr: %s (Len: %d)\n", op_type_to_str(instr->op_type), instr->instr_length); - V3_Print("Prefixes= %x\n", *(uint32_t *)&(instr->prefixes)); + V3_Print("Prefixes= %x\n", instr->prefixes.val); if (instr->is_str_op) { V3_Print("String OP (len=%d)\n", (uint32_t)instr->str_op_length);