Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Incorporated XED inclusion code.
[palacios.git] / palacios / include / palacios / vmm_decoder.h
index e25497a..aeb758d 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __VMM_EMULATE_H
 #define __VMM_EMULATE_H
 #include <palacios/vm_guest.h>
-
+#include <palacios/vmm.h>
 
 /*
  * This is where we do the hideous X86 instruction parsing among other things
@@ -10,7 +10,7 @@
 
 typedef enum {INVALID_OPERAND, REG_OPERAND, MEM_OPERAND} operand_type_t;
 
-
+int parse();
 
 
 struct x86_operand {
@@ -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);
@@ -160,10 +165,12 @@ static inline v3_reg_t get_gpr_mask(struct guest_info * info) {
 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->selector << 4);
-    break;
+    // It appears that the segment values are computed and cached in the vmcb structure 
+    // We Need to check this for Intel
+    /*   return addr + (seg->selector << 4);
+        break;*/
+
   case PROTECTED:
-  case PROTECTED_PG:
     return addr + seg->base;
     break;
   default: