~ubuntu-branches/ubuntu/trusty/qemu/trusty

« back to all changes in this revision

Viewing changes to .pc/CVE-2013-4377.patch/hw/virtio/virtio-bus.c

  • Committer: Package Import Robot
  • Author(s): Serge Hallyn
  • Date: 2014-02-04 12:13:08 UTC
  • mfrom: (10.1.45 sid)
  • Revision ID: package-import@ubuntu.com-20140204121308-1xq92lrfs75agw2g
Tags: 1.7.0+dfsg-3ubuntu1~ppa1
* Merge 1.7.0+dfsg-3 from debian.  Remaining changes:
  - debian/patches/ubuntu:
    * expose-vmx_qemu64cpu.patch
    * linaro (omap3) and arm64 patches
    * ubuntu/target-ppc-add-stubs-for-kvm-breakpoints: fix FTBFS
      on ppc
    * ubuntu/CVE-2013-4377.patch: fix denial of service via virtio
  - debian/qemu-system-x86.modprobe: set kvm_intel nested=1 options
  - debian/control:
    * add arm64 to Architectures
    * add qemu-common and qemu-system-aarch64 packages
  - debian/qemu-system-common.install: add debian/tmp/usr/lib
  - debian/qemu-system-common.preinst: add kvm group
  - debian/qemu-system-common.postinst: remove acl placed by udev,
    and add udevadm trigger.
  - qemu-system-x86.links: add eepro100.rom, remove pxe-virtio,
    pxe-e1000 and pxe-rtl8139.
  - add qemu-system-x86.qemu-kvm.upstart and .default
  - qemu-user-static.postinst-in: remove arm64 binfmt
  - debian/rules:
    * allow parallel build
    * add aarch64 to system_targets and sys_systems
    * add qemu-kvm-spice links
    * install qemu-system-x86.modprobe
  - add debian/qemu-system-common.links for OVMF.fd link
* Remove kvm-img, kvm-nbd, kvm-ifup and kvm-ifdown symlinks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * VirtioBus
3
 
 *
4
 
 *  Copyright (C) 2012 : GreenSocs Ltd
5
 
 *      http://www.greensocs.com/ , email: info@greensocs.com
6
 
 *
7
 
 *  Developed by :
8
 
 *  Frederic Konrad   <fred.konrad@greensocs.com>
9
 
 *
10
 
 * This program is free software; you can redistribute it and/or modify
11
 
 * it under the terms of the GNU General Public License as published by
12
 
 * the Free Software Foundation, either version 2 of the License, or
13
 
 * (at your option) any later version.
14
 
 *
15
 
 * This program is distributed in the hope that it will be useful,
16
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 
 * GNU General Public License for more details.
19
 
 *
20
 
 * You should have received a copy of the GNU General Public License along
21
 
 * with this program; if not, see <http://www.gnu.org/licenses/>.
22
 
 *
23
 
 */
24
 
 
25
 
#include "hw/hw.h"
26
 
#include "qemu/error-report.h"
27
 
#include "hw/qdev.h"
28
 
#include "hw/virtio/virtio-bus.h"
29
 
#include "hw/virtio/virtio.h"
30
 
 
31
 
/* #define DEBUG_VIRTIO_BUS */
32
 
 
33
 
#ifdef DEBUG_VIRTIO_BUS
34
 
#define DPRINTF(fmt, ...) \
35
 
