X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Flnx_virtio_balloon.c;h=f6608d260364afb2545f4a083a67658752b81cb8;hb=e3b62e7befa086a4fb320890952f54667ee46329;hp=a6203087d11596bf6a67eea0907aa57b26c016a3;hpb=e2964f7234daa3429275c039769a313f0870c212;p=palacios.git diff --git a/palacios/src/devices/lnx_virtio_balloon.c b/palacios/src/devices/lnx_virtio_balloon.c index a620308..f6608d2 100644 --- a/palacios/src/devices/lnx_virtio_balloon.c +++ b/palacios/src/devices/lnx_virtio_balloon.c @@ -77,9 +77,7 @@ struct virtio_balloon_state { }; -static int virtio_free(struct vm_device * dev) { - return -1; -} + static int virtio_reset(struct virtio_balloon_state * virtio) { @@ -174,7 +172,7 @@ static int handle_kick(struct guest_info * core, struct virtio_balloon_state * v if (!(q->avail->flags & VIRTIO_NO_IRQ_FLAG)) { PrintDebug("Raising IRQ %d\n", virtio->pci_dev->config_header.intr_line); - v3_pci_raise_irq(virtio->pci_bus, 0, virtio->pci_dev); + v3_pci_raise_irq(virtio->pci_bus, virtio->pci_dev, 0); virtio->virtio_cfg.pci_isr = VIRTIO_ISR_ACTIVE; } @@ -338,7 +336,7 @@ static int virtio_io_read(struct guest_info * core, uint16_t port, void * dst, u case VIRTIO_ISR_PORT: *(uint8_t *)dst = virtio->virtio_cfg.pci_isr; virtio->virtio_cfg.pci_isr = 0; - v3_pci_lower_irq(virtio->pci_bus, 0, virtio->pci_dev); + v3_pci_lower_irq(virtio->pci_bus, virtio->pci_dev, 0); break; default: @@ -361,10 +359,17 @@ static int virtio_io_read(struct guest_info * core, uint16_t port, void * dst, u } +static int virtio_free(struct virtio_balloon_state * virtio) { + + // unregister from PCI + + V3_Free(virtio); + return 0; +} static struct v3_device_ops dev_ops = { - .free = virtio_free, + .free = (int (*)(void *))virtio_free, }; @@ -374,7 +379,7 @@ static int set_size(struct virtio_balloon_state * virtio, addr_t size) { PrintDebug("Requesting %d pages\n", virtio->balloon_cfg.requested_pages); - v3_pci_raise_irq(virtio->pci_bus, 0, virtio->pci_dev); + v3_pci_raise_irq(virtio->pci_bus, virtio->pci_dev, 0); virtio->virtio_cfg.pci_isr = VIRTIO_ISR_ACTIVE | VIRTIO_ISR_CFG_CHANGED; return 0; @@ -419,18 +424,23 @@ static int virtio_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { } - virtio_state = (struct virtio_balloon_state *)V3_Malloc(sizeof(struct virtio_balloon_state)); - memset(virtio_state, 0, sizeof(struct virtio_balloon_state)); + virtio_state = (struct virtio_balloon_state *)V3_Malloc(sizeof(struct virtio_balloon_state)); - - struct vm_device * dev = v3_allocate_device(dev_id, &dev_ops, virtio_state); - if (v3_attach_device(vm, dev) == -1) { - PrintError("Could not attach device %s\n", dev_id); + if (!virtio_state) { + PrintError("Cannot allocate in init\n"); return -1; } + memset(virtio_state, 0, sizeof(struct virtio_balloon_state)); + + struct vm_device * dev = v3_add_device(vm, dev_id, &dev_ops, virtio_state); + if (dev == NULL) { + PrintError("Could not attach device %s\n", dev_id); + V3_Free(virtio_state); + return -1; + } // PCI initialization { @@ -472,10 +482,11 @@ static int virtio_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { pci_dev = v3_pci_register_device(pci_bus, PCI_STD_DEVICE, 0, PCI_AUTO_DEV_NUM, 0, "LNX_VIRTIO_BALLOON", bars, - NULL, NULL, NULL, virtio_state); + NULL, NULL, NULL, NULL, virtio_state); if (!pci_dev) { PrintError("Could not register PCI Device\n"); + v3_remove_device(dev); return -1; }