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.


svm_io.c: these now continue to operate on OUTS, INS even if the address type boot386puppy-26-to-ide
Peter Dinda [Thu, 3 Jul 2008 16:31:00 +0000 (16:31 +0000)]
given in exitinfo is undefined.  They assume 32 bit addresses if no address type
bit is set, display a warning, and continue.

vmm_ctrl_regs.c: Tweaked handling of an instruction (CTLS)

palacios/src/palacios/svm_io.c
palacios/src/palacios/vmm_ctrl_regs.c

index ece437a..f6e9c62 100644 (file)
@@ -104,9 +104,9 @@ int handle_svm_io_ins(struct guest_info * info) {
     // This value should be set depending on the host register size...
     mask = get_gpr_mask(info);
 
-
-    PrintDebug("INS Aborted... Check implementation\n");
-    return -1;
+    PrintDebug("INS io_info invalid address size, assuming 32, io_info=0x%x\n",*((uint_t*)(io_info)));
+    // PrintDebug("INS Aborted... Check implementation\n");
+    //return -1;
   }
 
   if (io_info->rep) {
@@ -237,15 +237,22 @@ int handle_svm_io_outs(struct guest_info * info) {
   } else if (io_info->addr64) {
     mask = 0xffffffffffffffffLL;
   } else {
+    // This value should be set depending on the host register size...
+    mask = get_gpr_mask(info);
+
+    PrintDebug("OUTS io_info invalid address size, assuming 32, io_info=0x%x\n",*((uint_t*)(io_info)));
+    // PrintDebug("INS Aborted... Check implementation\n");
+    //return -1;
     // should never happen
-    PrintDebug("Invalid Address length\n");
-    return -1;
+    //PrintDebug("Invalid Address length\n");
+    //return -1;
   }
 
   if (io_info->rep) {
     rep_num = info->vm_regs.rcx & mask;
   }
 
+  PrintDebug("OUTS size=%d for %d steps\n", write_size, rep_num);
 
   while (rep_num > 0) {
     addr_t host_addr;
index 4b0ff65..91b0fc2 100644 (file)
@@ -207,6 +207,7 @@ int handle_cr0_write(struct guest_info * info) {
        ret = read_guest_va_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 15, instr);
       }
        
+
       if (ret != 15) {
        // I think we should inject a GPF into the guest
        PrintDebug("Could not read instruction (ret=%d)\n", ret);