From 15c161c2e6e2c31cca9920dc128c3323a81fff26 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sun, 28 Oct 2018 14:04:25 +0200 Subject: [PATCH] qemu: add recommended patches --- .../qemu-system-x86_64/allow_elf64.patch | 25 +++++++++ ...ryRegionCaches-when-guest-negotiates.patch | 55 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 x11-packages/qemu-system-x86_64/allow_elf64.patch create mode 100644 x11-packages/qemu-system-x86_64/update-MemoryRegionCaches-when-guest-negotiates.patch diff --git a/x11-packages/qemu-system-x86_64/allow_elf64.patch b/x11-packages/qemu-system-x86_64/allow_elf64.patch new file mode 100644 index 000000000..0c5f6917c --- /dev/null +++ b/x11-packages/qemu-system-x86_64/allow_elf64.patch @@ -0,0 +1,25 @@ +commit cb61bc8a42da1a971079767e63df4503b6ab2efb +Author: Anatol Pomozov +Date: Mon Jan 29 10:08:53 2018 -0800 + + multiboot: Make elf64 loading functionality compatible with GRUB + + GRUB is a reference multiboot implementation and supports loading elf64 + binaries. Make QEMU to work similar was as GRUB. + +diff --git a/hw/i386/multiboot.c b/hw/i386/multiboot.c +index 5bc0a2cddb..0907e42a39 100644 +--- a/hw/i386/multiboot.c ++++ b/hw/i386/multiboot.c +@@ -193,11 +193,6 @@ int load_multiboot(FWCfgState *fw_cfg, + int kernel_size; + fclose(f); + +- if (((struct elf64_hdr*)header)->e_machine == EM_X86_64) { +- error_report("Cannot load x86-64 image, give a 32bit one."); +- exit(1); +- } +- + kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry, + &elf_low, &elf_high, 0, I386_ELF_MACHINE, + 0, 0); diff --git a/x11-packages/qemu-system-x86_64/update-MemoryRegionCaches-when-guest-negotiates.patch b/x11-packages/qemu-system-x86_64/update-MemoryRegionCaches-when-guest-negotiates.patch new file mode 100644 index 000000000..371252aa6 --- /dev/null +++ b/x11-packages/qemu-system-x86_64/update-MemoryRegionCaches-when-guest-negotiates.patch @@ -0,0 +1,55 @@ +From db812c4073c77c8a64db8d6663b3416a587c7b4a Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Thu, 23 Aug 2018 14:21:23 +0200 +Subject: [PATCH] virtio: update MemoryRegionCaches when guest negotiates + features + +Because the cache is sized to include the rings and the event indices, +negotiating the VIRTIO_RING_F_EVENT_IDX feature will result in the size +of the cache changing. And because MemoryRegionCache accesses are +range-checked, if we skip this we end up with an assertion failure. +This happens with OpenBSD 6.3. + +Reported-by: Fam Zheng +Fixes: 97cd965c070152bc626c7507df9fb356bbe1cd81 +Cc: qemu-stable@nongnu.org +Signed-off-by: Paolo Bonzini +Tested-by: Fam Zheng +Reviewed-by: Michael S. Tsirkin +Signed-off-by: Michael S. Tsirkin +--- + hw/virtio/virtio.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c +index d4e4d98b595..f6a588ab57e 100644 +--- a/hw/virtio/virtio.c ++++ b/hw/virtio/virtio.c +@@ -2006,14 +2006,25 @@ static int virtio_set_features_nocheck(VirtIODevice *vdev, uint64_t val) + + int virtio_set_features(VirtIODevice *vdev, uint64_t val) + { +- /* ++ int ret; ++ /* + * The driver must not attempt to set features after feature negotiation + * has finished. + */ + if (vdev->status & VIRTIO_CONFIG_S_FEATURES_OK) { + return -EINVAL; + } +- return virtio_set_features_nocheck(vdev, val); ++ ret = virtio_set_features_nocheck(vdev, val); ++ if (!ret && virtio_vdev_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX)) { ++ /* VIRTIO_RING_F_EVENT_IDX changes the size of the caches. */ ++ int i; ++ for (i = 0; i < VIRTIO_QUEUE_MAX; i++) { ++ if (vdev->vq[i].vring.num != 0) { ++ virtio_init_region_cache(vdev, i); ++ } ++ } ++ } ++ return ret; + } + + int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)