diff options
| -rw-r--r-- | VERSION | 2 | ||||
| -rw-r--r-- | arch_init.c | 12 | ||||
| -rwxr-xr-x | configure | 9 | ||||
| -rw-r--r-- | hw/acpi/aml-build.c | 2 | ||||
| -rw-r--r-- | hw/char/virtio-serial-bus.c | 4 | ||||
| -rw-r--r-- | hw/core/machine.c | 1 | ||||
| -rw-r--r-- | hw/net/virtio-net.c | 7 | ||||
| -rw-r--r-- | hw/ppc/mac_newworld.c | 2 | ||||
| -rw-r--r-- | hw/ppc/spapr.c | 40 | ||||
| -rw-r--r-- | include/hw/boards.h | 1 | ||||
| -rw-r--r-- | migration/rdma.c | 22 | ||||
| -rw-r--r-- | pc-bios/README | 2 | ||||
| -rw-r--r-- | pc-bios/slof.bin | bin | 911704 -> 912192 bytes | |||
| m--------- | roms/SLOF | 0 | ||||
| -rw-r--r-- | target-ppc/cpu-models.c | 6 | ||||
| -rw-r--r-- | target-ppc/cpu-models.h | 1 | ||||
| -rw-r--r-- | vl.c | 4 |
17 files changed, 73 insertions, 42 deletions
diff --git a/VERSION b/VERSION index 6f898f54a5..1a848c1af0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2.90 +2.2.91 diff --git a/arch_init.c b/arch_init.c index fcfa32828d..4c8fceed95 100644 --- a/arch_init.c +++ b/arch_init.c @@ -332,19 +332,14 @@ static size_t save_page_header(QEMUFile *f, RAMBlock *block, ram_addr_t offset) { size_t size; - if (block == last_sent_block) { - offset |= RAM_SAVE_FLAG_CONTINUE; - } - qemu_put_be64(f, offset); size = 8; - if (block != last_sent_block) { + if (!(offset & RAM_SAVE_FLAG_CONTINUE)) { qemu_put_byte(f, strlen(block->idstr)); qemu_put_buffer(f, (uint8_t *)block->idstr, strlen(block->idstr)); size += 1 + strlen(block->idstr); - last_sent_block = block; } return size; } @@ -644,6 +639,10 @@ static int ram_save_page(QEMUFile *f, RAMBlock* block, ram_addr_t offset, XBZRLE_cache_lock(); current_addr = block->offset + offset; + + if (block == last_sent_block) { + offset |= RAM_SAVE_FLAG_CONTINUE; + } if (ret != RAM_SAVE_CONTROL_NOT_SUPP) { if (ret != RAM_SAVE_CONTROL_DELAYED) { if (bytes_xmit > 0) { @@ -739,6 +738,7 @@ static int ram_find_and_save_block(QEMUFile *f, bool last_stage, /* if page is unmodified, continue to the next */ if (pages > 0) { + last_sent_block = block; break; } } diff --git a/configure b/configure index 589798e49d..09c922511c 100755 --- a/configure +++ b/configure @@ -1848,14 +1848,19 @@ fi # libseccomp check if test "$seccomp" != "no" ; then - if test "$cpu" = "i386" || test "$cpu" = "x86_64" && - $pkg_config --atleast-version=2.1.1 libseccomp; then + if $pkg_config --atleast-version=2.2.0 libseccomp || + (test "$cpu" = "i386" || test "$cpu" = "x86_64" && + $pkg_config --atleast-version=2.1.1 libseccomp); then libs_softmmu="$libs_softmmu `$pkg_config --libs libseccomp`" QEMU_CFLAGS="$QEMU_CFLAGS `$pkg_config --cflags libseccomp`" seccomp="yes" else if test "$seccomp" = "yes"; then + if test "$cpu" = "i386" || test "$cpu" = "x86_64"; then feature_not_found "libseccomp" "Install libseccomp devel >= 2.1.1" + else + feature_not_found "libseccomp" "Install libseccomp devel >= 2.2.0" + fi fi seccomp="no" fi diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index 6242908d6c..d7945f6e2d 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -68,7 +68,7 @@ build_append_nameseg(GArray *array, const char *seg) g_array_append_vals(array, "____", ACPI_NAMESEG_LEN - len); } -static void +static void GCC_FMT_ATTR(2, 0) build_append_namestringv(GArray *array, const char *format, va_list ap) { /* It would be nicer to use g_string_vprintf but it's only there in 2.22 */ diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c index d14e872d34..e336bdb4a9 100644 --- a/hw/char/virtio-serial-bus.c +++ b/hw/char/virtio-serial-bus.c @@ -980,8 +980,10 @@ static void virtio_serial_device_realize(DeviceState *dev, Error **errp) return; } + /* We don't support emergency write, skip it for now. */ + /* TODO: cleaner fix, depending on host features. */ virtio_init(vdev, "virtio-serial", VIRTIO_ID_CONSOLE, - sizeof(struct virtio_console_config)); + offsetof(struct virtio_console_config, emerg_wr)); /* Spawn a new virtio-serial bus on which the ports will ride as devices */ qbus_create_inplace(&vser->bus, sizeof(vser->bus), TYPE_VIRTIO_SERIAL_BUS, diff --git a/hw/core/machine.c b/hw/core/machine.c index cb1185ada4..25c45e6f9d 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -223,6 +223,7 @@ static void machine_set_usb(Object *obj, bool value, Error **errp) MachineState *ms = MACHINE(obj); ms->usb = value; + ms->usb_disabled = !value; } static char *machine_get_firmware(Object *obj, Error **errp) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 27adcc5467..59f76bcf76 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -1588,6 +1588,13 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) virtio_init(vdev, "virtio-net", VIRTIO_ID_NET, n->config_size); n->max_queues = MAX(n->nic_conf.peers.queues, 1); + if (n->max_queues * 2 + 1 > VIRTIO_PCI_QUEUE_MAX) { + error_setg(errp, "Invalid number of queues (= %" PRIu32 "), " + "must be a postive integer less than %d.", + n->max_queues, (VIRTIO_PCI_QUEUE_MAX - 1) / 2); + virtio_cleanup(vdev); + return; + } n->vqs = g_malloc0(sizeof(VirtIONetQueue) * n->max_queues); n->vqs[0].rx_vq = virtio_add_queue(vdev, 256, virtio_net_handle_rx); n->curr_queues = 1; diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c index e0397bc796..a365bf9223 100644 --- a/hw/ppc/mac_newworld.c +++ b/hw/ppc/mac_newworld.c @@ -371,7 +371,7 @@ static void ppc_core99_init(MachineState *machine) /* 970 gets a U3 bus */ pci_bus = pci_pmac_u3_init(pic, get_system_memory(), get_system_io()); machine_arch = ARCH_MAC99_U3; - machine->usb |= defaults_enabled(); + machine->usb |= defaults_enabled() && !machine->usb_disabled; } else { pci_bus = pci_pmac_init(pic, get_system_memory(), get_system_io()); machine_arch = ARCH_MAC99; diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 0487f52819..61ddc7994d 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -314,7 +314,6 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base, hwaddr initrd_size, hwaddr kernel_size, bool little_endian, - const char *boot_device, const char *kernel_cmdline, uint32_t epow_irq) { @@ -407,9 +406,6 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base, _FDT((fdt_property(fdt, "qemu,boot-kernel-le", NULL, 0))); } } - if (boot_device) { - _FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device))); - } if (boot_menu) { _FDT((fdt_property_cell(fdt, "qemu,boot-menu", boot_menu))); } @@ -721,6 +717,8 @@ static void spapr_finalize_fdt(sPAPREnvironment *spapr, hwaddr rtas_addr, hwaddr rtas_size) { + MachineState *machine = MACHINE(qdev_get_machine()); + const char *boot_device = machine->boot_order; int ret, i; size_t cb = 0; char *bootlist; @@ -780,6 +778,15 @@ static void spapr_finalize_fdt(sPAPREnvironment *spapr, ret = fdt_setprop_string(fdt, offset, "qemu,boot-list", bootlist); } + if (boot_device && strlen(boot_device)) { + int offset = fdt_path_offset(fdt, "/chosen"); + + if (offset < 0) { + exit(1); + } + fdt_setprop_string(fdt, offset, "qemu,boot-device", boot_device); + } + if (!spapr->has_graphics) { spapr_populate_chosen_stdout(fdt, spapr->vio_bus); } @@ -1370,6 +1377,13 @@ static SaveVMHandlers savevm_htab_handlers = { .load_state = htab_load, }; +static void spapr_boot_set(void *opaque, const char *boot_device, + Error **errp) +{ + MachineState *machine = MACHINE(qdev_get_machine()); + machine->boot_order = g_strdup(boot_device); +} + /* pSeries LPAR / sPAPR hardware init */ static void ppc_spapr_init(MachineState *machine) { @@ -1378,7 +1392,6 @@ static void ppc_spapr_init(MachineState *machine) const char *kernel_filename = machine->kernel_filename; const char *kernel_cmdline = machine->kernel_cmdline; const char *initrd_filename = machine->initrd_filename; - const char *boot_device = machine->boot_order; PowerPCCPU *cpu; CPUPPCState *env; PCIHostState *phb; @@ -1506,6 +1519,10 @@ static void ppc_spapr_init(MachineState *machine) } filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "spapr-rtas.bin"); + if (!filename) { + hw_error("Could not find LPAR rtas '%s'\n", "spapr-rtas.bin"); + exit(1); + } spapr->rtas_size = get_image_size(filename); spapr->rtas_blob = g_malloc(spapr->rtas_size); if (load_image_size(filename, spapr->rtas_blob, spapr->rtas_size) < 0) { @@ -1563,7 +1580,7 @@ static void ppc_spapr_init(MachineState *machine) /* Graphics */ if (spapr_vga_init(phb->bus)) { spapr->has_graphics = true; - machine->usb |= defaults_enabled(); + machine->usb |= defaults_enabled() && !machine->usb_disabled; } if (machine->usb) { @@ -1623,6 +1640,10 @@ static void ppc_spapr_init(MachineState *machine) bios_name = FW_FILE_NAME; } filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); + if (!filename) { + hw_error("Could not find LPAR rtas '%s'\n", bios_name); + exit(1); + } fw_size = load_image_targphys(filename, 0, FW_MAX_SIZE); if (fw_size < 0) { hw_error("qemu: could not load LPAR rtas '%s'\n", filename); @@ -1639,9 +1660,10 @@ static void ppc_spapr_init(MachineState *machine) /* Prepare the device tree */ spapr->fdt_skel = spapr_create_fdt_skel(initrd_base, initrd_size, kernel_size, kernel_le, - boot_device, kernel_cmdline, - spapr->epow_irq); + kernel_cmdline, spapr->epow_irq); assert(spapr->fdt_skel != NULL); + + qemu_register_boot_set(spapr_boot_set, spapr); } static int spapr_kvm_type(const char *vm_type) @@ -1771,7 +1793,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) mc->block_default_type = IF_SCSI; mc->max_cpus = MAX_CPUS; mc->no_parallel = 1; - mc->default_boot_order = NULL; + mc->default_boot_order = ""; mc->kvm_type = spapr_kvm_type; mc->has_dynamic_sysbus = true; diff --git a/include/hw/boards.h b/include/hw/boards.h index 78838d13d4..1f118811a2 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -146,6 +146,7 @@ struct MachineState { bool dump_guest_core; bool mem_merge; bool usb; + bool usb_disabled; char *firmware; bool iommu; bool suppress_vmdesc; diff --git a/migration/rdma.c b/migration/rdma.c index e6c3a67b54..77e34441dc 100644 --- a/migration/rdma.c +++ b/migration/rdma.c @@ -2194,6 +2194,10 @@ static void qemu_rdma_cleanup(RDMAContext *rdma) } } + if (rdma->qp) { + rdma_destroy_qp(rdma->cm_id); + rdma->qp = NULL; + } if (rdma->cq) { ibv_destroy_cq(rdma->cq); rdma->cq = NULL; @@ -2206,18 +2210,14 @@ static void qemu_rdma_cleanup(RDMAContext *rdma) ibv_dealloc_pd(rdma->pd); rdma->pd = NULL; } - if (rdma->listen_id) { - rdma_destroy_id(rdma->listen_id); - rdma->listen_id = NULL; - } if (rdma->cm_id) { - if (rdma->qp) { - rdma_destroy_qp(rdma->cm_id); - rdma->qp = NULL; - } rdma_destroy_id(rdma->cm_id); rdma->cm_id = NULL; } + if (rdma->listen_id) { + rdma_destroy_id(rdma->listen_id); + rdma->listen_id = NULL; + } if (rdma->channel) { rdma_destroy_event_channel(rdma->channel); rdma->channel = NULL; @@ -2309,8 +2309,6 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp) if (ret) { perror("rdma_connect"); ERROR(errp, "connecting to destination!"); - rdma_destroy_id(rdma->cm_id); - rdma->cm_id = NULL; goto err_rdma_source_connect; } @@ -2319,8 +2317,6 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp) perror("rdma_get_cm_event after rdma_connect"); ERROR(errp, "connecting to destination!"); rdma_ack_cm_event(cm_event); - rdma_destroy_id(rdma->cm_id); - rdma->cm_id = NULL; goto err_rdma_source_connect; } @@ -2328,8 +2324,6 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp) perror("rdma_get_cm_event != EVENT_ESTABLISHED after rdma_connect"); ERROR(errp, "connecting to destination!"); rdma_ack_cm_event(cm_event); - rdma_destroy_id(rdma->cm_id); - rdma->cm_id = NULL; goto err_rdma_source_connect; } rdma->connected = true; diff --git a/pc-bios/README b/pc-bios/README index 8a85e69d3b..63e725444d 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -17,7 +17,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/aik/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20141202. + built from git tag qemu-slof-20150313. - sgabios (the Serial Graphics Adapter option ROM) provides a means for legacy x86 software to communicate with an attached serial console as diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index 031e3063a2..ab72cba80c 100644 --- a/pc-bios/slof.bin +++ b/pc-bios/slof.bin Binary files differdiff --git a/roms/SLOF b/roms/SLOF -Subproject a70dbda2e21f6e438b3617c44ff180c3418dc30 +Subproject c89b0df661c0a6bfa9ff0ed4a371f631f5ee38b diff --git a/target-ppc/cpu-models.c b/target-ppc/cpu-models.c index 2b560a4757..4d5ab4ba18 100644 --- a/target-ppc/cpu-models.c +++ b/target-ppc/cpu-models.c @@ -1124,8 +1124,6 @@ POWERPC_DEF("POWER5", CPU_POWERPC_POWER5, POWER5, "POWER5") #endif - POWERPC_DEF("POWER5+_v0.0", CPU_POWERPC_POWER5P_v00, POWER5P, - "POWER5+ v0.0") POWERPC_DEF("POWER5+_v2.1", CPU_POWERPC_POWER5P_v21, POWER5P, "POWER5+ v2.1") #if defined(TODO) @@ -1387,8 +1385,8 @@ PowerPCCPUAlias ppc_cpu_aliases[] = { { "Dino", "POWER3" }, { "POWER3+", "631" }, { "POWER5gr", "POWER5" }, - { "POWER5+", "POWER5+_v0.0" }, - { "POWER5gs", "POWER5+_v0.0" }, + { "POWER5+", "POWER5+_v2.1" }, + { "POWER5gs", "POWER5+_v2.1" }, { "POWER7", "POWER7_v2.3" }, { "POWER7+", "POWER7+_v2.1" }, { "POWER8E", "POWER8E_v1.0" }, diff --git a/target-ppc/cpu-models.h b/target-ppc/cpu-models.h index ee693af873..9d80e72271 100644 --- a/target-ppc/cpu-models.h +++ b/target-ppc/cpu-models.h @@ -547,7 +547,6 @@ enum { CPU_POWERPC_POWER4P = 0x00380000, /* XXX: missing 0x003A0201 */ CPU_POWERPC_POWER5 = 0x003A0203, - CPU_POWERPC_POWER5P_v00 = 0x003B0000, CPU_POWERPC_POWER5P_v21 = 0x003B0201, CPU_POWERPC_POWER6 = 0x003E0000, CPU_POWERPC_POWER6_5 = 0x0F000001, /* POWER6 in POWER5 mode */ diff --git a/vl.c b/vl.c index 75ec292216..74c2681641 100644 --- a/vl.c +++ b/vl.c @@ -3618,8 +3618,10 @@ int main(int argc, char **argv, char **envp) } break; case QEMU_OPTION_incoming: + if (!incoming) { + runstate_set(RUN_STATE_INMIGRATE); + } incoming = optarg; - runstate_set(RUN_STATE_INMIGRATE); break; case QEMU_OPTION_nodefaults: has_defaults = 0; |