timerdev = DEVICE(&(s->timer[i])); qdev_prop_set_uint64(timerdev, "clock-frequency", 1000000000); object_property_set_bool(OBJECT(&s->timer[i]), true, "realized", &err); if (err != NULL) { error_propagate(errp, err); return; } timerbusdev = SYS_BUS_DEVICE(timerdev); sysbus_mmio_map(timerbusdev, 0, timer_addr[i]); sysbus_connect_irq(timerbusdev, 0, qdev_get_gpio_in(nvic, timer_irq[i])); } } static Property stm32f205_soc_properties[] = { DEFINE_PROP_STRING("kernel-filename", STM32F205State, kernel_filename), DEFINE_PROP_STRING("cpu-model", STM32F205State, cpu_model), DEFINE_PROP_END_OF_LIST(), }; static void stm32f205_soc_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); dc->realize = stm32f205_soc_realize; dc->props = stm32f205_soc_properties; } static const TypeInfo stm32f205_soc_info = { .name = TYPE_STM32F205_SOC, .parent = TYPE_SYS_BUS_DEVICE,
qdev_get_gpio_in(DEVICE(&s->cpus[n]), ARM_CPU_FIQ)); /* Connect timers from the CPU to the interrupt controller */ qdev_connect_gpio_out(DEVICE(&s->cpus[n]), GTIMER_PHYS, qdev_get_gpio_in_named(DEVICE(&s->control), "cntpnsirq", n)); qdev_connect_gpio_out(DEVICE(&s->cpus[n]), GTIMER_VIRT, qdev_get_gpio_in_named(DEVICE(&s->control), "cntvirq", n)); qdev_connect_gpio_out(DEVICE(&s->cpus[n]), GTIMER_HYP, qdev_get_gpio_in_named(DEVICE(&s->control), "cnthpirq", n)); qdev_connect_gpio_out(DEVICE(&s->cpus[n]), GTIMER_SEC, qdev_get_gpio_in_named(DEVICE(&s->control), "cntpsirq", n)); } } static Property bcm2836_props[] = { DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type), DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS), DEFINE_PROP_END_OF_LIST() }; static void bcm2836_class_init(ObjectClass *oc, void *data) { DeviceClass *dc = DEVICE_CLASS(oc); dc->props = bcm2836_props; dc->realize = bcm2836_realize; } static const TypeInfo bcm2836_type_info = { .name = TYPE_BCM2836, .parent = TYPE_SYS_BUS_DEVICE,
vdev->nvectors = proxy->nvectors; virtio_init_pci(proxy, vdev); /* make the actual value visible */ proxy->nvectors = vdev->nvectors; return 0; } static PCIDeviceInfo virtio_9p_info = { .qdev.name = "virtio-9p-pci", .qdev.size = sizeof(VirtIOPCIProxy), .init = virtio_9p_init_pci, .vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET, .device_id = 0x1009, .revision = VIRTIO_PCI_ABI_VERSION, .class_id = 0x2, .qdev.props = (Property[]) { DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2), DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features), DEFINE_PROP_STRING("mount_tag", VirtIOPCIProxy, fsconf.tag), DEFINE_PROP_STRING("fsdev", VirtIOPCIProxy, fsconf.fsdev_id), DEFINE_PROP_END_OF_LIST(), } }; static void virtio_9p_register_devices(void) { pci_qdev_register(&virtio_9p_info); } device_init(virtio_9p_register_devices)
}; static GoldfishDeviceInfo goldfish_battery_info = { .init = goldfish_battery_init, .readfn = goldfish_battery_readfn, .writefn = goldfish_battery_writefn, .qdev.name = "goldfish-battery", .qdev.size = sizeof(GoldfishBatteryDevice), .qdev.vmsd = &vmstate_goldfish_battery, .qdev.props = (Property[]) { DEFINE_PROP_UINT32("base", GoldfishDevice, base, 0), DEFINE_PROP_UINT32("id", GoldfishDevice, id, 0), DEFINE_PROP_UINT32("size", GoldfishDevice, size, 0x1000), DEFINE_PROP_UINT32("irq", GoldfishDevice, irq, 0), DEFINE_PROP_UINT32("irq_count", GoldfishDevice, irq_count, 1), DEFINE_PROP_INT32("ac_online", GoldfishBatteryDevice, ac_online, 1), DEFINE_PROP_INT32("status", GoldfishBatteryDevice, status, POWER_SUPPLY_STATUS_CHARGING), DEFINE_PROP_INT32("health", GoldfishBatteryDevice, health, POWER_SUPPLY_HEALTH_GOOD), DEFINE_PROP_INT32("present", GoldfishBatteryDevice, present, 1), // battery is present DEFINE_PROP_INT32("capacity", GoldfishBatteryDevice, capacity, 50), // 50% charged DEFINE_PROP_STRING("name", GoldfishDevice, name), DEFINE_PROP_END_OF_LIST(), }, }; static void goldfish_battery_register(void) { goldfish_bus_register_withprop(&goldfish_battery_info); } device_init(goldfish_battery_register);
port->info->have_data = NULL; qemu_chr_close(vcon->chr); } return 0; } static VirtIOSerialPortInfo virtconsole_info = { .qdev.name = "virtconsole", .qdev.size = sizeof(VirtConsole), .init = virtconsole_initfn, .exit = virtconsole_exitfn, .qdev.props = (Property[]) { DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1), DEFINE_PROP_CHR("chardev", VirtConsole, chr), DEFINE_PROP_STRING("name", VirtConsole, port.name), DEFINE_PROP_END_OF_LIST(), }, }; static void virtconsole_register(void) { virtio_serial_port_qdev_register(&virtconsole_info); } device_init(virtconsole_register) /* Generic Virtio Serial Ports */ static int virtserialport_initfn(VirtIOSerialDevice *dev) { VirtIOSerialPort *port = DO_UPCAST(VirtIOSerialPort, dev, &dev->qdev); VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
if (event->value) { vhid->ledstate |= ledbit; } else { vhid->ledstate &= ~ledbit; } kbd_put_ledstate(vhid->ledstate); break; default: fprintf(stderr, "%s: unknown type %d\n", __func__, le16_to_cpu(event->type)); break; } } static Property virtio_input_hid_properties[] = { DEFINE_PROP_STRING("display", VirtIOInputHID, display), DEFINE_PROP_UINT32("head", VirtIOInputHID, head, 0), DEFINE_PROP_END_OF_LIST(), }; static void virtio_input_hid_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass); dc->props = virtio_input_hid_properties; vic->realize = virtio_input_hid_realize; vic->unrealize = virtio_input_hid_unrealize; vic->change_active = virtio_input_hid_change_active; vic->handle_status = virtio_input_hid_handle_status; }
out_err: error_propagate(errp, local_err); } static void vfio_ap_unrealize(DeviceState *dev, Error **errp) { APDevice *apdev = AP_DEVICE(dev); VFIOAPDevice *vapdev = VFIO_AP_DEVICE(apdev); VFIOGroup *group = vapdev->vdev.group; vfio_ap_put_device(vapdev); vfio_put_group(group); } static Property vfio_ap_properties[] = { DEFINE_PROP_STRING("sysfsdev", VFIOAPDevice, vdev.sysfsdev), DEFINE_PROP_END_OF_LIST(), }; static void vfio_ap_reset(DeviceState *dev) { int ret; APDevice *apdev = AP_DEVICE(dev); VFIOAPDevice *vapdev = VFIO_AP_DEVICE(apdev); ret = ioctl(vapdev->vdev.fd, VFIO_DEVICE_RESET); if (ret) { error_report("%s: failed to reset %s device: %s", __func__, vapdev->vdev.name, strerror(errno)); } }
{ VirtIODevice *vdev; SyborgVirtIOProxy *proxy = FROM_SYSBUS(SyborgVirtIOProxy, dev); vdev = virtio_net_init(&dev->qdev, &proxy->nic, &proxy->net); return syborg_virtio_init(proxy, vdev); } static SysBusDeviceInfo syborg_virtio_net_info = { .init = syborg_virtio_net_init, .qdev.name = "syborg,virtio-net", .qdev.size = sizeof(SyborgVirtIOProxy), .qdev.props = (Property[]) { DEFINE_NIC_PROPERTIES(SyborgVirtIOProxy, nic), DEFINE_VIRTIO_NET_FEATURES(SyborgVirtIOProxy, host_features), DEFINE_PROP_UINT32("x-txtimer", SyborgVirtIOProxy, net.txtimer, TX_TIMER_INTERVAL), DEFINE_PROP_INT32("x-txburst", SyborgVirtIOProxy, net.txburst, TX_BURST), DEFINE_PROP_STRING("tx", SyborgVirtIOProxy, net.tx), DEFINE_PROP_END_OF_LIST(), } }; static void syborg_virtio_register_devices(void) { sysbus_register_withprop(&syborg_virtio_net_info); } device_init(syborg_virtio_register_devices)
{ VirtIODevice *vdev = VIRTIO_DEVICE(dev); VHostVSock *vsock = VHOST_VSOCK(dev); vhost_vsock_post_load_timer_cleanup(vsock); /* This will stop vhost backend if appropriate. */ vhost_vsock_set_status(vdev, 0); vhost_dev_cleanup(&vsock->vhost_dev); virtio_cleanup(vdev); } static Property vhost_vsock_properties[] = { DEFINE_PROP_UINT64("guest-cid", VHostVSock, conf.guest_cid, 0), DEFINE_PROP_STRING("vhostfd", VHostVSock, conf.vhostfd), DEFINE_PROP_END_OF_LIST(), }; static void vhost_vsock_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); dc->props = vhost_vsock_properties; dc->vmsd = &vmstate_virtio_vhost_vsock; set_bit(DEVICE_CATEGORY_MISC, dc->categories); vdc->realize = vhost_vsock_device_realize; vdc->unrealize = vhost_vsock_device_unrealize; vdc->get_features = vhost_vsock_get_features; vdc->get_config = vhost_vsock_get_config;
* are enabled */ DEFINE_PROP_UINT8("use-fpu", MicroBlazeCPU, cfg.use_fpu, 2), /* If use-hw-mul > 0 - Multiplier is enabled * If use-hw-mul = 2 - 64-bit multiplier is enabled */ DEFINE_PROP_UINT8("use-hw-mul", MicroBlazeCPU, cfg.use_hw_mul, 2), DEFINE_PROP_BOOL("use-barrel", MicroBlazeCPU, cfg.use_barrel, true), DEFINE_PROP_BOOL("use-div", MicroBlazeCPU, cfg.use_div, true), DEFINE_PROP_BOOL("use-msr-instr", MicroBlazeCPU, cfg.use_msr_instr, true), DEFINE_PROP_BOOL("use-pcmp-instr", MicroBlazeCPU, cfg.use_pcmp_instr, true), DEFINE_PROP_BOOL("use-mmu", MicroBlazeCPU, cfg.use_mmu, true), DEFINE_PROP_BOOL("dcache-writeback", MicroBlazeCPU, cfg.dcache_writeback, false), DEFINE_PROP_BOOL("endianness", MicroBlazeCPU, cfg.endi, false), DEFINE_PROP_STRING("version", MicroBlazeCPU, cfg.version), DEFINE_PROP_UINT8("pvr", MicroBlazeCPU, cfg.pvr, C_PVR_FULL), DEFINE_PROP_END_OF_LIST(), }; static ObjectClass *mb_cpu_class_by_name(const char *cpu_model) { return object_class_by_name(TYPE_MICROBLAZE_CPU); } static void mb_cpu_class_init(ObjectClass *oc, void *data) { DeviceClass *dc = DEVICE_CLASS(oc); CPUClass *cc = CPU_CLASS(oc); MicroBlazeCPUClass *mcc = MICROBLAZE_CPU_CLASS(oc);
{ VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d); virtio_reset(dev->vdev); css_reset_sch(dev->sch); } /**************** Virtio-ccw Bus Device Descriptions *******************/ static const VirtIOBindings virtio_ccw_bindings = { .notify = virtio_ccw_notify, .get_features = virtio_ccw_get_features, }; static Property virtio_ccw_net_properties[] = { DEFINE_PROP_STRING("devno", VirtioCcwDevice, bus_id), DEFINE_VIRTIO_NET_FEATURES(VirtioCcwDevice, host_features[0]), DEFINE_NIC_PROPERTIES(VirtioCcwDevice, nic), DEFINE_PROP_UINT32("x-txtimer", VirtioCcwDevice, net.txtimer, TX_TIMER_INTERVAL), DEFINE_PROP_INT32("x-txburst", VirtioCcwDevice, net.txburst, TX_BURST), DEFINE_PROP_STRING("tx", VirtioCcwDevice, net.tx), DEFINE_PROP_END_OF_LIST(), }; static void virtio_ccw_net_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
create_unimplemented_device("i2c_1", 0x40012000, 0x1000); create_unimplemented_device("gpio", 0x40013000, 0x1000); create_unimplemented_device("hs-dma", 0x40014000, 0x1000); create_unimplemented_device("can", 0x40015000, 0x1000); create_unimplemented_device("rtc", 0x40017000, 0x1000); create_unimplemented_device("apb_config", 0x40020000, 0x10000); create_unimplemented_device("emac", 0x40041000, 0x1000); create_unimplemented_device("usb", 0x40043000, 0x1000); } static Property m2sxxx_soc_properties[] = { /* * part name specifies the type of SmartFusion2 device variant(this * property is for information purpose only. */ DEFINE_PROP_STRING("cpu-type", MSF2State, cpu_type), DEFINE_PROP_STRING("part-name", MSF2State, part_name), DEFINE_PROP_UINT64("eNVM-size", MSF2State, envm_size, MSF2_ENVM_MAX_SIZE), DEFINE_PROP_UINT64("eSRAM-size", MSF2State, esram_size, MSF2_ESRAM_MAX_SIZE), /* Libero GUI shows 100Mhz as default for clocks */ DEFINE_PROP_UINT32("m3clk", MSF2State, m3clk, 100 * 1000000), /* default divisors in Libero GUI */ DEFINE_PROP_UINT8("apb0div", MSF2State, apb0div, 2), DEFINE_PROP_UINT8("apb1div", MSF2State, apb1div, 2), DEFINE_PROP_END_OF_LIST(), }; static void m2sxxx_soc_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass);
goto assign_error; } } return 0; assign_error: while (--n >= 0) { virtio_ccw_set_guest_notifier(dev, n, !assigned, false); } return r; } /**************** Virtio-ccw Bus Device Descriptions *******************/ static Property virtio_ccw_net_properties[] = { DEFINE_PROP_STRING("devno", VirtioCcwDevice, bus_id), DEFINE_VIRTIO_NET_FEATURES(VirtioCcwDevice, host_features[0]), DEFINE_VIRTIO_NET_PROPERTIES(VirtIONetCcw, vdev.net_conf), DEFINE_NIC_PROPERTIES(VirtIONetCcw, vdev.nic_conf), DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags, VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true), DEFINE_PROP_END_OF_LIST(), }; static void virtio_ccw_net_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass); k->init = virtio_ccw_net_init; k->exit = virtio_ccw_exit;
file = fopen(s->filename, "rb"); if (file) { /* Read nvram contents */ if (fread(s->contents, s->chip_size, 1, file) != 1) { printf("nvram_sysbus_initfn: short read\n"); } fclose(file); } nvram_post_load(s, 0); return 0; } static Property nvram_sysbus_properties[] = { DEFINE_PROP_UINT32("size", SysBusNvRamState, nvram.chip_size, 0x2000), DEFINE_PROP_STRING("filename", SysBusNvRamState, nvram.filename), DEFINE_PROP_END_OF_LIST(), }; static void nvram_sysbus_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); k->init = nvram_sysbus_initfn; dc->vmsd = &vmstate_nvram; dc->props = nvram_sysbus_properties; } static const TypeInfo nvram_sysbus_info = { .name = "ds1225y",
dprintf(svc, 1, "%s\n", __func__); vmc_unregister_interface(svc); qemu_del_vm_change_state_handler(svc->vmstate); virtio_serial_close(port); return 0; } static VirtIOSerialPortInfo vmc_info = { .qdev.name = VMC_DEVICE_NAME, .qdev.size = sizeof(SpiceVirtualChannel), .init = vmc_initfn, .exit = vmc_exitfn, .guest_open = vmc_guest_open, .guest_close = vmc_guest_close, .guest_ready = vmc_guest_ready, .have_data = vmc_have_data, .qdev.props = (Property[]) { DEFINE_PROP_UINT32("nr", SpiceVirtualChannel, port.id, VIRTIO_CONSOLE_BAD_ID), DEFINE_PROP_UINT32("debug", SpiceVirtualChannel, debug, 1), DEFINE_PROP_STRING("subtype", SpiceVirtualChannel, subtype), DEFINE_PROP_END_OF_LIST(), } }; static void vmc_register(void) { virtio_serial_port_qdev_register(&vmc_info); } device_init(vmc_register)
object_property_set_link(OBJECT(&s->gcr), OBJECT(&s->gic.mr), "gic", &err); object_property_set_link(OBJECT(&s->gcr), OBJECT(&s->cpc.mr), "cpc", &err); object_property_set_bool(OBJECT(&s->gcr), true, "realized", &err); if (err != NULL) { error_propagate(errp, err); return; } memory_region_add_subregion(&s->container, gcr_base, sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->gcr), 0)); } static Property mips_cps_properties[] = { DEFINE_PROP_UINT32("num-vp", MIPSCPSState, num_vp, 1), DEFINE_PROP_UINT32("num-irq", MIPSCPSState, num_irq, 256), DEFINE_PROP_STRING("cpu-type", MIPSCPSState, cpu_type), DEFINE_PROP_END_OF_LIST() }; static void mips_cps_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); dc->realize = mips_cps_realize; dc->props = mips_cps_properties; } static const TypeInfo mips_cps_info = { .name = TYPE_MIPS_CPS, .parent = TYPE_SYS_BUS_DEVICE, .instance_size = sizeof(MIPSCPSState),
return; } if (s->name == NULL) { error_setg(errp, "property 'name' not specified"); return; } memory_region_init_io(&s->iomem, OBJECT(s), &unimp_ops, s, s->name, s->size); sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem); } static Property unimp_properties[] = { DEFINE_PROP_UINT64("size", UnimplementedDeviceState, size, 0), DEFINE_PROP_STRING("name", UnimplementedDeviceState, name), DEFINE_PROP_END_OF_LIST(), }; static void unimp_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); dc->realize = unimp_realize; dc->props = unimp_properties; } static const TypeInfo unimp_info = { .name = TYPE_UNIMPLEMENTED_DEVICE, .parent = TYPE_SYS_BUS_DEVICE, .instance_size = sizeof(UnimplementedDeviceState),
}; static GoldfishDeviceInfo goldfish_nand_info = { .init = goldfish_nand_init, .readfn = nand_dev_readfn, .writefn = nand_dev_writefn, .qdev.name = "goldfish_nand", .qdev.size = sizeof(GoldfishNandDevice), .qdev.vmsd = &vmstate_goldfish_nand, .qdev.props = (Property[]) { DEFINE_PROP_UINT32("base", GoldfishDevice, base, 0), DEFINE_PROP_UINT32("id", GoldfishDevice, id, 0), DEFINE_PROP_UINT32("size", GoldfishDevice, size, 0x1000), DEFINE_PROP_UINT32("irq", GoldfishDevice, irq, 0), DEFINE_PROP_UINT32("irq_count", GoldfishDevice, irq_count, 1), DEFINE_PROP_STRING("name", GoldfishDevice, name), DEFINE_PROP_STRING("system_path", GoldfishNandDevice, system_path), DEFINE_PROP_STRING("system_init_path", GoldfishNandDevice, system_init_path), DEFINE_PROP_UINT64("system_size", GoldfishNandDevice, system_size, 0x7100000), DEFINE_PROP_STRING("user_data_path", GoldfishNandDevice, user_data_path), DEFINE_PROP_STRING("user_data_init_path", GoldfishNandDevice, user_data_init_path), DEFINE_PROP_UINT64("user_data_size", GoldfishNandDevice, user_data_size, 0x5000000), DEFINE_PROP_STRING("cache_path", GoldfishNandDevice, cache_path), DEFINE_PROP_UINT64("cache_size", GoldfishNandDevice, cache_size, 0x4200000), DEFINE_PROP_END_OF_LIST(), }, }; static void goldfish_nand_register(void) { goldfish_bus_register_withprop(&goldfish_nand_info);
} v9fs_path_free(&path); register_savevm(dev, "virtio-9p", -1, 1, virtio_9p_save, virtio_9p_load, s); return; out: g_free(s->ctx.fs_root); g_free(s->tag); virtio_cleanup(vdev); v9fs_path_free(&path); } /* virtio-9p device */ static Property virtio_9p_properties[] = { DEFINE_PROP_STRING("mount_tag", V9fsState, fsconf.tag), DEFINE_PROP_STRING("fsdev", V9fsState, fsconf.fsdev_id), DEFINE_PROP_END_OF_LIST(), }; static void virtio_9p_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); dc->props = virtio_9p_properties; set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); vdc->realize = virtio_9p_device_realize; vdc->get_features = virtio_9p_get_features; vdc->get_config = virtio_9p_get_config; }
.fields = (VMStateField[]) { VMSTATE_PCI_DEVICE(parent_obj, IVShmemState), VMSTATE_MSIX_TEST(parent_obj, IVShmemState, test_msix), VMSTATE_UINT32_TEST(intrstatus, IVShmemState, test_no_msix), VMSTATE_UINT32_TEST(intrmask, IVShmemState, test_no_msix), VMSTATE_END_OF_LIST() }, .load_state_old = ivshmem_load_old, .minimum_version_id_old = 0 }; static Property ivshmem_properties[] = { DEFINE_PROP_CHR("chardev", IVShmemState, server_chr), DEFINE_PROP_STRING("size", IVShmemState, sizearg), DEFINE_PROP_UINT32("vectors", IVShmemState, vectors, 1), DEFINE_PROP_BIT("ioeventfd", IVShmemState, features, IVSHMEM_IOEVENTFD, false), DEFINE_PROP_BIT("msi", IVShmemState, features, IVSHMEM_MSI, true), DEFINE_PROP_STRING("shm", IVShmemState, shmobj), DEFINE_PROP_STRING("role", IVShmemState, role), DEFINE_PROP_UINT32("use64", IVShmemState, not_legacy_32bit, 1), DEFINE_PROP_END_OF_LIST(), }; static void desugar_shm(IVShmemState *s) { Object *obj; char *path;
typedef struct IDEDrive { IDEDevice dev; } IDEDrive; static int ide_drive_initfn(IDEDevice *dev) { IDEBus *bus = DO_UPCAST(IDEBus, qbus, dev->qdev.parent_bus); ide_init_drive(bus->ifs + dev->unit, dev->conf.dinfo, &dev->conf, dev->version); return 0; } static IDEDeviceInfo ide_drive_info = { .qdev.name = "ide-drive", .qdev.size = sizeof(IDEDrive), .init = ide_drive_initfn, .qdev.props = (Property[]) { DEFINE_PROP_UINT32("unit", IDEDrive, dev.unit, -1), DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf), DEFINE_PROP_STRING("ver", IDEDrive, dev.version), DEFINE_PROP_END_OF_LIST(), } }; static void ide_drive_register(void) { ide_qdev_register(&ide_drive_info); } device_init(ide_drive_register);
timer_del(s->eof_timer); timer_free(s->eof_timer); } static void usb_ohci_reset_pci(DeviceState *d) { PCIDevice *dev = PCI_DEVICE(d); OHCIPCIState *ohci = PCI_OHCI(dev); OHCIState *s = &ohci->state; ohci_hard_reset(s); } static Property ohci_pci_properties[] = { DEFINE_PROP_STRING("masterbus", OHCIPCIState, masterbus), DEFINE_PROP_UINT32("num-ports", OHCIPCIState, num_ports, 3), DEFINE_PROP_UINT32("firstport", OHCIPCIState, firstport, 0), DEFINE_PROP_END_OF_LIST(), }; static const VMStateDescription vmstate_ohci = { .name = "ohci", .version_id = 1, .minimum_version_id = 1, .fields = (VMStateField[]) { VMSTATE_PCI_DEVICE(parent_obj, OHCIPCIState), VMSTATE_STRUCT(state, OHCIPCIState, 1, vmstate_ohci_state, OHCIState), VMSTATE_END_OF_LIST() } };
} /* virtio-9p device */ static const VMStateDescription vmstate_virtio_9p = { .name = "virtio-9p", .minimum_version_id = 1, .version_id = 1, .fields = (VMStateField[]) { VMSTATE_VIRTIO_DEVICE, VMSTATE_END_OF_LIST() }, }; static Property virtio_9p_properties[] = { DEFINE_PROP_STRING("mount_tag", V9fsVirtioState, state.fsconf.tag), DEFINE_PROP_STRING("fsdev", V9fsVirtioState, state.fsconf.fsdev_id), DEFINE_PROP_END_OF_LIST(), }; static void virtio_9p_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); dc->props = virtio_9p_properties; dc->vmsd = &vmstate_virtio_9p; set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); vdc->realize = virtio_9p_device_realize; vdc->unrealize = virtio_9p_device_unrealize; vdc->get_features = virtio_9p_get_features;
} } /* * Don't ever use the migrated values, they could come from a different * BIOS and therefore don't work. But still migrate the values, so * QEMUs relying on it don't break. */ ipl->compat_start_addr = ipl->start_addr; ipl->compat_bios_start_addr = ipl->bios_start_addr; qemu_register_reset(qdev_reset_all_fn, dev); error: error_propagate(errp, err); } static Property s390_ipl_properties[] = { DEFINE_PROP_STRING("kernel", S390IPLState, kernel), DEFINE_PROP_STRING("initrd", S390IPLState, initrd), DEFINE_PROP_STRING("cmdline", S390IPLState, cmdline), DEFINE_PROP_STRING("firmware", S390IPLState, firmware), DEFINE_PROP_STRING("netboot_fw", S390IPLState, netboot_fw), DEFINE_PROP_BOOL("enforce_bios", S390IPLState, enforce_bios, false), DEFINE_PROP_BOOL("iplbext_migration", S390IPLState, iplbext_migration, true), DEFINE_PROP_END_OF_LIST(), }; static void s390_ipl_set_boot_menu(S390IPLState *ipl) { QemuOptsList *plist = qemu_find_opts("boot-opts"); QemuOpts *opts = QTAILQ_FIRST(&plist->head); uint8_t *flags = &ipl->qipl.qipl_flags;
tis->loc[c].r_offset = 0; s->be_driver->ops->realloc_buffer(&tis->loc[c].r_buffer); } tpm_tis_do_startup_tpm(s); } static const VMStateDescription vmstate_tpm_tis = { .name = "tpm", .unmigratable = 1, }; static Property tpm_tis_properties[] = { DEFINE_PROP_UINT32("irq", TPMState, s.tis.irq_num, TPM_TIS_IRQ), DEFINE_PROP_STRING("tpmdev", TPMState, backend), DEFINE_PROP_END_OF_LIST(), }; static void tpm_tis_realizefn(DeviceState *dev, Error **errp) { TPMState *s = TPM(dev); TPMTISEmuState *tis = &s->s.tis; s->be_driver = qemu_find_tpm(s->backend); if (!s->be_driver) { error_setg(errp, "tpm_tis: backend driver with id %s could not be " "found", s->backend); return; }
} } static void generic_loader_unrealize(DeviceState *dev, Error **errp) { qemu_unregister_reset_loader(generic_loader_reset, dev); } static Property generic_loader_props[] = { DEFINE_PROP_UINT64("addr", GenericLoaderState, addr, 0), DEFINE_PROP_UINT64("data", GenericLoaderState, data, 0), DEFINE_PROP_UINT8("data-len", GenericLoaderState, data_len, 0), DEFINE_PROP_BOOL("data-be", GenericLoaderState, data_be, false), DEFINE_PROP_UINT32("cpu-num", GenericLoaderState, cpu_num, CPU_NONE), DEFINE_PROP_BOOL("force-raw", GenericLoaderState, force_raw, false), DEFINE_PROP_STRING("file", GenericLoaderState, file), DEFINE_PROP_UINT16("attrs-requester-id", GenericLoaderState, attrs.requester_id, 0), DEFINE_PROP_BOOL("attrs-debug", GenericLoaderState, attrs.debug, false), DEFINE_PROP_BOOL("attrs-secure", GenericLoaderState, attrs.secure, false), DEFINE_PROP_END_OF_LIST(), }; static void generic_loader_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); /* The reset function is not registered here and is instead registered in * the realize function to allow this device to be added via the device_add * command in the QEMU monitor. * TODO: Improve the device_add functionality to allow resets to be
} if (!dev->serial) { dev->serial = qemu_strdup(s->drive_serial_str); } add_boot_device_path(dev->conf.bootindex, &dev->qdev, dev->unit ? "/disk@1" : "/disk@0"); return 0; } static IDEDeviceInfo ide_drive_info = { .qdev.name = "ide-drive", .qdev.fw_name = "drive", .qdev.size = sizeof(IDEDrive), .init = ide_drive_initfn, .qdev.props = (Property[]) { DEFINE_PROP_UINT32("unit", IDEDrive, dev.unit, -1), DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf), DEFINE_PROP_STRING("ver", IDEDrive, dev.version), DEFINE_PROP_STRING("serial", IDEDrive, dev.serial), DEFINE_PROP_END_OF_LIST(), } }; static void ide_drive_register(void) { ide_qdev_register(&ide_drive_info); } device_init(ide_drive_register);
/* * Implementation of an interface to adjust firmware path * for the bootindex property handling. */ static char *vhost_scsi_get_fw_dev_path(FWPathProvider *p, BusState *bus, DeviceState *dev) { VHostSCSI *s = VHOST_SCSI(dev); /* format: channel@channel/vhost-scsi@target,lun */ return g_strdup_printf("/channel@%x/%s@%x,%x", s->channel, qdev_fw_name(dev), s->target, s->lun); } static Property vhost_scsi_properties[] = { DEFINE_PROP_STRING("vhostfd", VHostSCSI, parent_obj.conf.vhostfd), DEFINE_PROP_STRING("wwpn", VHostSCSI, parent_obj.conf.wwpn), DEFINE_PROP_UINT32("boot_tpgt", VHostSCSI, parent_obj.conf.boot_tpgt, 0), DEFINE_PROP_UINT32("num_queues", VHostSCSI, parent_obj.conf.num_queues, 1), DEFINE_PROP_UINT32("max_sectors", VHostSCSI, parent_obj.conf.max_sectors, 0xFFFF), DEFINE_PROP_UINT32("cmd_per_lun", VHostSCSI, parent_obj.conf.cmd_per_lun, 128), DEFINE_PROP_END_OF_LIST(), }; static void vhost_scsi_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); FWPathProviderClass *fwc = FW_PATH_PROVIDER_CLASS(klass);
object_property_set_int(OBJECT(&s->gcr), gcr_base, "gcr-base", &err); object_property_set_link(OBJECT(&s->gcr), OBJECT(&s->cpc.mr), "cpc", &err); object_property_set_bool(OBJECT(&s->gcr), true, "realized", &err); if (err != NULL) { error_propagate(errp, err); return; } memory_region_add_subregion(&s->container, gcr_base, sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->gcr), 0)); } static Property mips_cps_properties[] = { DEFINE_PROP_UINT32("num-vp", MIPSCPSState, num_vp, 1), DEFINE_PROP_UINT32("num-irq", MIPSCPSState, num_irq, 8), DEFINE_PROP_STRING("cpu-model", MIPSCPSState, cpu_model), DEFINE_PROP_END_OF_LIST() }; static void mips_cps_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); dc->realize = mips_cps_realize; dc->props = mips_cps_properties; } static const TypeInfo mips_cps_info = { .name = TYPE_MIPS_CPS, .parent = TYPE_SYS_BUS_DEVICE, .instance_size = sizeof(MIPSCPSState),