wok rev 17256

Up libzip (0.11.2)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Oct 21 12:15:20 2014 +0200 (2014-10-21)
parents 108901a0f197
children e9c56b27df13
files libzip-dev/receipt libzip/receipt qemu/stuff/virtio.u xarchive/stuff/slitaz-wrap.sh
line diff
     1.1 --- a/libzip-dev/receipt	Mon Oct 20 20:17:03 2014 +0200
     1.2 +++ b/libzip-dev/receipt	Tue Oct 21 12:15:20 2014 +0200
     1.3 @@ -1,7 +1,7 @@
     1.4  # SliTaz package receipt.
     1.5  
     1.6  PACKAGE="libzip-dev"
     1.7 -VERSION="0.10.1"
     1.8 +VERSION="0.11.2"
     1.9  CATEGORY="development"
    1.10  SHORT_DESC="C library for reading, creating, and modifying zip archives, development files."
    1.11  MAINTAINER="pascal.bellard@slitaz.org"
     2.1 --- a/libzip/receipt	Mon Oct 20 20:17:03 2014 +0200
     2.2 +++ b/libzip/receipt	Tue Oct 21 12:15:20 2014 +0200
     2.3 @@ -1,12 +1,12 @@
     2.4  # SliTaz package receipt.
     2.5  
     2.6  PACKAGE="libzip"
     2.7 -VERSION="0.10.1"
     2.8 +VERSION="0.11.2"
     2.9  CATEGORY="misc"
    2.10  SHORT_DESC="C library for reading, creating, and modifying zip archives."
    2.11  MAINTAINER="pascal.bellard@slitaz.org"
    2.12  LICENSE="BSD"
    2.13 -TARBALL="$PACKAGE-$VERSION.tar.bz2"
    2.14 +TARBALL="$PACKAGE-$VERSION.tar.xz"
    2.15  WEB_SITE="http://www.nih.at/libzip/"
    2.16  WGET_URL="${WEB_SITE}$TARBALL"
    2.17  HOST_ARCH="i486 arm"
     3.1 --- a/qemu/stuff/virtio.u	Mon Oct 20 20:17:03 2014 +0200
     3.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.3 @@ -1,1076 +0,0 @@
     3.4 -Index: qemu-0.9.1/Makefile.target
     3.5 -===================================================================
     3.6 ---- qemu-0.9.1.orig/Makefile.target	2008-01-06 19:38:41.000000000 +0000
     3.7 -+++ qemu-0.9.1/Makefile.target	2008-02-07 13:36:23.000000000 +0000
     3.8 -@@ -436,6 +436,9 @@
     3.9 - VL_OBJS += pcnet.o
    3.10 - VL_OBJS += rtl8139.o
    3.11 - 
    3.12 -+# virtio devices
    3.13 -+VL_OBJS += virtio.o
    3.14 -+
    3.15 - ifeq ($(TARGET_BASE_ARCH), i386)
    3.16 - # Hardware support
    3.17 - VL_OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o
    3.18 -Index: qemu-0.9.1/hw/virtio.c
    3.19 -===================================================================
    3.20 ---- /dev/null	1970-01-01 00:00:00.000000000 +0000
    3.21 -+++ qemu-0.9.1/hw/virtio.c	2008-02-07 13:36:23.000000000 +0000
    3.22 -@@ -0,0 +1,422 @@
    3.23 -+/*
    3.24 -+ * Virtio Support
    3.25 -+ *
    3.26 -+ * Copyright IBM, Corp. 2007
    3.27 -+ *
    3.28 -+ * Authors:
    3.29 -+ *  Anthony Liguori   <address@hidden>
    3.30 -+ *
    3.31 -+ * This work is licensed under the terms of the GNU GPL, version 2.  See
    3.32 -+ * the COPYING file in the top-level directory.
    3.33 -+ *
    3.34 -+ */
    3.35 -+
    3.36 -+#include <inttypes.h>
    3.37 -+#include <err.h>
    3.38 -+
    3.39 -+#include "virtio.h"
    3.40 -+#include "sysemu.h"
    3.41 -+
    3.42 -+/* from Linux's linux/virtio_pci.h */
    3.43 -+
    3.44 -+/* A 32-bit r/o bitmask of the features supported by the host */
    3.45 -+#define VIRTIO_PCI_HOST_FEATURES       0
    3.46 -+
    3.47 -+/* A 32-bit r/w bitmask of features activated by the guest */
    3.48 -+#define VIRTIO_PCI_GUEST_FEATURES      4
    3.49 -+
    3.50 -+/* A 32-bit r/w PFN for the currently selected queue */
    3.51 -+#define VIRTIO_PCI_QUEUE_PFN           8
    3.52 -+
    3.53 -+/* A 16-bit r/o queue size for the currently selected queue */
    3.54 -+#define VIRTIO_PCI_QUEUE_NUM           12
    3.55 -+
    3.56 -+/* A 16-bit r/w queue selector */
    3.57 -+#define VIRTIO_PCI_QUEUE_SEL           14
    3.58 -+
    3.59 -+/* A 16-bit r/w queue notifier */
    3.60 -+#define VIRTIO_PCI_QUEUE_NOTIFY                16
    3.61 -+
    3.62 -+/* An 8-bit device status register.  */
    3.63 -+#define VIRTIO_PCI_STATUS              18
    3.64 -+
    3.65 -+/* An 8-bit r/o interrupt status register.  Reading the value will return the
    3.66 -+ * current contents of the ISR and will also clear it.  This is effectively
    3.67 -+ * a read-and-acknowledge. */
    3.68 -+#define VIRTIO_PCI_ISR                 19
    3.69 -+
    3.70 -+#define VIRTIO_PCI_CONFIG              20
    3.71 -+
    3.72 -+/* QEMU doesn't strictly need write barriers since everything runs in
    3.73 -+ * lock-step.  We'll leave the calls to wmb() in though to make it obvious for
    3.74 -+ * KVM or if kqemu gets SMP support.
    3.75 -+ */
    3.76 -+#define wmb() do { } while (0)
    3.77 -+
    3.78 -+/* virt queue functions */
    3.79 -+
    3.80 -+static void virtqueue_init(VirtQueue *vq, void *p)
    3.81 -+{
    3.82 -+    vq->vring.desc = p;
    3.83 -+    vq->vring.avail = p + vq->vring.num * sizeof(VRingDesc);
    3.84 -+    vq->vring.used = (void *)TARGET_PAGE_ALIGN((unsigned long)&vq->vring.avail->ring[vq->vring.num]);
    3.85 -+}
    3.86 -+
    3.87 -+static unsigned virtqueue_next_desc(VirtQueue *vq, unsigned int i)
    3.88 -+{
    3.89 -+    unsigned int next;
    3.90 -+
    3.91 -+    /* If this descriptor says it doesn't chain, we're done. */
    3.92 -+    if (!(vq->vring.desc[i].flags & VRING_DESC_F_NEXT))
    3.93 -+       return vq->vring.num;
    3.94 -+
    3.95 -+    /* Check they're not leading us off end of descriptors. */
    3.96 -+    next = vq->vring.desc[i].next;
    3.97 -+    /* Make sure compiler knows to grab that: we don't want it changing! */
    3.98 -+    wmb();
    3.99 -+
   3.100 -+    if (next >= vq->vring.num)
   3.101 -+       errx(1, "Desc next is %u", next);
   3.102 -+
   3.103 -+    return next;
   3.104 -+}
   3.105 -+
   3.106 -+void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem,
   3.107 -+                   unsigned int len)
   3.108 -+{
   3.109 -+    VRingUsedElem *used;
   3.110 -+
   3.111 -+    /* Get a pointer to the next entry in the used ring. */
   3.112 -+    used = &vq->vring.used->ring[vq->vring.used->idx % vq->vring.num];
   3.113 -+    used->id = elem->index;
   3.114 -+    used->len = len;
   3.115 -+    /* Make sure buffer is written before we update index. */
   3.116 -+    wmb();
   3.117 -+    vq->vring.used->idx++;
   3.118 -+}
   3.119 -+
   3.120 -+int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem)
   3.121 -+{
   3.122 -+    unsigned int i, head;
   3.123 -+    unsigned int position;
   3.124 -+
   3.125 -+    /* Check it isn't doing very strange things with descriptor numbers. */
   3.126 -+    if ((uint16_t)(vq->vring.avail->idx - vq->last_avail_idx) > vq->vring.num)
   3.127 -+       errx(1, "Guest moved used index from %u to %u",
   3.128 -+            vq->last_avail_idx, vq->vring.avail->idx);
   3.129 -+
   3.130 -+    /* If there's nothing new since last we looked, return invalid. */
   3.131 -+    if (vq->vring.avail->idx == vq->last_avail_idx)
   3.132 -+       return 0;
   3.133 -+
   3.134 -+    /* Grab the next descriptor number they're advertising, and increment
   3.135 -+     * the index we've seen. */
   3.136 -+    head = vq->vring.avail->ring[vq->last_avail_idx++ % vq->vring.num];
   3.137 -+
   3.138 -+    /* If their number is silly, that's a fatal mistake. */
   3.139 -+    if (head >= vq->vring.num)
   3.140 -+       errx(1, "Guest says index %u is available", head);
   3.141 -+
   3.142 -+    /* When we start there are none of either input nor output. */
   3.143 -+    position = elem->out_num = elem->in_num = 0;
   3.144 -+
   3.145 -+    i = head;
   3.146 -+    do {
   3.147 -+       struct iovec *sg;
   3.148 -+
   3.149 -+       if ((vq->vring.desc[i].addr + vq->vring.desc[i].len) > ram_size)
   3.150 -+           errx(1, "Guest sent invalid pointer");
   3.151 -+
   3.152 -+       if (vq->vring.desc[i].flags & VRING_DESC_F_WRITE)
   3.153 -+           sg = &elem->in_sg[elem->in_num++];
   3.154 -+       else
   3.155 -+           sg = &elem->out_sg[elem->out_num++];
   3.156 -+
   3.157 -+       /* Grab the first descriptor, and check it's OK. */
   3.158 -+       sg->iov_len = vq->vring.desc[i].len;
   3.159 -+       sg->iov_base = phys_ram_base + vq->vring.desc[i].addr;
   3.160 -+
   3.161 -+       /* If we've got too many, that implies a descriptor loop. */
   3.162 -+       if ((elem->in_num + elem->out_num) > vq->vring.num)
   3.163 -+           errx(1, "Looped descriptor");
   3.164 -+    } while ((i = virtqueue_next_desc(vq, i)) != vq->vring.num);
   3.165 -+
   3.166 -+    elem->index = head;
   3.167 -+
   3.168 -+    return elem->in_num + elem->out_num;
   3.169 -+}
   3.170 -+
   3.171 -+/* virtio device */
   3.172 -+
   3.173 -+static VirtIODevice *to_virtio_device(PCIDevice *pci_dev)
   3.174 -+{
   3.175 -+    return (VirtIODevice *)pci_dev;
   3.176 -+}
   3.177 -+
   3.178 -+static void virtio_update_irq(VirtIODevice *vdev)
   3.179 -+{
   3.180 -+    qemu_set_irq(vdev->pci_dev.irq[0], vdev->isr & 1);
   3.181 -+}
   3.182 -+
   3.183 -+static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
   3.184 -+{
   3.185 -+    VirtIODevice *vdev = to_virtio_device(opaque);
   3.186 -+    ram_addr_t pa;
   3.187 -+
   3.188 -+    addr -= vdev->addr;
   3.189 -+
   3.190 -+    switch (addr) {
   3.191 -+    case VIRTIO_PCI_GUEST_FEATURES:
   3.192 -+       if (vdev->set_features)
   3.193 -+           vdev->set_features(vdev, val);
   3.194 -+       vdev->features = val;
   3.195 -+       break;
   3.196 -+    case VIRTIO_PCI_QUEUE_PFN:
   3.197 -+       pa = (ram_addr_t)val << TARGET_PAGE_BITS;
   3.198 -+       vdev->vq[vdev->queue_sel].pfn = val;
   3.199 -+       if (pa == 0) {
   3.200 -+           vdev->vq[vdev->queue_sel].vring.desc = NULL;
   3.201 -+           vdev->vq[vdev->queue_sel].vring.avail = NULL;
   3.202 -+           vdev->vq[vdev->queue_sel].vring.used = NULL;
   3.203 -+       } else if (pa < (ram_size - TARGET_PAGE_SIZE)) {
   3.204 -+           virtqueue_init(&vdev->vq[vdev->queue_sel], phys_ram_base + pa);
   3.205 -+           /* FIXME if pa == 0, deal with device tear down */
   3.206 -+       }
   3.207 -+       break;
   3.208 -+    case VIRTIO_PCI_QUEUE_SEL:
   3.209 -+       if (val < VIRTIO_PCI_QUEUE_MAX)
   3.210 -+           vdev->queue_sel = val;
   3.211 -+       break;
   3.212 -+    case VIRTIO_PCI_QUEUE_NOTIFY:
   3.213 -+       if (val < VIRTIO_PCI_QUEUE_MAX && vdev->vq[val].vring.desc)
   3.214 -+           vdev->vq[val].handle_output(vdev, &vdev->vq[val]);
   3.215 -+       break;
   3.216 -+    case VIRTIO_PCI_STATUS:
   3.217 -+       vdev->status = val & 0xFF;
   3.218 -+       break;
   3.219 -+    }
   3.220 -+}
   3.221 -+
   3.222 -+static uint32_t virtio_ioport_read(void *opaque, uint32_t addr)
   3.223 -+{
   3.224 -+    VirtIODevice *vdev = to_virtio_device(opaque);
   3.225 -+    uint32_t ret = 0xFFFFFFFF;
   3.226 -+
   3.227 -+    addr -= vdev->addr;
   3.228 -+
   3.229 -+    switch (addr) {
   3.230 -+    case VIRTIO_PCI_HOST_FEATURES:
   3.231 -+       ret = vdev->get_features(vdev);
   3.232 -+       break;
   3.233 -+    case VIRTIO_PCI_GUEST_FEATURES:
   3.234 -+       ret = vdev->features;
   3.235 -+       break;
   3.236 -+    case VIRTIO_PCI_QUEUE_PFN:
   3.237 -+       ret = vdev->vq[vdev->queue_sel].pfn;
   3.238 -+       break;
   3.239 -+    case VIRTIO_PCI_QUEUE_NUM:
   3.240 -+       ret = vdev->vq[vdev->queue_sel].vring.num;
   3.241 -+       break;
   3.242 -+    case VIRTIO_PCI_QUEUE_SEL:
   3.243 -+       ret = vdev->queue_sel;
   3.244 -+       break;
   3.245 -+    case VIRTIO_PCI_STATUS:
   3.246 -+       ret = vdev->status;
   3.247 -+       break;
   3.248 -+    case VIRTIO_PCI_ISR:
   3.249 -+       /* reading from the ISR also clears it. */
   3.250 -+       ret = vdev->isr;
   3.251 -+       vdev->isr = 0;
   3.252 -+       virtio_update_irq(vdev);
   3.253 -+       break;
   3.254 -+    default:
   3.255 -+       break;
   3.256 -+    }
   3.257 -+
   3.258 -+    return ret;
   3.259 -+}
   3.260 -+
   3.261 -+static uint32_t virtio_config_readb(void *opaque, uint32_t addr)
   3.262 -+{
   3.263 -+    VirtIODevice *vdev = opaque;
   3.264 -+    uint8_t val;
   3.265 -+
   3.266 -+    addr -= vdev->addr + VIRTIO_PCI_CONFIG;
   3.267 -+    if (addr > (vdev->config_len - sizeof(val)))
   3.268 -+       return (uint32_t)-1;
   3.269 -+
   3.270 -+    memcpy(&val, vdev->config + addr, sizeof(val));
   3.271 -+    return val;
   3.272 -+}
   3.273 -+
   3.274 -+static uint32_t virtio_config_readw(void *opaque, uint32_t addr)
   3.275 -+{
   3.276 -+    VirtIODevice *vdev = opaque;
   3.277 -+    uint16_t val;
   3.278 -+
   3.279 -+    addr -= vdev->addr + VIRTIO_PCI_CONFIG;
   3.280 -+    if (addr > (vdev->config_len - sizeof(val)))
   3.281 -+       return (uint32_t)-1;
   3.282 -+
   3.283 -+    memcpy(&val, vdev->config + addr, sizeof(val));
   3.284 -+    return val;
   3.285 -+}
   3.286 -+
   3.287 -+static uint32_t virtio_config_readl(void *opaque, uint32_t addr)
   3.288 -+{
   3.289 -+    VirtIODevice *vdev = opaque;
   3.290 -+    uint32_t val;
   3.291 -+
   3.292 -+    addr -= vdev->addr + VIRTIO_PCI_CONFIG;
   3.293 -+    if (addr > (vdev->config_len - sizeof(val)))
   3.294 -+       return (uint32_t)-1;
   3.295 -+
   3.296 -+    memcpy(&val, vdev->config + addr, sizeof(val));
   3.297 -+    return val;
   3.298 -+}
   3.299 -+
   3.300 -+static void virtio_config_writeb(void *opaque, uint32_t addr, uint32_t data)
   3.301 -+{
   3.302 -+    VirtIODevice *vdev = opaque;
   3.303 -+    uint8_t val = data;
   3.304 -+
   3.305 -+    addr -= vdev->addr + VIRTIO_PCI_CONFIG;
   3.306 -+    if (addr > (vdev->config_len - sizeof(val)))
   3.307 -+       return;
   3.308 -+
   3.309 -+    memcpy(vdev->config + addr, &val, sizeof(val));
   3.310 -+}
   3.311 -+
   3.312 -+static void virtio_config_writew(void *opaque, uint32_t addr, uint32_t data)
   3.313 -+{
   3.314 -+    VirtIODevice *vdev = opaque;
   3.315 -+    uint16_t val = data;
   3.316 -+
   3.317 -+    addr -= vdev->addr + VIRTIO_PCI_CONFIG;
   3.318 -+    if (addr > (vdev->config_len - sizeof(val)))
   3.319 -+       return;
   3.320 -+
   3.321 -+    memcpy(vdev->config + addr, &val, sizeof(val));
   3.322 -+}
   3.323 -+
   3.324 -+static void virtio_config_writel(void *opaque, uint32_t addr, uint32_t data)
   3.325 -+{
   3.326 -+    VirtIODevice *vdev = opaque;
   3.327 -+    uint32_t val = data;
   3.328 -+
   3.329 -+    addr -= vdev->addr + VIRTIO_PCI_CONFIG;
   3.330 -+    if (addr > (vdev->config_len - sizeof(val)))
   3.331 -+       return;
   3.332 -+
   3.333 -+    memcpy(vdev->config + addr, &val, sizeof(val));
   3.334 -+}
   3.335 -+
   3.336 -+static void virtio_map(PCIDevice *pci_dev, int region_num,
   3.337 -+                      uint32_t addr, uint32_t size, int type)
   3.338 -+{
   3.339 -+    VirtIODevice *vdev = to_virtio_device(pci_dev);
   3.340 -+    int i;
   3.341 -+
   3.342 -+    vdev->addr = addr;
   3.343 -+    for (i = 0; i < 3; i++) {
   3.344 -+       register_ioport_write(addr, 20, 1 << i, virtio_ioport_write, vdev);
   3.345 -+       register_ioport_read(addr, 20, 1 << i, virtio_ioport_read, vdev);
   3.346 -+    }
   3.347 -+
   3.348 -+    if (vdev->config_len) {
   3.349 -+       register_ioport_write(addr + 20, vdev->config_len, 1,
   3.350 -+                             virtio_config_writeb, vdev);
   3.351 -+       register_ioport_write(addr + 20, vdev->config_len, 2,
   3.352 -+                             virtio_config_writew, vdev);
   3.353 -+       register_ioport_write(addr + 20, vdev->config_len, 4,
   3.354 -+                             virtio_config_writel, vdev);
   3.355 -+       register_ioport_read(addr + 20, vdev->config_len, 1,
   3.356 -+                            virtio_config_readb, vdev);
   3.357 -+       register_ioport_read(addr + 20, vdev->config_len, 2,
   3.358 -+                            virtio_config_readw, vdev);
   3.359 -+       register_ioport_read(addr + 20, vdev->config_len, 4,
   3.360 -+                            virtio_config_readl, vdev);
   3.361 -+
   3.362 -+       vdev->update_config(vdev, vdev->config);
   3.363 -+    }
   3.364 -+}
   3.365 -+
   3.366 -+VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
   3.367 -+                           void (*handle_output)(VirtIODevice *, VirtQueue *))
   3.368 -+{
   3.369 -+    int i;
   3.370 -+
   3.371 -+    for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
   3.372 -+       if (vdev->vq[i].vring.num == 0)
   3.373 -+           break;
   3.374 -+    }
   3.375 -+
   3.376 -+    if (i == VIRTIO_PCI_QUEUE_MAX || queue_size > VIRTQUEUE_MAX_SIZE)
   3.377 -+       abort();
   3.378 -+
   3.379 -+    vdev->vq[i].vring.num = queue_size;
   3.380 -+    vdev->vq[i].handle_output = handle_output;
   3.381 -+    vdev->vq[i].index = i;
   3.382 -+
   3.383 -+    return &vdev->vq[i];
   3.384 -+}
   3.385 -+
   3.386 -+void virtio_notify(VirtIODevice *vdev, VirtQueue *vq)
   3.387 -+{
   3.388 -+    if (vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT)
   3.389 -+       return;
   3.390 -+
   3.391 -+    vdev->isr = 1;
   3.392 -+    virtio_update_irq(vdev);
   3.393 -+}
   3.394 -+
   3.395 -+VirtIODevice *virtio_init_pci(PCIBus *bus, const char *name,
   3.396 -+                             uint16_t vendor, uint16_t device,
   3.397 -+                             uint16_t subvendor, uint16_t subdevice,
   3.398 -+                             uint8_t class_code, uint8_t subclass_code,
   3.399 -+                             uint8_t pif, size_t config_size,
   3.400 -+                             size_t struct_size)
   3.401 -+{
   3.402 -+    VirtIODevice *vdev;
   3.403 -+    PCIDevice *pci_dev;
   3.404 -+    uint8_t *config;
   3.405 -+
   3.406 -+    pci_dev = pci_register_device(bus, name, struct_size,
   3.407 -+                                 -1, NULL, NULL);
   3.408 -+    vdev = to_virtio_device(pci_dev);
   3.409 -+
   3.410 -+    vdev->status = 0;
   3.411 -+    vdev->isr = 0;
   3.412 -+    vdev->queue_sel = 0;
   3.413 -+    memset(vdev->vq, 0, sizeof(vdev->vq));
   3.414 -+
   3.415 -+    config = pci_dev->config;
   3.416 -+    config[0x00] = vendor & 0xFF;
   3.417 -+    config[0x01] = (vendor >> 8) & 0xFF;
   3.418 -+    config[0x02] = device & 0xFF;
   3.419 -+    config[0x03] = (device >> 8) & 0xFF;
   3.420 -+
   3.421 -+    config[0x09] = pif;
   3.422 -+    config[0x0a] = subclass_code;
   3.423 -+    config[0x0b] = class_code;
   3.424 -+    config[0x0e] = 0x00;
   3.425 -+
   3.426 -+    config[0x2c] = subvendor & 0xFF;
   3.427 -+    config[0x2d] = (subvendor >> 8) & 0xFF;
   3.428 -+    config[0x2e] = subdevice & 0xFF;
   3.429 -+    config[0x2f] = (subdevice >> 8) & 0xFF;
   3.430 -+
   3.431 -+    config[0x3d] = 1;
   3.432 -+
   3.433 -+    vdev->name = name;
   3.434 -+    vdev->config_len = config_size;
   3.435 -+    if (vdev->config_len)
   3.436 -+       vdev->config = qemu_mallocz(config_size);
   3.437 -+    else
   3.438 -+       vdev->config = NULL;
   3.439 -+
   3.440 -+    pci_register_io_region(pci_dev, 0, 20 + config_size, PCI_ADDRESS_SPACE_IO,
   3.441 -+                          virtio_map);
   3.442 -+
   3.443 -+    return vdev;
   3.444 -+}
   3.445 -Index: qemu-0.9.1/hw/virtio.h
   3.446 -===================================================================
   3.447 ---- /dev/null	1970-01-01 00:00:00.000000000 +0000
   3.448 -+++ qemu-0.9.1/hw/virtio.h	2008-02-07 13:36:23.000000000 +0000
   3.449 -@@ -0,0 +1,143 @@
   3.450 -+/*
   3.451 -+ * Virtio Support
   3.452 -+ *
   3.453 -+ * Copyright IBM, Corp. 2007
   3.454 -+ *
   3.455 -+ * Authors:
   3.456 -+ *  Anthony Liguori   <address@hidden>
   3.457 -+ *
   3.458 -+ * This work is licensed under the terms of the GNU GPL, version 2.  See
   3.459 -+ * the COPYING file in the top-level directory.
   3.460 -+ *
   3.461 -+ */
   3.462 -+
   3.463 -+#ifndef _QEMU_VIRTIO_H
   3.464 -+#define _QEMU_VIRTIO_H
   3.465 -+
   3.466 -+#include <sys/uio.h>
   3.467 -+#include "hw.h"
   3.468 -+#include "pci.h"
   3.469 -+
   3.470 -+/* from Linux's linux/virtio_config.h */
   3.471 -+
   3.472 -+/* Status byte for guest to report progress, and synchronize features. */
   3.473 -+/* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
   3.474 -+#define VIRTIO_CONFIG_S_ACKNOWLEDGE    1
   3.475 -+/* We have found a driver for the device. */
   3.476 -+#define VIRTIO_CONFIG_S_DRIVER         2
   3.477 -+/* Driver has used its parts of the config, and is happy */
   3.478 -+#define VIRTIO_CONFIG_S_DRIVER_OK      4
   3.479 -+/* We've given up on this device. */
   3.480 -+#define VIRTIO_CONFIG_S_FAILED         0x80
   3.481 -+
   3.482 -+/* from Linux's linux/virtio_ring.h */
   3.483 -+
   3.484 -+/* This marks a buffer as continuing via the next field. */
   3.485 -+#define VRING_DESC_F_NEXT      1
   3.486 -+/* This marks a buffer as write-only (otherwise read-only). */
   3.487 -+#define VRING_DESC_F_WRITE     2
   3.488 -+
   3.489 -+/* This means don't notify other side when buffer added. */
   3.490 -+#define VRING_USED_F_NO_NOTIFY 1
   3.491 -+/* This means don't interrupt guest when buffer consumed. */
   3.492 -+#define VRING_AVAIL_F_NO_INTERRUPT     1
   3.493 -+
   3.494 -+typedef struct VirtQueue VirtQueue;
   3.495 -+typedef struct VirtIODevice VirtIODevice;
   3.496 -+
   3.497 -+typedef struct VRingDesc
   3.498 -+{
   3.499 -+    uint64_t addr;
   3.500 -+    uint32_t len;
   3.501 -+    uint16_t flags;
   3.502 -+    uint16_t next;
   3.503 -+} VRingDesc;
   3.504 -+
   3.505 -+typedef struct VRingAvail
   3.506 -+{
   3.507 -+    uint16_t flags;
   3.508 -+    uint16_t idx;
   3.509 -+    uint16_t ring[0];
   3.510 -+} VRingAvail;
   3.511 -+
   3.512 -+typedef struct VRingUsedElem
   3.513 -+{
   3.514 -+    uint32_t id;
   3.515 -+    uint32_t len;
   3.516 -+} VRingUsedElem;
   3.517 -+
   3.518 -+typedef struct VRingUsed
   3.519 -+{
   3.520 -+    uint16_t flags;
   3.521 -+    uint16_t idx;
   3.522 -+    VRingUsedElem ring[0];
   3.523 -+} VRingUsed;
   3.524 -+
   3.525 -+typedef struct VRing
   3.526 -+{
   3.527 -+    unsigned int num;
   3.528 -+    VRingDesc *desc;
   3.529 -+    VRingAvail *avail;
   3.530 -+    VRingUsed *used;
   3.531 -+} VRing;
   3.532 -+
   3.533 -+struct VirtQueue
   3.534 -+{
   3.535 -+    VRing vring;
   3.536 -+    uint32_t pfn;
   3.537 -+    uint16_t last_avail_idx;
   3.538 -+    void (*handle_output)(VirtIODevice *vdev, VirtQueue *vq);
   3.539 -+    int index;
   3.540 -+};
   3.541 -+
   3.542 -+#define VIRTQUEUE_MAX_SIZE 1024
   3.543 -+
   3.544 -+typedef struct VirtQueueElement
   3.545 -+{
   3.546 -+    unsigned int index;
   3.547 -+    unsigned int out_num;
   3.548 -+    unsigned int in_num;
   3.549 -+    struct iovec in_sg[VIRTQUEUE_MAX_SIZE];
   3.550 -+    struct iovec out_sg[VIRTQUEUE_MAX_SIZE];
   3.551 -+} VirtQueueElement;
   3.552 -+
   3.553 -+#define VIRTIO_PCI_QUEUE_MAX   16
   3.554 -+
   3.555 -+struct VirtIODevice
   3.556 -+{
   3.557 -+    PCIDevice pci_dev;
   3.558 -+    const char *name;
   3.559 -+    uint32_t addr;
   3.560 -+    uint16_t vendor;
   3.561 -+    uint16_t device;
   3.562 -+    uint8_t status;
   3.563 -+    uint8_t isr;
   3.564 -+    uint16_t queue_sel;
   3.565 -+    uint32_t features;
   3.566 -+    size_t config_len;
   3.567 -+    void *config;
   3.568 -+    uint32_t (*get_features)(VirtIODevice *vdev);
   3.569 -+    void (*set_features)(VirtIODevice *vdev, uint32_t val);
   3.570 -+    void (*update_config)(VirtIODevice *vdev, uint8_t *config);
   3.571 -+    VirtQueue vq[VIRTIO_PCI_QUEUE_MAX];
   3.572 -+};
   3.573 -+
   3.574 -+VirtIODevice *virtio_init_pci(PCIBus *bus, const char *name,
   3.575 -+                             uint16_t vendor, uint16_t device,
   3.576 -+                             uint16_t subvendor, uint16_t subdevice,
   3.577 -+                             uint8_t class_code, uint8_t subclass_code,
   3.578 -+                             uint8_t pif, size_t config_size,
   3.579 -+                             size_t struct_size);
   3.580 -+
   3.581 -+VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
   3.582 -+                           void (*handle_output)(VirtIODevice *,
   3.583 -+                                                 VirtQueue *));
   3.584 -+
   3.585 -+void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem,
   3.586 -+                   unsigned int len);
   3.587 -+
   3.588 -+int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem);
   3.589 -+
   3.590 -+void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
   3.591 -+
   3.592 -+#endif
   3.593 -Index: qemu-0.9.1/Makefile.target
   3.594 -===================================================================
   3.595 ---- qemu-0.9.1.orig/Makefile.target	2008-02-07 13:36:23.000000000 +0000
   3.596 -+++ qemu-0.9.1/Makefile.target	2008-02-07 13:36:37.000000000 +0000
   3.597 -@@ -437,7 +437,7 @@
   3.598 - VL_OBJS += rtl8139.o
   3.599 - 
   3.600 - # virtio devices
   3.601 --VL_OBJS += virtio.o
   3.602 -+VL_OBJS += virtio.o virtio-net.o
   3.603 - 
   3.604 - ifeq ($(TARGET_BASE_ARCH), i386)
   3.605 - # Hardware support
   3.606 -Index: qemu-0.9.1/hw/pc.h
   3.607 -===================================================================
   3.608 ---- qemu-0.9.1.orig/hw/pc.h	2008-01-06 19:38:42.000000000 +0000
   3.609 -+++ qemu-0.9.1/hw/pc.h	2008-02-07 13:36:37.000000000 +0000
   3.610 -@@ -142,4 +142,9 @@
   3.611 - 
   3.612 - void isa_ne2000_init(int base, qemu_irq irq, NICInfo *nd);
   3.613 - 
   3.614 -+/* virtio-net.c */
   3.615 -+
   3.616 -+void *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn);
   3.617 -+
   3.618 -+
   3.619 - #endif
   3.620 -Index: qemu-0.9.1/hw/pci.c
   3.621 -===================================================================
   3.622 ---- qemu-0.9.1.orig/hw/pci.c	2008-01-06 19:38:42.000000000 +0000
   3.623 -+++ qemu-0.9.1/hw/pci.c	2008-02-07 13:36:37.000000000 +0000
   3.624 -@@ -25,6 +25,7 @@
   3.625 - #include "pci.h"
   3.626 - #include "console.h"
   3.627 - #include "net.h"
   3.628 -+#include "pc.h"
   3.629 - 
   3.630 - //#define DEBUG_PCI
   3.631 - 
   3.632 -@@ -638,9 +639,11 @@
   3.633 -         pci_rtl8139_init(bus, nd, devfn);
   3.634 -     } else if (strcmp(nd->model, "pcnet") == 0) {
   3.635 -         pci_pcnet_init(bus, nd, devfn);
   3.636 -+    } else if (strcmp(nd->model, "virtio") == 0) {
   3.637 -+       virtio_net_init(bus, nd, devfn);
   3.638 -     } else if (strcmp(nd->model, "?") == 0) {
   3.639 -         fprintf(stderr, "qemu: Supported PCI NICs: i82551 i82557b i82559er"
   3.640 --                        " ne2k_pci pcnet rtl8139\n");
   3.641 -+                        " ne2k_pci pcnet rtl8139 virtio\n");
   3.642 -         exit (1);
   3.643 -     } else {
   3.644 -         fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd->model);
   3.645 -Index: qemu-0.9.1/hw/virtio-net.c
   3.646 -===================================================================
   3.647 ---- /dev/null	1970-01-01 00:00:00.000000000 +0000
   3.648 -+++ qemu-0.9.1/hw/virtio-net.c	2008-02-07 13:36:37.000000000 +0000
   3.649 -@@ -0,0 +1,178 @@
   3.650 -+/*
   3.651 -+ * Virtio Network Device
   3.652 -+ *
   3.653 -+ * Copyright IBM, Corp. 2007
   3.654 -+ *
   3.655 -+ * Authors:
   3.656 -+ *  Anthony Liguori   <address@hidden>
   3.657 -+ *
   3.658 -+ * This work is licensed under the terms of the GNU GPL, version 2.  See
   3.659 -+ * the COPYING file in the top-level directory.
   3.660 -+ *
   3.661 -+ */
   3.662 -+
   3.663 -+#include "virtio.h"
   3.664 -+#include "net.h"
   3.665 -+#include "pc.h"
   3.666 -+
   3.667 -+/* from Linux's virtio_net.h */
   3.668 -+
   3.669 -+/* The ID for virtio_net */
   3.670 -+#define VIRTIO_ID_NET  1
   3.671 -+
   3.672 -+/* The feature bitmap for virtio net */
   3.673 -+#define VIRTIO_NET_F_NO_CSUM   0
   3.674 -+#define VIRTIO_NET_F_TSO4      1
   3.675 -+#define VIRTIO_NET_F_UFO       2
   3.676 -+#define VIRTIO_NET_F_TSO4_ECN  3
   3.677 -+#define VIRTIO_NET_F_TSO6      4
   3.678 -+#define VIRTIO_NET_F_MAC       5
   3.679 -+
   3.680 -+/* The config defining mac address (6 bytes) */
   3.681 -+struct virtio_net_config
   3.682 -+{
   3.683 -+    uint8_t mac[6];
   3.684 -+} __attribute__((packed));
   3.685 -+
   3.686 -+/* This is the first element of the scatter-gather list.  If you don't
   3.687 -+ * specify GSO or CSUM features, you can simply ignore the header. */
   3.688 -+struct virtio_net_hdr
   3.689 -+{
   3.690 -+#define VIRTIO_NET_HDR_F_NEEDS_CSUM    1       // Use csum_start, csum_offset
   3.691 -+    uint8_t flags;
   3.692 -+#define VIRTIO_NET_HDR_GSO_NONE                0       // Not a GSO frame
   3.693 -+#define VIRTIO_NET_HDR_GSO_TCPV4       1       // GSO frame, IPv4 TCP (TSO)
   3.694 -+/* FIXME: Do we need this?  If they said they can handle ECN, do they care? */
   3.695 -+#define VIRTIO_NET_HDR_GSO_TCPV4_ECN   2       // GSO frame, IPv4 TCP w/ ECN
   3.696 -+#define VIRTIO_NET_HDR_GSO_UDP         3       // GSO frame, IPv4 UDP (UFO)
   3.697 -+#define VIRTIO_NET_HDR_GSO_TCPV6       4       // GSO frame, IPv6 TCP
   3.698 -+    uint8_t gso_type;
   3.699 -+    uint16_t gso_size;
   3.700 -+    uint16_t csum_start;
   3.701 -+    uint16_t csum_offset;
   3.702 -+};
   3.703 -+
   3.704 -+typedef struct VirtIONet
   3.705 -+{
   3.706 -+    VirtIODevice vdev;
   3.707 -+    uint8_t mac[6];
   3.708 -+    VirtQueue *rx_vq;
   3.709 -+    VirtQueue *tx_vq;
   3.710 -+    VLANClientState *vc;
   3.711 -+    int can_receive;
   3.712 -+} VirtIONet;
   3.713 -+
   3.714 -+static VirtIONet *to_virtio_net(VirtIODevice *vdev)
   3.715 -+{
   3.716 -+    return (VirtIONet *)vdev;
   3.717 -+}
   3.718 -+
   3.719 -+static void virtio_net_update_config(VirtIODevice *vdev, uint8_t *config)
   3.720 -+{
   3.721 -+    VirtIONet *n = to_virtio_net(vdev);
   3.722 -+    struct virtio_net_config netcfg;
   3.723 -+
   3.724 -+    memcpy(netcfg.mac, n->mac, 6);
   3.725 -+    memcpy(config, &netcfg, sizeof(netcfg));
   3.726 -+}
   3.727 -+
   3.728 -+static uint32_t virtio_net_get_features(VirtIODevice *vdev)
   3.729 -+{
   3.730 -+    return (1 << VIRTIO_NET_F_MAC);
   3.731 -+}
   3.732 -+
   3.733 -+/* RX */
   3.734 -+
   3.735 -+static void virtio_net_handle_rx(VirtIODevice *vdev, VirtQueue *vq)
   3.736 -+{
   3.737 -+    VirtIONet *n = to_virtio_net(vdev);
   3.738 -+    n->can_receive = 1;
   3.739 -+}
   3.740 -+
   3.741 -+static int virtio_net_can_receive(void *opaque)
   3.742 -+{
   3.743 -+    VirtIONet *n = opaque;
   3.744 -+
   3.745 -+    return (n->vdev.status & VIRTIO_CONFIG_S_DRIVER_OK) && n->can_receive;
   3.746 -+}
   3.747 -+
   3.748 -+static void virtio_net_receive(void *opaque, const uint8_t *buf, int size)
   3.749 -+{
   3.750 -+    VirtIONet *n = opaque;
   3.751 -+    VirtQueueElement elem;
   3.752 -+    struct virtio_net_hdr *hdr;
   3.753 -+    int offset, i;
   3.754 -+
   3.755 -+    /* FIXME: the drivers really need to set their status better */
   3.756 -+    if (n->rx_vq->vring.avail == NULL) {
   3.757 -+       n->can_receive = 0;
   3.758 -+       return;
   3.759 -+    }
   3.760 -+
   3.761 -+    if (virtqueue_pop(n->rx_vq, &elem) == 0) {
   3.762 -+       /* wait until the guest adds some rx bufs */
   3.763 -+       n->can_receive = 0;
   3.764 -+       return;
   3.765 -+    }
   3.766 -+
   3.767 -+    hdr = (void *)elem.in_sg[0].iov_base;
   3.768 -+    hdr->flags = 0;
   3.769 -+    hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;
   3.770 -+
   3.771 -+    /* copy in packet.  ugh */
   3.772 -+    offset = 0;
   3.773 -+    i = 1;
   3.774 -+    while (offset < size && i < elem.in_num) {
   3.775 -+       int len = MIN(elem.in_sg[i].iov_len, size - offset);
   3.776 -+       memcpy(elem.in_sg[i].iov_base, buf + offset, len);
   3.777 -+       offset += len;
   3.778 -+       i++;
   3.779 -+    }
   3.780 -+
   3.781 -+    /* signal other side */
   3.782 -+    virtqueue_push(n->rx_vq, &elem, sizeof(*hdr) + offset);
   3.783 -+    virtio_notify(&n->vdev, n->rx_vq);
   3.784 -+}
   3.785 -+
   3.786 -+/* TX */
   3.787 -+static void virtio_net_handle_tx(VirtIODevice *vdev, VirtQueue *vq)
   3.788 -+{
   3.789 -+    VirtIONet *n = to_virtio_net(vdev);
   3.790 -+    VirtQueueElement elem;
   3.791 -+
   3.792 -+    while (virtqueue_pop(vq, &elem)) {
   3.793 -+       int i;
   3.794 -+       size_t len = 0;
   3.795 -+
   3.796 -+       /* ignore the header for now */
   3.797 -+       for (i = 1; i < elem.out_num; i++) {
   3.798 -+           qemu_send_packet(n->vc, elem.out_sg[i].iov_base,
   3.799 -+                            elem.out_sg[i].iov_len);
   3.800 -+           len += elem.out_sg[i].iov_len;
   3.801 -+       }
   3.802 -+
   3.803 -+       virtqueue_push(vq, &elem, sizeof(struct virtio_net_hdr) + len);
   3.804 -+       virtio_notify(&n->vdev, vq);
   3.805 -+    }
   3.806 -+}
   3.807 -+
   3.808 -+void *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn)
   3.809 -+{
   3.810 -+    VirtIONet *n;
   3.811 -+
   3.812 -+    n = (VirtIONet *)virtio_init_pci(bus, "virtio-net", 6900, 0x1000,
   3.813 -+                                    0, VIRTIO_ID_NET,
   3.814 -+                                    0x02, 0x00, 0x00,
   3.815 -+                                    6, sizeof(VirtIONet));
   3.816 -+
   3.817 -+    n->vdev.update_config = virtio_net_update_config;
   3.818 -+    n->vdev.get_features = virtio_net_get_features;
   3.819 -+    n->rx_vq = virtio_add_queue(&n->vdev, 512, virtio_net_handle_rx);
   3.820 -+    n->tx_vq = virtio_add_queue(&n->vdev, 128, virtio_net_handle_tx);
   3.821 -+    n->can_receive = 0;
   3.822 -+    memcpy(n->mac, nd->macaddr, 6);
   3.823 -+    n->vc = qemu_new_vlan_client(nd->vlan, virtio_net_receive,
   3.824 -+                                virtio_net_can_receive, n);
   3.825 -+
   3.826 -+    return &n->vdev;
   3.827 -+}
   3.828 -Index: qemu-0.9.1/Makefile.target
   3.829 -===================================================================
   3.830 ---- qemu-0.9.1.orig/Makefile.target	2008-02-07 13:36:37.000000000 +0000
   3.831 -+++ qemu-0.9.1/Makefile.target	2008-02-07 13:38:53.000000000 +0000
   3.832 -@@ -437,7 +437,7 @@
   3.833 - VL_OBJS += rtl8139.o
   3.834 - 
   3.835 - # virtio devices
   3.836 --VL_OBJS += virtio.o virtio-net.o
   3.837 -+VL_OBJS += virtio.o virtio-net.o virtio-blk.o
   3.838 - 
   3.839 - ifeq ($(TARGET_BASE_ARCH), i386)
   3.840 - # Hardware support
   3.841 -Index: qemu-0.9.1/hw/pc.c
   3.842 -===================================================================
   3.843 ---- qemu-0.9.1.orig/hw/pc.c	2008-01-06 19:38:42.000000000 +0000
   3.844 -+++ qemu-0.9.1/hw/pc.c	2008-02-07 13:38:53.000000000 +0000
   3.845 -@@ -1008,6 +1008,18 @@
   3.846 - 	    }
   3.847 -         }
   3.848 -     }
   3.849 -+
   3.850 -+    /* Add virtio block devices */
   3.851 -+    if (pci_enabled) {
   3.852 -+       int index;
   3.853 -+       int unit_id = 0;
   3.854 -+
   3.855 -+       while ((index = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
   3.856 -+           virtio_blk_init(pci_bus, 0x5002, 0x2258,
   3.857 -+                           drives_table[index].bdrv);
   3.858 -+           unit_id++;
   3.859 -+       }
   3.860 -+    }
   3.861 - }
   3.862 - 
   3.863 - static void pc_init_pci(int ram_size, int vga_ram_size,
   3.864 -Index: qemu-0.9.1/hw/pc.h
   3.865 -===================================================================
   3.866 ---- qemu-0.9.1.orig/hw/pc.h	2008-02-07 13:36:37.000000000 +0000
   3.867 -+++ qemu-0.9.1/hw/pc.h	2008-02-07 13:38:53.000000000 +0000
   3.868 -@@ -147,4 +147,8 @@
   3.869 - void *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn);
   3.870 - 
   3.871 - 
   3.872 -+/* virtio-blk.h */
   3.873 -+void *virtio_blk_init(PCIBus *bus, uint16_t vendor, uint16_t device,
   3.874 -+                     BlockDriverState *bs);
   3.875 -+
   3.876 - #endif
   3.877 -Index: qemu-0.9.1/hw/virtio-blk.c
   3.878 -===================================================================
   3.879 ---- /dev/null	1970-01-01 00:00:00.000000000 +0000
   3.880 -+++ qemu-0.9.1/hw/virtio-blk.c	2008-02-07 13:38:53.000000000 +0000
   3.881 -@@ -0,0 +1,163 @@
   3.882 -+/*
   3.883 -+ * Virtio Block Device
   3.884 -+ *
   3.885 -+ * Copyright IBM, Corp. 2007
   3.886 -+ *
   3.887 -+ * Authors:
   3.888 -+ *  Anthony Liguori   <address@hidden>
   3.889 -+ *
   3.890 -+ * This work is licensed under the terms of the GNU GPL, version 2.  See
   3.891 -+ * the COPYING file in the top-level directory.
   3.892 -+ *
   3.893 -+ */
   3.894 -+
   3.895 -+#include "virtio.h"
   3.896 -+#include "block.h"
   3.897 -+#include "pc.h"
   3.898 -+
   3.899 -+/* from Linux's linux/virtio_blk.h */
   3.900 -+
   3.901 -+/* The ID for virtio_block */
   3.902 -+#define VIRTIO_ID_BLOCK        2
   3.903 -+
   3.904 -+/* Feature bits */
   3.905 -+#define VIRTIO_BLK_F_BARRIER   0       /* Does host support barriers? */
   3.906 -+#define VIRTIO_BLK_F_SIZE_MAX  1       /* Indicates maximum segment size */
   3.907 -+#define VIRTIO_BLK_F_SEG_MAX   2       /* Indicates maximum # of segments */
   3.908 -+
   3.909 -+struct virtio_blk_config
   3.910 -+{
   3.911 -+    uint64_t capacity;
   3.912 -+    uint32_t size_max;
   3.913 -+    uint32_t seg_max;
   3.914 -+};
   3.915 -+
   3.916 -+/* These two define direction. */
   3.917 -+#define VIRTIO_BLK_T_IN                0
   3.918 -+#define VIRTIO_BLK_T_OUT       1
   3.919 -+
   3.920 -+/* This bit says it's a scsi command, not an actual read or write. */
   3.921 -+#define VIRTIO_BLK_T_SCSI_CMD  2
   3.922 -+
   3.923 -+/* Barrier before this op. */
   3.924 -+#define VIRTIO_BLK_T_BARRIER   0x80000000
   3.925 -+
   3.926 -+/* This is the first element of the read scatter-gather list. */
   3.927 -+struct virtio_blk_outhdr
   3.928 -+{
   3.929 -+    /* VIRTIO_BLK_T* */
   3.930 -+    uint32_t type;
   3.931 -+    /* io priority. */
   3.932 -+    uint32_t ioprio;
   3.933 -+    /* Sector (ie. 512 byte offset) */
   3.934 -+    uint64_t sector;
   3.935 -+    /* Where to put reply. */
   3.936 -+    uint64_t id;
   3.937 -+};
   3.938 -+
   3.939 -+#define VIRTIO_BLK_S_OK                0
   3.940 -+#define VIRTIO_BLK_S_IOERR     1
   3.941 -+#define VIRTIO_BLK_S_UNSUPP    2
   3.942 -+
   3.943 -+/* This is the first element of the write scatter-gather list */
   3.944 -+struct virtio_blk_inhdr
   3.945 -+{
   3.946 -+    unsigned char status;
   3.947 -+};
   3.948 -+
   3.949 -+typedef struct VirtIOBlock
   3.950 -+{
   3.951 -+    VirtIODevice vdev;
   3.952 -+    BlockDriverState *bs;
   3.953 -+} VirtIOBlock;
   3.954 -+
   3.955 -+static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
   3.956 -+{
   3.957 -+    return (VirtIOBlock *)vdev;
   3.958 -+}
   3.959 -+
   3.960 -+static void virtio_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq)
   3.961 -+{
   3.962 -+    VirtIOBlock *s = to_virtio_blk(vdev);
   3.963 -+    VirtQueueElement elem;
   3.964 -+    unsigned int count;
   3.965 -+
   3.966 -+    while ((count = virtqueue_pop(vq, &elem)) != 0) {
   3.967 -+       struct virtio_blk_inhdr *in;
   3.968 -+       struct virtio_blk_outhdr *out;
   3.969 -+       unsigned int wlen;
   3.970 -+       off_t off;
   3.971 -+       int i;
   3.972 -+
   3.973 -+       out = (void *)elem.out_sg[0].iov_base;
   3.974 -+       in = (void *)elem.in_sg[elem.in_num - 1].iov_base;
   3.975 -+       off = out->sector;
   3.976 -+
   3.977 -+       if (out->type & VIRTIO_BLK_T_SCSI_CMD) {
   3.978 -+           wlen = sizeof(*in);
   3.979 -+           in->status = VIRTIO_BLK_S_UNSUPP;
   3.980 -+       } else if (out->type & VIRTIO_BLK_T_OUT) {
   3.981 -+           wlen = sizeof(*in);
   3.982 -+
   3.983 -+           for (i = 1; i < elem.out_num; i++) {
   3.984 -+               bdrv_write(s->bs, off,
   3.985 -+                          elem.out_sg[i].iov_base,
   3.986 -+                          elem.out_sg[i].iov_len / 512);
   3.987 -+               off += elem.out_sg[i].iov_len / 512;
   3.988 -+           }
   3.989 -+
   3.990 -+           in->status = VIRTIO_BLK_S_OK;
   3.991 -+       } else {
   3.992 -+           wlen = sizeof(*in);
   3.993 -+
   3.994 -+           for (i = 0; i < elem.in_num - 1; i++) {
   3.995 -+               bdrv_read(s->bs, off,
   3.996 -+                         elem.in_sg[i].iov_base,
   3.997 -+                         elem.in_sg[i].iov_len / 512);
   3.998 -+               off += elem.in_sg[i].iov_len / 512;
   3.999 -+               wlen += elem.in_sg[i].iov_len;
  3.1000 -+           }
  3.1001 -+
  3.1002 -+           in->status = VIRTIO_BLK_S_OK;
  3.1003 -+       }
  3.1004 -+
  3.1005 -+       virtqueue_push(vq, &elem, wlen);
  3.1006 -+       virtio_notify(vdev, vq);
  3.1007 -+    }
  3.1008 -+}
  3.1009 -+
  3.1010 -+static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
  3.1011 -+{
  3.1012 -+    VirtIOBlock *s = to_virtio_blk(vdev);
  3.1013 -+    struct virtio_blk_config blkcfg;
  3.1014 -+    int64_t capacity;
  3.1015 -+
  3.1016 -+    bdrv_get_geometry(s->bs, &capacity);
  3.1017 -+    blkcfg.capacity = capacity;
  3.1018 -+    blkcfg.seg_max = 128 - 2;
  3.1019 -+    memcpy(config, &blkcfg, sizeof(blkcfg));
  3.1020 -+}
  3.1021 -+
  3.1022 -+static uint32_t virtio_blk_get_features(VirtIODevice *vdev)
  3.1023 -+{
  3.1024 -+    return (1 << VIRTIO_BLK_F_SEG_MAX);
  3.1025 -+}
  3.1026 -+
  3.1027 -+void *virtio_blk_init(PCIBus *bus, uint16_t vendor, uint16_t device,
  3.1028 -+                     BlockDriverState *bs)
  3.1029 -+{
  3.1030 -+    VirtIOBlock *s;
  3.1031 -+
  3.1032 -+    s = (VirtIOBlock *)virtio_init_pci(bus, "virtio-blk", 6900, 0x1001,
  3.1033 -+                                      0, VIRTIO_ID_BLOCK,
  3.1034 -+                                      0x01, 0x80, 0x00,
  3.1035 -+                                      16, sizeof(VirtIOBlock));
  3.1036 -+
  3.1037 -+    s->vdev.update_config = virtio_blk_update_config;
  3.1038 -+    s->vdev.get_features = virtio_blk_get_features;
  3.1039 -+    s->bs = bs;
  3.1040 -+
  3.1041 -+    virtio_add_queue(&s->vdev, 128, virtio_blk_handle_output);
  3.1042 -+
  3.1043 -+    return &s->vdev;
  3.1044 -+}
  3.1045 -Index: qemu-0.9.1/sysemu.h
  3.1046 -===================================================================
  3.1047 ---- qemu-0.9.1.orig/sysemu.h	2008-01-06 19:38:42.000000000 +0000
  3.1048 -+++ qemu-0.9.1/sysemu.h	2008-02-07 13:38:53.000000000 +0000
  3.1049 -@@ -117,7 +117,7 @@
  3.1050 - #endif
  3.1051 - 
  3.1052 - typedef enum {
  3.1053 --    IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD
  3.1054 -+    IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO
  3.1055 - } BlockInterfaceType;
  3.1056 - 
  3.1057 - typedef struct DriveInfo {
  3.1058 -Index: qemu-0.9.1/vl.c
  3.1059 -===================================================================
  3.1060 ---- qemu-0.9.1.orig/vl.c	2008-01-06 19:38:42.000000000 +0000
  3.1061 -+++ qemu-0.9.1/vl.c	2008-02-07 13:40:52.000000000 +0000
  3.1062 -@@ -4953,6 +4953,9 @@
  3.1063 - 	} else if (!strcmp(buf, "sd")) {
  3.1064 - 	    type = IF_SD;
  3.1065 -             max_devs = 0;
  3.1066 -+	} else if (!strcmp(buf, "virtio")) {
  3.1067 -+	    type = IF_VIRTIO;
  3.1068 -+            max_devs = 0;
  3.1069 - 	} else {
  3.1070 -             fprintf(stderr, "qemu: '%s' unsupported bus type '%s'\n", str, buf);
  3.1071 -             return -1;
  3.1072 -@@ -5141,6 +5144,7 @@
  3.1073 -         break;
  3.1074 -     case IF_PFLASH:
  3.1075 -     case IF_MTD:
  3.1076 -+    case IF_VIRTIO:
  3.1077 -         break;
  3.1078 -     }
  3.1079 -     if (!file[0])
     4.1 --- a/xarchive/stuff/slitaz-wrap.sh	Mon Oct 20 20:17:03 2014 +0200
     4.2 +++ b/xarchive/stuff/slitaz-wrap.sh	Tue Oct 21 12:15:20 2014 +0200
     4.3 @@ -38,13 +38,17 @@
     4.4  ISO_EXTS="iso"
     4.5  SQUASHFS_EXTS="sfs sqfs squashfs"
     4.6  CROMFS_EXTS="cfs cromfs"
     4.7 -FS_EXTS="ext2 ext3 dos fat vfat xfs fd fs loop"
     4.8 +FAT_EXTS="dos fat vfat"
     4.9 +EXT2_EXTS="ext2 ext3 ext4"
    4.10 +FS_EXTS="$EXT2_EXTS $FAT_EXTS xfs fd fs loop"
    4.11  CLOOP_EXTS="cloop"
    4.12  RAR_EXTS="rar cbr"
    4.13  LHA_EXTS="lha lzh lzs"
    4.14  LZO_EXTS="lzo"
    4.15  ARJ_EXTS="arj pak arc j uc2 zoo"
    4.16 -_7Z_EXTS="7z bcj bcj2"
    4.17 +_7Z_EXTS="7z bcj bcj2 wim $BZIP2_EXTS $ZIP_EXTS $XZ_EXTS"
    4.18 +_7Z_EXTS_X="chm cramfs dmg hfs mbr msi nsis ntfs udf vhd xar arj cab lzh rar \
    4.19 +udf cpio $ISO_EXTS $FAT_EXTS $SQUASHFS_EXTS"
    4.20  
    4.21  while read var progs; do
    4.22  	eval $var=""
    4.23 @@ -310,7 +314,7 @@
    4.24  rar		$RAR_EXTS
    4.25  unace		ace
    4.26  arj		$ARJ_EXTS
    4.27 -7zr		$_7Z_EXTS
    4.28 +7zr		$_7Z_EXTS $_7Z_EXTS_X
    4.29  lha		$LHA_EXTS
    4.30  lzop		$LZO_EXTS
    4.31  cabextract	cab
    4.32 @@ -513,7 +517,7 @@
    4.33  lzop		-x		N/A		$LZO_EXTS
    4.34  rar		x\ -o-\ -p-	x\ -o-		$RAR_EXTS
    4.35  arj		x\ -y		x\ -y\ -g?	$ARJ_EXTS
    4.36 -7zr		x\ -y\ -p-	x\ -y		$_7Z_EXTS
    4.37 +7zr		x\ -y\ -p-	x\ -y		$_7Z_EXTS $_7Z_EXTS_X
    4.38  unace		N/A		x\ -o\ -y	ace
    4.39  cabextract	-q		N/A		cab
    4.40  EOT