X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Finterfaces%2Fvmm_host_dev.c;h=5992f9e0698768ede247c61729fc77b0ca137335;hb=ff0fec756f4800fe869f3dff2f164d3ffcfc83e6;hp=064d17fdf658c1b95a37c596136888ec5f659ed4;hpb=aec065bb54946223ac3c64817408466433fd9413;p=palacios.git diff --git a/palacios/src/interfaces/vmm_host_dev.c b/palacios/src/interfaces/vmm_host_dev.c index 064d17f..5992f9e 100644 --- a/palacios/src/interfaces/vmm_host_dev.c +++ b/palacios/src/interfaces/vmm_host_dev.c @@ -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; }