do { printf("virtio_bus: " fmt , ## __VA_ARGS__); } while (0)
36
 
#else
37
 
#define DPRINTF(fmt, ...) do { } while (0)
38
 
#endif
39
 
 
40
 
/* Plug the VirtIODevice */
41
 
int virtio_bus_plug_device(VirtIODevice *vdev)
42
 
{
43
 
    DeviceState *qdev = DEVICE(vdev);
44
 
    BusState *qbus = BUS(qdev_get_parent_bus(qdev));
45
 
    VirtioBusState *bus = VIRTIO_BUS(qbus);
46
 
    VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(bus);
47
 
    DPRINTF("%s: plug device.\n", qbus->name);
48
 
 
49
 
    bus->vdev = vdev;
50
 
 
51
 
    if (klass->device_plugged != NULL) {
52
 
        klass->device_plugged(qbus->parent);
53
 
    }
54
 
 
55
 
    return 0;
56
 
}
57
 
 
58
 
/* Reset the virtio_bus */
59
 
void virtio_bus_reset(VirtioBusState *bus)
60
 
{
61
 
    DPRINTF("%s: reset device.\n", qbus->name);
62
 
    if (bus->vdev != NULL) {
63
 
        virtio_reset(bus->vdev);
64
 
    }
65
 
}
66
 
 
67
 
/* Destroy the VirtIODevice */
68
 
void virtio_bus_destroy_device(VirtioBusState *bus)
69
 
{
70
 
    BusState *qbus = BUS(bus);
71
 
    VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(bus);
72
 
    DPRINTF("%s: remove device.\n", qbus->name);
73
 
 
74
 
    if (bus->vdev != NULL) {
75
 
        if (klass->device_unplug != NULL) {
76
 
            klass->device_unplug(qbus->parent);
77
 
        }
78
 
        object_unparent(OBJECT(bus->vdev));
79
 
        bus->vdev = NULL;
80
 
    }
81
 
}
82
 
 
83
 
/* Get the device id of the plugged device. */
84
 
uint16_t virtio_bus_get_vdev_id(VirtioBusState *bus)
85
 
{
86
 
    assert(bus->vdev != NULL);
87
 
    return bus->vdev->device_id;
88
 
}
89
 
 
90
 
/* Get the config_len field of the plugged device. */
91
 
size_t virtio_bus_get_vdev_config_len(VirtioBusState *bus)
92
 
{
93
 
    assert(bus->vdev != NULL);
94
 
    return bus->vdev->config_len;
95
 
}
96
 
 
97
 
/* Get the features of the plugged device. */
98
 
uint32_t virtio_bus_get_vdev_features(VirtioBusState *bus,
99
 
                                    uint32_t requested_features)
100
 
{
101
 
    VirtioDeviceClass *k;
102
 
    assert(bus->vdev != NULL);
103
 
    k = VIRTIO_DEVICE_GET_CLASS(bus->vdev);
104
 
    assert(k->get_features != NULL);
105
 
    return k->get_features(bus->vdev, requested_features);
106
 
}
107
 
 
108
 
/* Set the features of the plugged device. */
109
 
void virtio_bus_set_vdev_features(VirtioBusState *bus,
110
 
                                      uint32_t requested_features)
111
 
{
112
 
    VirtioDeviceClass *k;
113
 
    assert(bus->vdev != NULL);
114
 
    k = VIRTIO_DEVICE_GET_CLASS(bus->vdev);
115
 
    if (k->set_features != NULL) {
116
 
        k->set_features(bus->vdev, requested_features);
117
 
    }
118
 
}
119
 
 
120
 
/* Get bad features of the plugged device. */
121
 
uint32_t virtio_bus_get_vdev_bad_features(VirtioBusState *bus)
122
 
{
123
 
    VirtioDeviceClass *k;
124
 
    assert(bus->vdev != NULL);
125
 
    k = VIRTIO_DEVICE_GET_CLASS(bus->vdev);
126
 
    if (k->bad_features != NULL) {
127
 
        return k->bad_features(bus->vdev);
128
 
    } else {
129
 
        return 0;
130
 
    }
131
 
}
132
 
 
133
 
/* Get config of the plugged device. */
134
 
void virtio_bus_get_vdev_config(VirtioBusState *bus, uint8_t *config)
135
 
{
136
 
    VirtioDeviceClass *k;
137
 
    assert(bus->vdev != NULL);
138
 
    k = VIRTIO_DEVICE_GET_CLASS(bus->vdev);
139
 
    if (k->get_config != NULL) {
140
 
        k->get_config(bus->vdev, config);
141
 
    }
142
 
}
143
 
 
144
 
/* Set config of the plugged device. */
145
 
void virtio_bus_set_vdev_config(VirtioBusState *bus, uint8_t *config)
146
 
{
147
 
    VirtioDeviceClass *k;
148
 
    assert(bus->vdev != NULL);
149
 
    k = VIRTIO_DEVICE_GET_CLASS(bus->vdev);
150
 
    if (k->set_config != NULL) {
151
 
        k->set_config(bus->vdev, config);
152
 
    }
153
 
}
154
 
 
155
 
static char *virtio_bus_get_dev_path(DeviceState *dev)
156
 
{
157
 
    BusState *bus = qdev_get_parent_bus(dev);
158
 
    DeviceState *proxy = DEVICE(bus->parent);
159
 
    return qdev_get_dev_path(proxy);
160
 
}
161
 
 
162
 
static char *virtio_bus_get_fw_dev_path(DeviceState *dev)
163
 
{
164
 
    return NULL;
165
 
}
166
 
 
167
 
static void virtio_bus_class_init(ObjectClass *klass, void *data)
168
 
{
169
 
    BusClass *bus_class = BUS_CLASS(klass);
170
 
    bus_class->get_dev_path = virtio_bus_get_dev_path;
171
 
    bus_class->get_fw_dev_path = virtio_bus_get_fw_dev_path;
172
 
}
173
 
 
174
 
static const TypeInfo virtio_bus_info = {
175
 
    .name = TYPE_VIRTIO_BUS,
176
 
    .parent = TYPE_BUS,
177
 
    .instance_size = sizeof(VirtioBusState),
178
 
    .abstract = true,
179
 
    .class_size = sizeof(VirtioBusClass),
180
 
    .class_init = virtio_bus_class_init
181
 
};
182
 
 
183
 
static void virtio_register_types(void)
184
 
{
185
 
    type_register_static(&virtio_bus_info);
186
 
}
187
 
 
188
 
type_init(virtio_register_types)