X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_decoder.h;h=130e1ae19148f1a3bc49a665162556032eacf241;hb=d38ca6817962f46012fae1b014a24372494f4d7c;hp=e25497a242b1180c56a34184d23b661ce5b3f2fd;hpb=1c63b0651a5d039076d8027c7cd87960e4151408;p=palacios.git diff --git a/palacios/include/palacios/vmm_decoder.h b/palacios/include/palacios/vmm_decoder.h index e25497a..130e1ae 100644 --- a/palacios/include/palacios/vmm_decoder.h +++ b/palacios/include/palacios/vmm_decoder.h @@ -1,7 +1,7 @@ #ifndef __VMM_EMULATE_H #define __VMM_EMULATE_H #include - +#include /* * This is where we do the hideous X86 instruction parsing among other things @@ -19,6 +19,9 @@ struct x86_operand { operand_type_t type; }; +struct x86_prefix_list { + uint_t lock : 1; +}; /* This parses an instruction * All addresses in arguments are in the host address space @@ -26,6 +29,9 @@ struct x86_operand { int v3_parse_instr(struct guest_info * info, // input char * instr_ptr, // input 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); // output @@ -101,22 +107,22 @@ MAKE_INSTR(LMSW, 3, 0x0f, 0x01, 0x00); MAKE_INSTR(SMSW, 3, 0x0f, 0x01, 0x00); -static const uchar_t PREFIX_LOCK = 0xF0; -static const uchar_t PREFIX_REPNE = 0xF2; -static const uchar_t PREFIX_REPNZ = 0xF2; -static const uchar_t PREFIX_REP = 0xF3; -static const uchar_t PREFIX_REPE = 0xF3; -static const uchar_t PREFIX_REPZ = 0xF3; -static const uchar_t PREFIX_CS_OVERRIDE = 0x2E; -static const uchar_t PREFIX_SS_OVERRIDE = 0x36; -static const uchar_t PREFIX_DS_OVERRIDE = 0x3E; -static const uchar_t PREFIX_ES_OVERRIDE = 0x26; -static const uchar_t PREFIX_FS_OVERRIDE = 0x64; -static const uchar_t PREFIX_GS_OVERRIDE = 0x65; -static const uchar_t PREFIX_BR_NOT_TAKEN = 0x2E; -static const uchar_t PREFIX_BR_TAKEN = 0x3E; -static const uchar_t PREFIX_OP_SIZE = 0x66; -static const uchar_t PREFIX_ADDR_SIZE = 0x67; +#define PREFIX_LOCK 0xF0 +#define PREFIX_REPNE 0xF2 +#define PREFIX_REPNZ 0xF2 +#define PREFIX_REP 0xF3 +#define PREFIX_REPE 0xF3 +#define PREFIX_REPZ 0xF3 +#define PREFIX_CS_OVERRIDE 0x2E +#define PREFIX_SS_OVERRIDE 0x36 +#define PREFIX_DS_OVERRIDE 0x3E +#define PREFIX_ES_OVERRIDE 0x26 +#define PREFIX_FS_OVERRIDE 0x64 +#define PREFIX_GS_OVERRIDE 0x65 +#define PREFIX_BR_NOT_TAKEN 0x2E +#define PREFIX_BR_TAKEN 0x3E +#define PREFIX_OP_SIZE 0x66 +#define PREFIX_ADDR_SIZE 0x67 static inline int is_prefix_byte(char byte) { switch (byte) { @@ -148,7 +154,6 @@ static inline v3_reg_t get_gpr_mask(struct guest_info * info) { return 0xffff; break; case PROTECTED: - case PROTECTED_PG: return 0xffffffff; default: V3_ASSERT(0); @@ -163,7 +168,6 @@ static inline addr_t get_addr_linear(struct guest_info * info, addr_t addr, stru return addr + (seg->selector << 4); break; case PROTECTED: - case PROTECTED_PG: return addr + seg->base; break; default: