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.


integrated decoder
Jack Lange [Wed, 23 Jul 2008 19:06:20 +0000 (19:06 +0000)]
palacios/include/palacios/vm_guest.h
palacios/include/palacios/vmm_decoder.h
palacios/src/palacios/vmm.c
palacios/src/palacios/vmm_ctrl_regs.c
palacios/src/palacios/vmm_xed.c

index 9083b62..9475597 100644 (file)
@@ -81,7 +81,7 @@ struct vm_ctrl_ops {
 
 
 typedef enum {SHADOW_PAGING, NESTED_PAGING} vmm_paging_mode_t;
-typedef enum {REAL, /*UNREAL,*/ PROTECTED, PROTECTED_PAE, LONG} vm_cpu_mode_t;
+typedef enum {REAL, /*UNREAL,*/ PROTECTED, PROTECTED_PAE, LONG, LONG_32_COMPAT, LONG_16_COMPAT} vm_cpu_mode_t;
 typedef enum {PHYSICAL_MEM, VIRTUAL_MEM} vm_mem_mode_t;
 
 struct guest_info {
index 4d956b4..ac3e83b 100644 (file)
@@ -61,6 +61,12 @@ struct x86_instr {
    This is an External API definition that must be implemented by a decoder
 */
 
+
+/* 
+ * Initializes a decoder
+ */
+int init_decoder();
+
 /* 
  * Decodes an instruction 
  * All addresses in arguments are in the host address space
index 8b04b51..b103c32 100644 (file)
@@ -4,6 +4,7 @@
 #include <palacios/vmm_intr.h>
 #include <palacios/vmm_config.h>
 #include <palacios/vm_guest.h>
+#include <palacios/vmm_decoder.h>
 
 v3_cpu_arch_t v3_cpu_type;
 struct vmm_os_hooks * os_hooks = NULL;
@@ -23,6 +24,8 @@ void Init_V3(struct vmm_os_hooks * hooks, struct vmm_ctrl_ops * vmm_ops) {
 
   v3_cpu_type = V3_INVALID_CPU;
 
+  init_decoder();
+
   if (is_svm_capable()) {
 
     PrintDebug("Machine is SVM Capable\n");
index b21dc85..b31fcaa 100644 (file)
@@ -43,7 +43,14 @@ int handle_cr0_write(struct guest_info * info) {
        PrintDebug("Could not read instruction (ret=%d)\n", ret);
        return -1;
       }
+      /*
+      {
+       struct x86_instr dec_instr;
+       v3_decode(info, (addr_t)instr, &dec_instr);
+       return -1;
+      }
 
+      */
       while (is_prefix_byte(instr[index])) {
        switch(instr[index]) {
        case PREFIX_CS_OVERRIDE:
index 9a05797..f0117f2 100644 (file)
 #include <palacios/vmm_decoder.h>
 #include <palacios/vmm_xed.h>
 #include <xed/xed-interface.h>
+#include <palacios/vm_guest.h>
 
+static xed_state_t decoder_state;
 
 
+static int set_decoder_mode(struct guest_info * info, xed_state_t * state) {
+  switch (info->cpu_mode) {
+  case REAL:
+    if (state->mmode != XED_MACHINE_MODE_LEGACY_16) {
+      xed_state_init(state,
+                    XED_MACHINE_MODE_LEGACY_16, 
+                    XED_ADDRESS_WIDTH_16b, 
+                    XED_ADDRESS_WIDTH_16b); 
+    }
+   break;
+  case PROTECTED:
+  case PROTECTED_PAE:
+    if (state->mmode != XED_MACHINE_MODE_LEGACY_32) {
+      xed_state_init(state,
+                    XED_MACHINE_MODE_LEGACY_32, 
+                    XED_ADDRESS_WIDTH_32b, 
+                    XED_ADDRESS_WIDTH_32b);
+    }
+    break;
+  case LONG:
+    if (state->mmode != XED_MACHINE_MODE_LONG_64) {    
+      state->mmode = XED_MACHINE_MODE_LONG_64;
+    }
+    break;
+  default:
+    return -1;
+  }
+  return 0;
+}
+
+
+int init_decoder() {
+  xed_tables_init();
+  xed_state_zero(&decoder_state);
+  return 0;
+}
+
 
 int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * instr) {
+  xed_decoded_inst_t xed_instr;
+  xed_error_enum_t xed_error;
+
+  if (set_decoder_mode(info, &decoder_state) == -1) {
+    PrintError("Could not set decoder mode\n");
+    return -1;
+  }
+  
+  xed_decoded_inst_zero_set_mode(&xed_instr, &decoder_state);
+
+  xed_error = xed_decode(&xed_instr, 
+                        REINTERPRET_CAST(const xed_uint8_t *, instr_ptr), 
+                        XED_MAX_INSTRUCTION_BYTES);
+  
+
+  if (xed_error != XED_ERROR_NONE) {
+    PrintError("Xed error: %s\n", xed_error_enum_t2str(xed_error));
+    return -1;
+  }
+  
+  instr->instr_length = xed_decoded_inst_get_length (&xed_instr);
+  
+  
+  PrintDebug("category: %s\n", xed_category_enum_t2str(xed_decoded_inst_get_category(&xed_instr)));;
+  PrintDebug("ISA-extension:%s\n ",xed_extension_enum_t2str(xed_decoded_inst_get_extension(&xed_instr)));
+  PrintDebug(" instruction-length: %d\n ", xed_decoded_inst_get_length(&xed_instr));
+  PrintDebug(" operand-size:%d\n ", xed_operand_values_get_effective_operand_width(xed_decoded_inst_operands_const(&xed_instr)));   
+  PrintDebug("address-size:%d\n ", xed_operand_values_get_effective_address_width(xed_decoded_inst_operands_const(&xed_instr))); 
+  PrintDebug("iform-enum-name:%s\n ",xed_iform_enum_t2str(xed_decoded_inst_get_iform_enum(&xed_instr)));
+  PrintDebug("iform-enum-name-dispatch (zero based):%d\n ", xed_decoded_inst_get_iform_enum_dispatch(&xed_instr));
+  PrintDebug("iclass-max-iform-dispatch: %d\n ", xed_iform_max_per_iclass(xed_decoded_inst_get_iclass(&xed_instr)));
+  
+  // operands
+  // print_operands(&xed_instr);
+  
+  // memops
+  // print_memops(&xed_instr);
+  
+  // flags
+  //print_flags(&xed_instr);
+  
+  // attributes
+  //print_attributes(&xed_instr);*/
+
+
+
+    return -1;
+}
+
+
+int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf) {
+
+  return -1;
+}
+
+
+
+
+/*
 
     xed_state_t dstate;
     xed_decoded_inst_t xedd;
@@ -76,16 +174,9 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins
            //print_flags(&xedd);
 
            // attributes
-           //print_attributes(&xedd);*/
+           //print_attributes(&xedd);
     }
 
 
 
-    return -1;
-}
-
-
-int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf) {
-
-  return -1;
-}
+*/