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) {
}
}
+
+
+static inline addr_t get_addr_linear(struct guest_info * info, addr_t addr, addr_t seg_base) {
+ switch (info->cpu_mode) {
+ case REAL:
+ return addr + (seg_base << 4);
+ break;
+ case PROTECTED:
+ case PROTECTED_PG:
+ return addr + seg_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;