/*
* 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
-
*/
-/* JRL: Some of this was taken from the Xen sources...
- *
+/*
+ * JRL: Some of this was taken from the Xen sources...
*/
#define PACKED __attribute__((packed))
}
+static inline v3_reg_t get_gpr_mask(struct guest_info * info) {
+ switch (info->cpu_mode) {
+ case REAL:
+ return 0xffff;
+ break;
+ case PROTECTED:
+ case PROTECTED_PG:
+ return 0xffffffff;
+ default:
+ V3_ASSERT(0);
+ return 0;
+ }
+}
+
-static inline addr_t get_addr_linear(struct guest_info * info, addr_t addr, addr_t seg_base) {
+static inline addr_t get_addr_linear(struct guest_info * info, addr_t addr, struct v3_segment * seg) {
switch (info->cpu_mode) {
case REAL:
- return addr + (seg_base << 4);
+ return addr + (seg->selector << 4);
break;
case PROTECTED:
case PROTECTED_PG:
- return addr + seg_base;
+ return addr + seg->base;
break;
default:
+ V3_ASSERT(0);
return 0;
}
}
typedef enum {INVALID_REG_SIZE, REG64, REG32, REG16, REG8} reg_size_t;
typedef enum {INVALID_OPERAND, REG_OPERAND, MEM_OPERAND} operand_type_t;
-struct guest_gprs;
+struct v3_gprs;
-static inline addr_t decode_register(struct guest_gprs * gprs, char reg_code, reg_size_t reg_size) {
+static inline addr_t decode_register(struct v3_gprs * gprs, char reg_code, reg_size_t reg_size) {
addr_t reg_addr;
switch (reg_code) {
-static inline operand_type_t decode_operands16(struct guest_gprs * gprs, // input/output
+static inline operand_type_t decode_operands16(struct v3_gprs * gprs, // input/output
char * modrm_instr, // input
int * offset, // output
addr_t * first_operand, // output
-static inline operand_type_t decode_operands32(struct guest_gprs * gprs, // input/output
+static inline operand_type_t decode_operands32(struct v3_gprs * gprs, // input/output
char * modrm_instr, // input
int * offset, // output
addr_t * first_operand, // output