/*
* 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
- *
- * Before we begin I'd just like to say a few words to those that made this possible...
- *
- *
- * _____
- * || ||
- * |\___/|
- * | |
- * | |
- * | |
- * | |
- * | |
- * | |
- * _____|<--->|_____
- * ___/ | | \
- * / | | | | \
- * | | | | | |
- * | | | | | |
- * | | |
- * | | |
- * | Fuck You Intel! /
- * | /
- * \ /
- * \ /
- * | |
- * | |
- *
- * That is all.
- *
+
*/
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;