X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fgeekos%2Fvmm_emulate.h;h=4b843cc3d132ca2c437f4ab5b1365ecf7bb9f52c;hb=8c38488bc7d510a85ad23222ddd228924d14be8a;hp=5c0c9c57fe888cf438cecea1968a09db55c6102e;hpb=b85f79b8030114370851ed3422c078debe630570;p=palacios.git diff --git a/palacios/include/geekos/vmm_emulate.h b/palacios/include/geekos/vmm_emulate.h index 5c0c9c5..4b843cc 100644 --- a/palacios/include/geekos/vmm_emulate.h +++ b/palacios/include/geekos/vmm_emulate.h @@ -107,6 +107,23 @@ 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; + static inline int is_prefix_byte(char byte) { switch (byte) { @@ -131,6 +148,23 @@ static inline int is_prefix_byte(char byte) { } } + + +static inline addr_t get_rip_linear(struct guest_info * info, addr_t rip, addr_t cs_base) { + switch (info->cpu_mode) { + case REAL: + return rip + (cs_base << 4); + break; + case PROTECTED: + case PROTECTED_PG: + return rip + cs_base; + break; + default: + return 0; + } +} + + typedef enum {INVALID_ADDR_TYPE, REG, DISP0, DISP8, DISP16, DISP32} modrm_mode_t; typedef enum {INVALID_REG_SIZE, REG64, REG32, REG16, REG8} reg_size_t; typedef enum {INVALID_OPERAND, REG_OPERAND, MEM_OPERAND} operand_type_t;