diff options
-rwxr-xr-x | configure | 9 | ||||
-rw-r--r-- | hw/display/cirrus_vga.c | 24 | ||||
-rw-r--r-- | hw/display/cirrus_vga_rop.h | 3 | ||||
-rw-r--r-- | hw/mips/mips_malta.c | 20 | ||||
-rw-r--r-- | hw/timer/mc146818rtc.c | 2 | ||||
-rw-r--r-- | hw/usb/dev-mtp.c | 4 | ||||
-rw-r--r-- | hw/watchdog/watchdog.c | 6 | ||||
-rw-r--r-- | target-i386/cpu.c | 2 | ||||
-rw-r--r-- | target-mips/kvm.c | 7 | ||||
-rw-r--r-- | target-mips/translate.c | 8 | ||||
-rw-r--r-- | target-s390x/kvm.c | 23 | ||||
-rw-r--r-- | ui/gtk.c | 9 | ||||
-rw-r--r-- | ui/spice-core.c | 5 | ||||
-rw-r--r-- | util/oslib-posix.c | 30 |
14 files changed, 121 insertions, 31 deletions
@@ -1489,8 +1489,9 @@ for flag in $gcc_flags; do fi done -if test "$stack_protector" != "no" ; then +if test "$stack_protector" != "no"; then gcc_flags="-fstack-protector-strong -fstack-protector-all" + sp_on=0 for flag in $gcc_flags; do # We need to check both a compile and a link, since some compiler # setups fail only on a .c->.o compile and some only at link time @@ -1498,9 +1499,15 @@ if test "$stack_protector" != "no" ; then compile_prog "-Werror $flag" ""; then QEMU_CFLAGS="$QEMU_CFLAGS $flag" LIBTOOLFLAGS="$LIBTOOLFLAGS -Wc,$flag" + sp_on=1 break fi done + if test "$stack_protector" = yes; then + if test $sp_on = 0; then + error_exit "Stack protector not supported" + fi + fi fi # Workaround for http://gcc.gnu.org/PR55489. Happens with -fPIE/-fPIC and diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index 6fbe39d..db330e9 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -2059,7 +2059,7 @@ static void cirrus_vga_mem_write(void *opaque, } } else { #ifdef DEBUG_CIRRUS - printf("cirrus: mem_writeb " TARGET_FMT_plx " value %02x\n", addr, + printf("cirrus: mem_writeb " TARGET_FMT_plx " value 0x%02" PRIu64 "\n", addr, mem_value); #endif } @@ -2594,7 +2594,7 @@ static void cirrus_vga_ioport_write(void *opaque, hwaddr addr, uint64_t val, break; case 0x3c5: #ifdef DEBUG_VGA_REG - printf("vga: write SR%x = 0x%02x\n", s->sr_index, val); + printf("vga: write SR%x = 0x%02" PRIu64 "\n", s->sr_index, val); #endif cirrus_vga_write_sr(c, val); break; @@ -2619,7 +2619,7 @@ static void cirrus_vga_ioport_write(void *opaque, hwaddr addr, uint64_t val, break; case 0x3cf: #ifdef DEBUG_VGA_REG - printf("vga: write GR%x = 0x%02x\n", s->gr_index, val); + printf("vga: write GR%x = 0x%02" PRIu64 "\n", s->gr_index, val); #endif cirrus_vga_write_gr(c, s->gr_index, val); break; @@ -2630,7 +2630,7 @@ static void cirrus_vga_ioport_write(void *opaque, hwaddr addr, uint64_t val, case 0x3b5: case 0x3d5: #ifdef DEBUG_VGA_REG - printf("vga: write CR%x = 0x%02x\n", s->cr_index, val); + printf("vga: write CR%x = 0x%02"PRIu64"\n", s->cr_index, val); #endif cirrus_vga_write_cr(c, val); break; @@ -2911,6 +2911,14 @@ static void isa_cirrus_vga_realizefn(DeviceState *dev, Error **errp) ISACirrusVGAState *d = ISA_CIRRUS_VGA(dev); VGACommonState *s = &d->cirrus_vga.vga; + /* follow real hardware, cirrus card emulated has 4 MB video memory. + Also accept 8 MB/16 MB for backward compatibility. */ + if (s->vram_size_mb != 4 && s->vram_size_mb != 8 && + s->vram_size_mb != 16) { + error_setg(errp, "Invalid cirrus_vga ram size '%u'", + s->vram_size_mb); + return; + } vga_common_init(s, OBJECT(dev), true); cirrus_init_common(&d->cirrus_vga, OBJECT(dev), CIRRUS_ID_CLGD5430, 0, isa_address_space(isadev), @@ -2957,6 +2965,14 @@ static int pci_cirrus_vga_initfn(PCIDevice *dev) PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev); int16_t device_id = pc->device_id; + /* follow real hardware, cirrus card emulated has 4 MB video memory. + Also accept 8 MB/16 MB for backward compatibility. */ + if (s->vga.vram_size_mb != 4 && s->vga.vram_size_mb != 8 && + s->vga.vram_size_mb != 16) { + error_report("Invalid cirrus_vga ram size '%u'", + s->vga.vram_size_mb); + return -1; + } /* setup VGA */ vga_common_init(&s->vga, OBJECT(dev), true); cirrus_init_common(s, OBJECT(dev), device_id, 1, pci_address_space(dev), diff --git a/hw/display/cirrus_vga_rop.h b/hw/display/cirrus_vga_rop.h index 9c7bb09..0925a00 100644 --- a/hw/display/cirrus_vga_rop.h +++ b/hw/display/cirrus_vga_rop.h @@ -52,8 +52,7 @@ glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(CirrusVGAState *s, dstpitch -= bltwidth; srcpitch -= bltwidth; - if (dstpitch < 0 || srcpitch < 0) { - /* is 0 valid? srcpitch == 0 could be useful */ + if (bltheight > 1 && (dstpitch < 0 || srcpitch < 0)) { return; } diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c index 2868ee5..cfb60af 100644 --- a/hw/mips/mips_malta.c +++ b/hw/mips/mips_malta.c @@ -792,9 +792,23 @@ static int64_t load_kernel (void) loaderparams.kernel_filename); exit(1); } + + /* Sanity check where the kernel has been linked */ if (kvm_enabled()) { + if (kernel_entry & 0x80000000ll) { + error_report("KVM guest kernels must be linked in useg. " + "Did you forget to enable CONFIG_KVM_GUEST?"); + exit(1); + } + xlate_to_kseg0 = cpu_mips_kvm_um_phys_to_kseg0; } else { + if (!(kernel_entry & 0x80000000ll)) { + error_report("KVM guest kernels aren't supported with TCG. " + "Did you unintentionally enable CONFIG_KVM_GUEST?"); + exit(1); + } + xlate_to_kseg0 = cpu_mips_phys_to_kseg0; } @@ -1028,7 +1042,7 @@ void mips_malta_init(MachineState *machine) fl_idx++; if (kernel_filename) { ram_low_size = MIN(ram_size, 256 << 20); - /* For KVM T&E we reserve 1MB of RAM for running bootloader */ + /* For KVM we reserve 1MB of RAM for running bootloader */ if (kvm_enabled()) { ram_low_size -= 0x100000; bootloader_run_addr = 0x40000000 + ram_low_size; @@ -1052,10 +1066,10 @@ void mips_malta_init(MachineState *machine) bootloader_run_addr, kernel_entry); } } else { - /* The flash region isn't executable from a KVM T&E guest */ + /* The flash region isn't executable from a KVM guest */ if (kvm_enabled()) { error_report("KVM enabled but no -kernel argument was specified. " - "Booting from flash is not supported with KVM T&E."); + "Booting from flash is not supported with KVM."); exit(1); } /* Load firmware from flash. */ diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c index 9d817ca..233fc70 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c @@ -895,7 +895,7 @@ static void rtc_realizefn(DeviceState *dev, Error **errp) check_update_timer(s); s->clock_reset_notifier.notify = rtc_notify_clock_reset; - qemu_clock_register_reset_notifier(QEMU_CLOCK_REALTIME, + qemu_clock_register_reset_notifier(rtc_clock, &s->clock_reset_notifier); s->suspend_notifier.notify = rtc_notify_suspend; diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c index 380b465..1b51a90 100644 --- a/hw/usb/dev-mtp.c +++ b/hw/usb/dev-mtp.c @@ -145,6 +145,7 @@ enum { STR_MANUFACTURER = 1, STR_PRODUCT, STR_SERIALNUMBER, + STR_MTP, STR_CONFIG_FULL, STR_CONFIG_HIGH, STR_CONFIG_SUPER, @@ -154,6 +155,7 @@ static const USBDescStrings desc_strings = { [STR_MANUFACTURER] = MTP_MANUFACTURER, [STR_PRODUCT] = MTP_PRODUCT, [STR_SERIALNUMBER] = "34617", + [STR_MTP] = "MTP", [STR_CONFIG_FULL] = "Full speed config (usb 1.1)", [STR_CONFIG_HIGH] = "High speed config (usb 2.0)", [STR_CONFIG_SUPER] = "Super speed config (usb 3.0)", @@ -165,6 +167,7 @@ static const USBDescIface desc_iface_full = { .bInterfaceClass = USB_CLASS_STILL_IMAGE, .bInterfaceSubClass = 0x01, .bInterfaceProtocol = 0x01, + .iInterface = STR_MTP, .eps = (USBDescEndpoint[]) { { .bEndpointAddress = USB_DIR_IN | EP_DATA_IN, @@ -206,6 +209,7 @@ static const USBDescIface desc_iface_high = { .bInterfaceClass = USB_CLASS_STILL_IMAGE, .bInterfaceSubClass = 0x01, .bInterfaceProtocol = 0x01, + .iInterface = STR_MTP, .eps = (USBDescEndpoint[]) { { .bEndpointAddress = USB_DIR_IN | EP_DATA_IN, diff --git a/hw/watchdog/watchdog.c b/hw/watchdog/watchdog.c index 9f607d4..c307f9b 100644 --- a/hw/watchdog/watchdog.c +++ b/hw/watchdog/watchdog.c @@ -122,8 +122,12 @@ void watchdog_perform_action(void) exit(0); case WDT_PAUSE: /* same as 'stop' command in monitor */ + /* In a timer callback, when vm_stop calls qemu_clock_enable + * you would get a deadlock. Bypass the problem. + */ + qemu_system_vmstop_request_prepare(); qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_PAUSE, &error_abort); - vm_stop(RUN_STATE_WATCHDOG); + qemu_system_vmstop_request(RUN_STATE_WATCHDOG); break; case WDT_DEBUG: diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 45c662d..6d008ab 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -241,7 +241,7 @@ static const char *kvm_feature_name[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, + "kvmclock-stable-bit", NULL, NULL, NULL, NULL, NULL, NULL, NULL, }; diff --git a/target-mips/kvm.c b/target-mips/kvm.c index 844e5bb..97fd51a 100644 --- a/target-mips/kvm.c +++ b/target-mips/kvm.c @@ -61,6 +61,13 @@ int kvm_arch_init_vcpu(CPUState *cs) void kvm_mips_reset_vcpu(MIPSCPU *cpu) { + CPUMIPSState *env = &cpu->env; + + if (env->CP0_Config1 & (1 << CP0C1_FP)) { + fprintf(stderr, "Warning: FPU not supported with KVM, disabling\n"); + env->CP0_Config1 &= ~(1 << CP0C1_FP); + } + DPRINTF("%s\n", __func__); } diff --git a/target-mips/translate.c b/target-mips/translate.c index 2f91959..d7b8c4d 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -28,6 +28,7 @@ #include "exec/helper-proto.h" #include "exec/helper-gen.h" +#include "sysemu/kvm.h" #define MIPS_DEBUG_DISAS 0 //#define MIPS_DEBUG_SIGN_EXTENSIONS @@ -16076,7 +16077,12 @@ void cpu_state_reset(CPUMIPSState *env) env->CP0_Random = env->tlb->nb_tlb - 1; env->tlb->tlb_in_use = env->tlb->nb_tlb; env->CP0_Wired = 0; - env->CP0_EBase = 0x80000000 | (cs->cpu_index & 0x3FF); + env->CP0_EBase = (cs->cpu_index & 0x3FF); + if (kvm_enabled()) { + env->CP0_EBase |= 0x40000000; + } else { + env->CP0_EBase |= 0x80000000; + } env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL); /* vectored interrupts not implemented, timer on int 7, no performance counters. */ diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index a6e587b..a32d91a 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -207,6 +207,7 @@ int kvm_arch_put_registers(CPUState *cs, int level) CPUS390XState *env = &cpu->env; struct kvm_sregs sregs; struct kvm_regs regs; + struct kvm_fpu fpu; int r; int i; @@ -229,6 +230,17 @@ int kvm_arch_put_registers(CPUState *cs, int level) } } + /* Floating point */ + for (i = 0; i < 16; i++) { + fpu.fprs[i] = env->fregs[i].ll; + } + fpu.fpc = env->fpc; + + r = kvm_vcpu_ioctl(cs, KVM_SET_FPU, &fpu); + if (r < 0) { + return r; + } + /* Do we need to save more than that? */ if (level == KVM_PUT_RUNTIME_STATE) { return 0; @@ -296,6 +308,7 @@ int kvm_arch_get_registers(CPUState *cs) CPUS390XState *env = &cpu->env; struct kvm_sregs sregs; struct kvm_regs regs; + struct kvm_fpu fpu; int i, r; /* get the PSW */ @@ -336,6 +349,16 @@ int kvm_arch_get_registers(CPUState *cs) } } + /* Floating point */ + r = kvm_vcpu_ioctl(cs, KVM_GET_FPU, &fpu); + if (r < 0) { + return r; + } + for (i = 0; i < 16; i++) { + env->fregs[i].ll = fpu.fprs[i]; + } + env->fpc = fpu.fpc; + /* The prefix */ if (cap_sync_regs && cs->kvm_run->kvm_valid_regs & KVM_SYNC_PREFIX) { env->psa = cs->kvm_run->s.regs.prefix; @@ -992,13 +992,16 @@ static void gd_menu_switch_vc(GtkMenuItem *item, void *opaque) { GtkDisplayState *s = opaque; VirtualConsole *vc = gd_vc_find_by_menu(s); + GtkNotebook *nb = GTK_NOTEBOOK(s->notebook); + GtkWidget *child; gint page; gtk_release_modifiers(s); if (vc) { - page = gtk_notebook_page_num(GTK_NOTEBOOK(s->notebook), - vc->tab_item); - gtk_notebook_set_current_page(GTK_NOTEBOOK(s->notebook), page); + page = gtk_notebook_page_num(nb, vc->tab_item); + gtk_notebook_set_current_page(nb, page); + child = gtk_notebook_get_nth_page(nb, page); + gtk_widget_grab_focus(child); } } diff --git a/ui/spice-core.c b/ui/spice-core.c index 70df446..7bb91e6 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -741,6 +741,7 @@ void qemu_spice_init(void) error_report("spice: failed to enable sasl"); exit(1); } + auth = "sasl"; } if (qemu_opt_get_bool(opts, "disable-ticketing", 0)) { auth = "none"; @@ -894,6 +895,10 @@ static int qemu_spice_set_ticket(bool fail_if_conn, bool disconnect_if_conn) int qemu_spice_set_passwd(const char *passwd, bool fail_if_conn, bool disconnect_if_conn) { + if (strcmp(auth, "spice") != 0) { + return -1; + } + g_free(auth_passwd); auth_passwd = g_strdup(passwd); return qemu_spice_set_ticket(fail_if_conn, disconnect_if_conn); diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 1524ead..cdbfb2e 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -366,10 +366,9 @@ static size_t fd_getpagesize(int fd) void os_mem_prealloc(int fd, char *area, size_t memory) { - int ret, i; + int ret; struct sigaction act, oldact; sigset_t set, oldset; - size_t hpagesize = fd_getpagesize(fd); memset(&act, 0, sizeof(act)); act.sa_handler = &sigbus_handler; @@ -389,19 +388,22 @@ void os_mem_prealloc(int fd, char *area, size_t memory) if (sigsetjmp(sigjump, 1)) { fprintf(stderr, "os_mem_prealloc: failed to preallocate pages\n"); exit(1); - } + } else { + int i; + size_t hpagesize = fd_getpagesize(fd); - /* MAP_POPULATE silently ignores failures */ - memory = (memory + hpagesize - 1) & -hpagesize; - for (i = 0; i < (memory/hpagesize); i++) { - memset(area + (hpagesize*i), 0, 1); - } + /* MAP_POPULATE silently ignores failures */ + memory = (memory + hpagesize - 1) & -hpagesize; + for (i = 0; i < (memory / hpagesize); i++) { + memset(area + (hpagesize * i), 0, 1); + } - ret = sigaction(SIGBUS, &oldact, NULL); - if (ret) { - perror("os_mem_prealloc: failed to reinstall signal handler"); - exit(1); - } + ret = sigaction(SIGBUS, &oldact, NULL); + if (ret) { + perror("os_mem_prealloc: failed to reinstall signal handler"); + exit(1); + } - pthread_sigmask(SIG_SETMASK, &oldset, NULL); + pthread_sigmask(SIG_SETMASK, &oldset, NULL); + } } |