File: | hw/s390x/s390-virtio-bus.c |
Location: | line 400, column 5 |
Description: | Value stored to 'cur_offs' is never read |
1 | /* |
2 | * QEMU S390 virtio target |
3 | * |
4 | * Copyright (c) 2009 Alexander Graf <agraf@suse.de> |
5 | * |
6 | * This library is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2 of the License, or (at your option) any later version. |
10 | * |
11 | * This library is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
18 | */ |
19 | |
20 | #include "hw/hw.h" |
21 | #include "block/block.h" |
22 | #include "sysemu/sysemu.h" |
23 | #include "hw/boards.h" |
24 | #include "monitor/monitor.h" |
25 | #include "hw/loader.h" |
26 | #include "elf.h" |
27 | #include "hw/virtio/virtio.h" |
28 | #include "hw/virtio/virtio-rng.h" |
29 | #include "hw/virtio/virtio-serial.h" |
30 | #include "hw/virtio/virtio-net.h" |
31 | #include "hw/virtio/vhost-scsi.h" |
32 | #include "hw/sysbus.h" |
33 | #include "sysemu/kvm.h" |
34 | |
35 | #include "hw/s390x/s390-virtio-bus.h" |
36 | #include "hw/virtio/virtio-bus.h" |
37 | |
38 | /* #define DEBUG_S390 */ |
39 | |
40 | #ifdef DEBUG_S390 |
41 | #define DPRINTF(fmt, ...)do { } while (0) \ |
42 | do { fprintf(stderrstderr, fmt, ## __VA_ARGS__); } while (0) |
43 | #else |
44 | #define DPRINTF(fmt, ...)do { } while (0) \ |
45 | do { } while (0) |
46 | #endif |
47 | |
48 | #define VIRTIO_EXT_CODE0x2603 0x2603 |
49 | |
50 | static void virtio_s390_bus_new(VirtioBusState *bus, size_t bus_size, |
51 | VirtIOS390Device *dev); |
52 | |
53 | static const TypeInfo s390_virtio_bus_info = { |
54 | .name = TYPE_S390_VIRTIO_BUS"s390-virtio-bus", |
55 | .parent = TYPE_BUS"bus", |
56 | .instance_size = sizeof(VirtIOS390Bus), |
57 | }; |
58 | |
59 | static ram_addr_t s390_virtio_device_num_vq(VirtIOS390Device *dev); |
60 | |
61 | /* length of VirtIO device pages */ |
62 | const hwaddr virtio_size = S390_DEVICE_PAGES512 * TARGET_PAGE_SIZE(1 << 12); |
63 | |
64 | static void s390_virtio_bus_reset(void *opaque) |
65 | { |
66 | VirtIOS390Bus *bus = opaque; |
67 | bus->next_ring = bus->dev_page + TARGET_PAGE_SIZE(1 << 12); |
68 | } |
69 | |
70 | void s390_virtio_reset_idx(VirtIOS390Device *dev) |
71 | { |
72 | int i; |
73 | hwaddr idx_addr; |
74 | uint8_t num_vq; |
75 | |
76 | num_vq = s390_virtio_device_num_vq(dev); |
77 | for (i = 0; i < num_vq; i++) { |
78 | idx_addr = virtio_queue_get_avail_addr(dev->vdev, i) + |
79 | VIRTIO_VRING_AVAIL_IDX_OFFS2; |
80 | stw_phys(idx_addr, 0); |
81 | idx_addr = virtio_queue_get_used_addr(dev->vdev, i) + |
82 | VIRTIO_VRING_USED_IDX_OFFS2; |
83 | stw_phys(idx_addr, 0); |
84 | } |
85 | } |
86 | |
87 | VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size) |
88 | { |
89 | VirtIOS390Bus *bus; |
90 | BusState *_bus; |
91 | DeviceState *dev; |
92 | |
93 | /* Create bridge device */ |
94 | dev = qdev_create(NULL((void*)0), "s390-virtio-bridge"); |
95 | qdev_init_nofail(dev); |
96 | |
97 | /* Create bus on bridge device */ |
98 | |
99 | _bus = qbus_create(TYPE_S390_VIRTIO_BUS"s390-virtio-bus", dev, "s390-virtio"); |
100 | bus = DO_UPCAST(VirtIOS390Bus, bus, _bus)( __extension__ ( { char __attribute__((unused)) offset_must_be_zero [ -__builtin_offsetof(VirtIOS390Bus, bus)]; ({ const typeof(( (VirtIOS390Bus *) 0)->bus) *__mptr = (_bus); (VirtIOS390Bus *) ((char *) __mptr - __builtin_offsetof(VirtIOS390Bus, bus) );});})); |
101 | |
102 | bus->dev_page = *ram_size; |
103 | bus->dev_offs = bus->dev_page; |
104 | bus->next_ring = bus->dev_page + TARGET_PAGE_SIZE(1 << 12); |
105 | |
106 | /* Enable hotplugging */ |
107 | _bus->allow_hotplug = 1; |
108 | |
109 | /* Allocate RAM for VirtIO device pages (descriptors, queues, rings) */ |
110 | *ram_size += S390_DEVICE_PAGES512 * TARGET_PAGE_SIZE(1 << 12); |
111 | |
112 | qemu_register_reset(s390_virtio_bus_reset, bus); |
113 | return bus; |
114 | } |
115 | |
116 | static void s390_virtio_irq(S390CPU *cpu, int config_change, uint64_t token) |
117 | { |
118 | if (kvm_enabled()(0)) { |
119 | kvm_s390_virtio_irq(cpu, config_change, token); |
120 | } else { |
121 | cpu_inject_ext(cpu, VIRTIO_EXT_CODE0x2603, config_change, token); |
122 | } |
123 | } |
124 | |
125 | static int s390_virtio_device_init(VirtIOS390Device *dev, VirtIODevice *vdev) |
126 | { |
127 | VirtIOS390Bus *bus; |
128 | int dev_len; |
129 | |
130 | bus = DO_UPCAST(VirtIOS390Bus, bus, dev->qdev.parent_bus)( __extension__ ( { char __attribute__((unused)) offset_must_be_zero [ -__builtin_offsetof(VirtIOS390Bus, bus)]; ({ const typeof(( (VirtIOS390Bus *) 0)->bus) *__mptr = (dev->qdev.parent_bus ); (VirtIOS390Bus *) ((char *) __mptr - __builtin_offsetof(VirtIOS390Bus , bus));});})); |
131 | dev->vdev = vdev; |
132 | dev->dev_offs = bus->dev_offs; |
133 | dev->feat_len = sizeof(uint32_t); /* always keep 32 bits features */ |
134 | |
135 | dev_len = VIRTIO_DEV_OFFS_CONFIG5; |
136 | dev_len += s390_virtio_device_num_vq(dev) * VIRTIO_VQCONFIG_LEN24; |
137 | dev_len += dev->feat_len * 2; |
138 | dev_len += virtio_bus_get_vdev_config_len(&dev->bus); |
139 | |
140 | bus->dev_offs += dev_len; |
141 | |
142 | dev->host_features = virtio_bus_get_vdev_features(&dev->bus, |
143 | dev->host_features); |
144 | s390_virtio_device_sync(dev); |
145 | s390_virtio_reset_idx(dev); |
146 | if (dev->qdev.hotplugged) { |
147 | S390CPU *cpu = s390_cpu_addr2state(0); |
148 | s390_virtio_irq(cpu, VIRTIO_PARAM_DEV_ADD0x2, dev->dev_offs); |
149 | } |
150 | |
151 | return 0; |
152 | } |
153 | |
154 | static int s390_virtio_net_init(VirtIOS390Device *s390_dev) |
155 | { |
156 | DeviceState *qdev = DEVICE(s390_dev)((DeviceState *)object_dynamic_cast_assert(((Object *)((s390_dev ))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 156, __func__)); |
157 | VirtIONetS390 *dev = VIRTIO_NET_S390(s390_dev)((VirtIONetS390 *)object_dynamic_cast_assert(((Object *)((s390_dev ))), ("virtio-net-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 157, __func__)); |
158 | DeviceState *vdev = DEVICE(&dev->vdev)((DeviceState *)object_dynamic_cast_assert(((Object *)((& dev->vdev))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 158, __func__)); |
159 | |
160 | virtio_net_set_config_size(&dev->vdev, s390_dev->host_features); |
161 | virtio_net_set_netclient_name(&dev->vdev, qdev->id, |
162 | object_get_typename(OBJECT(qdev)((Object *)(qdev)))); |
163 | qdev_set_parent_bus(vdev, BUS(&s390_dev->bus)((BusState *)object_dynamic_cast_assert(((Object *)((&s390_dev ->bus))), ("bus"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 163, __func__))); |
164 | if (qdev_init(vdev) < 0) { |
165 | return -1; |
166 | } |
167 | |
168 | return s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev)((VirtIODevice *)object_dynamic_cast_assert(((Object *)((vdev ))), ("virtio-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 168, __func__))); |
169 | } |
170 | |
171 | static void s390_virtio_net_instance_init(Object *obj) |
172 | { |
173 | VirtIONetS390 *dev = VIRTIO_NET_S390(obj)((VirtIONetS390 *)object_dynamic_cast_assert(((Object *)((obj ))), ("virtio-net-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 173, __func__)); |
174 | object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_NET"virtio-net-device"); |
175 | object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev)((Object *)(&dev->vdev)), NULL((void*)0)); |
176 | } |
177 | |
178 | static int s390_virtio_blk_init(VirtIOS390Device *s390_dev) |
179 | { |
180 | VirtIOBlkS390 *dev = VIRTIO_BLK_S390(s390_dev)((VirtIOBlkS390 *)object_dynamic_cast_assert(((Object *)((s390_dev ))), ("virtio-blk-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 180, __func__)); |
181 | DeviceState *vdev = DEVICE(&dev->vdev)((DeviceState *)object_dynamic_cast_assert(((Object *)((& dev->vdev))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 181, __func__)); |
182 | virtio_blk_set_conf(vdev, &(dev->blk)); |
183 | qdev_set_parent_bus(vdev, BUS(&s390_dev->bus)((BusState *)object_dynamic_cast_assert(((Object *)((&s390_dev ->bus))), ("bus"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 183, __func__))); |
184 | if (qdev_init(vdev) < 0) { |
185 | return -1; |
186 | } |
187 | return s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev)((VirtIODevice *)object_dynamic_cast_assert(((Object *)((vdev ))), ("virtio-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 187, __func__))); |
188 | } |
189 | |
190 | static void s390_virtio_blk_instance_init(Object *obj) |
191 | { |
192 | VirtIOBlkS390 *dev = VIRTIO_BLK_S390(obj)((VirtIOBlkS390 *)object_dynamic_cast_assert(((Object *)((obj ))), ("virtio-blk-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 192, __func__)); |
193 | object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_BLK"virtio-blk-device"); |
194 | object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev)((Object *)(&dev->vdev)), NULL((void*)0)); |
195 | } |
196 | |
197 | static int s390_virtio_serial_init(VirtIOS390Device *s390_dev) |
198 | { |
199 | VirtIOSerialS390 *dev = VIRTIO_SERIAL_S390(s390_dev)((VirtIOSerialS390 *)object_dynamic_cast_assert(((Object *)(( s390_dev))), ("virtio-serial-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 199, __func__)); |
200 | DeviceState *vdev = DEVICE(&dev->vdev)((DeviceState *)object_dynamic_cast_assert(((Object *)((& dev->vdev))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 200, __func__)); |
201 | DeviceState *qdev = DEVICE(s390_dev)((DeviceState *)object_dynamic_cast_assert(((Object *)((s390_dev ))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 201, __func__)); |
202 | VirtIOS390Bus *bus; |
203 | int r; |
204 | char *bus_name; |
205 | |
206 | bus = DO_UPCAST(VirtIOS390Bus, bus, qdev->parent_bus)( __extension__ ( { char __attribute__((unused)) offset_must_be_zero [ -__builtin_offsetof(VirtIOS390Bus, bus)]; ({ const typeof(( (VirtIOS390Bus *) 0)->bus) *__mptr = (qdev->parent_bus) ; (VirtIOS390Bus *) ((char *) __mptr - __builtin_offsetof(VirtIOS390Bus , bus));});})); |
207 | |
208 | /* |
209 | * For command line compatibility, this sets the virtio-serial-device bus |
210 | * name as before. |
211 | */ |
212 | if (qdev->id) { |
213 | bus_name = g_strdup_printf("%s.0", qdev->id); |
214 | virtio_device_set_child_bus_name(VIRTIO_DEVICE(vdev)((VirtIODevice *)object_dynamic_cast_assert(((Object *)((vdev ))), ("virtio-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 214, __func__)), bus_name); |
215 | g_free(bus_name); |
216 | } |
217 | |
218 | qdev_set_parent_bus(vdev, BUS(&s390_dev->bus)((BusState *)object_dynamic_cast_assert(((Object *)((&s390_dev ->bus))), ("bus"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 218, __func__))); |
219 | if (qdev_init(vdev) < 0) { |
220 | return -1; |
221 | } |
222 | |
223 | r = s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev)((VirtIODevice *)object_dynamic_cast_assert(((Object *)((vdev ))), ("virtio-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 223, __func__))); |
224 | if (!r) { |
225 | bus->console = s390_dev; |
226 | } |
227 | |
228 | return r; |
229 | } |
230 | |
231 | static void s390_virtio_serial_instance_init(Object *obj) |
232 | { |
233 | VirtIOSerialS390 *dev = VIRTIO_SERIAL_S390(obj)((VirtIOSerialS390 *)object_dynamic_cast_assert(((Object *)(( obj))), ("virtio-serial-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 233, __func__)); |
234 | object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_SERIAL"virtio-serial-device"); |
235 | object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev)((Object *)(&dev->vdev)), NULL((void*)0)); |
236 | } |
237 | |
238 | static int s390_virtio_scsi_init(VirtIOS390Device *s390_dev) |
239 | { |
240 | VirtIOSCSIS390 *dev = VIRTIO_SCSI_S390(s390_dev)((VirtIOSCSIS390 *)object_dynamic_cast_assert(((Object *)((s390_dev ))), ("virtio-scsi-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 240, __func__)); |
241 | DeviceState *vdev = DEVICE(&dev->vdev)((DeviceState *)object_dynamic_cast_assert(((Object *)((& dev->vdev))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 241, __func__)); |
242 | DeviceState *qdev = DEVICE(s390_dev)((DeviceState *)object_dynamic_cast_assert(((Object *)((s390_dev ))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 242, __func__)); |
243 | char *bus_name; |
244 | |
245 | /* |
246 | * For command line compatibility, this sets the virtio-scsi-device bus |
247 | * name as before. |
248 | */ |
249 | if (qdev->id) { |
250 | bus_name = g_strdup_printf("%s.0", qdev->id); |
251 | virtio_device_set_child_bus_name(VIRTIO_DEVICE(vdev)((VirtIODevice *)object_dynamic_cast_assert(((Object *)((vdev ))), ("virtio-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 251, __func__)), bus_name); |
252 | g_free(bus_name); |
253 | } |
254 | |
255 | qdev_set_parent_bus(vdev, BUS(&s390_dev->bus)((BusState *)object_dynamic_cast_assert(((Object *)((&s390_dev ->bus))), ("bus"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 255, __func__))); |
256 | if (qdev_init(vdev) < 0) { |
257 | return -1; |
258 | } |
259 | |
260 | return s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev)((VirtIODevice *)object_dynamic_cast_assert(((Object *)((vdev ))), ("virtio-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 260, __func__))); |
261 | } |
262 | |
263 | static void s390_virtio_scsi_instance_init(Object *obj) |
264 | { |
265 | VirtIOSCSIS390 *dev = VIRTIO_SCSI_S390(obj)((VirtIOSCSIS390 *)object_dynamic_cast_assert(((Object *)((obj ))), ("virtio-scsi-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 265, __func__)); |
266 | object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_SCSI"virtio-scsi-device"); |
267 | object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev)((Object *)(&dev->vdev)), NULL((void*)0)); |
268 | } |
269 | |
270 | #ifdef CONFIG_VHOST_SCSI1 |
271 | static int s390_vhost_scsi_init(VirtIOS390Device *s390_dev) |
272 | { |
273 | VHostSCSIS390 *dev = VHOST_SCSI_S390(s390_dev)((VHostSCSIS390 *)object_dynamic_cast_assert(((Object *)((s390_dev ))), ("vhost-scsi-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 273, __func__)); |
274 | DeviceState *vdev = DEVICE(&dev->vdev)((DeviceState *)object_dynamic_cast_assert(((Object *)((& dev->vdev))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 274, __func__)); |
275 | |
276 | qdev_set_parent_bus(vdev, BUS(&s390_dev->bus)((BusState *)object_dynamic_cast_assert(((Object *)((&s390_dev ->bus))), ("bus"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 276, __func__))); |
277 | if (qdev_init(vdev) < 0) { |
278 | return -1; |
279 | } |
280 | |
281 | return s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev)((VirtIODevice *)object_dynamic_cast_assert(((Object *)((vdev ))), ("virtio-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 281, __func__))); |
282 | } |
283 | |
284 | static void s390_vhost_scsi_instance_init(Object *obj) |
285 | { |
286 | VHostSCSIS390 *dev = VHOST_SCSI_S390(obj)((VHostSCSIS390 *)object_dynamic_cast_assert(((Object *)((obj ))), ("vhost-scsi-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 286, __func__)); |
287 | object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VHOST_SCSI"vhost-scsi"); |
288 | object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev)((Object *)(&dev->vdev)), NULL((void*)0)); |
289 | } |
290 | #endif |
291 | |
292 | |
293 | static int s390_virtio_rng_init(VirtIOS390Device *s390_dev) |
294 | { |
295 | VirtIORNGS390 *dev = VIRTIO_RNG_S390(s390_dev)((VirtIORNGS390 *)object_dynamic_cast_assert(((Object *)((s390_dev ))), ("virtio-rng-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 295, __func__)); |
296 | DeviceState *vdev = DEVICE(&dev->vdev)((DeviceState *)object_dynamic_cast_assert(((Object *)((& dev->vdev))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 296, __func__)); |
297 | |
298 | qdev_set_parent_bus(vdev, BUS(&s390_dev->bus)((BusState *)object_dynamic_cast_assert(((Object *)((&s390_dev ->bus))), ("bus"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 298, __func__))); |
299 | if (qdev_init(vdev) < 0) { |
300 | return -1; |
301 | } |
302 | |
303 | object_property_set_link(OBJECT(dev)((Object *)(dev)), |
304 | OBJECT(dev->vdev.conf.rng)((Object *)(dev->vdev.conf.rng)), "rng", |
305 | NULL((void*)0)); |
306 | |
307 | return s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev)((VirtIODevice *)object_dynamic_cast_assert(((Object *)((vdev ))), ("virtio-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 307, __func__))); |
308 | } |
309 | |
310 | static void s390_virtio_rng_instance_init(Object *obj) |
311 | { |
312 | VirtIORNGS390 *dev = VIRTIO_RNG_S390(obj)((VirtIORNGS390 *)object_dynamic_cast_assert(((Object *)((obj ))), ("virtio-rng-s390"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 312, __func__)); |
313 | object_initialize(&dev->vdev, sizeof(dev->vdev), TYPE_VIRTIO_RNG"virtio-rng-device"); |
314 | object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev)((Object *)(&dev->vdev)), NULL((void*)0)); |
315 | object_property_add_link(obj, "rng", TYPE_RNG_BACKEND"rng-backend", |
316 | (Object **)&dev->vdev.conf.rng, NULL((void*)0)); |
317 | } |
318 | |
319 | static uint64_t s390_virtio_device_vq_token(VirtIOS390Device *dev, int vq) |
320 | { |
321 | ram_addr_t token_off; |
322 | |
323 | token_off = (dev->dev_offs + VIRTIO_DEV_OFFS_CONFIG5) + |
324 | (vq * VIRTIO_VQCONFIG_LEN24) + |
325 | VIRTIO_VQCONFIG_OFFS_TOKEN0; |
326 | |
327 | return ldq_be_phys(token_off); |
328 | } |
329 | |
330 | static ram_addr_t s390_virtio_device_num_vq(VirtIOS390Device *dev) |
331 | { |
332 | VirtIODevice *vdev = dev->vdev; |
333 | int num_vq; |
334 | |
335 | for (num_vq = 0; num_vq < VIRTIO_PCI_QUEUE_MAX64; num_vq++) { |
336 | if (!virtio_queue_get_num(vdev, num_vq)) { |
337 | break; |
338 | } |
339 | } |
340 | |
341 | return num_vq; |
342 | } |
343 | |
344 | static ram_addr_t s390_virtio_next_ring(VirtIOS390Bus *bus) |
345 | { |
346 | ram_addr_t r = bus->next_ring; |
347 | |
348 | bus->next_ring += VIRTIO_RING_LEN((1 << 12) * 3); |
349 | return r; |
350 | } |
351 | |
352 | void s390_virtio_device_sync(VirtIOS390Device *dev) |
353 | { |
354 | VirtIOS390Bus *bus = DO_UPCAST(VirtIOS390Bus, bus, dev->qdev.parent_bus)( __extension__ ( { char __attribute__((unused)) offset_must_be_zero [ -__builtin_offsetof(VirtIOS390Bus, bus)]; ({ const typeof(( (VirtIOS390Bus *) 0)->bus) *__mptr = (dev->qdev.parent_bus ); (VirtIOS390Bus *) ((char *) __mptr - __builtin_offsetof(VirtIOS390Bus , bus));});})); |
355 | ram_addr_t cur_offs; |
356 | uint8_t num_vq; |
357 | int i; |
358 | |
359 | virtio_reset(dev->vdev); |
360 | |
361 | /* Sync dev space */ |
362 | stb_phys(dev->dev_offs + VIRTIO_DEV_OFFS_TYPE0, dev->vdev->device_id); |
363 | |
364 | stb_phys(dev->dev_offs + VIRTIO_DEV_OFFS_NUM_VQ1, s390_virtio_device_num_vq(dev)); |
365 | stb_phys(dev->dev_offs + VIRTIO_DEV_OFFS_FEATURE_LEN2, dev->feat_len); |
366 | |
367 | stb_phys(dev->dev_offs + VIRTIO_DEV_OFFS_CONFIG_LEN3, dev->vdev->config_len); |
368 | |
369 | num_vq = s390_virtio_device_num_vq(dev); |
370 | stb_phys(dev->dev_offs + VIRTIO_DEV_OFFS_NUM_VQ1, num_vq); |
371 | |
372 | /* Sync virtqueues */ |
373 | for (i = 0; i < num_vq; i++) { |
374 | ram_addr_t vq = (dev->dev_offs + VIRTIO_DEV_OFFS_CONFIG5) + |
375 | (i * VIRTIO_VQCONFIG_LEN24); |
376 | ram_addr_t vring; |
377 | |
378 | vring = s390_virtio_next_ring(bus); |
379 | virtio_queue_set_addr(dev->vdev, i, vring); |
380 | virtio_queue_set_vector(dev->vdev, i, i); |
381 | stq_be_phys(vq + VIRTIO_VQCONFIG_OFFS_ADDRESS8, vring); |
382 | stw_be_phys(vq + VIRTIO_VQCONFIG_OFFS_NUM16, virtio_queue_get_num(dev->vdev, i)); |
383 | } |
384 | |
385 | cur_offs = dev->dev_offs; |
386 | cur_offs += VIRTIO_DEV_OFFS_CONFIG5; |
387 | cur_offs += num_vq * VIRTIO_VQCONFIG_LEN24; |
388 | |
389 | /* Sync feature bitmap */ |
390 | stl_le_phys(cur_offs, dev->host_features); |
391 | |
392 | dev->feat_offs = cur_offs + dev->feat_len; |
393 | cur_offs += dev->feat_len * 2; |
394 | |
395 | /* Sync config space */ |
396 | virtio_bus_get_vdev_config(&dev->bus, dev->vdev->config); |
397 | |
398 | cpu_physical_memory_write(cur_offs, |
399 | dev->vdev->config, dev->vdev->config_len); |
400 | cur_offs += dev->vdev->config_len; |
Value stored to 'cur_offs' is never read | |
401 | } |
402 | |
403 | void s390_virtio_device_update_status(VirtIOS390Device *dev) |
404 | { |
405 | VirtIODevice *vdev = dev->vdev; |
406 | uint32_t features; |
407 | |
408 | virtio_set_status(vdev, ldub_phys(dev->dev_offs + VIRTIO_DEV_OFFS_STATUS4)); |
409 | |
410 | /* Update guest supported feature bitmap */ |
411 | |
412 | features = bswap32(ldl_be_phys(dev->feat_offs)); |
413 | virtio_set_features(vdev, features); |
414 | } |
415 | |
416 | VirtIOS390Device *s390_virtio_bus_console(VirtIOS390Bus *bus) |
417 | { |
418 | return bus->console; |
419 | } |
420 | |
421 | /* Find a device by vring address */ |
422 | VirtIOS390Device *s390_virtio_bus_find_vring(VirtIOS390Bus *bus, |
423 | ram_addr_t mem, |
424 | int *vq_num) |
425 | { |
426 | BusChild *kid; |
427 | int i; |
428 | |
429 | QTAILQ_FOREACH(kid, &bus->bus.children, sibling)for ((kid) = ((&bus->bus.children)->tqh_first); (kid ); (kid) = ((kid)->sibling.tqe_next)) { |
430 | VirtIOS390Device *dev = (VirtIOS390Device *)kid->child; |
431 | |
432 | for(i = 0; i < VIRTIO_PCI_QUEUE_MAX64; i++) { |
433 | if (!virtio_queue_get_addr(dev->vdev, i)) |
434 | break; |
435 | if (virtio_queue_get_addr(dev->vdev, i) == mem) { |
436 | if (vq_num) { |
437 | *vq_num = i; |
438 | } |
439 | return dev; |
440 | } |
441 | } |
442 | } |
443 | |
444 | return NULL((void*)0); |
445 | } |
446 | |
447 | /* Find a device by device descriptor location */ |
448 | VirtIOS390Device *s390_virtio_bus_find_mem(VirtIOS390Bus *bus, ram_addr_t mem) |
449 | { |
450 | BusChild *kid; |
451 | |
452 | QTAILQ_FOREACH(kid, &bus->bus.children, sibling)for ((kid) = ((&bus->bus.children)->tqh_first); (kid ); (kid) = ((kid)->sibling.tqe_next)) { |
453 | VirtIOS390Device *dev = (VirtIOS390Device *)kid->child; |
454 | if (dev->dev_offs == mem) { |
455 | return dev; |
456 | } |
457 | } |
458 | |
459 | return NULL((void*)0); |
460 | } |
461 | |
462 | /* DeviceState to VirtIOS390Device. Note: used on datapath, |
463 | * be careful and test performance if you change this. |
464 | */ |
465 | static inline VirtIOS390Device *to_virtio_s390_device_fast(DeviceState *d) |
466 | { |
467 | return container_of(d, VirtIOS390Device, qdev)({ const typeof(((VirtIOS390Device *) 0)->qdev) *__mptr = ( d); (VirtIOS390Device *) ((char *) __mptr - __builtin_offsetof (VirtIOS390Device, qdev));}); |
468 | } |
469 | |
470 | /* DeviceState to VirtIOS390Device. TODO: use QOM. */ |
471 | static inline VirtIOS390Device *to_virtio_s390_device(DeviceState *d) |
472 | { |
473 | return container_of(d, VirtIOS390Device, qdev)({ const typeof(((VirtIOS390Device *) 0)->qdev) *__mptr = ( d); (VirtIOS390Device *) ((char *) __mptr - __builtin_offsetof (VirtIOS390Device, qdev));}); |
474 | } |
475 | |
476 | static void virtio_s390_notify(DeviceState *d, uint16_t vector) |
477 | { |
478 | VirtIOS390Device *dev = to_virtio_s390_device_fast(d); |
479 | uint64_t token = s390_virtio_device_vq_token(dev, vector); |
480 | S390CPU *cpu = s390_cpu_addr2state(0); |
481 | |
482 | s390_virtio_irq(cpu, 0, token); |
483 | } |
484 | |
485 | static unsigned virtio_s390_get_features(DeviceState *d) |
486 | { |
487 | VirtIOS390Device *dev = to_virtio_s390_device(d); |
488 | return dev->host_features; |
489 | } |
490 | |
491 | /**************** S390 Virtio Bus Device Descriptions *******************/ |
492 | |
493 | static Property s390_virtio_net_properties[] = { |
494 | DEFINE_NIC_PROPERTIES(VirtIONetS390, vdev.nic_conf){ .name = ("mac"), .info = &(qdev_prop_macaddr), .offset = __builtin_offsetof(VirtIONetS390, vdev.nic_conf.macaddr) + ( (MACAddr*)0 - (typeof(((VirtIONetS390 *)0)->vdev.nic_conf. macaddr)*)0), }, { .name = ("vlan"), .info = &(qdev_prop_vlan ), .offset = __builtin_offsetof(VirtIONetS390, vdev.nic_conf. peers) + ((NICPeers*)0 - (typeof(((VirtIONetS390 *)0)->vdev .nic_conf.peers)*)0), }, { .name = ("netdev"), .info = &( qdev_prop_netdev), .offset = __builtin_offsetof(VirtIONetS390 , vdev.nic_conf.peers) + ((NICPeers*)0 - (typeof(((VirtIONetS390 *)0)->vdev.nic_conf.peers)*)0), }, { .name = ("bootindex" ), .info = &(qdev_prop_int32), .offset = __builtin_offsetof (VirtIONetS390, vdev.nic_conf.bootindex) + ((int32_t*)0 - (typeof (((VirtIONetS390 *)0)->vdev.nic_conf.bootindex)*)0), .qtype = QTYPE_QINT, .defval = (int32_t)-1, }, |
495 | DEFINE_VIRTIO_NET_FEATURES(VirtIOS390Device, host_features){ .name = ("indirect_desc"), .info = &(qdev_prop_bit), .bitnr = (28), .offset = __builtin_offsetof(VirtIOS390Device, host_features ) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("event_idx"), .info = &(qdev_prop_bit), .bitnr = (29), . offset = __builtin_offsetof(VirtIOS390Device, host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("any_layout"), .info = &(qdev_prop_bit), .bitnr = (27), .offset = __builtin_offsetof(VirtIOS390Device, host_features ) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("csum"), .info = &(qdev_prop_bit), .bitnr = (0), .offset = __builtin_offsetof(VirtIOS390Device, host_features) + ((uint32_t *)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("guest_csum" ), .info = &(qdev_prop_bit), .bitnr = (1), .offset = __builtin_offsetof (VirtIOS390Device, host_features) + ((uint32_t*)0 - (typeof(( (VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL , .defval = (_Bool)1, }, { .name = ("gso"), .info = &(qdev_prop_bit ), .bitnr = (6), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("guest_tso4"), .info = &(qdev_prop_bit ), .bitnr = (7), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("guest_tso6"), .info = &(qdev_prop_bit ), .bitnr = (8), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("guest_ecn"), .info = &(qdev_prop_bit ), .bitnr = (9), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("guest_ufo"), .info = &(qdev_prop_bit ), .bitnr = (10), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("host_tso4"), .info = &(qdev_prop_bit ), .bitnr = (11), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("host_tso6"), .info = &(qdev_prop_bit ), .bitnr = (12), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("host_ecn"), .info = &(qdev_prop_bit ), .bitnr = (13), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("host_ufo"), .info = &(qdev_prop_bit ), .bitnr = (14), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("mrg_rxbuf"), .info = &(qdev_prop_bit ), .bitnr = (15), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("status"), .info = &(qdev_prop_bit ), .bitnr = (16), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("ctrl_vq"), .info = &(qdev_prop_bit ), .bitnr = (17), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("ctrl_rx"), .info = &(qdev_prop_bit ), .bitnr = (18), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("ctrl_vlan"), .info = &(qdev_prop_bit ), .bitnr = (19), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("ctrl_rx_extra"), .info = &(qdev_prop_bit ), .bitnr = (20), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("ctrl_mac_addr"), .info = &(qdev_prop_bit ), .bitnr = (23), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("ctrl_guest_offloads"), .info = & (qdev_prop_bit), .bitnr = (2), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("mq"), .info = &(qdev_prop_bit), .bitnr = (22), .offset = __builtin_offsetof(VirtIOS390Device , host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)0, }, |
496 | DEFINE_VIRTIO_NET_PROPERTIES(VirtIONetS390, vdev.net_conf){ .name = ("x-txtimer"), .info = &(qdev_prop_uint32), .offset = __builtin_offsetof(VirtIONetS390, vdev.net_conf.txtimer) + ((uint32_t*)0 - (typeof(((VirtIONetS390 *)0)->vdev.net_conf .txtimer)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t)150000 , }, { .name = ("x-txburst"), .info = &(qdev_prop_int32), .offset = __builtin_offsetof(VirtIONetS390, vdev.net_conf.txburst ) + ((int32_t*)0 - (typeof(((VirtIONetS390 *)0)->vdev.net_conf .txburst)*)0), .qtype = QTYPE_QINT, .defval = (int32_t)256, } , { .name = ("tx"), .info = &(qdev_prop_string), .offset = __builtin_offsetof(VirtIONetS390, vdev.net_conf.tx) + ((char **)0 - (typeof(((VirtIONetS390 *)0)->vdev.net_conf.tx)*)0) , }, |
497 | DEFINE_PROP_END_OF_LIST(){}, |
498 | }; |
499 | |
500 | static void s390_virtio_net_class_init(ObjectClass *klass, void *data) |
501 | { |
502 | DeviceClass *dc = DEVICE_CLASS(klass)((DeviceClass *)object_class_dynamic_cast_assert(((ObjectClass *)((klass))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 502, __func__)); |
503 | VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass)((VirtIOS390DeviceClass *)object_class_dynamic_cast_assert((( ObjectClass *)((klass))), ("virtio-s390-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 503, __func__)); |
504 | |
505 | k->init = s390_virtio_net_init; |
506 | dc->props = s390_virtio_net_properties; |
507 | } |
508 | |
509 | static const TypeInfo s390_virtio_net = { |
510 | .name = TYPE_VIRTIO_NET_S390"virtio-net-s390", |
511 | .parent = TYPE_VIRTIO_S390_DEVICE"virtio-s390-device", |
512 | .instance_size = sizeof(VirtIONetS390), |
513 | .instance_init = s390_virtio_net_instance_init, |
514 | .class_init = s390_virtio_net_class_init, |
515 | }; |
516 | |
517 | static Property s390_virtio_blk_properties[] = { |
518 | DEFINE_VIRTIO_BLK_PROPERTIES(VirtIOBlkS390, blk){ .name = ("drive"), .info = &(qdev_prop_drive), .offset = __builtin_offsetof(VirtIOBlkS390, blk.conf.bs) + ((BlockDriverState **)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf.bs)*)0), }, { .name = ("logical_block_size"), .info = &(qdev_prop_blocksize ), .offset = __builtin_offsetof(VirtIOBlkS390, blk.conf.logical_block_size ) + ((uint16_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf .logical_block_size)*)0), .qtype = QTYPE_QINT, .defval = (uint16_t )512, }, { .name = ("physical_block_size"), .info = &(qdev_prop_blocksize ), .offset = __builtin_offsetof(VirtIOBlkS390, blk.conf.physical_block_size ) + ((uint16_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf .physical_block_size)*)0), .qtype = QTYPE_QINT, .defval = (uint16_t )512, }, { .name = ("min_io_size"), .info = &(qdev_prop_uint16 ), .offset = __builtin_offsetof(VirtIOBlkS390, blk.conf.min_io_size ) + ((uint16_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf .min_io_size)*)0), .qtype = QTYPE_QINT, .defval = (uint16_t)0 , }, { .name = ("opt_io_size"), .info = &(qdev_prop_uint32 ), .offset = __builtin_offsetof(VirtIOBlkS390, blk.conf.opt_io_size ) + ((uint32_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf .opt_io_size)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t)0 , }, { .name = ("bootindex"), .info = &(qdev_prop_int32), .offset = __builtin_offsetof(VirtIOBlkS390, blk.conf.bootindex ) + ((int32_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf. bootindex)*)0), .qtype = QTYPE_QINT, .defval = (int32_t)-1, } , { .name = ("discard_granularity"), .info = &(qdev_prop_uint32 ), .offset = __builtin_offsetof(VirtIOBlkS390, blk.conf.discard_granularity ) + ((uint32_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf .discard_granularity)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t )-1, }, { .name = ("cyls"), .info = &(qdev_prop_uint32), . offset = __builtin_offsetof(VirtIOBlkS390, blk.conf.cyls) + ( (uint32_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf.cyls )*)0), .qtype = QTYPE_QINT, .defval = (uint32_t)0, }, { .name = ("heads"), .info = &(qdev_prop_uint32), .offset = __builtin_offsetof (VirtIOBlkS390, blk.conf.heads) + ((uint32_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf.heads)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t)0, }, { .name = ("secs"), .info = &(qdev_prop_uint32 ), .offset = __builtin_offsetof(VirtIOBlkS390, blk.conf.secs) + ((uint32_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.conf. secs)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t)0, }, { . name = ("serial"), .info = &(qdev_prop_string), .offset = __builtin_offsetof(VirtIOBlkS390, blk.serial) + ((char**)0 - (typeof(((VirtIOBlkS390 *)0)->blk.serial)*)0), }, { .name = ("config-wce"), .info = &(qdev_prop_bit), .bitnr = (0) , .offset = __builtin_offsetof(VirtIOBlkS390, blk.config_wce) + ((uint32_t*)0 - (typeof(((VirtIOBlkS390 *)0)->blk.config_wce )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("scsi"), .info = &(qdev_prop_bit), .bitnr = (0), .offset = __builtin_offsetof(VirtIOBlkS390, blk.scsi) + ((uint32_t*) 0 - (typeof(((VirtIOBlkS390 *)0)->blk.scsi)*)0), .qtype = QTYPE_QBOOL , .defval = (_Bool)1, }, |
519 | DEFINE_PROP_END_OF_LIST(){}, |
520 | }; |
521 | |
522 | static void s390_virtio_blk_class_init(ObjectClass *klass, void *data) |
523 | { |
524 | DeviceClass *dc = DEVICE_CLASS(klass)((DeviceClass *)object_class_dynamic_cast_assert(((ObjectClass *)((klass))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 524, __func__)); |
525 | VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass)((VirtIOS390DeviceClass *)object_class_dynamic_cast_assert((( ObjectClass *)((klass))), ("virtio-s390-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 525, __func__)); |
526 | |
527 | k->init = s390_virtio_blk_init; |
528 | dc->props = s390_virtio_blk_properties; |
529 | } |
530 | |
531 | static const TypeInfo s390_virtio_blk = { |
532 | .name = "virtio-blk-s390", |
533 | .parent = TYPE_VIRTIO_S390_DEVICE"virtio-s390-device", |
534 | .instance_size = sizeof(VirtIOBlkS390), |
535 | .instance_init = s390_virtio_blk_instance_init, |
536 | .class_init = s390_virtio_blk_class_init, |
537 | }; |
538 | |
539 | static Property s390_virtio_serial_properties[] = { |
540 | DEFINE_VIRTIO_SERIAL_PROPERTIES(VirtIOSerialS390, vdev.serial){ .name = ("max_ports"), .info = &(qdev_prop_uint32), .offset = __builtin_offsetof(VirtIOSerialS390, vdev.serial.max_virtserial_ports ) + ((uint32_t*)0 - (typeof(((VirtIOSerialS390 *)0)->vdev. serial.max_virtserial_ports)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t)31, }, |
541 | DEFINE_PROP_END_OF_LIST(){}, |
542 | }; |
543 | |
544 | static void s390_virtio_serial_class_init(ObjectClass *klass, void *data) |
545 | { |
546 | DeviceClass *dc = DEVICE_CLASS(klass)((DeviceClass *)object_class_dynamic_cast_assert(((ObjectClass *)((klass))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 546, __func__)); |
547 | VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass)((VirtIOS390DeviceClass *)object_class_dynamic_cast_assert((( ObjectClass *)((klass))), ("virtio-s390-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 547, __func__)); |
548 | |
549 | k->init = s390_virtio_serial_init; |
550 | dc->props = s390_virtio_serial_properties; |
551 | } |
552 | |
553 | static const TypeInfo s390_virtio_serial = { |
554 | .name = TYPE_VIRTIO_SERIAL_S390"virtio-serial-s390", |
555 | .parent = TYPE_VIRTIO_S390_DEVICE"virtio-s390-device", |
556 | .instance_size = sizeof(VirtIOSerialS390), |
557 | .instance_init = s390_virtio_serial_instance_init, |
558 | .class_init = s390_virtio_serial_class_init, |
559 | }; |
560 | |
561 | static Property s390_virtio_rng_properties[] = { |
562 | DEFINE_VIRTIO_COMMON_FEATURES(VirtIOS390Device, host_features){ .name = ("indirect_desc"), .info = &(qdev_prop_bit), .bitnr = (28), .offset = __builtin_offsetof(VirtIOS390Device, host_features ) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("event_idx"), .info = &(qdev_prop_bit), .bitnr = (29), . offset = __builtin_offsetof(VirtIOS390Device, host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, |
563 | DEFINE_VIRTIO_RNG_PROPERTIES(VirtIORNGS390, vdev.conf){ .name = ("max-bytes"), .info = &(qdev_prop_uint64), .offset = __builtin_offsetof(VirtIORNGS390, vdev.conf.max_bytes) + ( (uint64_t*)0 - (typeof(((VirtIORNGS390 *)0)->vdev.conf.max_bytes )*)0), .qtype = QTYPE_QINT, .defval = (uint64_t)(9223372036854775807L ), }, { .name = ("period"), .info = &(qdev_prop_uint32), . offset = __builtin_offsetof(VirtIORNGS390, vdev.conf.period_ms ) + ((uint32_t*)0 - (typeof(((VirtIORNGS390 *)0)->vdev.conf .period_ms)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t)1 << 16, }, |
564 | DEFINE_PROP_END_OF_LIST(){}, |
565 | }; |
566 | |
567 | static void s390_virtio_rng_class_init(ObjectClass *klass, void *data) |
568 | { |
569 | DeviceClass *dc = DEVICE_CLASS(klass)((DeviceClass *)object_class_dynamic_cast_assert(((ObjectClass *)((klass))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 569, __func__)); |
570 | VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass)((VirtIOS390DeviceClass *)object_class_dynamic_cast_assert((( ObjectClass *)((klass))), ("virtio-s390-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 570, __func__)); |
571 | |
572 | k->init = s390_virtio_rng_init; |
573 | dc->props = s390_virtio_rng_properties; |
574 | } |
575 | |
576 | static const TypeInfo s390_virtio_rng = { |
577 | .name = TYPE_VIRTIO_RNG_S390"virtio-rng-s390", |
578 | .parent = TYPE_VIRTIO_S390_DEVICE"virtio-s390-device", |
579 | .instance_size = sizeof(VirtIORNGS390), |
580 | .instance_init = s390_virtio_rng_instance_init, |
581 | .class_init = s390_virtio_rng_class_init, |
582 | }; |
583 | |
584 | static int s390_virtio_busdev_init(DeviceState *dev) |
585 | { |
586 | VirtIOS390Device *_dev = (VirtIOS390Device *)dev; |
587 | VirtIOS390DeviceClass *_info = VIRTIO_S390_DEVICE_GET_CLASS(dev)((VirtIOS390DeviceClass *)object_class_dynamic_cast_assert((( ObjectClass *)(object_get_class(((Object *)((dev)))))), ("virtio-s390-device" ), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 587, __func__)); |
588 | |
589 | virtio_s390_bus_new(&_dev->bus, sizeof(_dev->bus), _dev); |
590 | |
591 | return _info->init(_dev); |
592 | } |
593 | |
594 | static void s390_virtio_busdev_reset(DeviceState *dev) |
595 | { |
596 | VirtIOS390Device *_dev = (VirtIOS390Device *)dev; |
597 | |
598 | virtio_reset(_dev->vdev); |
599 | } |
600 | |
601 | static void virtio_s390_device_class_init(ObjectClass *klass, void *data) |
602 | { |
603 | DeviceClass *dc = DEVICE_CLASS(klass)((DeviceClass *)object_class_dynamic_cast_assert(((ObjectClass *)((klass))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 603, __func__)); |
604 | |
605 | dc->init = s390_virtio_busdev_init; |
606 | dc->bus_type = TYPE_S390_VIRTIO_BUS"s390-virtio-bus"; |
607 | dc->unplug = qdev_simple_unplug_cb; |
608 | dc->reset = s390_virtio_busdev_reset; |
609 | } |
610 | |
611 | static const TypeInfo virtio_s390_device_info = { |
612 | .name = TYPE_VIRTIO_S390_DEVICE"virtio-s390-device", |
613 | .parent = TYPE_DEVICE"device", |
614 | .instance_size = sizeof(VirtIOS390Device), |
615 | .class_init = virtio_s390_device_class_init, |
616 | .class_size = sizeof(VirtIOS390DeviceClass), |
617 | .abstract = true1, |
618 | }; |
619 | |
620 | static Property s390_virtio_scsi_properties[] = { |
621 | DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOSCSIS390, vdev.parent_obj.conf){ .name = ("num_queues"), .info = &(qdev_prop_uint32), .offset = __builtin_offsetof(VirtIOSCSIS390, vdev.parent_obj.conf.num_queues ) + ((uint32_t*)0 - (typeof(((VirtIOSCSIS390 *)0)->vdev.parent_obj .conf.num_queues)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t )1, }, { .name = ("max_sectors"), .info = &(qdev_prop_uint32 ), .offset = __builtin_offsetof(VirtIOSCSIS390, vdev.parent_obj .conf.max_sectors) + ((uint32_t*)0 - (typeof(((VirtIOSCSIS390 *)0)->vdev.parent_obj.conf.max_sectors)*)0), .qtype = QTYPE_QINT , .defval = (uint32_t)0xFFFF, }, { .name = ("cmd_per_lun"), . info = &(qdev_prop_uint32), .offset = __builtin_offsetof( VirtIOSCSIS390, vdev.parent_obj.conf.cmd_per_lun) + ((uint32_t *)0 - (typeof(((VirtIOSCSIS390 *)0)->vdev.parent_obj.conf. cmd_per_lun)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t)128 , }, |
622 | DEFINE_VIRTIO_SCSI_FEATURES(VirtIOS390Device, host_features){ .name = ("indirect_desc"), .info = &(qdev_prop_bit), .bitnr = (28), .offset = __builtin_offsetof(VirtIOS390Device, host_features ) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("event_idx"), .info = &(qdev_prop_bit), .bitnr = (29), . offset = __builtin_offsetof(VirtIOS390Device, host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("hotplug"), .info = &(qdev_prop_bit), .bitnr = (1), .offset = __builtin_offsetof(VirtIOS390Device, host_features) + ((uint32_t *)0 - (typeof(((VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("param_change" ), .info = &(qdev_prop_bit), .bitnr = (2), .offset = __builtin_offsetof (VirtIOS390Device, host_features) + ((uint32_t*)0 - (typeof(( (VirtIOS390Device *)0)->host_features)*)0), .qtype = QTYPE_QBOOL , .defval = (_Bool)1, }, |
623 | DEFINE_PROP_END_OF_LIST(){}, |
624 | }; |
625 | |
626 | static void s390_virtio_scsi_class_init(ObjectClass *klass, void *data) |
627 | { |
628 | DeviceClass *dc = DEVICE_CLASS(klass)((DeviceClass *)object_class_dynamic_cast_assert(((ObjectClass *)((klass))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 628, __func__)); |
629 | VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass)((VirtIOS390DeviceClass *)object_class_dynamic_cast_assert((( ObjectClass *)((klass))), ("virtio-s390-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 629, __func__)); |
630 | |
631 | k->init = s390_virtio_scsi_init; |
632 | dc->props = s390_virtio_scsi_properties; |
633 | } |
634 | |
635 | static const TypeInfo s390_virtio_scsi = { |
636 | .name = TYPE_VIRTIO_SCSI_S390"virtio-scsi-s390", |
637 | .parent = TYPE_VIRTIO_S390_DEVICE"virtio-s390-device", |
638 | .instance_size = sizeof(VirtIOSCSIS390), |
639 | .instance_init = s390_virtio_scsi_instance_init, |
640 | .class_init = s390_virtio_scsi_class_init, |
641 | }; |
642 | |
643 | #ifdef CONFIG_VHOST_SCSI1 |
644 | static Property s390_vhost_scsi_properties[] = { |
645 | DEFINE_VIRTIO_COMMON_FEATURES(VirtIOS390Device, host_features){ .name = ("indirect_desc"), .info = &(qdev_prop_bit), .bitnr = (28), .offset = __builtin_offsetof(VirtIOS390Device, host_features ) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, { .name = ("event_idx"), .info = &(qdev_prop_bit), .bitnr = (29), . offset = __builtin_offsetof(VirtIOS390Device, host_features) + ((uint32_t*)0 - (typeof(((VirtIOS390Device *)0)->host_features )*)0), .qtype = QTYPE_QBOOL, .defval = (_Bool)1, }, |
646 | DEFINE_VHOST_SCSI_PROPERTIES(VHostSCSIS390, vdev.parent_obj.conf){ .name = ("vhostfd"), .info = &(qdev_prop_string), .offset = __builtin_offsetof(VHostSCSIS390, vdev.parent_obj.conf.vhostfd ) + ((char**)0 - (typeof(((VHostSCSIS390 *)0)->vdev.parent_obj .conf.vhostfd)*)0), }, { .name = ("wwpn"), .info = &(qdev_prop_string ), .offset = __builtin_offsetof(VHostSCSIS390, vdev.parent_obj .conf.wwpn) + ((char**)0 - (typeof(((VHostSCSIS390 *)0)->vdev .parent_obj.conf.wwpn)*)0), }, { .name = ("num_queues"), .info = &(qdev_prop_uint32), .offset = __builtin_offsetof(VHostSCSIS390 , vdev.parent_obj.conf.num_queues) + ((uint32_t*)0 - (typeof( ((VHostSCSIS390 *)0)->vdev.parent_obj.conf.num_queues)*)0) , .qtype = QTYPE_QINT, .defval = (uint32_t)1, }, { .name = ("max_sectors" ), .info = &(qdev_prop_uint32), .offset = __builtin_offsetof (VHostSCSIS390, vdev.parent_obj.conf.max_sectors) + ((uint32_t *)0 - (typeof(((VHostSCSIS390 *)0)->vdev.parent_obj.conf.max_sectors )*)0), .qtype = QTYPE_QINT, .defval = (uint32_t)0xFFFF, }, { . name = ("cmd_per_lun"), .info = &(qdev_prop_uint32), .offset = __builtin_offsetof(VHostSCSIS390, vdev.parent_obj.conf.cmd_per_lun ) + ((uint32_t*)0 - (typeof(((VHostSCSIS390 *)0)->vdev.parent_obj .conf.cmd_per_lun)*)0), .qtype = QTYPE_QINT, .defval = (uint32_t )128, }, |
647 | DEFINE_PROP_END_OF_LIST(){}, |
648 | }; |
649 | |
650 | static void s390_vhost_scsi_class_init(ObjectClass *klass, void *data) |
651 | { |
652 | DeviceClass *dc = DEVICE_CLASS(klass)((DeviceClass *)object_class_dynamic_cast_assert(((ObjectClass *)((klass))), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 652, __func__)); |
653 | VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass)((VirtIOS390DeviceClass *)object_class_dynamic_cast_assert((( ObjectClass *)((klass))), ("virtio-s390-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 653, __func__)); |
654 | |
655 | k->init = s390_vhost_scsi_init; |
656 | dc->props = s390_vhost_scsi_properties; |
657 | } |
658 | |
659 | static const TypeInfo s390_vhost_scsi = { |
660 | .name = TYPE_VHOST_SCSI_S390"vhost-scsi-s390", |
661 | .parent = TYPE_VIRTIO_S390_DEVICE"virtio-s390-device", |
662 | .instance_size = sizeof(VHostSCSIS390), |
663 | .instance_init = s390_vhost_scsi_instance_init, |
664 | .class_init = s390_vhost_scsi_class_init, |
665 | }; |
666 | #endif |
667 | |
668 | /***************** S390 Virtio Bus Bridge Device *******************/ |
669 | /* Only required to have the virtio bus as child in the system bus */ |
670 | |
671 | static int s390_virtio_bridge_init(SysBusDevice *dev) |
672 | { |
673 | /* nothing */ |
674 | return 0; |
675 | } |
676 | |
677 | static void s390_virtio_bridge_class_init(ObjectClass *klass, void *data) |
678 | { |
679 | SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass)((SysBusDeviceClass *)object_class_dynamic_cast_assert(((ObjectClass *)((klass))), ("sys-bus-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 679, __func__)); |
680 | |
681 | k->init = s390_virtio_bridge_init; |
682 | } |
683 | |
684 | static const TypeInfo s390_virtio_bridge_info = { |
685 | .name = "s390-virtio-bridge", |
686 | .parent = TYPE_SYS_BUS_DEVICE"sys-bus-device", |
687 | .instance_size = sizeof(SysBusDevice), |
688 | .class_init = s390_virtio_bridge_class_init, |
689 | }; |
690 | |
691 | /* virtio-s390-bus */ |
692 | |
693 | static void virtio_s390_bus_new(VirtioBusState *bus, size_t bus_size, |
694 | VirtIOS390Device *dev) |
695 | { |
696 | DeviceState *qdev = DEVICE(dev)((DeviceState *)object_dynamic_cast_assert(((Object *)((dev)) ), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 696, __func__)); |
697 | BusState *qbus; |
698 | char virtio_bus_name[] = "virtio-bus"; |
699 | |
700 | qbus_create_inplace(bus, bus_size, TYPE_VIRTIO_S390_BUS"virtio-s390-bus", |
701 | qdev, virtio_bus_name); |
702 | qbus = BUS(bus)((BusState *)object_dynamic_cast_assert(((Object *)((bus))), ( "bus"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 702, __func__)); |
703 | qbus->allow_hotplug = 1; |
704 | } |
705 | |
706 | static void virtio_s390_bus_class_init(ObjectClass *klass, void *data) |
707 | { |
708 | VirtioBusClass *k = VIRTIO_BUS_CLASS(klass)((VirtioBusClass *)object_class_dynamic_cast_assert(((ObjectClass *)(klass)), ("virtio-bus"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 708, __func__)); |
709 | BusClass *bus_class = BUS_CLASS(klass)((BusClass *)object_class_dynamic_cast_assert(((ObjectClass * )((klass))), ("bus"), "/home/stefan/src/qemu/qemu.org/qemu/hw/s390x/s390-virtio-bus.c" , 709, __func__)); |
710 | bus_class->max_dev = 1; |
711 | k->notify = virtio_s390_notify; |
712 | k->get_features = virtio_s390_get_features; |
713 | } |
714 | |
715 | static const TypeInfo virtio_s390_bus_info = { |
716 | .name = TYPE_VIRTIO_S390_BUS"virtio-s390-bus", |
717 | .parent = TYPE_VIRTIO_BUS"virtio-bus", |
718 | .instance_size = sizeof(VirtioS390BusState), |
719 | .class_init = virtio_s390_bus_class_init, |
720 | }; |
721 | |
722 | static void s390_virtio_register_types(void) |
723 | { |
724 | type_register_static(&virtio_s390_bus_info); |
725 | type_register_static(&s390_virtio_bus_info); |
726 | type_register_static(&virtio_s390_device_info); |
727 | type_register_static(&s390_virtio_serial); |
728 | type_register_static(&s390_virtio_blk); |
729 | type_register_static(&s390_virtio_net); |
730 | type_register_static(&s390_virtio_scsi); |
731 | #ifdef CONFIG_VHOST_SCSI1 |
732 | type_register_static(&s390_vhost_scsi); |
733 | #endif |
734 | type_register_static(&s390_virtio_rng); |
735 | type_register_static(&s390_virtio_bridge_info); |
736 | } |
737 | |
738 | type_init(s390_virtio_register_types)static void __attribute__((constructor)) do_qemu_init_s390_virtio_register_types (void) { register_module_init(s390_virtio_register_types, MODULE_INIT_QOM ); } |