X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_decoder.h;h=009fc588f7c06fd25f6762a05d25672e5cb6140c;hb=2166b2c5f57341f9674821c4b2af0de607f63c2f;hp=6b8715e85f590db3060c4f44f1f71077977ce5ba;hpb=7cdedeb7a01b51c5242cce94924f2ea246008e7d;p=palacios.git diff --git a/palacios/include/palacios/vmm_decoder.h b/palacios/include/palacios/vmm_decoder.h index 6b8715e..009fc58 100644 --- a/palacios/include/palacios/vmm_decoder.h +++ b/palacios/include/palacios/vmm_decoder.h @@ -1,4 +1,3 @@ - /* * This file is part of the Palacios Virtual Machine Monitor developed * by the V3VEE Project with funding from the United States National @@ -27,6 +26,17 @@ #include +typedef enum { V3_INVALID_OP, + V3_OP_MOVCR2, V3_OP_MOV2CR, V3_OP_SMSW, V3_OP_LMSW, V3_OP_CLTS, + V3_OP_INVLPG, + V3_OP_ADC, V3_OP_ADD, V3_OP_AND, V3_OP_OR, V3_OP_XOR, V3_OP_SUB, + V3_OP_INC, V3_OP_DEC, V3_OP_NEG, V3_OP_MOV, V3_OP_NOT, V3_OP_XCHG, + V3_OP_SETB, V3_OP_SETBE, V3_OP_SETL, V3_OP_SETLE, V3_OP_SETNB, + V3_OP_SETNBE, V3_OP_SETNL, V3_OP_SETNLE, V3_OP_SETNO, V3_OP_SETNP, + V3_OP_SETNS, V3_OP_SETNZ, V3_OP_SETO, V3_OP_SETP, V3_OP_SETS, + V3_OP_SETZ, V3_OP_MOVS, V3_OP_STOS, V3_OP_MOVZX, V3_OP_MOVSX} v3_op_type_t; + + typedef enum {INVALID_OPERAND, REG_OPERAND, MEM_OPERAND, IMM_OPERAND} v3_operand_type_t; struct x86_operand { @@ -49,7 +59,7 @@ struct x86_prefixes { uint_t fs_override : 1; // 0x64 uint_t gs_override : 1; // 0x65 uint_t br_not_taken : 1; // 0x2E - uint_t br_takend : 1; // 0x3E + uint_t br_taken : 1; // 0x3E uint_t op_size : 1; // 0x66 uint_t addr_size : 1; // 0x67 }; @@ -58,11 +68,13 @@ struct x86_prefixes { struct x86_instr { struct x86_prefixes prefixes; uint_t instr_length; - addr_t opcode; // a pointer to the V3_OPCODE_[*] arrays defined below + v3_op_type_t op_type; uint_t num_operands; struct x86_operand dst_operand; struct x86_operand src_operand; struct x86_operand third_operand; + addr_t str_op_length; + addr_t is_str_op; void * decoder_data; }; @@ -119,7 +131,7 @@ int v3_basic_mem_decode(struct guest_info * info, addr_t instr_ptr, struct basic /* Removes a rep prefix in place */ void v3_strip_rep_prefix(uchar_t * instr, int length); - +void v3_get_prefixes(uchar_t * instr, struct x86_prefixes * prefixes); /* @@ -241,10 +253,14 @@ static inline v3_reg_t get_gpr_mask(struct guest_info * info) { return 0xffff; break; case PROTECTED: + case PROTECTED_PAE: return 0xffffffff; + case LONG: + case LONG_32_COMPAT: + case LONG_16_COMPAT: default: - V3_ASSERT(0); - return 0; + PrintError("Unsupported Address Mode\n"); + return -1; } } @@ -258,11 +274,20 @@ static inline addr_t get_addr_linear(struct guest_info * info, addr_t addr, stru break;*/ case PROTECTED: + case PROTECTED_PAE: + case LONG_32_COMPAT: return addr + seg->base; break; + + case LONG: + // In long mode the segment bases are disregarded (forced to 0), unless using + // FS or GS, then the base addresses are added + return addr + seg->base; + + case LONG_16_COMPAT: default: - V3_ASSERT(0); - return 0; + PrintError("Unsupported CPU Mode: %d\n", info->cpu_mode); + return -1; } } @@ -463,7 +488,7 @@ static inline v3_operand_type_t decode_operands32(struct v3_gprs * gprs, // inpu base_addr = gprs->rax; break; case 1: - base_addr = gprs->rcx; + base_addr = gprs->rcx; break; case 2: base_addr = gprs->rdx;