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.


Update host device framework to support PCI and other interrupt types
[palacios.git] / palacios / src / interfaces / vmm_host_dev.c
index 064d17f..5992f9e 100644 (file)
@@ -29,18 +29,20 @@ struct v3_host_dev_hooks * host_dev_hooks = 0;
 
 v3_host_dev_t v3_host_dev_open(char *impl,
                               v3_bus_class_t bus,
-                              v3_guest_dev_t gdev)
+                              v3_guest_dev_t gdev,
+                              v3_guest_dev_intr_t intr,
+                              struct v3_vm_info *vm)
 {                                             
-    V3_ASSERT(host_dev_hooks != NULL);
-    V3_ASSERT(host_dev_hooks->open != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->open != NULL);
 
-    return host_dev_hooks->open(impl,bus,gdev);
+    return host_dev_hooks->open(impl,bus,gdev,intr,vm->host_priv_data);
 }
 
 int v3_host_dev_close(v3_host_dev_t hdev) 
 {
-    V3_ASSERT(host_dev_hooks);
-    V3_ASSERT(host_dev_hooks->close);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->close);
 
     return host_dev_hooks->close(hdev);
 }
@@ -50,8 +52,8 @@ uint64_t v3_host_dev_read_io(v3_host_dev_t hdev,
                             void *dst,
                             uint64_t len)
 {
-    V3_ASSERT(host_dev_hooks != NULL);
-    V3_ASSERT(host_dev_hooks->read_io != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->read_io != NULL);
     
     return host_dev_hooks->read_io(hdev,port,dst,len);
 }
@@ -61,8 +63,8 @@ uint64_t v3_host_dev_write_io(v3_host_dev_t hdev,
                              void *src,
                              uint64_t len)
 {
-    V3_ASSERT(host_dev_hooks != NULL);
-    V3_ASSERT(host_dev_hooks->write_io != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->write_io != NULL);
     
     return host_dev_hooks->write_io(hdev,port,src,len);
 }
@@ -72,10 +74,10 @@ uint64_t v3_host_dev_read_mem(v3_host_dev_t hdev,
                              void *dst,
                              uint64_t len)
 {
-    V3_ASSERT(host_dev_hooks != NULL);
-    V3_ASSERT(host_dev_hooks->read_mem != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->read_mem != NULL);
     
-    return host_dev_hooks->read_mem(hdev,gpa,dst,len);
+    return host_dev_hooks->read_mem(hdev,(void*)gpa,dst,len);
 }
 
 uint64_t v3_host_dev_write_mem(v3_host_dev_t hdev,
@@ -83,10 +85,10 @@ uint64_t v3_host_dev_write_mem(v3_host_dev_t hdev,
                              void *src,
                              uint64_t len)
 {
-    V3_ASSERT(host_dev_hooks != NULL);
-    V3_ASSERT(host_dev_hooks->write_mem != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->write_mem != NULL);
     
-    return host_dev_hooks->write_mem(hdev,gpa,src,len);
+    return host_dev_hooks->write_mem(hdev,(void*)gpa,src,len);
 }
 
 uint64_t v3_host_dev_read_config(v3_host_dev_t hdev,
@@ -94,8 +96,8 @@ uint64_t v3_host_dev_read_config(v3_host_dev_t hdev,
                                 void *dst,
                                 uint64_t len)
 {
-    V3_ASSERT(host_dev_hooks != NULL);
-    V3_ASSERT(host_dev_hooks->read_config);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->read_config);
 
     return host_dev_hooks->read_config(hdev,offset,dst,len);
 }
@@ -105,8 +107,8 @@ uint64_t v3_host_dev_write_config(v3_host_dev_t hdev,
                                  void *src,
                                  uint64_t len)
 {
-    V3_ASSERT(host_dev_hooks != NULL);
-    V3_ASSERT(host_dev_hooks->write_config);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->write_config);
     
     return host_dev_hooks->write_config(hdev,offset,src,len);
 
@@ -115,8 +117,8 @@ uint64_t v3_host_dev_write_config(v3_host_dev_t hdev,
 
 int v3_host_dev_ack_irq(v3_host_dev_t hdev, uint8_t irq)
 {
-    V3_ASSERT(host_dev_hooks != NULL);
-    V3_ASSERT(host_dev_hooks->ack_irq);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
+    V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->ack_irq);
 
     return host_dev_hooks->ack_irq(hdev,irq);
 }
@@ -124,14 +126,37 @@ int v3_host_dev_ack_irq(v3_host_dev_t hdev, uint8_t irq)
 
 int v3_host_dev_raise_irq(v3_host_dev_t hostdev,
                          v3_guest_dev_t guest_dev,
+                         v3_guest_dev_intr_t intr,
                          uint8_t irq)
 {
-    // Make this smarter later...
+    if (intr) { 
+       intr(hostdev,guest_dev,irq,1);
+       return 0;
+    } else {
+       struct vm_device *dev = (struct vm_device *) guest_dev;
+       
+       if (dev && dev->vm) { 
+           return v3_raise_irq(dev->vm,irq);
+       } else {
+           return -1;
+       }
+    }
+}
 
+int v3_host_dev_lower_irq(v3_host_dev_t hostdev,
+                         v3_guest_dev_t guest_dev,
+                         v3_guest_dev_intr_t intr,
+                         uint8_t irq)
+{
     struct vm_device *dev = (struct vm_device *) guest_dev;
     
     if (dev && dev->vm) { 
-       return v3_raise_irq(dev->vm,irq);
+       if (intr) { 
+           intr(hostdev,guest_dev,irq,0);
+           return 0;
+       } else {
+           return v3_lower_irq(dev->vm,irq);
+       }
     } else {
        return -1;
     }
@@ -140,7 +165,7 @@ int v3_host_dev_raise_irq(v3_host_dev_t hostdev,
 
 uint64_t v3_host_dev_read_guest_mem(v3_host_dev_t  hostdev,
                                    v3_guest_dev_t guest_dev,
-                                   addr_t         gpa,
+                                   void *         gpa,
                                    void           *dst,
                                    uint64_t       len)
 {
@@ -154,14 +179,14 @@ uint64_t v3_host_dev_read_guest_mem(v3_host_dev_t  hostdev,
        if (!vm) { 
            return 0;
        } else {
-           return v3_read_gpa_memory(&(vm->cores[0]), gpa, len, dst);
+           return v3_read_gpa_memory(&(vm->cores[0]), (addr_t)gpa, len, dst);
        }
     }
 }
 
 uint64_t v3_host_dev_write_guest_mem(v3_host_dev_t  hostdev,
                                     v3_guest_dev_t guest_dev,
-                                    addr_t         gpa,
+                                    void *         gpa,
                                     void           *src,
                                     uint64_t       len)
 {
@@ -175,7 +200,7 @@ uint64_t v3_host_dev_write_guest_mem(v3_host_dev_t  hostdev,
        if (!vm) { 
            return 0;
        } else {
-           return v3_write_gpa_memory(&(vm->cores[0]), gpa, len, src);
+           return v3_write_gpa_memory(&(vm->cores[0]), (addr_t)gpa, len, src);
        }
     }
 }
@@ -184,7 +209,7 @@ uint64_t v3_host_dev_write_guest_mem(v3_host_dev_t  hostdev,
 
 void V3_Init_Host_Device_Support(struct v3_host_dev_hooks * hooks) {
     host_dev_hooks = hooks;
-    PrintDebug("V3 host device interface inited\n");
+    PrintDebug(VM_NONE, VCORE_NONE, "V3 host device interface inited\n");
 
     return;
 }