X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_decoder.h;h=e5232b850f8f32dbde4352a11053290ce9f14e84;hb=eb7dda8d4a92a2e8d0c8f867c65317d756ca6c11;hp=4d956b4a4f0ae0b15971db38b0971220f4936c5d;hpb=f224dad455ede0cdeadb60d0e428afcc869a4b2d;p=palacios.git diff --git a/palacios/include/palacios/vmm_decoder.h b/palacios/include/palacios/vmm_decoder.h index 4d956b4..e5232b8 100644 --- a/palacios/include/palacios/vmm_decoder.h +++ b/palacios/include/palacios/vmm_decoder.h @@ -6,16 +6,8 @@ #include #include -/* - * This is where we do the hideous X86 instruction parsing among other things - * We can parse out the instruction prefixes, as well as decode the operands - */ - - - - -typedef enum {INVALID_OPERAND, REG_OPERAND, MEM_OPERAND} operand_type_t; +typedef enum {INVALID_OPERAND, REG_OPERAND, MEM_OPERAND, IMM_OPERAND} operand_type_t; struct x86_operand { addr_t operand; @@ -23,7 +15,7 @@ struct x86_operand { operand_type_t type; }; -struct x86_prefix_list { +struct x86_prefixes { uint_t lock : 1; // 0xF0 uint_t repne : 1; // 0xF2 uint_t repnz : 1; // 0xF2 @@ -44,16 +36,26 @@ struct x86_prefix_list { struct x86_instr { - uint_t instr_length; // output - addr_t opcode; // output - uint_t opcode_length; // output - struct x86_prefix_list prefixes; // output - struct x86_operand src_operand; // output - struct x86_operand dst_operand; // output - struct x86_operand extra_operand; + struct x86_prefixes prefixes; + uint_t instr_length; + addr_t opcode; // a pointer to the V3_OPCODE_[*] arrays defined below + uint_t num_operands; + struct x86_operand dst_operand; + struct x86_operand src_operand; + struct x86_operand third_operand; + void * decoder_data; }; +struct basic_instr_info { + uint_t instr_length; + uint_t op_size; + uint_t str_op : 1; + uint_t has_rep : 1; +}; + + + /************************/ /* EXTERNAL DECODER API */ /************************/ @@ -61,6 +63,12 @@ struct x86_instr { This is an External API definition that must be implemented by a decoder */ + +/* + * Initializes a decoder + */ +int init_decoder(); + /* * Decodes an instruction * All addresses in arguments are in the host address space @@ -81,10 +89,16 @@ 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); +/* + * Gets the operand size for a memory operation + * + */ +int v3_basic_mem_decode(struct guest_info * info, addr_t instr_ptr, struct basic_instr_info * instr_info); - +/* Removes a rep prefix in place */ +void strip_rep_prefix(uchar_t * instr, int length); @@ -117,7 +131,7 @@ struct sib_byte { -#define MAKE_INSTR(nm, ...) static const uchar_t OPCODE_##nm[] = { __VA_ARGS__ } +#define MAKE_INSTR(nm, ...) static const uchar_t V3_OPCODE_##nm[] = { __VA_ARGS__ } /* * Here's how it works: @@ -174,6 +188,9 @@ MAKE_INSTR(SMSW, 3, 0x0f, 0x01, 0x00); #define PREFIX_OP_SIZE 0x66 #define PREFIX_ADDR_SIZE 0x67 +int opcode_cmp(const uchar_t * op1, const uchar_t * op2); + + static inline int is_prefix_byte(char byte) { switch (byte) { case 0xF0: // lock