import qemu-kvm-6.2.0-28.module+el8.8.0+17721+63bacee8
This commit is contained in:
parent
82e468bb05
commit
38978d44db
171
SOURCES/kvm-Update-linux-headers-to-v6.0-rc4.patch
Normal file
171
SOURCES/kvm-Update-linux-headers-to-v6.0-rc4.patch
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
From 10fc28b61a6fba1e6dc44fd544cf31c7f313c622 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= <clg@redhat.com>
|
||||||
|
Date: Fri, 28 Oct 2022 17:48:00 +0100
|
||||||
|
Subject: [PATCH 05/42] Update linux headers to v6.0-rc4
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [5/41] ca55f497d1bf1e72179330f8f613781bf999d898
|
||||||
|
|
||||||
|
Based on upstream commit d525f73f9186a5bc641b8caf0b2c9bb94e5aa963
|
||||||
|
("Update linux headers to v6.0-rc4"), but this is focusing only on the
|
||||||
|
ZPCI and protected dump changes.
|
||||||
|
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
linux-headers/linux/kvm.h | 87 +++++++++++++++++++++++++++++++++
|
||||||
|
linux-headers/linux/vfio_zdev.h | 7 +++
|
||||||
|
2 files changed, 94 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
|
||||||
|
index 0d05d02ee4..c65930288c 100644
|
||||||
|
--- a/linux-headers/linux/kvm.h
|
||||||
|
+++ b/linux-headers/linux/kvm.h
|
||||||
|
@@ -1150,6 +1150,9 @@ struct kvm_ppc_resize_hpt {
|
||||||
|
#define KVM_CAP_DISABLE_QUIRKS2 213
|
||||||
|
/* #define KVM_CAP_VM_TSC_CONTROL 214 */
|
||||||
|
#define KVM_CAP_SYSTEM_EVENT_DATA 215
|
||||||
|
+#define KVM_CAP_S390_PROTECTED_DUMP 217
|
||||||
|
+#define KVM_CAP_S390_ZPCI_OP 221
|
||||||
|
+#define KVM_CAP_S390_CPU_TOPOLOGY 222
|
||||||
|
|
||||||
|
#ifdef KVM_CAP_IRQ_ROUTING
|
||||||
|
|
||||||
|
@@ -1651,6 +1654,55 @@ struct kvm_s390_pv_unp {
|
||||||
|
__u64 tweak;
|
||||||
|
};
|
||||||
|
|
||||||
|
+enum pv_cmd_dmp_id {
|
||||||
|
+ KVM_PV_DUMP_INIT,
|
||||||
|
+ KVM_PV_DUMP_CONFIG_STOR_STATE,
|
||||||
|
+ KVM_PV_DUMP_COMPLETE,
|
||||||
|
+ KVM_PV_DUMP_CPU,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct kvm_s390_pv_dmp {
|
||||||
|
+ __u64 subcmd;
|
||||||
|
+ __u64 buff_addr;
|
||||||
|
+ __u64 buff_len;
|
||||||
|
+ __u64 gaddr; /* For dump storage state */
|
||||||
|
+ __u64 reserved[4];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+enum pv_cmd_info_id {
|
||||||
|
+ KVM_PV_INFO_VM,
|
||||||
|
+ KVM_PV_INFO_DUMP,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct kvm_s390_pv_info_dump {
|
||||||
|
+ __u64 dump_cpu_buffer_len;
|
||||||
|
+ __u64 dump_config_mem_buffer_per_1m;
|
||||||
|
+ __u64 dump_config_finalize_len;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct kvm_s390_pv_info_vm {
|
||||||
|
+ __u64 inst_calls_list[4];
|
||||||
|
+ __u64 max_cpus;
|
||||||
|
+ __u64 max_guests;
|
||||||
|
+ __u64 max_guest_addr;
|
||||||
|
+ __u64 feature_indication;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct kvm_s390_pv_info_header {
|
||||||
|
+ __u32 id;
|
||||||
|
+ __u32 len_max;
|
||||||
|
+ __u32 len_written;
|
||||||
|
+ __u32 reserved;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct kvm_s390_pv_info {
|
||||||
|
+ struct kvm_s390_pv_info_header header;
|
||||||
|
+ union {
|
||||||
|
+ struct kvm_s390_pv_info_dump dump;
|
||||||
|
+ struct kvm_s390_pv_info_vm vm;
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
enum pv_cmd_id {
|
||||||
|
KVM_PV_ENABLE,
|
||||||
|
KVM_PV_DISABLE,
|
||||||
|
@@ -1659,6 +1711,8 @@ enum pv_cmd_id {
|
||||||
|
KVM_PV_VERIFY,
|
||||||
|
KVM_PV_PREP_RESET,
|
||||||
|
KVM_PV_UNSHARE_ALL,
|
||||||
|
+ KVM_PV_INFO,
|
||||||
|
+ KVM_PV_DUMP,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct kvm_pv_cmd {
|
||||||
|
@@ -2066,4 +2120,37 @@ struct kvm_stats_desc {
|
||||||
|
/* Available with KVM_CAP_XSAVE2 */
|
||||||
|
#define KVM_GET_XSAVE2 _IOR(KVMIO, 0xcf, struct kvm_xsave)
|
||||||
|
|
||||||
|
+/* Available with KVM_CAP_S390_PROTECTED_DUMP */
|
||||||
|
+#define KVM_S390_PV_CPU_COMMAND _IOWR(KVMIO, 0xd0, struct kvm_pv_cmd)
|
||||||
|
+
|
||||||
|
+/* Available with KVM_CAP_S390_ZPCI_OP */
|
||||||
|
+#define KVM_S390_ZPCI_OP _IOW(KVMIO, 0xd1, struct kvm_s390_zpci_op)
|
||||||
|
+
|
||||||
|
+struct kvm_s390_zpci_op {
|
||||||
|
+ /* in */
|
||||||
|
+ __u32 fh; /* target device */
|
||||||
|
+ __u8 op; /* operation to perform */
|
||||||
|
+ __u8 pad[3];
|
||||||
|
+ union {
|
||||||
|
+ /* for KVM_S390_ZPCIOP_REG_AEN */
|
||||||
|
+ struct {
|
||||||
|
+ __u64 ibv; /* Guest addr of interrupt bit vector */
|
||||||
|
+ __u64 sb; /* Guest addr of summary bit */
|
||||||
|
+ __u32 flags;
|
||||||
|
+ __u32 noi; /* Number of interrupts */
|
||||||
|
+ __u8 isc; /* Guest interrupt subclass */
|
||||||
|
+ __u8 sbo; /* Offset of guest summary bit vector */
|
||||||
|
+ __u16 pad;
|
||||||
|
+ } reg_aen;
|
||||||
|
+ __u64 reserved[8];
|
||||||
|
+ } u;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* types for kvm_s390_zpci_op->op */
|
||||||
|
+#define KVM_S390_ZPCIOP_REG_AEN 0
|
||||||
|
+#define KVM_S390_ZPCIOP_DEREG_AEN 1
|
||||||
|
+
|
||||||
|
+/* flags for kvm_s390_zpci_op->u.reg_aen.flags */
|
||||||
|
+#define KVM_S390_ZPCIOP_REGAEN_HOST (1 << 0)
|
||||||
|
+
|
||||||
|
#endif /* __LINUX_KVM_H */
|
||||||
|
diff --git a/linux-headers/linux/vfio_zdev.h b/linux-headers/linux/vfio_zdev.h
|
||||||
|
index b4309397b6..77f2aff1f2 100644
|
||||||
|
--- a/linux-headers/linux/vfio_zdev.h
|
||||||
|
+++ b/linux-headers/linux/vfio_zdev.h
|
||||||
|
@@ -29,6 +29,9 @@ struct vfio_device_info_cap_zpci_base {
|
||||||
|
__u16 fmb_length; /* Measurement Block Length (in bytes) */
|
||||||
|
__u8 pft; /* PCI Function Type */
|
||||||
|
__u8 gid; /* PCI function group ID */
|
||||||
|
+ /* End of version 1 */
|
||||||
|
+ __u32 fh; /* PCI function handle */
|
||||||
|
+ /* End of version 2 */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -47,6 +50,10 @@ struct vfio_device_info_cap_zpci_group {
|
||||||
|
__u16 noi; /* Maximum number of MSIs */
|
||||||
|
__u16 maxstbl; /* Maximum Store Block Length */
|
||||||
|
__u8 version; /* Supported PCI Version */
|
||||||
|
+ /* End of version 1 */
|
||||||
|
+ __u8 reserved;
|
||||||
|
+ __u16 imaxstbl; /* Maximum Interpreted Store Block Length */
|
||||||
|
+ /* End of version 2 */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,71 @@
|
|||||||
|
From 60da56e3685969493ae483c3cc2c66af13d00baf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Thomas Huth <thuth@redhat.com>
|
||||||
|
Date: Wed, 10 Aug 2022 14:57:18 +0200
|
||||||
|
Subject: [PATCH 1/3] backends/hostmem: Fix support of memory-backend-memfd in
|
||||||
|
qemu_maxrampagesize()
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <None>
|
||||||
|
RH-MergeRequest: 221: backends/hostmem: Fix support of memory-backend-memfd in qemu_maxrampagesize()
|
||||||
|
RH-Bugzilla: 2117149
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Commit: [1/1] b5a1047750af32c0a261b8385ea0e819eb16681a
|
||||||
|
|
||||||
|
It is currently not possible yet to use "memory-backend-memfd" on s390x
|
||||||
|
with hugepages enabled. This problem is caused by qemu_maxrampagesize()
|
||||||
|
not taking memory-backend-memfd objects into account yet, so the code
|
||||||
|
in s390_memory_init() fails to enable the huge page support there via
|
||||||
|
s390_set_max_pagesize(). Fix it by generalizing the code, so that it
|
||||||
|
looks at qemu_ram_pagesize(memdev->mr.ram_block) instead of re-trying
|
||||||
|
to get the information from the filesystem.
|
||||||
|
|
||||||
|
Suggested-by: David Hildenbrand <david@redhat.com>
|
||||||
|
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2116496
|
||||||
|
Message-Id: <20220810125720.3849835-2-thuth@redhat.com>
|
||||||
|
Reviewed-by: David Hildenbrand <david@redhat.com>
|
||||||
|
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit 8be934b70e923104da883b990dee18f02552d40e)
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2117149
|
||||||
|
[clg: Resolved conflict on qemu_real_host_page_size() ]
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
backends/hostmem.c | 14 ++------------
|
||||||
|
1 file changed, 2 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/backends/hostmem.c b/backends/hostmem.c
|
||||||
|
index 4c05862ed5..0c4654ea85 100644
|
||||||
|
--- a/backends/hostmem.c
|
||||||
|
+++ b/backends/hostmem.c
|
||||||
|
@@ -305,22 +305,12 @@ bool host_memory_backend_is_mapped(HostMemoryBackend *backend)
|
||||||
|
return backend->is_mapped;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#ifdef __linux__
|
||||||
|
size_t host_memory_backend_pagesize(HostMemoryBackend *memdev)
|
||||||
|
{
|
||||||
|
- Object *obj = OBJECT(memdev);
|
||||||
|
- char *path = object_property_get_str(obj, "mem-path", NULL);
|
||||||
|
- size_t pagesize = qemu_mempath_getpagesize(path);
|
||||||
|
-
|
||||||
|
- g_free(path);
|
||||||
|
+ size_t pagesize = qemu_ram_pagesize(memdev->mr.ram_block);
|
||||||
|
+ g_assert(pagesize >= qemu_real_host_page_size);
|
||||||
|
return pagesize;
|
||||||
|
}
|
||||||
|
-#else
|
||||||
|
-size_t host_memory_backend_pagesize(HostMemoryBackend *memdev)
|
||||||
|
-{
|
||||||
|
- return qemu_real_host_page_size;
|
||||||
|
-}
|
||||||
|
-#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
@ -0,0 +1,70 @@
|
|||||||
|
From 407e23d7f0c9020404247afe7d4df98505222bbb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Thomas Huth <thuth@redhat.com>
|
||||||
|
Date: Mon, 14 Nov 2022 14:25:02 +0100
|
||||||
|
Subject: [PATCH 1/3] docs/system/s390x: Document the "loadparm" machine
|
||||||
|
property
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-MergeRequest: 233: s390x: Document the "loadparm" machine property
|
||||||
|
RH-Bugzilla: 2128225
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [1/2] e9589ea32d2a8f82971476b644e1063fa14cf822
|
||||||
|
|
||||||
|
The "loadparm" machine property is useful for selecting alternative
|
||||||
|
kernels on the disk of the guest, but so far we do not tell the users
|
||||||
|
yet how to use it. Add some documentation to fill this gap.
|
||||||
|
|
||||||
|
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2128235
|
||||||
|
Message-Id: <20221114132502.110213-1-thuth@redhat.com>
|
||||||
|
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit be5df2edb5d69ff3107c5616aa035a9ba8d0422e)
|
||||||
|
---
|
||||||
|
docs/system/s390x/bootdevices.rst | 26 ++++++++++++++++++++++++++
|
||||||
|
1 file changed, 26 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/docs/system/s390x/bootdevices.rst b/docs/system/s390x/bootdevices.rst
|
||||||
|
index 9e591cb9dc..d4bf3b9f0b 100644
|
||||||
|
--- a/docs/system/s390x/bootdevices.rst
|
||||||
|
+++ b/docs/system/s390x/bootdevices.rst
|
||||||
|
@@ -53,6 +53,32 @@ recommended to specify a CD-ROM device via ``-device scsi-cd`` (as mentioned
|
||||||
|
above) instead.
|
||||||
|
|
||||||
|
|
||||||
|
+Selecting kernels with the ``loadparm`` property
|
||||||
|
+------------------------------------------------
|
||||||
|
+
|
||||||
|
+The ``s390-ccw-virtio`` machine supports the so-called ``loadparm`` parameter
|
||||||
|
+which can be used to select the kernel on the disk of the guest that the
|
||||||
|
+s390-ccw bios should boot. When starting QEMU, it can be specified like this::
|
||||||
|
+
|
||||||
|
+ qemu-system-s390x -machine s390-ccw-virtio,loadparm=<string>
|
||||||
|
+
|
||||||
|
+The first way to use this parameter is to use the word ``PROMPT`` as the
|
||||||
|
+``<string>`` here. In that case the s390-ccw bios will show a list of
|
||||||
|
+installed kernels on the disk of the guest and ask the user to enter a number
|
||||||
|
+to chose which kernel should be booted -- similar to what can be achieved by
|
||||||
|
+specifying the ``-boot menu=on`` option when starting QEMU. Note that the menu
|
||||||
|
+list will only show the names of the installed kernels when using a DASD-like
|
||||||
|
+disk image with 4k byte sectors. On normal SCSI-style disks with 512-byte
|
||||||
|
+sectors, there is not enough space for the zipl loader on the disk to store
|
||||||
|
+the kernel names, so you only get a list without names here.
|
||||||
|
+
|
||||||
|
+The second way to use this parameter is to use a number in the range from 0
|
||||||
|
+to 31. The numbers that can be used here correspond to the numbers that are
|
||||||
|
+shown when using the ``PROMPT`` option, and the s390-ccw bios will then try
|
||||||
|
+to automatically boot the kernel that is associated with the given number.
|
||||||
|
+Note that ``0`` can be used to boot the default entry.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
Booting from a network device
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,356 @@
|
|||||||
|
From f2f3efff83dddd38a97699cd2701f46f61a732e3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 11:32:10 +0000
|
||||||
|
Subject: [PATCH 36/42] dump: Add architecture section and section string table
|
||||||
|
support
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [36/41] 83b98ff185e93e62703f686b65546d60c783d783
|
||||||
|
|
||||||
|
Add hooks which architectures can use to add arbitrary data to custom
|
||||||
|
sections.
|
||||||
|
|
||||||
|
Also add a section name string table in order to identify section
|
||||||
|
contents
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20221017113210.41674-1-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 9b72224f44612ddd5b434a1bccf79346946d11da)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 186 +++++++++++++++++++++++++++++++------
|
||||||
|
include/sysemu/dump-arch.h | 3 +
|
||||||
|
include/sysemu/dump.h | 3 +
|
||||||
|
3 files changed, 166 insertions(+), 26 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 7a42401790..4aa8fb64d2 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -104,6 +104,7 @@ static int dump_cleanup(DumpState *s)
|
||||||
|
memory_mapping_list_free(&s->list);
|
||||||
|
close(s->fd);
|
||||||
|
g_free(s->guest_note);
|
||||||
|
+ g_array_unref(s->string_table_buf);
|
||||||
|
s->guest_note = NULL;
|
||||||
|
if (s->resume) {
|
||||||
|
if (s->detached) {
|
||||||
|
@@ -153,11 +154,10 @@ static void prepare_elf64_header(DumpState *s, Elf64_Ehdr *elf_header)
|
||||||
|
elf_header->e_phoff = cpu_to_dump64(s, s->phdr_offset);
|
||||||
|
elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr));
|
||||||
|
elf_header->e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
- if (s->shdr_num) {
|
||||||
|
- elf_header->e_shoff = cpu_to_dump64(s, s->shdr_offset);
|
||||||
|
- elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr));
|
||||||
|
- elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
- }
|
||||||
|
+ elf_header->e_shoff = cpu_to_dump64(s, s->shdr_offset);
|
||||||
|
+ elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr));
|
||||||
|
+ elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
+ elf_header->e_shstrndx = cpu_to_dump16(s, s->shdr_num - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void prepare_elf32_header(DumpState *s, Elf32_Ehdr *elf_header)
|
||||||
|
@@ -181,11 +181,10 @@ static void prepare_elf32_header(DumpState *s, Elf32_Ehdr *elf_header)
|
||||||
|
elf_header->e_phoff = cpu_to_dump32(s, s->phdr_offset);
|
||||||
|
elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr));
|
||||||
|
elf_header->e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
- if (s->shdr_num) {
|
||||||
|
- elf_header->e_shoff = cpu_to_dump32(s, s->shdr_offset);
|
||||||
|
- elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr));
|
||||||
|
- elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
- }
|
||||||
|
+ elf_header->e_shoff = cpu_to_dump32(s, s->shdr_offset);
|
||||||
|
+ elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr));
|
||||||
|
+ elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
+ elf_header->e_shstrndx = cpu_to_dump16(s, s->shdr_num - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_elf_header(DumpState *s, Error **errp)
|
||||||
|
@@ -196,6 +195,8 @@ static void write_elf_header(DumpState *s, Error **errp)
|
||||||
|
void *header_ptr;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
+ /* The NULL header and the shstrtab are always defined */
|
||||||
|
+ assert(s->shdr_num >= 2);
|
||||||
|
if (dump_is_64bit(s)) {
|
||||||
|
prepare_elf64_header(s, &elf64_header);
|
||||||
|
header_size = sizeof(elf64_header);
|
||||||
|
@@ -394,17 +395,49 @@ static void prepare_elf_section_hdr_zero(DumpState *s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void prepare_elf_section_hdrs(DumpState *s)
|
||||||
|
+static void prepare_elf_section_hdr_string(DumpState *s, void *buff)
|
||||||
|
+{
|
||||||
|
+ uint64_t index = s->string_table_buf->len;
|
||||||
|
+ const char strtab[] = ".shstrtab";
|
||||||
|
+ Elf32_Shdr shdr32 = {};
|
||||||
|
+ Elf64_Shdr shdr64 = {};
|
||||||
|
+ int shdr_size;
|
||||||
|
+ void *shdr;
|
||||||
|
+
|
||||||
|
+ g_array_append_vals(s->string_table_buf, strtab, sizeof(strtab));
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
+ shdr_size = sizeof(Elf64_Shdr);
|
||||||
|
+ shdr64.sh_type = SHT_STRTAB;
|
||||||
|
+ shdr64.sh_offset = s->section_offset + s->elf_section_data_size;
|
||||||
|
+ shdr64.sh_name = index;
|
||||||
|
+ shdr64.sh_size = s->string_table_buf->len;
|
||||||
|
+ shdr = &shdr64;
|
||||||
|
+ } else {
|
||||||
|
+ shdr_size = sizeof(Elf32_Shdr);
|
||||||
|
+ shdr32.sh_type = SHT_STRTAB;
|
||||||
|
+ shdr32.sh_offset = s->section_offset + s->elf_section_data_size;
|
||||||
|
+ shdr32.sh_name = index;
|
||||||
|
+ shdr32.sh_size = s->string_table_buf->len;
|
||||||
|
+ shdr = &shdr32;
|
||||||
|
+ }
|
||||||
|
+ memcpy(buff, shdr, shdr_size);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static bool prepare_elf_section_hdrs(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
size_t len, sizeof_shdr;
|
||||||
|
+ void *buff_hdr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Section ordering:
|
||||||
|
* - HDR zero
|
||||||
|
+ * - Arch section hdrs
|
||||||
|
+ * - String table hdr
|
||||||
|
*/
|
||||||
|
sizeof_shdr = dump_is_64bit(s) ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr);
|
||||||
|
len = sizeof_shdr * s->shdr_num;
|
||||||
|
s->elf_section_hdrs = g_malloc0(len);
|
||||||
|
+ buff_hdr = s->elf_section_hdrs;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The first section header is ALWAYS a special initial section
|
||||||
|
@@ -420,6 +453,26 @@ static void prepare_elf_section_hdrs(DumpState *s)
|
||||||
|
if (s->phdr_num >= PN_XNUM) {
|
||||||
|
prepare_elf_section_hdr_zero(s);
|
||||||
|
}
|
||||||
|
+ buff_hdr += sizeof_shdr;
|
||||||
|
+
|
||||||
|
+ /* Add architecture defined section headers */
|
||||||
|
+ if (s->dump_info.arch_sections_write_hdr_fn
|
||||||
|
+ && s->shdr_num > 2) {
|
||||||
|
+ buff_hdr += s->dump_info.arch_sections_write_hdr_fn(s, buff_hdr);
|
||||||
|
+
|
||||||
|
+ if (s->shdr_num >= SHN_LORESERVE) {
|
||||||
|
+ error_setg_errno(errp, EINVAL,
|
||||||
|
+ "dump: too many architecture defined sections");
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * String table is the last section since strings are added via
|
||||||
|
+ * arch_sections_write_hdr().
|
||||||
|
+ */
|
||||||
|
+ prepare_elf_section_hdr_string(s, buff_hdr);
|
||||||
|
+ return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_elf_section_headers(DumpState *s, Error **errp)
|
||||||
|
@@ -427,7 +480,9 @@ static void write_elf_section_headers(DumpState *s, Error **errp)
|
||||||
|
size_t sizeof_shdr = dump_is_64bit(s) ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- prepare_elf_section_hdrs(s);
|
||||||
|
+ if (!prepare_elf_section_hdrs(s, errp)) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
ret = fd_write_vmcore(s->elf_section_hdrs, s->shdr_num * sizeof_shdr, s);
|
||||||
|
if (ret < 0) {
|
||||||
|
@@ -437,6 +492,29 @@ static void write_elf_section_headers(DumpState *s, Error **errp)
|
||||||
|
g_free(s->elf_section_hdrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void write_elf_sections(DumpState *s, Error **errp)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ if (s->elf_section_data_size) {
|
||||||
|
+ /* Write architecture section data */
|
||||||
|
+ ret = fd_write_vmcore(s->elf_section_data,
|
||||||
|
+ s->elf_section_data_size, s);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ error_setg_errno(errp, -ret,
|
||||||
|
+ "dump: failed to write architecture section data");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Write string table */
|
||||||
|
+ ret = fd_write_vmcore(s->string_table_buf->data,
|
||||||
|
+ s->string_table_buf->len, s);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ error_setg_errno(errp, -ret, "dump: failed to write string table data");
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void write_data(DumpState *s, void *buf, int length, Error **errp)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
@@ -693,6 +771,31 @@ static void dump_iterate(DumpState *s, Error **errp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void dump_end(DumpState *s, Error **errp)
|
||||||
|
+{
|
||||||
|
+ int rc;
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
+
|
||||||
|
+ if (s->elf_section_data_size) {
|
||||||
|
+ s->elf_section_data = g_malloc0(s->elf_section_data_size);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Adds the architecture defined section data to s->elf_section_data */
|
||||||
|
+ if (s->dump_info.arch_sections_write_fn &&
|
||||||
|
+ s->elf_section_data_size) {
|
||||||
|
+ rc = s->dump_info.arch_sections_write_fn(s, s->elf_section_data);
|
||||||
|
+ if (rc) {
|
||||||
|
+ error_setg_errno(errp, rc,
|
||||||
|
+ "dump: failed to get arch section data");
|
||||||
|
+ g_free(s->elf_section_data);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* write sections to vmcore */
|
||||||
|
+ write_elf_sections(s, errp);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void create_vmcore(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
|
@@ -702,7 +805,14 @@ static void create_vmcore(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Iterate over memory and dump it to file */
|
||||||
|
dump_iterate(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Write the section data */
|
||||||
|
+ dump_end(s, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int write_start_flat_header(int fd)
|
||||||
|
@@ -1720,6 +1830,14 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
s->filter_area_begin = begin;
|
||||||
|
s->filter_area_length = length;
|
||||||
|
|
||||||
|
+ /* First index is 0, it's the special null name */
|
||||||
|
+ s->string_table_buf = g_array_new(FALSE, TRUE, 1);
|
||||||
|
+ /*
|
||||||
|
+ * Allocate the null name, due to the clearing option set to true
|
||||||
|
+ * it will be 0.
|
||||||
|
+ */
|
||||||
|
+ g_array_set_size(s->string_table_buf, 1);
|
||||||
|
+
|
||||||
|
memory_mapping_list_init(&s->list);
|
||||||
|
|
||||||
|
guest_phys_blocks_init(&s->guest_phys_blocks);
|
||||||
|
@@ -1856,26 +1974,42 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * calculate phdr_num
|
||||||
|
+ * The first section header is always a special one in which most
|
||||||
|
+ * fields are 0. The section header string table is also always
|
||||||
|
+ * set.
|
||||||
|
+ */
|
||||||
|
+ s->shdr_num = 2;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Adds the number of architecture sections to shdr_num and sets
|
||||||
|
+ * elf_section_data_size so we know the offsets and sizes of all
|
||||||
|
+ * parts.
|
||||||
|
+ */
|
||||||
|
+ if (s->dump_info.arch_sections_add_fn) {
|
||||||
|
+ s->dump_info.arch_sections_add_fn(s);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * calculate shdr_num so we know the offsets and sizes of all
|
||||||
|
+ * parts.
|
||||||
|
+ * Calculate phdr_num
|
||||||
|
*
|
||||||
|
- * the type of ehdr->e_phnum is uint16_t, so we should avoid overflow
|
||||||
|
+ * The absolute maximum amount of phdrs is UINT32_MAX - 1 as
|
||||||
|
+ * sh_info is 32 bit. There's special handling once we go over
|
||||||
|
+ * UINT16_MAX - 1 but that is handled in the ehdr and section
|
||||||
|
+ * code.
|
||||||
|
*/
|
||||||
|
- s->phdr_num = 1; /* PT_NOTE */
|
||||||
|
- if (s->list.num < UINT16_MAX - 2) {
|
||||||
|
- s->shdr_num = 0;
|
||||||
|
+ s->phdr_num = 1; /* Reserve PT_NOTE */
|
||||||
|
+ if (s->list.num <= UINT32_MAX - 1) {
|
||||||
|
s->phdr_num += s->list.num;
|
||||||
|
} else {
|
||||||
|
- /* sh_info of section 0 holds the real number of phdrs */
|
||||||
|
- s->shdr_num = 1;
|
||||||
|
-
|
||||||
|
- /* the type of shdr->sh_info is uint32_t, so we should avoid overflow */
|
||||||
|
- if (s->list.num <= UINT32_MAX - 1) {
|
||||||
|
- s->phdr_num += s->list.num;
|
||||||
|
- } else {
|
||||||
|
- s->phdr_num = UINT32_MAX;
|
||||||
|
- }
|
||||||
|
+ s->phdr_num = UINT32_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Now that the number of section and program headers is known we
|
||||||
|
+ * can calculate the offsets of the headers and data.
|
||||||
|
+ */
|
||||||
|
if (dump_is_64bit(s)) {
|
||||||
|
s->shdr_offset = sizeof(Elf64_Ehdr);
|
||||||
|
s->phdr_offset = s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_num;
|
||||||
|
diff --git a/include/sysemu/dump-arch.h b/include/sysemu/dump-arch.h
|
||||||
|
index e25b02e990..59bbc9be38 100644
|
||||||
|
--- a/include/sysemu/dump-arch.h
|
||||||
|
+++ b/include/sysemu/dump-arch.h
|
||||||
|
@@ -21,6 +21,9 @@ typedef struct ArchDumpInfo {
|
||||||
|
uint32_t page_size; /* The target's page size. If it's variable and
|
||||||
|
* unknown, then this should be the maximum. */
|
||||||
|
uint64_t phys_base; /* The target's physmem base. */
|
||||||
|
+ void (*arch_sections_add_fn)(DumpState *s);
|
||||||
|
+ uint64_t (*arch_sections_write_hdr_fn)(DumpState *s, uint8_t *buff);
|
||||||
|
+ int (*arch_sections_write_fn)(DumpState *s, uint8_t *buff);
|
||||||
|
} ArchDumpInfo;
|
||||||
|
|
||||||
|
struct GuestPhysBlockList; /* memory_mapping.h */
|
||||||
|
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
|
||||||
|
index 9ed811b313..38ccac7190 100644
|
||||||
|
--- a/include/sysemu/dump.h
|
||||||
|
+++ b/include/sysemu/dump.h
|
||||||
|
@@ -180,6 +180,9 @@ typedef struct DumpState {
|
||||||
|
hwaddr note_offset;
|
||||||
|
|
||||||
|
void *elf_section_hdrs; /* Pointer to section header buffer */
|
||||||
|
+ void *elf_section_data; /* Pointer to section data buffer */
|
||||||
|
+ uint64_t elf_section_data_size; /* Size of section data */
|
||||||
|
+ GArray *string_table_buf; /* String table data buffer */
|
||||||
|
|
||||||
|
uint8_t *note_buf; /* buffer for notes */
|
||||||
|
size_t note_buf_offset; /* the writing place in note_buf */
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
138
SOURCES/kvm-dump-Add-more-offset-variables.patch
Normal file
138
SOURCES/kvm-dump-Add-more-offset-variables.patch
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
From bee31226b87d0b05faae84e88cce3af1b8dabbfd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Wed, 30 Mar 2022 12:35:59 +0000
|
||||||
|
Subject: [PATCH 17/42] dump: Add more offset variables
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [17/41] fbe629e1476e8a0e039f989af6e1f4707075ba01
|
||||||
|
|
||||||
|
Offset calculations are easy enough to get wrong. Let's add a few
|
||||||
|
variables to make moving around elf headers and data sections easier.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
Message-Id: <20220330123603.107120-6-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit e71d353360bb09a8e784e35d78370c691f6ea185)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 35 +++++++++++++++--------------------
|
||||||
|
include/sysemu/dump.h | 4 ++++
|
||||||
|
2 files changed, 19 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 5cc2322325..85a402b38c 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -142,13 +142,11 @@ static void write_elf64_header(DumpState *s, Error **errp)
|
||||||
|
elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine);
|
||||||
|
elf_header.e_version = cpu_to_dump32(s, EV_CURRENT);
|
||||||
|
elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
|
||||||
|
- elf_header.e_phoff = cpu_to_dump64(s, sizeof(Elf64_Ehdr));
|
||||||
|
+ elf_header.e_phoff = cpu_to_dump64(s, s->phdr_offset);
|
||||||
|
elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr));
|
||||||
|
elf_header.e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
if (s->shdr_num) {
|
||||||
|
- uint64_t shoff = sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->phdr_num;
|
||||||
|
-
|
||||||
|
- elf_header.e_shoff = cpu_to_dump64(s, shoff);
|
||||||
|
+ elf_header.e_shoff = cpu_to_dump64(s, s->shdr_offset);
|
||||||
|
elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr));
|
||||||
|
elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
}
|
||||||
|
@@ -179,13 +177,11 @@ static void write_elf32_header(DumpState *s, Error **errp)
|
||||||
|
elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine);
|
||||||
|
elf_header.e_version = cpu_to_dump32(s, EV_CURRENT);
|
||||||
|
elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
|
||||||
|
- elf_header.e_phoff = cpu_to_dump32(s, sizeof(Elf32_Ehdr));
|
||||||
|
+ elf_header.e_phoff = cpu_to_dump32(s, s->phdr_offset);
|
||||||
|
elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr));
|
||||||
|
elf_header.e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
if (s->shdr_num) {
|
||||||
|
- uint32_t shoff = sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->phdr_num;
|
||||||
|
-
|
||||||
|
- elf_header.e_shoff = cpu_to_dump32(s, shoff);
|
||||||
|
+ elf_header.e_shoff = cpu_to_dump32(s, s->shdr_offset);
|
||||||
|
elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr));
|
||||||
|
elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
}
|
||||||
|
@@ -248,12 +244,11 @@ static void write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
|
||||||
|
static void write_elf64_note(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
Elf64_Phdr phdr;
|
||||||
|
- hwaddr begin = s->memory_offset - s->note_size;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset(&phdr, 0, sizeof(Elf64_Phdr));
|
||||||
|
phdr.p_type = cpu_to_dump32(s, PT_NOTE);
|
||||||
|
- phdr.p_offset = cpu_to_dump64(s, begin);
|
||||||
|
+ phdr.p_offset = cpu_to_dump64(s, s->note_offset);
|
||||||
|
phdr.p_paddr = 0;
|
||||||
|
phdr.p_filesz = cpu_to_dump64(s, s->note_size);
|
||||||
|
phdr.p_memsz = cpu_to_dump64(s, s->note_size);
|
||||||
|
@@ -313,13 +308,12 @@ static void write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
|
||||||
|
|
||||||
|
static void write_elf32_note(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
- hwaddr begin = s->memory_offset - s->note_size;
|
||||||
|
Elf32_Phdr phdr;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset(&phdr, 0, sizeof(Elf32_Phdr));
|
||||||
|
phdr.p_type = cpu_to_dump32(s, PT_NOTE);
|
||||||
|
- phdr.p_offset = cpu_to_dump32(s, begin);
|
||||||
|
+ phdr.p_offset = cpu_to_dump32(s, s->note_offset);
|
||||||
|
phdr.p_paddr = 0;
|
||||||
|
phdr.p_filesz = cpu_to_dump32(s, s->note_size);
|
||||||
|
phdr.p_memsz = cpu_to_dump32(s, s->note_size);
|
||||||
|
@@ -1826,15 +1820,16 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
- s->memory_offset = sizeof(Elf64_Ehdr) +
|
||||||
|
- sizeof(Elf64_Phdr) * s->phdr_num +
|
||||||
|
- sizeof(Elf64_Shdr) * s->shdr_num +
|
||||||
|
- s->note_size;
|
||||||
|
+ s->phdr_offset = sizeof(Elf64_Ehdr);
|
||||||
|
+ s->shdr_offset = s->phdr_offset + sizeof(Elf64_Phdr) * s->phdr_num;
|
||||||
|
+ s->note_offset = s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_num;
|
||||||
|
+ s->memory_offset = s->note_offset + s->note_size;
|
||||||
|
} else {
|
||||||
|
- s->memory_offset = sizeof(Elf32_Ehdr) +
|
||||||
|
- sizeof(Elf32_Phdr) * s->phdr_num +
|
||||||
|
- sizeof(Elf32_Shdr) * s->shdr_num +
|
||||||
|
- s->note_size;
|
||||||
|
+
|
||||||
|
+ s->phdr_offset = sizeof(Elf32_Ehdr);
|
||||||
|
+ s->shdr_offset = s->phdr_offset + sizeof(Elf32_Phdr) * s->phdr_num;
|
||||||
|
+ s->note_offset = s->shdr_offset + sizeof(Elf32_Shdr) * s->shdr_num;
|
||||||
|
+ s->memory_offset = s->note_offset + s->note_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
|
||||||
|
index 19458bffbd..ffc2ea1072 100644
|
||||||
|
--- a/include/sysemu/dump.h
|
||||||
|
+++ b/include/sysemu/dump.h
|
||||||
|
@@ -159,6 +159,10 @@ typedef struct DumpState {
|
||||||
|
bool resume;
|
||||||
|
bool detached;
|
||||||
|
ssize_t note_size;
|
||||||
|
+ hwaddr shdr_offset;
|
||||||
|
+ hwaddr phdr_offset;
|
||||||
|
+ hwaddr section_offset;
|
||||||
|
+ hwaddr note_offset;
|
||||||
|
hwaddr memory_offset;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
94
SOURCES/kvm-dump-Cleanup-dump_begin-write-functions.patch
Normal file
94
SOURCES/kvm-dump-Cleanup-dump_begin-write-functions.patch
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
From cbb653d73e32513ccd46b293a52384eed6a5f84f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Wed, 30 Mar 2022 12:36:02 +0000
|
||||||
|
Subject: [PATCH 20/42] dump: Cleanup dump_begin write functions
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [20/41] 18ea1457a3e54fd368e556d96c3be50c6ad0a6bd
|
||||||
|
|
||||||
|
There's no need to have a gigantic if in there let's move the elf
|
||||||
|
32/64 bit logic into the section, segment or note code.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220330123603.107120-9-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 5ff2e5a3e1e67930e523486e39549a33fcf97227)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 42 +++++++++++-------------------------------
|
||||||
|
1 file changed, 11 insertions(+), 31 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 823ca32883..88abde355a 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -565,46 +565,26 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (dump_is_64bit(s)) {
|
||||||
|
- /* write all PT_LOAD to vmcore */
|
||||||
|
- write_elf_loads(s, errp);
|
||||||
|
+ /* write all PT_LOAD to vmcore */
|
||||||
|
+ write_elf_loads(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* write section to vmcore */
|
||||||
|
+ if (s->shdr_num) {
|
||||||
|
+ write_elf_section(s, 1, errp);
|
||||||
|
if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- /* write section to vmcore */
|
||||||
|
- if (s->shdr_num) {
|
||||||
|
- write_elf_section(s, 1, errp);
|
||||||
|
- if (*errp) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
/* write notes to vmcore */
|
||||||
|
write_elf64_notes(fd_write_vmcore, s, errp);
|
||||||
|
- if (*errp) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
} else {
|
||||||
|
- /* write all PT_LOAD to vmcore */
|
||||||
|
- write_elf_loads(s, errp);
|
||||||
|
- if (*errp) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* write section to vmcore */
|
||||||
|
- if (s->shdr_num) {
|
||||||
|
- write_elf_section(s, 0, errp);
|
||||||
|
- if (*errp) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* write notes to vmcore */
|
||||||
|
write_elf32_notes(fd_write_vmcore, s, errp);
|
||||||
|
- if (*errp) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
67
SOURCES/kvm-dump-Consolidate-elf-note-function.patch
Normal file
67
SOURCES/kvm-dump-Consolidate-elf-note-function.patch
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
From 0547599cf507930f91943f22d5f917ebacf69484 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Wed, 30 Mar 2022 12:36:03 +0000
|
||||||
|
Subject: [PATCH 21/42] dump: Consolidate elf note function
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [21/41] 52298c098c116aea75ad15894731ff412c2c4e73
|
||||||
|
|
||||||
|
Just like with the other write functions let's move the 32/64 bit elf
|
||||||
|
handling to a function to improve readability.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220330123603.107120-10-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit c68124738bc29017e4254c898bc40be7be477af7)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 18 +++++++++++-------
|
||||||
|
1 file changed, 11 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 88abde355a..a451abc590 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -520,6 +520,15 @@ static void write_elf_loads(DumpState *s, Error **errp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void write_elf_notes(DumpState *s, Error **errp)
|
||||||
|
+{
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
+ write_elf64_notes(fd_write_vmcore, s, errp);
|
||||||
|
+ } else {
|
||||||
|
+ write_elf32_notes(fd_write_vmcore, s, errp);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* write elf header, PT_NOTE and elf note to vmcore. */
|
||||||
|
static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
@@ -579,13 +588,8 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (dump_is_64bit(s)) {
|
||||||
|
- /* write notes to vmcore */
|
||||||
|
- write_elf64_notes(fd_write_vmcore, s, errp);
|
||||||
|
- } else {
|
||||||
|
- /* write notes to vmcore */
|
||||||
|
- write_elf32_notes(fd_write_vmcore, s, errp);
|
||||||
|
- }
|
||||||
|
+ /* write notes to vmcore */
|
||||||
|
+ write_elf_notes(s, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int get_next_block(DumpState *s, GuestPhysBlock *block)
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
169
SOURCES/kvm-dump-Consolidate-phdr-note-writes.patch
Normal file
169
SOURCES/kvm-dump-Consolidate-phdr-note-writes.patch
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
From f87abe1ef14e80731249ebe9fe1bea569a68e9b4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Wed, 30 Mar 2022 12:36:01 +0000
|
||||||
|
Subject: [PATCH 19/42] dump: Consolidate phdr note writes
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [19/41] 180c4c0ab4941a0bf366dc7f32ee035e03daa6c0
|
||||||
|
|
||||||
|
There's no need to have two write functions. Let's rather have two
|
||||||
|
functions that set the data for elf 32/64 and then write it in a
|
||||||
|
common function.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220330123603.107120-8-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit bc7d558017e6700f9a05c61b0b638a8994945f0d)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 94 +++++++++++++++++++++++++++--------------------------
|
||||||
|
1 file changed, 48 insertions(+), 46 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 6394e94023..823ca32883 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -246,24 +246,15 @@ static void write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void write_elf64_note(DumpState *s, Error **errp)
|
||||||
|
+static void write_elf64_phdr_note(DumpState *s, Elf64_Phdr *phdr)
|
||||||
|
{
|
||||||
|
- Elf64_Phdr phdr;
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- memset(&phdr, 0, sizeof(Elf64_Phdr));
|
||||||
|
- phdr.p_type = cpu_to_dump32(s, PT_NOTE);
|
||||||
|
- phdr.p_offset = cpu_to_dump64(s, s->note_offset);
|
||||||
|
- phdr.p_paddr = 0;
|
||||||
|
- phdr.p_filesz = cpu_to_dump64(s, s->note_size);
|
||||||
|
- phdr.p_memsz = cpu_to_dump64(s, s->note_size);
|
||||||
|
- phdr.p_vaddr = 0;
|
||||||
|
-
|
||||||
|
- ret = fd_write_vmcore(&phdr, sizeof(Elf64_Phdr), s);
|
||||||
|
- if (ret < 0) {
|
||||||
|
- error_setg_errno(errp, -ret,
|
||||||
|
- "dump: failed to write program header table");
|
||||||
|
- }
|
||||||
|
+ memset(phdr, 0, sizeof(*phdr));
|
||||||
|
+ phdr->p_type = cpu_to_dump32(s, PT_NOTE);
|
||||||
|
+ phdr->p_offset = cpu_to_dump64(s, s->note_offset);
|
||||||
|
+ phdr->p_paddr = 0;
|
||||||
|
+ phdr->p_filesz = cpu_to_dump64(s, s->note_size);
|
||||||
|
+ phdr->p_memsz = cpu_to_dump64(s, s->note_size);
|
||||||
|
+ phdr->p_vaddr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int cpu_index(CPUState *cpu)
|
||||||
|
@@ -311,24 +302,15 @@ static void write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
|
||||||
|
write_guest_note(f, s, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void write_elf32_note(DumpState *s, Error **errp)
|
||||||
|
+static void write_elf32_phdr_note(DumpState *s, Elf32_Phdr *phdr)
|
||||||
|
{
|
||||||
|
- Elf32_Phdr phdr;
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- memset(&phdr, 0, sizeof(Elf32_Phdr));
|
||||||
|
- phdr.p_type = cpu_to_dump32(s, PT_NOTE);
|
||||||
|
- phdr.p_offset = cpu_to_dump32(s, s->note_offset);
|
||||||
|
- phdr.p_paddr = 0;
|
||||||
|
- phdr.p_filesz = cpu_to_dump32(s, s->note_size);
|
||||||
|
- phdr.p_memsz = cpu_to_dump32(s, s->note_size);
|
||||||
|
- phdr.p_vaddr = 0;
|
||||||
|
-
|
||||||
|
- ret = fd_write_vmcore(&phdr, sizeof(Elf32_Phdr), s);
|
||||||
|
- if (ret < 0) {
|
||||||
|
- error_setg_errno(errp, -ret,
|
||||||
|
- "dump: failed to write program header table");
|
||||||
|
- }
|
||||||
|
+ memset(phdr, 0, sizeof(*phdr));
|
||||||
|
+ phdr->p_type = cpu_to_dump32(s, PT_NOTE);
|
||||||
|
+ phdr->p_offset = cpu_to_dump32(s, s->note_offset);
|
||||||
|
+ phdr->p_paddr = 0;
|
||||||
|
+ phdr->p_filesz = cpu_to_dump32(s, s->note_size);
|
||||||
|
+ phdr->p_memsz = cpu_to_dump32(s, s->note_size);
|
||||||
|
+ phdr->p_vaddr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_elf32_notes(WriteCoreDumpFunction f, DumpState *s,
|
||||||
|
@@ -358,6 +340,32 @@ static void write_elf32_notes(WriteCoreDumpFunction f, DumpState *s,
|
||||||
|
write_guest_note(f, s, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void write_elf_phdr_note(DumpState *s, Error **errp)
|
||||||
|
+{
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
+ Elf32_Phdr phdr32;
|
||||||
|
+ Elf64_Phdr phdr64;
|
||||||
|
+ void *phdr;
|
||||||
|
+ size_t size;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
+ write_elf64_phdr_note(s, &phdr64);
|
||||||
|
+ size = sizeof(phdr64);
|
||||||
|
+ phdr = &phdr64;
|
||||||
|
+ } else {
|
||||||
|
+ write_elf32_phdr_note(s, &phdr32);
|
||||||
|
+ size = sizeof(phdr32);
|
||||||
|
+ phdr = &phdr32;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = fd_write_vmcore(phdr, size, s);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ error_setg_errno(errp, -ret,
|
||||||
|
+ "dump: failed to write program header table");
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void write_elf_section(DumpState *s, int type, Error **errp)
|
||||||
|
{
|
||||||
|
Elf32_Shdr shdr32;
|
||||||
|
@@ -551,13 +559,13 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (dump_is_64bit(s)) {
|
||||||
|
- /* write PT_NOTE to vmcore */
|
||||||
|
- write_elf64_note(s, errp);
|
||||||
|
- if (*errp) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
+ /* write PT_NOTE to vmcore */
|
||||||
|
+ write_elf_phdr_note(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
/* write all PT_LOAD to vmcore */
|
||||||
|
write_elf_loads(s, errp);
|
||||||
|
if (*errp) {
|
||||||
|
@@ -578,12 +586,6 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- /* write PT_NOTE to vmcore */
|
||||||
|
- write_elf32_note(s, errp);
|
||||||
|
- if (*errp) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* write all PT_LOAD to vmcore */
|
||||||
|
write_elf_loads(s, errp);
|
||||||
|
if (*errp) {
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
118
SOURCES/kvm-dump-Introduce-dump_is_64bit-helper-function.patch
Normal file
118
SOURCES/kvm-dump-Introduce-dump_is_64bit-helper-function.patch
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
From c851676d202b5b76962529f3b6d433936becbd8a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Wed, 30 Mar 2022 12:36:00 +0000
|
||||||
|
Subject: [PATCH 18/42] dump: Introduce dump_is_64bit() helper function
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [18/41] a0fd2d1985c61b8e50d4a7ca26bc0ee6fcaa6196
|
||||||
|
|
||||||
|
Checking d_class in dump_info leads to lengthy conditionals so let's
|
||||||
|
shorten things a bit by introducing a helper function.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220330123603.107120-7-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 05bbaa5040ccb3419e8b93af8040485430e2db42)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 25 +++++++++++++++----------
|
||||||
|
1 file changed, 15 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 85a402b38c..6394e94023 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -55,6 +55,11 @@ static Error *dump_migration_blocker;
|
||||||
|
DIV_ROUND_UP((name_size), 4) + \
|
||||||
|
DIV_ROUND_UP((desc_size), 4)) * 4)
|
||||||
|
|
||||||
|
+static inline bool dump_is_64bit(DumpState *s)
|
||||||
|
+{
|
||||||
|
+ return s->dump_info.d_class == ELFCLASS64;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
uint16_t cpu_to_dump16(DumpState *s, uint16_t val)
|
||||||
|
{
|
||||||
|
if (s->dump_info.d_endian == ELFDATA2LSB) {
|
||||||
|
@@ -489,7 +494,7 @@ static void write_elf_loads(DumpState *s, Error **errp)
|
||||||
|
get_offset_range(memory_mapping->phys_addr,
|
||||||
|
memory_mapping->length,
|
||||||
|
s, &offset, &filesz);
|
||||||
|
- if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
write_elf64_load(s, memory_mapping, phdr_index++, offset,
|
||||||
|
filesz, errp);
|
||||||
|
} else {
|
||||||
|
@@ -537,7 +542,7 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* write elf header to vmcore */
|
||||||
|
- if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
write_elf64_header(s, errp);
|
||||||
|
} else {
|
||||||
|
write_elf32_header(s, errp);
|
||||||
|
@@ -546,7 +551,7 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
/* write PT_NOTE to vmcore */
|
||||||
|
write_elf64_note(s, errp);
|
||||||
|
if (*errp) {
|
||||||
|
@@ -757,7 +762,7 @@ static void get_note_sizes(DumpState *s, const void *note,
|
||||||
|
uint64_t name_sz;
|
||||||
|
uint64_t desc_sz;
|
||||||
|
|
||||||
|
- if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
const Elf64_Nhdr *hdr = note;
|
||||||
|
note_head_sz = sizeof(Elf64_Nhdr);
|
||||||
|
name_sz = tswap64(hdr->n_namesz);
|
||||||
|
@@ -1017,10 +1022,10 @@ out:
|
||||||
|
|
||||||
|
static void write_dump_header(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
- if (s->dump_info.d_class == ELFCLASS32) {
|
||||||
|
- create_header32(s, errp);
|
||||||
|
- } else {
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
create_header64(s, errp);
|
||||||
|
+ } else {
|
||||||
|
+ create_header32(s, errp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1715,8 +1720,8 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
uint32_t size;
|
||||||
|
uint16_t format;
|
||||||
|
|
||||||
|
- note_head_size = s->dump_info.d_class == ELFCLASS32 ?
|
||||||
|
- sizeof(Elf32_Nhdr) : sizeof(Elf64_Nhdr);
|
||||||
|
+ note_head_size = dump_is_64bit(s) ?
|
||||||
|
+ sizeof(Elf64_Nhdr) : sizeof(Elf32_Nhdr);
|
||||||
|
|
||||||
|
format = le16_to_cpu(vmci->vmcoreinfo.guest_format);
|
||||||
|
size = le32_to_cpu(vmci->vmcoreinfo.size);
|
||||||
|
@@ -1819,7 +1824,7 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
s->phdr_offset = sizeof(Elf64_Ehdr);
|
||||||
|
s->shdr_offset = s->phdr_offset + sizeof(Elf64_Phdr) * s->phdr_num;
|
||||||
|
s->note_offset = s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_num;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
136
SOURCES/kvm-dump-Introduce-shdr_num-to-decrease-complexity.patch
Normal file
136
SOURCES/kvm-dump-Introduce-shdr_num-to-decrease-complexity.patch
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
From 255722667a4fa4d522bb0b7e0825cbbe635abb8d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Wed, 30 Mar 2022 12:35:57 +0000
|
||||||
|
Subject: [PATCH 15/42] dump: Introduce shdr_num to decrease complexity
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [15/41] b0215ea5d381ef7f6abfe3f3bafea51ce933da56
|
||||||
|
|
||||||
|
Let's move from a boolean to a int variable which will later enable us
|
||||||
|
to store the number of sections that are in the dump file.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220330123603.107120-4-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 862a395858e5a302ed5921487777acdc95a3a31b)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 24 ++++++++++++------------
|
||||||
|
include/sysemu/dump.h | 2 +-
|
||||||
|
2 files changed, 13 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 7236b167cc..972e28b089 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -145,12 +145,12 @@ static void write_elf64_header(DumpState *s, Error **errp)
|
||||||
|
elf_header.e_phoff = cpu_to_dump64(s, sizeof(Elf64_Ehdr));
|
||||||
|
elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr));
|
||||||
|
elf_header.e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
- if (s->have_section) {
|
||||||
|
+ if (s->shdr_num) {
|
||||||
|
uint64_t shoff = sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->phdr_num;
|
||||||
|
|
||||||
|
elf_header.e_shoff = cpu_to_dump64(s, shoff);
|
||||||
|
elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr));
|
||||||
|
- elf_header.e_shnum = cpu_to_dump16(s, 1);
|
||||||
|
+ elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s);
|
||||||
|
@@ -182,12 +182,12 @@ static void write_elf32_header(DumpState *s, Error **errp)
|
||||||
|
elf_header.e_phoff = cpu_to_dump32(s, sizeof(Elf32_Ehdr));
|
||||||
|
elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr));
|
||||||
|
elf_header.e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
- if (s->have_section) {
|
||||||
|
+ if (s->shdr_num) {
|
||||||
|
uint32_t shoff = sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->phdr_num;
|
||||||
|
|
||||||
|
elf_header.e_shoff = cpu_to_dump32(s, shoff);
|
||||||
|
elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr));
|
||||||
|
- elf_header.e_shnum = cpu_to_dump16(s, 1);
|
||||||
|
+ elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s);
|
||||||
|
@@ -566,7 +566,7 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write section to vmcore */
|
||||||
|
- if (s->have_section) {
|
||||||
|
+ if (s->shdr_num) {
|
||||||
|
write_elf_section(s, 1, errp);
|
||||||
|
if (*errp) {
|
||||||
|
return;
|
||||||
|
@@ -592,7 +592,7 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write section to vmcore */
|
||||||
|
- if (s->have_section) {
|
||||||
|
+ if (s->shdr_num) {
|
||||||
|
write_elf_section(s, 0, errp);
|
||||||
|
if (*errp) {
|
||||||
|
return;
|
||||||
|
@@ -1811,11 +1811,11 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
*/
|
||||||
|
s->phdr_num = 1; /* PT_NOTE */
|
||||||
|
if (s->list.num < UINT16_MAX - 2) {
|
||||||
|
+ s->shdr_num = 0;
|
||||||
|
s->phdr_num += s->list.num;
|
||||||
|
- s->have_section = false;
|
||||||
|
} else {
|
||||||
|
/* sh_info of section 0 holds the real number of phdrs */
|
||||||
|
- s->have_section = true;
|
||||||
|
+ s->shdr_num = 1;
|
||||||
|
|
||||||
|
/* the type of shdr->sh_info is uint32_t, so we should avoid overflow */
|
||||||
|
if (s->list.num <= UINT32_MAX - 1) {
|
||||||
|
@@ -1826,19 +1826,19 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
- if (s->have_section) {
|
||||||
|
+ if (s->shdr_num) {
|
||||||
|
s->memory_offset = sizeof(Elf64_Ehdr) +
|
||||||
|
sizeof(Elf64_Phdr) * s->phdr_num +
|
||||||
|
- sizeof(Elf64_Shdr) + s->note_size;
|
||||||
|
+ sizeof(Elf64_Shdr) * s->shdr_num + s->note_size;
|
||||||
|
} else {
|
||||||
|
s->memory_offset = sizeof(Elf64_Ehdr) +
|
||||||
|
sizeof(Elf64_Phdr) * s->phdr_num + s->note_size;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- if (s->have_section) {
|
||||||
|
+ if (s->shdr_num) {
|
||||||
|
s->memory_offset = sizeof(Elf32_Ehdr) +
|
||||||
|
sizeof(Elf32_Phdr) * s->phdr_num +
|
||||||
|
- sizeof(Elf32_Shdr) + s->note_size;
|
||||||
|
+ sizeof(Elf32_Shdr) * s->shdr_num + s->note_size;
|
||||||
|
} else {
|
||||||
|
s->memory_offset = sizeof(Elf32_Ehdr) +
|
||||||
|
sizeof(Elf32_Phdr) * s->phdr_num + s->note_size;
|
||||||
|
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
|
||||||
|
index b463fc9c02..19458bffbd 100644
|
||||||
|
--- a/include/sysemu/dump.h
|
||||||
|
+++ b/include/sysemu/dump.h
|
||||||
|
@@ -155,7 +155,7 @@ typedef struct DumpState {
|
||||||
|
ArchDumpInfo dump_info;
|
||||||
|
MemoryMappingList list;
|
||||||
|
uint32_t phdr_num;
|
||||||
|
- bool have_section;
|
||||||
|
+ uint32_t shdr_num;
|
||||||
|
bool resume;
|
||||||
|
bool detached;
|
||||||
|
ssize_t note_size;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,142 @@
|
|||||||
|
From a18ba2fbaf132724e81be92da42b36d8f365e66c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Thu, 11 Aug 2022 12:10:56 +0000
|
||||||
|
Subject: [PATCH 24/42] dump: Refactor dump_iterate and introduce
|
||||||
|
dump_filter_memblock_*()
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [24/41] 74ef470f24d9d98093c4d63730a99474587033fd
|
||||||
|
|
||||||
|
The iteration over the memblocks in dump_iterate() is hard to
|
||||||
|
understand so it's about time to clean it up. Instead of manually
|
||||||
|
grabbing the next memblock we can use QTAILQ_FOREACH to iterate over
|
||||||
|
all memblocks.
|
||||||
|
|
||||||
|
Additionally we move the calculation of the offset and length out by
|
||||||
|
introducing and using the dump_filter_memblock_*() functions. These
|
||||||
|
functions will later be used to cleanup other parts of dump.c.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220811121111.9878-4-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 1e8113032f5b1efc5da66382470ce4809c76f8f2)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 74 ++++++++++++++++++++++++++++++-----------------------
|
||||||
|
1 file changed, 42 insertions(+), 32 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index fa787f379f..d981e843dd 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -592,31 +592,43 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
write_elf_notes(s, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int get_next_block(DumpState *s, GuestPhysBlock *block)
|
||||||
|
+static int64_t dump_filtered_memblock_size(GuestPhysBlock *block,
|
||||||
|
+ int64_t filter_area_start,
|
||||||
|
+ int64_t filter_area_length)
|
||||||
|
{
|
||||||
|
- while (1) {
|
||||||
|
- block = QTAILQ_NEXT(block, next);
|
||||||
|
- if (!block) {
|
||||||
|
- /* no more block */
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
+ int64_t size, left, right;
|
||||||
|
|
||||||
|
- s->start = 0;
|
||||||
|
- s->next_block = block;
|
||||||
|
- if (s->has_filter) {
|
||||||
|
- if (block->target_start >= s->begin + s->length ||
|
||||||
|
- block->target_end <= s->begin) {
|
||||||
|
- /* This block is out of the range */
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
+ /* No filter, return full size */
|
||||||
|
+ if (!filter_area_length) {
|
||||||
|
+ return block->target_end - block->target_start;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (s->begin > block->target_start) {
|
||||||
|
- s->start = s->begin - block->target_start;
|
||||||
|
- }
|
||||||
|
+ /* calculate the overlapped region. */
|
||||||
|
+ left = MAX(filter_area_start, block->target_start);
|
||||||
|
+ right = MIN(filter_area_start + filter_area_length, block->target_end);
|
||||||
|
+ size = right - left;
|
||||||
|
+ size = size > 0 ? size : 0;
|
||||||
|
+
|
||||||
|
+ return size;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int64_t dump_filtered_memblock_start(GuestPhysBlock *block,
|
||||||
|
+ int64_t filter_area_start,
|
||||||
|
+ int64_t filter_area_length)
|
||||||
|
+{
|
||||||
|
+ if (filter_area_length) {
|
||||||
|
+ /* return -1 if the block is not within filter area */
|
||||||
|
+ if (block->target_start >= filter_area_start + filter_area_length ||
|
||||||
|
+ block->target_end <= filter_area_start) {
|
||||||
|
+ return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- return 0;
|
||||||
|
+ if (filter_area_start > block->target_start) {
|
||||||
|
+ return filter_area_start - block->target_start;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write all memory to vmcore */
|
||||||
|
@@ -624,24 +636,22 @@ static void dump_iterate(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
|
GuestPhysBlock *block;
|
||||||
|
- int64_t size;
|
||||||
|
-
|
||||||
|
- do {
|
||||||
|
- block = s->next_block;
|
||||||
|
+ int64_t memblock_size, memblock_start;
|
||||||
|
|
||||||
|
- size = block->target_end - block->target_start;
|
||||||
|
- if (s->has_filter) {
|
||||||
|
- size -= s->start;
|
||||||
|
- if (s->begin + s->length < block->target_end) {
|
||||||
|
- size -= block->target_end - (s->begin + s->length);
|
||||||
|
- }
|
||||||
|
+ QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
|
||||||
|
+ memblock_start = dump_filtered_memblock_start(block, s->begin, s->length);
|
||||||
|
+ if (memblock_start == -1) {
|
||||||
|
+ continue;
|
||||||
|
}
|
||||||
|
- write_memory(s, block, s->start, size, errp);
|
||||||
|
+
|
||||||
|
+ memblock_size = dump_filtered_memblock_size(block, s->begin, s->length);
|
||||||
|
+
|
||||||
|
+ /* Write the memory to file */
|
||||||
|
+ write_memory(s, block, memblock_start, memblock_size, errp);
|
||||||
|
if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- } while (!get_next_block(s, block));
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static void create_vmcore(DumpState *s, Error **errp)
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,45 @@
|
|||||||
|
From 6932fe3afbec443bbf6acff5b707536254e1bc37 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 08:38:16 +0000
|
||||||
|
Subject: [PATCH 35/42] dump: Reintroduce memory_offset and section_offset
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [35/41] e60c0d066aeeedb42e724712bc3aa7b7591c6c79
|
||||||
|
|
||||||
|
section_offset will later be used to store the offset to the section
|
||||||
|
data which will be stored last. For now memory_offset is only needed
|
||||||
|
to make section_offset look nicer.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20221017083822.43118-5-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 13fd417ddc81a1685c6a8f4e1c80bbfe7150f164)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index d17537d4e9..7a42401790 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -1885,6 +1885,8 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
s->phdr_offset = s->shdr_offset + sizeof(Elf32_Shdr) * s->shdr_num;
|
||||||
|
s->note_offset = s->phdr_offset + sizeof(Elf32_Phdr) * s->phdr_num;
|
||||||
|
}
|
||||||
|
+ s->memory_offset = s->note_offset + s->note_size;
|
||||||
|
+ s->section_offset = s->memory_offset + s->total_size;
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,70 @@
|
|||||||
|
From a8eeab6936a2bd27b33b63aed7e2ef96034f7772 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Wed, 30 Mar 2022 12:35:58 +0000
|
||||||
|
Subject: [PATCH 16/42] dump: Remove the section if when calculating the memory
|
||||||
|
offset
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [16/41] ff214d2c23b9cb16fd49d22d976829267df43133
|
||||||
|
|
||||||
|
When s->shdr_num is 0 we'll add 0 bytes of section headers which is
|
||||||
|
equivalent to not adding section headers but with the multiplication
|
||||||
|
we can remove a if/else.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220330123603.107120-5-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 344107e07bd81546474a54ab83800158ca953059)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 24 ++++++++----------------
|
||||||
|
1 file changed, 8 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 972e28b089..5cc2322325 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -1826,23 +1826,15 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
- if (s->shdr_num) {
|
||||||
|
- s->memory_offset = sizeof(Elf64_Ehdr) +
|
||||||
|
- sizeof(Elf64_Phdr) * s->phdr_num +
|
||||||
|
- sizeof(Elf64_Shdr) * s->shdr_num + s->note_size;
|
||||||
|
- } else {
|
||||||
|
- s->memory_offset = sizeof(Elf64_Ehdr) +
|
||||||
|
- sizeof(Elf64_Phdr) * s->phdr_num + s->note_size;
|
||||||
|
- }
|
||||||
|
+ s->memory_offset = sizeof(Elf64_Ehdr) +
|
||||||
|
+ sizeof(Elf64_Phdr) * s->phdr_num +
|
||||||
|
+ sizeof(Elf64_Shdr) * s->shdr_num +
|
||||||
|
+ s->note_size;
|
||||||
|
} else {
|
||||||
|
- if (s->shdr_num) {
|
||||||
|
- s->memory_offset = sizeof(Elf32_Ehdr) +
|
||||||
|
- sizeof(Elf32_Phdr) * s->phdr_num +
|
||||||
|
- sizeof(Elf32_Shdr) * s->shdr_num + s->note_size;
|
||||||
|
- } else {
|
||||||
|
- s->memory_offset = sizeof(Elf32_Ehdr) +
|
||||||
|
- sizeof(Elf32_Phdr) * s->phdr_num + s->note_size;
|
||||||
|
- }
|
||||||
|
+ s->memory_offset = sizeof(Elf32_Ehdr) +
|
||||||
|
+ sizeof(Elf32_Phdr) * s->phdr_num +
|
||||||
|
+ sizeof(Elf32_Shdr) * s->shdr_num +
|
||||||
|
+ s->note_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
176
SOURCES/kvm-dump-Remove-the-sh_info-variable.patch
Normal file
176
SOURCES/kvm-dump-Remove-the-sh_info-variable.patch
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
From eb763bec53d6b9aea7a6b60b0cf8c5d8b5f1b35c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Thu, 7 Apr 2022 09:48:24 +0000
|
||||||
|
Subject: [PATCH 14/42] dump: Remove the sh_info variable
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [14/41] 24af12b78c8f5a02cf85df2f6b1d64249f9499c9
|
||||||
|
|
||||||
|
There's no need to have phdr_num and sh_info at the same time. We can
|
||||||
|
make phdr_num 32 bit and set PN_XNUM when we write the header if
|
||||||
|
phdr_num >= PN_XNUM.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220407094824.5074-1-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 046bc4160bc780eaacc2d702a2589f1a7a01188d)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 44 +++++++++++++++++++++++--------------------
|
||||||
|
include/sysemu/dump.h | 3 +--
|
||||||
|
2 files changed, 25 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 9876123f2e..7236b167cc 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -124,6 +124,12 @@ static int fd_write_vmcore(const void *buf, size_t size, void *opaque)
|
||||||
|
|
||||||
|
static void write_elf64_header(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
+ /*
|
||||||
|
+ * phnum in the elf header is 16 bit, if we have more segments we
|
||||||
|
+ * set phnum to PN_XNUM and write the real number of segments to a
|
||||||
|
+ * special section.
|
||||||
|
+ */
|
||||||
|
+ uint16_t phnum = MIN(s->phdr_num, PN_XNUM);
|
||||||
|
Elf64_Ehdr elf_header;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
@@ -138,9 +144,9 @@ static void write_elf64_header(DumpState *s, Error **errp)
|
||||||
|
elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
|
||||||
|
elf_header.e_phoff = cpu_to_dump64(s, sizeof(Elf64_Ehdr));
|
||||||
|
elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr));
|
||||||
|
- elf_header.e_phnum = cpu_to_dump16(s, s->phdr_num);
|
||||||
|
+ elf_header.e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
if (s->have_section) {
|
||||||
|
- uint64_t shoff = sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->sh_info;
|
||||||
|
+ uint64_t shoff = sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->phdr_num;
|
||||||
|
|
||||||
|
elf_header.e_shoff = cpu_to_dump64(s, shoff);
|
||||||
|
elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr));
|
||||||
|
@@ -155,6 +161,12 @@ static void write_elf64_header(DumpState *s, Error **errp)
|
||||||
|
|
||||||
|
static void write_elf32_header(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
+ /*
|
||||||
|
+ * phnum in the elf header is 16 bit, if we have more segments we
|
||||||
|
+ * set phnum to PN_XNUM and write the real number of segments to a
|
||||||
|
+ * special section.
|
||||||
|
+ */
|
||||||
|
+ uint16_t phnum = MIN(s->phdr_num, PN_XNUM);
|
||||||
|
Elf32_Ehdr elf_header;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
@@ -169,9 +181,9 @@ static void write_elf32_header(DumpState *s, Error **errp)
|
||||||
|
elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
|
||||||
|
elf_header.e_phoff = cpu_to_dump32(s, sizeof(Elf32_Ehdr));
|
||||||
|
elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr));
|
||||||
|
- elf_header.e_phnum = cpu_to_dump16(s, s->phdr_num);
|
||||||
|
+ elf_header.e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
if (s->have_section) {
|
||||||
|
- uint32_t shoff = sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->sh_info;
|
||||||
|
+ uint32_t shoff = sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->phdr_num;
|
||||||
|
|
||||||
|
elf_header.e_shoff = cpu_to_dump32(s, shoff);
|
||||||
|
elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr));
|
||||||
|
@@ -358,12 +370,12 @@ static void write_elf_section(DumpState *s, int type, Error **errp)
|
||||||
|
if (type == 0) {
|
||||||
|
shdr_size = sizeof(Elf32_Shdr);
|
||||||
|
memset(&shdr32, 0, shdr_size);
|
||||||
|
- shdr32.sh_info = cpu_to_dump32(s, s->sh_info);
|
||||||
|
+ shdr32.sh_info = cpu_to_dump32(s, s->phdr_num);
|
||||||
|
shdr = &shdr32;
|
||||||
|
} else {
|
||||||
|
shdr_size = sizeof(Elf64_Shdr);
|
||||||
|
memset(&shdr64, 0, shdr_size);
|
||||||
|
- shdr64.sh_info = cpu_to_dump32(s, s->sh_info);
|
||||||
|
+ shdr64.sh_info = cpu_to_dump32(s, s->phdr_num);
|
||||||
|
shdr = &shdr64;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -478,13 +490,6 @@ static void write_elf_loads(DumpState *s, Error **errp)
|
||||||
|
hwaddr offset, filesz;
|
||||||
|
MemoryMapping *memory_mapping;
|
||||||
|
uint32_t phdr_index = 1;
|
||||||
|
- uint32_t max_index;
|
||||||
|
-
|
||||||
|
- if (s->have_section) {
|
||||||
|
- max_index = s->sh_info;
|
||||||
|
- } else {
|
||||||
|
- max_index = s->phdr_num;
|
||||||
|
- }
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(memory_mapping, &s->list.head, next) {
|
||||||
|
get_offset_range(memory_mapping->phys_addr,
|
||||||
|
@@ -502,7 +507,7 @@ static void write_elf_loads(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (phdr_index >= max_index) {
|
||||||
|
+ if (phdr_index >= s->phdr_num) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1809,22 +1814,21 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
s->phdr_num += s->list.num;
|
||||||
|
s->have_section = false;
|
||||||
|
} else {
|
||||||
|
+ /* sh_info of section 0 holds the real number of phdrs */
|
||||||
|
s->have_section = true;
|
||||||
|
- s->phdr_num = PN_XNUM;
|
||||||
|
- s->sh_info = 1; /* PT_NOTE */
|
||||||
|
|
||||||
|
/* the type of shdr->sh_info is uint32_t, so we should avoid overflow */
|
||||||
|
if (s->list.num <= UINT32_MAX - 1) {
|
||||||
|
- s->sh_info += s->list.num;
|
||||||
|
+ s->phdr_num += s->list.num;
|
||||||
|
} else {
|
||||||
|
- s->sh_info = UINT32_MAX;
|
||||||
|
+ s->phdr_num = UINT32_MAX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
if (s->have_section) {
|
||||||
|
s->memory_offset = sizeof(Elf64_Ehdr) +
|
||||||
|
- sizeof(Elf64_Phdr) * s->sh_info +
|
||||||
|
+ sizeof(Elf64_Phdr) * s->phdr_num +
|
||||||
|
sizeof(Elf64_Shdr) + s->note_size;
|
||||||
|
} else {
|
||||||
|
s->memory_offset = sizeof(Elf64_Ehdr) +
|
||||||
|
@@ -1833,7 +1837,7 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
} else {
|
||||||
|
if (s->have_section) {
|
||||||
|
s->memory_offset = sizeof(Elf32_Ehdr) +
|
||||||
|
- sizeof(Elf32_Phdr) * s->sh_info +
|
||||||
|
+ sizeof(Elf32_Phdr) * s->phdr_num +
|
||||||
|
sizeof(Elf32_Shdr) + s->note_size;
|
||||||
|
} else {
|
||||||
|
s->memory_offset = sizeof(Elf32_Ehdr) +
|
||||||
|
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
|
||||||
|
index 250143cb5a..b463fc9c02 100644
|
||||||
|
--- a/include/sysemu/dump.h
|
||||||
|
+++ b/include/sysemu/dump.h
|
||||||
|
@@ -154,8 +154,7 @@ typedef struct DumpState {
|
||||||
|
GuestPhysBlockList guest_phys_blocks;
|
||||||
|
ArchDumpInfo dump_info;
|
||||||
|
MemoryMappingList list;
|
||||||
|
- uint16_t phdr_num;
|
||||||
|
- uint32_t sh_info;
|
||||||
|
+ uint32_t phdr_num;
|
||||||
|
bool have_section;
|
||||||
|
bool resume;
|
||||||
|
bool detached;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,69 @@
|
|||||||
|
From 18fef7f02801d51207d67b8f8ec5f0d828889c78 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Thu, 11 Aug 2022 12:11:01 +0000
|
||||||
|
Subject: [PATCH 29/42] dump: Rename write_elf*_phdr_note to
|
||||||
|
prepare_elf*_phdr_note
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [29/41] 876cea6f6e51be8df2763f56d0daef99d11fdd49
|
||||||
|
|
||||||
|
The functions in question do not actually write to the file descriptor
|
||||||
|
they set up a buffer which is later written to the fd.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220811121111.9878-9-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 2341a94d3a0a8a93a5a977e642da1807b8edaab8)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 8 ++++----
|
||||||
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 8d5226f861..c2c1341ad7 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -261,7 +261,7 @@ static void write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void write_elf64_phdr_note(DumpState *s, Elf64_Phdr *phdr)
|
||||||
|
+static void prepare_elf64_phdr_note(DumpState *s, Elf64_Phdr *phdr)
|
||||||
|
{
|
||||||
|
memset(phdr, 0, sizeof(*phdr));
|
||||||
|
phdr->p_type = cpu_to_dump32(s, PT_NOTE);
|
||||||
|
@@ -317,7 +317,7 @@ static void write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
|
||||||
|
write_guest_note(f, s, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void write_elf32_phdr_note(DumpState *s, Elf32_Phdr *phdr)
|
||||||
|
+static void prepare_elf32_phdr_note(DumpState *s, Elf32_Phdr *phdr)
|
||||||
|
{
|
||||||
|
memset(phdr, 0, sizeof(*phdr));
|
||||||
|
phdr->p_type = cpu_to_dump32(s, PT_NOTE);
|
||||||
|
@@ -365,11 +365,11 @@ static void write_elf_phdr_note(DumpState *s, Error **errp)
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (dump_is_64bit(s)) {
|
||||||
|
- write_elf64_phdr_note(s, &phdr64);
|
||||||
|
+ prepare_elf64_phdr_note(s, &phdr64);
|
||||||
|
size = sizeof(phdr64);
|
||||||
|
phdr = &phdr64;
|
||||||
|
} else {
|
||||||
|
- write_elf32_phdr_note(s, &phdr32);
|
||||||
|
+ prepare_elf32_phdr_note(s, &phdr32);
|
||||||
|
size = sizeof(phdr32);
|
||||||
|
phdr = &phdr32;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,57 @@
|
|||||||
|
From 04d4947a22fe3192384ff486d0a979d799ded98e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Thu, 11 Aug 2022 12:10:55 +0000
|
||||||
|
Subject: [PATCH 23/42] dump: Rename write_elf_loads to write_elf_phdr_loads
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [23/41] 18e3ef70b97c525b7c43cf12143204bdb1060e4f
|
||||||
|
|
||||||
|
Let's make it a bit clearer that we write the program headers of the
|
||||||
|
PT_LOAD type.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Reviewed-by: Steffen Eiden <seiden@ibm.linux.com>
|
||||||
|
Message-Id: <20220811121111.9878-3-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit afae6056ea79e2d89fd90867de3a01732eae724f)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 6 +++---
|
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index a451abc590..fa787f379f 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -491,7 +491,7 @@ static void get_offset_range(hwaddr phys_addr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void write_elf_loads(DumpState *s, Error **errp)
|
||||||
|
+static void write_elf_phdr_loads(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
|
hwaddr offset, filesz;
|
||||||
|
@@ -574,8 +574,8 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* write all PT_LOAD to vmcore */
|
||||||
|
- write_elf_loads(s, errp);
|
||||||
|
+ /* write all PT_LOADs to vmcore */
|
||||||
|
+ write_elf_phdr_loads(s, errp);
|
||||||
|
if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
68
SOURCES/kvm-dump-Reorder-struct-DumpState.patch
Normal file
68
SOURCES/kvm-dump-Reorder-struct-DumpState.patch
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
From 7e8d6290099b33f88621b45e62652a97704c9573 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 08:38:15 +0000
|
||||||
|
Subject: [PATCH 34/42] dump: Reorder struct DumpState
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [34/41] 8d44e5e8c86ea5b33644eba141046cd657d0071e
|
||||||
|
|
||||||
|
Let's move ELF related members into one block and guest memory related
|
||||||
|
ones into another to improve readability.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20221017083822.43118-4-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 8384b73c46fd474847d7e74d121318e344edc3c4)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
include/sysemu/dump.h | 16 +++++++++-------
|
||||||
|
1 file changed, 9 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
|
||||||
|
index 9995f65dc8..9ed811b313 100644
|
||||||
|
--- a/include/sysemu/dump.h
|
||||||
|
+++ b/include/sysemu/dump.h
|
||||||
|
@@ -154,15 +154,8 @@ typedef struct DumpState {
|
||||||
|
GuestPhysBlockList guest_phys_blocks;
|
||||||
|
ArchDumpInfo dump_info;
|
||||||
|
MemoryMappingList list;
|
||||||
|
- uint32_t phdr_num;
|
||||||
|
- uint32_t shdr_num;
|
||||||
|
bool resume;
|
||||||
|
bool detached;
|
||||||
|
- ssize_t note_size;
|
||||||
|
- hwaddr shdr_offset;
|
||||||
|
- hwaddr phdr_offset;
|
||||||
|
- hwaddr section_offset;
|
||||||
|
- hwaddr note_offset;
|
||||||
|
hwaddr memory_offset;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
@@ -177,6 +170,15 @@ typedef struct DumpState {
|
||||||
|
int64_t filter_area_begin; /* Start address of partial guest memory area */
|
||||||
|
int64_t filter_area_length; /* Length of partial guest memory area */
|
||||||
|
|
||||||
|
+ /* Elf dump related data */
|
||||||
|
+ uint32_t phdr_num;
|
||||||
|
+ uint32_t shdr_num;
|
||||||
|
+ ssize_t note_size;
|
||||||
|
+ hwaddr shdr_offset;
|
||||||
|
+ hwaddr phdr_offset;
|
||||||
|
+ hwaddr section_offset;
|
||||||
|
+ hwaddr note_offset;
|
||||||
|
+
|
||||||
|
void *elf_section_hdrs; /* Pointer to section header buffer */
|
||||||
|
|
||||||
|
uint8_t *note_buf; /* buffer for notes */
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,467 @@
|
|||||||
|
From 8f674e0e12e4b88fc035948612a0b0949e0ad892 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Thu, 11 Aug 2022 12:10:54 +0000
|
||||||
|
Subject: [PATCH 22/42] dump: Replace opaque DumpState pointer with a typed one
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [22/41] 5f071d7ef441ae6f5da70eb56018c4657deee3d7
|
||||||
|
|
||||||
|
It's always better to convey the type of a pointer if at all
|
||||||
|
possible. So let's add the DumpState typedef to typedefs.h and move
|
||||||
|
the dump note functions from the opaque pointers to DumpState
|
||||||
|
pointers.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
CC: Peter Maydell <peter.maydell@linaro.org>
|
||||||
|
CC: Cédric Le Goater <clg@kaod.org>
|
||||||
|
CC: Daniel Henrique Barboza <danielhb413@gmail.com>
|
||||||
|
CC: David Gibson <david@gibson.dropbear.id.au>
|
||||||
|
CC: Greg Kurz <groug@kaod.org>
|
||||||
|
CC: Palmer Dabbelt <palmer@dabbelt.com>
|
||||||
|
CC: Alistair Francis <alistair.francis@wdc.com>
|
||||||
|
CC: Bin Meng <bin.meng@windriver.com>
|
||||||
|
CC: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
CC: Thomas Huth <thuth@redhat.com>
|
||||||
|
CC: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
CC: David Hildenbrand <david@redhat.com>
|
||||||
|
Acked-by: Daniel Henrique Barboza <danielhb413@gmail.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220811121111.9878-2-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 1af0006ab959864dfa2f59e9136c5fb93000b61f)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
include/hw/core/sysemu-cpu-ops.h | 8 ++++----
|
||||||
|
include/qemu/typedefs.h | 1 +
|
||||||
|
target/arm/arch_dump.c | 6 ++----
|
||||||
|
target/arm/cpu.h | 4 ++--
|
||||||
|
target/i386/arch_dump.c | 30 +++++++++++++++---------------
|
||||||
|
target/i386/cpu.h | 8 ++++----
|
||||||
|
target/ppc/arch_dump.c | 18 +++++++++---------
|
||||||
|
target/ppc/cpu.h | 4 ++--
|
||||||
|
target/riscv/arch_dump.c | 6 ++----
|
||||||
|
target/riscv/cpu.h | 4 ++--
|
||||||
|
target/s390x/arch_dump.c | 10 +++++-----
|
||||||
|
target/s390x/s390x-internal.h | 2 +-
|
||||||
|
12 files changed, 49 insertions(+), 52 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/hw/core/sysemu-cpu-ops.h b/include/hw/core/sysemu-cpu-ops.h
|
||||||
|
index a9ba39e5f2..ee169b872c 100644
|
||||||
|
--- a/include/hw/core/sysemu-cpu-ops.h
|
||||||
|
+++ b/include/hw/core/sysemu-cpu-ops.h
|
||||||
|
@@ -53,25 +53,25 @@ typedef struct SysemuCPUOps {
|
||||||
|
* 32-bit VM coredump.
|
||||||
|
*/
|
||||||
|
int (*write_elf32_note)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
/**
|
||||||
|
* @write_elf64_note: Callback for writing a CPU-specific ELF note to a
|
||||||
|
* 64-bit VM coredump.
|
||||||
|
*/
|
||||||
|
int (*write_elf64_note)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
/**
|
||||||
|
* @write_elf32_qemunote: Callback for writing a CPU- and QEMU-specific ELF
|
||||||
|
* note to a 32-bit VM coredump.
|
||||||
|
*/
|
||||||
|
int (*write_elf32_qemunote)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||||
|
- void *opaque);
|
||||||
|
+ DumpState *s);
|
||||||
|
/**
|
||||||
|
* @write_elf64_qemunote: Callback for writing a CPU- and QEMU-specific ELF
|
||||||
|
* note to a 64-bit VM coredump.
|
||||||
|
*/
|
||||||
|
int (*write_elf64_qemunote)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||||
|
- void *opaque);
|
||||||
|
+ DumpState *s);
|
||||||
|
/**
|
||||||
|
* @virtio_is_big_endian: Callback to return %true if a CPU which supports
|
||||||
|
* runtime configurable endianness is currently big-endian.
|
||||||
|
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
|
||||||
|
index ee60eb3de4..ac9d031be6 100644
|
||||||
|
--- a/include/qemu/typedefs.h
|
||||||
|
+++ b/include/qemu/typedefs.h
|
||||||
|
@@ -125,6 +125,7 @@ typedef struct VirtIODevice VirtIODevice;
|
||||||
|
typedef struct Visitor Visitor;
|
||||||
|
typedef struct VMChangeStateEntry VMChangeStateEntry;
|
||||||
|
typedef struct VMStateDescription VMStateDescription;
|
||||||
|
+typedef struct DumpState DumpState;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pointer types
|
||||||
|
diff --git a/target/arm/arch_dump.c b/target/arm/arch_dump.c
|
||||||
|
index 0184845310..3a824e0aa6 100644
|
||||||
|
--- a/target/arm/arch_dump.c
|
||||||
|
+++ b/target/arm/arch_dump.c
|
||||||
|
@@ -232,12 +232,11 @@ static int aarch64_write_elf64_sve(WriteCoreDumpFunction f,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int arm_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque)
|
||||||
|
+ int cpuid, DumpState *s)
|
||||||
|
{
|
||||||
|
struct aarch64_note note;
|
||||||
|
ARMCPU *cpu = ARM_CPU(cs);
|
||||||
|
CPUARMState *env = &cpu->env;
|
||||||
|
- DumpState *s = opaque;
|
||||||
|
uint64_t pstate, sp;
|
||||||
|
int ret, i;
|
||||||
|
|
||||||
|
@@ -360,12 +359,11 @@ static int arm_write_elf32_vfp(WriteCoreDumpFunction f, CPUARMState *env,
|
||||||
|
}
|
||||||
|
|
||||||
|
int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque)
|
||||||
|
+ int cpuid, DumpState *s)
|
||||||
|
{
|
||||||
|
struct arm_note note;
|
||||||
|
ARMCPU *cpu = ARM_CPU(cs);
|
||||||
|
CPUARMState *env = &cpu->env;
|
||||||
|
- DumpState *s = opaque;
|
||||||
|
int ret, i;
|
||||||
|
bool fpvalid = cpu_isar_feature(aa32_vfp_simd, cpu);
|
||||||
|
|
||||||
|
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
|
||||||
|
index e33f37b70a..8d2f496ef9 100644
|
||||||
|
--- a/target/arm/cpu.h
|
||||||
|
+++ b/target/arm/cpu.h
|
||||||
|
@@ -1065,9 +1065,9 @@ int arm_gen_dynamic_svereg_xml(CPUState *cpu, int base_reg);
|
||||||
|
const char *arm_gdb_get_dynamic_xml(CPUState *cpu, const char *xmlname);
|
||||||
|
|
||||||
|
int arm_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
|
||||||
|
#ifdef TARGET_AARCH64
|
||||||
|
int aarch64_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||||
|
diff --git a/target/i386/arch_dump.c b/target/i386/arch_dump.c
|
||||||
|
index 004141fc04..c290910a04 100644
|
||||||
|
--- a/target/i386/arch_dump.c
|
||||||
|
+++ b/target/i386/arch_dump.c
|
||||||
|
@@ -42,7 +42,7 @@ typedef struct {
|
||||||
|
|
||||||
|
static int x86_64_write_elf64_note(WriteCoreDumpFunction f,
|
||||||
|
CPUX86State *env, int id,
|
||||||
|
- void *opaque)
|
||||||
|
+ DumpState *s)
|
||||||
|
{
|
||||||
|
x86_64_user_regs_struct regs;
|
||||||
|
Elf64_Nhdr *note;
|
||||||
|
@@ -94,7 +94,7 @@ static int x86_64_write_elf64_note(WriteCoreDumpFunction f,
|
||||||
|
buf += descsz - sizeof(x86_64_user_regs_struct)-sizeof(target_ulong);
|
||||||
|
memcpy(buf, ®s, sizeof(x86_64_user_regs_struct));
|
||||||
|
|
||||||
|
- ret = f(note, note_size, opaque);
|
||||||
|
+ ret = f(note, note_size, s);
|
||||||
|
g_free(note);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
@@ -148,7 +148,7 @@ static void x86_fill_elf_prstatus(x86_elf_prstatus *prstatus, CPUX86State *env,
|
||||||
|
}
|
||||||
|
|
||||||
|
static int x86_write_elf64_note(WriteCoreDumpFunction f, CPUX86State *env,
|
||||||
|
- int id, void *opaque)
|
||||||
|
+ int id, DumpState *s)
|
||||||
|
{
|
||||||
|
x86_elf_prstatus prstatus;
|
||||||
|
Elf64_Nhdr *note;
|
||||||
|
@@ -170,7 +170,7 @@ static int x86_write_elf64_note(WriteCoreDumpFunction f, CPUX86State *env,
|
||||||
|
buf += ROUND_UP(name_size, 4);
|
||||||
|
memcpy(buf, &prstatus, sizeof(prstatus));
|
||||||
|
|
||||||
|
- ret = f(note, note_size, opaque);
|
||||||
|
+ ret = f(note, note_size, s);
|
||||||
|
g_free(note);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
@@ -180,7 +180,7 @@ static int x86_write_elf64_note(WriteCoreDumpFunction f, CPUX86State *env,
|
||||||
|
}
|
||||||
|
|
||||||
|
int x86_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque)
|
||||||
|
+ int cpuid, DumpState *s)
|
||||||
|
{
|
||||||
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
|
int ret;
|
||||||
|
@@ -189,10 +189,10 @@ int x86_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
bool lma = !!(first_x86_cpu->env.hflags & HF_LMA_MASK);
|
||||||
|
|
||||||
|
if (lma) {
|
||||||
|
- ret = x86_64_write_elf64_note(f, &cpu->env, cpuid, opaque);
|
||||||
|
+ ret = x86_64_write_elf64_note(f, &cpu->env, cpuid, s);
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
|
- ret = x86_write_elf64_note(f, &cpu->env, cpuid, opaque);
|
||||||
|
+ ret = x86_write_elf64_note(f, &cpu->env, cpuid, s);
|
||||||
|
#ifdef TARGET_X86_64
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@@ -201,7 +201,7 @@ int x86_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
}
|
||||||
|
|
||||||
|
int x86_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque)
|
||||||
|
+ int cpuid, DumpState *s)
|
||||||
|
{
|
||||||
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
|
x86_elf_prstatus prstatus;
|
||||||
|
@@ -224,7 +224,7 @@ int x86_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
buf += ROUND_UP(name_size, 4);
|
||||||
|
memcpy(buf, &prstatus, sizeof(prstatus));
|
||||||
|
|
||||||
|
- ret = f(note, note_size, opaque);
|
||||||
|
+ ret = f(note, note_size, s);
|
||||||
|
g_free(note);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
@@ -329,7 +329,7 @@ static void qemu_get_cpustate(QEMUCPUState *s, CPUX86State *env)
|
||||||
|
|
||||||
|
static inline int cpu_write_qemu_note(WriteCoreDumpFunction f,
|
||||||
|
CPUX86State *env,
|
||||||
|
- void *opaque,
|
||||||
|
+ DumpState *s,
|
||||||
|
int type)
|
||||||
|
{
|
||||||
|
QEMUCPUState state;
|
||||||
|
@@ -369,7 +369,7 @@ static inline int cpu_write_qemu_note(WriteCoreDumpFunction f,
|
||||||
|
buf += ROUND_UP(name_size, 4);
|
||||||
|
memcpy(buf, &state, sizeof(state));
|
||||||
|
|
||||||
|
- ret = f(note, note_size, opaque);
|
||||||
|
+ ret = f(note, note_size, s);
|
||||||
|
g_free(note);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
@@ -379,19 +379,19 @@ static inline int cpu_write_qemu_note(WriteCoreDumpFunction f,
|
||||||
|
}
|
||||||
|
|
||||||
|
int x86_cpu_write_elf64_qemunote(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- void *opaque)
|
||||||
|
+ DumpState *s)
|
||||||
|
{
|
||||||
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
|
|
||||||
|
- return cpu_write_qemu_note(f, &cpu->env, opaque, 1);
|
||||||
|
+ return cpu_write_qemu_note(f, &cpu->env, s, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int x86_cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- void *opaque)
|
||||||
|
+ DumpState *s)
|
||||||
|
{
|
||||||
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
|
|
||||||
|
- return cpu_write_qemu_note(f, &cpu->env, opaque, 0);
|
||||||
|
+ return cpu_write_qemu_note(f, &cpu->env, s, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cpu_get_dump_info(ArchDumpInfo *info,
|
||||||
|
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||||
|
index 006b735fe4..5d2ddd81b9 100644
|
||||||
|
--- a/target/i386/cpu.h
|
||||||
|
+++ b/target/i386/cpu.h
|
||||||
|
@@ -1887,13 +1887,13 @@ extern const VMStateDescription vmstate_x86_cpu;
|
||||||
|
int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request);
|
||||||
|
|
||||||
|
int x86_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cpu,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
int x86_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cpu,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
int x86_cpu_write_elf64_qemunote(WriteCoreDumpFunction f, CPUState *cpu,
|
||||||
|
- void *opaque);
|
||||||
|
+ DumpState *s);
|
||||||
|
int x86_cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cpu,
|
||||||
|
- void *opaque);
|
||||||
|
+ DumpState *s);
|
||||||
|
|
||||||
|
void x86_cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list,
|
||||||
|
Error **errp);
|
||||||
|
diff --git a/target/ppc/arch_dump.c b/target/ppc/arch_dump.c
|
||||||
|
index bb392f6d88..e9f512bcd4 100644
|
||||||
|
--- a/target/ppc/arch_dump.c
|
||||||
|
+++ b/target/ppc/arch_dump.c
|
||||||
|
@@ -270,23 +270,23 @@ ssize_t cpu_get_note_size(int class, int machine, int nr_cpus)
|
||||||
|
static int ppc_write_all_elf_notes(const char *note_name,
|
||||||
|
WriteCoreDumpFunction f,
|
||||||
|
PowerPCCPU *cpu, int id,
|
||||||
|
- void *opaque)
|
||||||
|
+ DumpState *s)
|
||||||
|
{
|
||||||
|
- NoteFuncArg arg = { .state = opaque };
|
||||||
|
+ NoteFuncArg arg = { .state = s };
|
||||||
|
int ret = -1;
|
||||||
|
int note_size;
|
||||||
|
const NoteFuncDesc *nf;
|
||||||
|
|
||||||
|
for (nf = note_func; nf->note_contents_func; nf++) {
|
||||||
|
- arg.note.hdr.n_namesz = cpu_to_dump32(opaque, sizeof(arg.note.name));
|
||||||
|
- arg.note.hdr.n_descsz = cpu_to_dump32(opaque, nf->contents_size);
|
||||||
|
+ arg.note.hdr.n_namesz = cpu_to_dump32(s, sizeof(arg.note.name));
|
||||||
|
+ arg.note.hdr.n_descsz = cpu_to_dump32(s, nf->contents_size);
|
||||||
|
strncpy(arg.note.name, note_name, sizeof(arg.note.name));
|
||||||
|
|
||||||
|
(*nf->note_contents_func)(&arg, cpu);
|
||||||
|
|
||||||
|
note_size =
|
||||||
|
sizeof(arg.note) - sizeof(arg.note.contents) + nf->contents_size;
|
||||||
|
- ret = f(&arg.note, note_size, opaque);
|
||||||
|
+ ret = f(&arg.note, note_size, s);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@@ -295,15 +295,15 @@ static int ppc_write_all_elf_notes(const char *note_name,
|
||||||
|
}
|
||||||
|
|
||||||
|
int ppc64_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque)
|
||||||
|
+ int cpuid, DumpState *s)
|
||||||
|
{
|
||||||
|
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||||
|
- return ppc_write_all_elf_notes("CORE", f, cpu, cpuid, opaque);
|
||||||
|
+ return ppc_write_all_elf_notes("CORE", f, cpu, cpuid, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ppc32_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque)
|
||||||
|
+ int cpuid, DumpState *s)
|
||||||
|
{
|
||||||
|
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||||
|
- return ppc_write_all_elf_notes("CORE", f, cpu, cpuid, opaque);
|
||||||
|
+ return ppc_write_all_elf_notes("CORE", f, cpu, cpuid, s);
|
||||||
|
}
|
||||||
|
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
|
||||||
|
index 23e8b76c85..f5fb284706 100644
|
||||||
|
--- a/target/ppc/cpu.h
|
||||||
|
+++ b/target/ppc/cpu.h
|
||||||
|
@@ -1289,9 +1289,9 @@ void ppc_gdb_gen_spr_xml(PowerPCCPU *cpu);
|
||||||
|
const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name);
|
||||||
|
#endif
|
||||||
|
int ppc64_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
int ppc32_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
void ppc_cpu_do_interrupt(CPUState *cpu);
|
||||||
|
bool ppc_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||||
|
diff --git a/target/riscv/arch_dump.c b/target/riscv/arch_dump.c
|
||||||
|
index 709f621d82..736a232956 100644
|
||||||
|
--- a/target/riscv/arch_dump.c
|
||||||
|
+++ b/target/riscv/arch_dump.c
|
||||||
|
@@ -64,12 +64,11 @@ static void riscv64_note_init(struct riscv64_note *note, DumpState *s,
|
||||||
|
}
|
||||||
|
|
||||||
|
int riscv_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque)
|
||||||
|
+ int cpuid, DumpState *s)
|
||||||
|
{
|
||||||
|
struct riscv64_note note;
|
||||||
|
RISCVCPU *cpu = RISCV_CPU(cs);
|
||||||
|
CPURISCVState *env = &cpu->env;
|
||||||
|
- DumpState *s = opaque;
|
||||||
|
int ret, i = 0;
|
||||||
|
const char name[] = "CORE";
|
||||||
|
|
||||||
|
@@ -134,12 +133,11 @@ static void riscv32_note_init(struct riscv32_note *note, DumpState *s,
|
||||||
|
}
|
||||||
|
|
||||||
|
int riscv_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque)
|
||||||
|
+ int cpuid, DumpState *s)
|
||||||
|
{
|
||||||
|
struct riscv32_note note;
|
||||||
|
RISCVCPU *cpu = RISCV_CPU(cs);
|
||||||
|
CPURISCVState *env = &cpu->env;
|
||||||
|
- DumpState *s = opaque;
|
||||||
|
int ret, i;
|
||||||
|
const char name[] = "CORE";
|
||||||
|
|
||||||
|
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
|
||||||
|
index 0760c0af93..4cce524b2c 100644
|
||||||
|
--- a/target/riscv/cpu.h
|
||||||
|
+++ b/target/riscv/cpu.h
|
||||||
|
@@ -344,9 +344,9 @@ extern const char * const riscv_fpr_regnames[];
|
||||||
|
const char *riscv_cpu_get_trap_name(target_ulong cause, bool async);
|
||||||
|
void riscv_cpu_do_interrupt(CPUState *cpu);
|
||||||
|
int riscv_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
int riscv_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
int riscv_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||||
|
int riscv_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||||
|
bool riscv_cpu_fp_enabled(CPURISCVState *env);
|
||||||
|
diff --git a/target/s390x/arch_dump.c b/target/s390x/arch_dump.c
|
||||||
|
index 08daf93ae1..f60a14920d 100644
|
||||||
|
--- a/target/s390x/arch_dump.c
|
||||||
|
+++ b/target/s390x/arch_dump.c
|
||||||
|
@@ -204,7 +204,7 @@ static const NoteFuncDesc note_linux[] = {
|
||||||
|
static int s390x_write_elf64_notes(const char *note_name,
|
||||||
|
WriteCoreDumpFunction f,
|
||||||
|
S390CPU *cpu, int id,
|
||||||
|
- void *opaque,
|
||||||
|
+ DumpState *s,
|
||||||
|
const NoteFuncDesc *funcs)
|
||||||
|
{
|
||||||
|
Note note;
|
||||||
|
@@ -222,7 +222,7 @@ static int s390x_write_elf64_notes(const char *note_name,
|
||||||
|
(*nf->note_contents_func)(¬e, cpu, id);
|
||||||
|
|
||||||
|
note_size = sizeof(note) - sizeof(note.contents) + nf->contents_size;
|
||||||
|
- ret = f(¬e, note_size, opaque);
|
||||||
|
+ ret = f(¬e, note_size, s);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
@@ -235,16 +235,16 @@ static int s390x_write_elf64_notes(const char *note_name,
|
||||||
|
|
||||||
|
|
||||||
|
int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque)
|
||||||
|
+ int cpuid, DumpState *s)
|
||||||
|
{
|
||||||
|
S390CPU *cpu = S390_CPU(cs);
|
||||||
|
int r;
|
||||||
|
|
||||||
|
- r = s390x_write_elf64_notes("CORE", f, cpu, cpuid, opaque, note_core);
|
||||||
|
+ r = s390x_write_elf64_notes("CORE", f, cpu, cpuid, s, note_core);
|
||||||
|
if (r) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
- return s390x_write_elf64_notes("LINUX", f, cpu, cpuid, opaque, note_linux);
|
||||||
|
+ return s390x_write_elf64_notes("LINUX", f, cpu, cpuid, s, note_linux);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cpu_get_dump_info(ArchDumpInfo *info,
|
||||||
|
diff --git a/target/s390x/s390x-internal.h b/target/s390x/s390x-internal.h
|
||||||
|
index 1a178aed41..02cf6c3f43 100644
|
||||||
|
--- a/target/s390x/s390x-internal.h
|
||||||
|
+++ b/target/s390x/s390x-internal.h
|
||||||
|
@@ -228,7 +228,7 @@ static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
|
||||||
|
|
||||||
|
/* arch_dump.c */
|
||||||
|
int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
- int cpuid, void *opaque);
|
||||||
|
+ int cpuid, DumpState *s);
|
||||||
|
|
||||||
|
|
||||||
|
/* cc_helper.c */
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
73
SOURCES/kvm-dump-Rework-dump_calculate_size-function.patch
Normal file
73
SOURCES/kvm-dump-Rework-dump_calculate_size-function.patch
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
From 1f7cb73592a1922b3a981eb3232098281e07679f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Thu, 11 Aug 2022 12:10:59 +0000
|
||||||
|
Subject: [PATCH 27/42] dump: Rework dump_calculate_size function
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [27/41] eaa05c39109b57a119752ad3df66f4c2ace2cbe4
|
||||||
|
|
||||||
|
dump_calculate_size() sums up all the sizes of the guest memory
|
||||||
|
blocks. Since we already have a function that calculates the size of a
|
||||||
|
single memory block (dump_get_memblock_size()) we can simply iterate
|
||||||
|
over the blocks and use the function instead of calculating the size
|
||||||
|
ourselves.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Message-Id: <20220811121111.9878-7-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit c370d5300f9ac1f90f8158082d22262b904fe30e)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 22 ++++++++--------------
|
||||||
|
1 file changed, 8 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index f6fe13e258..902a85ef8e 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -1557,25 +1557,19 @@ bool dump_in_progress(void)
|
||||||
|
return (qatomic_read(&state->status) == DUMP_STATUS_ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* calculate total size of memory to be dumped (taking filter into
|
||||||
|
- * acoount.) */
|
||||||
|
+/*
|
||||||
|
+ * calculate total size of memory to be dumped (taking filter into
|
||||||
|
+ * account.)
|
||||||
|
+ */
|
||||||
|
static int64_t dump_calculate_size(DumpState *s)
|
||||||
|
{
|
||||||
|
GuestPhysBlock *block;
|
||||||
|
- int64_t size = 0, total = 0, left = 0, right = 0;
|
||||||
|
+ int64_t total = 0;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
|
||||||
|
- if (dump_has_filter(s)) {
|
||||||
|
- /* calculate the overlapped region. */
|
||||||
|
- left = MAX(s->filter_area_begin, block->target_start);
|
||||||
|
- right = MIN(s->filter_area_begin + s->filter_area_length, block->target_end);
|
||||||
|
- size = right - left;
|
||||||
|
- size = size > 0 ? size : 0;
|
||||||
|
- } else {
|
||||||
|
- /* count the whole region in */
|
||||||
|
- size = (block->target_end - block->target_start);
|
||||||
|
- }
|
||||||
|
- total += size;
|
||||||
|
+ total += dump_filtered_memblock_size(block,
|
||||||
|
+ s->filter_area_begin,
|
||||||
|
+ s->filter_area_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
187
SOURCES/kvm-dump-Rework-filter-area-variables.patch
Normal file
187
SOURCES/kvm-dump-Rework-filter-area-variables.patch
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
From 411f5354b809f6b783946e58d7655135814fb809 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Thu, 11 Aug 2022 12:10:58 +0000
|
||||||
|
Subject: [PATCH 26/42] dump: Rework filter area variables
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [26/41] f10a5523dfd2724f7a8637fca3ed68ba6df659a5
|
||||||
|
|
||||||
|
While the DumpState begin and length variables directly mirror the API
|
||||||
|
variable names they are not very descriptive. So let's add a
|
||||||
|
"filter_area_" prefix and make has_filter a function checking length > 0.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220811121111.9878-6-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit dddf725f70bfe7f5adb41fa31dbd06e767271bda)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 53 +++++++++++++++++++++++++------------------
|
||||||
|
include/sysemu/dump.h | 13 ++++++++---
|
||||||
|
2 files changed, 41 insertions(+), 25 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index e6aa037f59..f6fe13e258 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -60,6 +60,11 @@ static inline bool dump_is_64bit(DumpState *s)
|
||||||
|
return s->dump_info.d_class == ELFCLASS64;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static inline bool dump_has_filter(DumpState *s)
|
||||||
|
+{
|
||||||
|
+ return s->filter_area_length > 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
uint16_t cpu_to_dump16(DumpState *s, uint16_t val)
|
||||||
|
{
|
||||||
|
if (s->dump_info.d_endian == ELFDATA2LSB) {
|
||||||
|
@@ -444,29 +449,30 @@ static void get_offset_range(hwaddr phys_addr,
|
||||||
|
*p_offset = -1;
|
||||||
|
*p_filesz = 0;
|
||||||
|
|
||||||
|
- if (s->has_filter) {
|
||||||
|
- if (phys_addr < s->begin || phys_addr >= s->begin + s->length) {
|
||||||
|
+ if (dump_has_filter(s)) {
|
||||||
|
+ if (phys_addr < s->filter_area_begin ||
|
||||||
|
+ phys_addr >= s->filter_area_begin + s->filter_area_length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
|
||||||
|
- if (s->has_filter) {
|
||||||
|
- if (block->target_start >= s->begin + s->length ||
|
||||||
|
- block->target_end <= s->begin) {
|
||||||
|
+ if (dump_has_filter(s)) {
|
||||||
|
+ if (block->target_start >= s->filter_area_begin + s->filter_area_length ||
|
||||||
|
+ block->target_end <= s->filter_area_begin) {
|
||||||
|
/* This block is out of the range */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (s->begin <= block->target_start) {
|
||||||
|
+ if (s->filter_area_begin <= block->target_start) {
|
||||||
|
start = block->target_start;
|
||||||
|
} else {
|
||||||
|
- start = s->begin;
|
||||||
|
+ start = s->filter_area_begin;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_in_block = block->target_end - start;
|
||||||
|
- if (s->begin + s->length < block->target_end) {
|
||||||
|
- size_in_block -= block->target_end - (s->begin + s->length);
|
||||||
|
+ if (s->filter_area_begin + s->filter_area_length < block->target_end) {
|
||||||
|
+ size_in_block -= block->target_end - (s->filter_area_begin + s->filter_area_length);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
start = block->target_start;
|
||||||
|
@@ -639,12 +645,12 @@ static void dump_iterate(DumpState *s, Error **errp)
|
||||||
|
int64_t memblock_size, memblock_start;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
|
||||||
|
- memblock_start = dump_filtered_memblock_start(block, s->begin, s->length);
|
||||||
|
+ memblock_start = dump_filtered_memblock_start(block, s->filter_area_begin, s->filter_area_length);
|
||||||
|
if (memblock_start == -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- memblock_size = dump_filtered_memblock_size(block, s->begin, s->length);
|
||||||
|
+ memblock_size = dump_filtered_memblock_size(block, s->filter_area_begin, s->filter_area_length);
|
||||||
|
|
||||||
|
/* Write the memory to file */
|
||||||
|
write_memory(s, block, memblock_start, memblock_size, errp);
|
||||||
|
@@ -1513,14 +1519,14 @@ static int validate_start_block(DumpState *s)
|
||||||
|
{
|
||||||
|
GuestPhysBlock *block;
|
||||||
|
|
||||||
|
- if (!s->has_filter) {
|
||||||
|
+ if (!dump_has_filter(s)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
|
||||||
|
/* This block is out of the range */
|
||||||
|
- if (block->target_start >= s->begin + s->length ||
|
||||||
|
- block->target_end <= s->begin) {
|
||||||
|
+ if (block->target_start >= s->filter_area_begin + s->filter_area_length ||
|
||||||
|
+ block->target_end <= s->filter_area_begin) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
@@ -1559,10 +1565,10 @@ static int64_t dump_calculate_size(DumpState *s)
|
||||||
|
int64_t size = 0, total = 0, left = 0, right = 0;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
|
||||||
|
- if (s->has_filter) {
|
||||||
|
+ if (dump_has_filter(s)) {
|
||||||
|
/* calculate the overlapped region. */
|
||||||
|
- left = MAX(s->begin, block->target_start);
|
||||||
|
- right = MIN(s->begin + s->length, block->target_end);
|
||||||
|
+ left = MAX(s->filter_area_begin, block->target_start);
|
||||||
|
+ right = MIN(s->filter_area_begin + s->filter_area_length, block->target_end);
|
||||||
|
size = right - left;
|
||||||
|
size = size > 0 ? size : 0;
|
||||||
|
} else {
|
||||||
|
@@ -1652,9 +1658,12 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
}
|
||||||
|
|
||||||
|
s->fd = fd;
|
||||||
|
- s->has_filter = has_filter;
|
||||||
|
- s->begin = begin;
|
||||||
|
- s->length = length;
|
||||||
|
+ if (has_filter && !length) {
|
||||||
|
+ error_setg(errp, QERR_INVALID_PARAMETER, "length");
|
||||||
|
+ goto cleanup;
|
||||||
|
+ }
|
||||||
|
+ s->filter_area_begin = begin;
|
||||||
|
+ s->filter_area_length = length;
|
||||||
|
|
||||||
|
memory_mapping_list_init(&s->list);
|
||||||
|
|
||||||
|
@@ -1787,8 +1796,8 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (s->has_filter) {
|
||||||
|
- memory_mapping_filter(&s->list, s->begin, s->length);
|
||||||
|
+ if (dump_has_filter(s)) {
|
||||||
|
+ memory_mapping_filter(&s->list, s->filter_area_begin, s->filter_area_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
|
||||||
|
index 7fce1d4af6..b62513d87d 100644
|
||||||
|
--- a/include/sysemu/dump.h
|
||||||
|
+++ b/include/sysemu/dump.h
|
||||||
|
@@ -166,9 +166,16 @@ typedef struct DumpState {
|
||||||
|
hwaddr memory_offset;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
- bool has_filter;
|
||||||
|
- int64_t begin;
|
||||||
|
- int64_t length;
|
||||||
|
+ /*
|
||||||
|
+ * Dump filter area variables
|
||||||
|
+ *
|
||||||
|
+ * A filtered dump only contains the guest memory designated by
|
||||||
|
+ * the start address and length variables defined below.
|
||||||
|
+ *
|
||||||
|
+ * If length is 0, no filtering is applied.
|
||||||
|
+ */
|
||||||
|
+ int64_t filter_area_begin; /* Start address of partial guest memory area */
|
||||||
|
+ int64_t filter_area_length; /* Length of partial guest memory area */
|
||||||
|
|
||||||
|
uint8_t *note_buf; /* buffer for notes */
|
||||||
|
size_t note_buf_offset; /* the writing place in note_buf */
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
102
SOURCES/kvm-dump-Rework-get_start_block.patch
Normal file
102
SOURCES/kvm-dump-Rework-get_start_block.patch
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
From b56c362132baef40cc25d910c1e0d217d83cfe44 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Thu, 11 Aug 2022 12:10:57 +0000
|
||||||
|
Subject: [PATCH 25/42] dump: Rework get_start_block
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [25/41] c93842a1aaeadcc11e91c194452fcd05d163b3ca
|
||||||
|
|
||||||
|
get_start_block() returns the start address of the first memory block
|
||||||
|
or -1.
|
||||||
|
|
||||||
|
With the GuestPhysBlock iterator conversion we don't need to set the
|
||||||
|
start address and can therefore remove that code and the "start"
|
||||||
|
DumpState struct member. The only functionality left is the validation
|
||||||
|
of the start block so it only makes sense to re-name the function to
|
||||||
|
validate_start_block()
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Message-Id: <20220811121111.9878-5-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 0c2994ac9009577b967529ce18e269da5b280351)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 20 ++++++--------------
|
||||||
|
include/sysemu/dump.h | 2 --
|
||||||
|
2 files changed, 6 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index d981e843dd..e6aa037f59 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -1509,30 +1509,22 @@ static void create_kdump_vmcore(DumpState *s, Error **errp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static ram_addr_t get_start_block(DumpState *s)
|
||||||
|
+static int validate_start_block(DumpState *s)
|
||||||
|
{
|
||||||
|
GuestPhysBlock *block;
|
||||||
|
|
||||||
|
if (!s->has_filter) {
|
||||||
|
- s->next_block = QTAILQ_FIRST(&s->guest_phys_blocks.head);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
|
||||||
|
+ /* This block is out of the range */
|
||||||
|
if (block->target_start >= s->begin + s->length ||
|
||||||
|
block->target_end <= s->begin) {
|
||||||
|
- /* This block is out of the range */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- s->next_block = block;
|
||||||
|
- if (s->begin > block->target_start) {
|
||||||
|
- s->start = s->begin - block->target_start;
|
||||||
|
- } else {
|
||||||
|
- s->start = 0;
|
||||||
|
- }
|
||||||
|
- return s->start;
|
||||||
|
- }
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@@ -1679,8 +1671,8 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
- s->start = get_start_block(s);
|
||||||
|
- if (s->start == -1) {
|
||||||
|
+ /* Is the filter filtering everything? */
|
||||||
|
+ if (validate_start_block(s) == -1) {
|
||||||
|
error_setg(errp, QERR_INVALID_PARAMETER, "begin");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
|
||||||
|
index ffc2ea1072..7fce1d4af6 100644
|
||||||
|
--- a/include/sysemu/dump.h
|
||||||
|
+++ b/include/sysemu/dump.h
|
||||||
|
@@ -166,8 +166,6 @@ typedef struct DumpState {
|
||||||
|
hwaddr memory_offset;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
- GuestPhysBlock *next_block;
|
||||||
|
- ram_addr_t start;
|
||||||
|
bool has_filter;
|
||||||
|
int64_t begin;
|
||||||
|
int64_t length;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,173 @@
|
|||||||
|
From d1e147a3133d4d31d4b0c02c05916366fadd9c30 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Thu, 11 Aug 2022 12:11:00 +0000
|
||||||
|
Subject: [PATCH 28/42] dump: Split elf header functions into prepare and write
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [28/41] f70a13ad443835e7f46b7c5e176e372d370ac797
|
||||||
|
|
||||||
|
Let's split the write from the modification of the elf header so we
|
||||||
|
can consolidate the write of the data in one function.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220811121111.9878-8-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 670e76998a61ca171200fcded3865b294a2d1243)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 100 ++++++++++++++++++++++++++++------------------------
|
||||||
|
1 file changed, 53 insertions(+), 47 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 902a85ef8e..8d5226f861 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -132,7 +132,7 @@ static int fd_write_vmcore(const void *buf, size_t size, void *opaque)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void write_elf64_header(DumpState *s, Error **errp)
|
||||||
|
+static void prepare_elf64_header(DumpState *s, Elf64_Ehdr *elf_header)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* phnum in the elf header is 16 bit, if we have more segments we
|
||||||
|
@@ -140,34 +140,27 @@ static void write_elf64_header(DumpState *s, Error **errp)
|
||||||
|
* special section.
|
||||||
|
*/
|
||||||
|
uint16_t phnum = MIN(s->phdr_num, PN_XNUM);
|
||||||
|
- Elf64_Ehdr elf_header;
|
||||||
|
- int ret;
|
||||||
|
|
||||||
|
- memset(&elf_header, 0, sizeof(Elf64_Ehdr));
|
||||||
|
- memcpy(&elf_header, ELFMAG, SELFMAG);
|
||||||
|
- elf_header.e_ident[EI_CLASS] = ELFCLASS64;
|
||||||
|
- elf_header.e_ident[EI_DATA] = s->dump_info.d_endian;
|
||||||
|
- elf_header.e_ident[EI_VERSION] = EV_CURRENT;
|
||||||
|
- elf_header.e_type = cpu_to_dump16(s, ET_CORE);
|
||||||
|
- elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine);
|
||||||
|
- elf_header.e_version = cpu_to_dump32(s, EV_CURRENT);
|
||||||
|
- elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
|
||||||
|
- elf_header.e_phoff = cpu_to_dump64(s, s->phdr_offset);
|
||||||
|
- elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr));
|
||||||
|
- elf_header.e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
+ memset(elf_header, 0, sizeof(Elf64_Ehdr));
|
||||||
|
+ memcpy(elf_header, ELFMAG, SELFMAG);
|
||||||
|
+ elf_header->e_ident[EI_CLASS] = ELFCLASS64;
|
||||||
|
+ elf_header->e_ident[EI_DATA] = s->dump_info.d_endian;
|
||||||
|
+ elf_header->e_ident[EI_VERSION] = EV_CURRENT;
|
||||||
|
+ elf_header->e_type = cpu_to_dump16(s, ET_CORE);
|
||||||
|
+ elf_header->e_machine = cpu_to_dump16(s, s->dump_info.d_machine);
|
||||||
|
+ elf_header->e_version = cpu_to_dump32(s, EV_CURRENT);
|
||||||
|
+ elf_header->e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
|
||||||
|
+ elf_header->e_phoff = cpu_to_dump64(s, s->phdr_offset);
|
||||||
|
+ elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr));
|
||||||
|
+ elf_header->e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
if (s->shdr_num) {
|
||||||
|
- elf_header.e_shoff = cpu_to_dump64(s, s->shdr_offset);
|
||||||
|
- elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr));
|
||||||
|
- elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s);
|
||||||
|
- if (ret < 0) {
|
||||||
|
- error_setg_errno(errp, -ret, "dump: failed to write elf header");
|
||||||
|
+ elf_header->e_shoff = cpu_to_dump64(s, s->shdr_offset);
|
||||||
|
+ elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr));
|
||||||
|
+ elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void write_elf32_header(DumpState *s, Error **errp)
|
||||||
|
+static void prepare_elf32_header(DumpState *s, Elf32_Ehdr *elf_header)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* phnum in the elf header is 16 bit, if we have more segments we
|
||||||
|
@@ -175,28 +168,45 @@ static void write_elf32_header(DumpState *s, Error **errp)
|
||||||
|
* special section.
|
||||||
|
*/
|
||||||
|
uint16_t phnum = MIN(s->phdr_num, PN_XNUM);
|
||||||
|
- Elf32_Ehdr elf_header;
|
||||||
|
- int ret;
|
||||||
|
|
||||||
|
- memset(&elf_header, 0, sizeof(Elf32_Ehdr));
|
||||||
|
- memcpy(&elf_header, ELFMAG, SELFMAG);
|
||||||
|
- elf_header.e_ident[EI_CLASS] = ELFCLASS32;
|
||||||
|
- elf_header.e_ident[EI_DATA] = s->dump_info.d_endian;
|
||||||
|
- elf_header.e_ident[EI_VERSION] = EV_CURRENT;
|
||||||
|
- elf_header.e_type = cpu_to_dump16(s, ET_CORE);
|
||||||
|
- elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine);
|
||||||
|
- elf_header.e_version = cpu_to_dump32(s, EV_CURRENT);
|
||||||
|
- elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
|
||||||
|
- elf_header.e_phoff = cpu_to_dump32(s, s->phdr_offset);
|
||||||
|
- elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr));
|
||||||
|
- elf_header.e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
+ memset(elf_header, 0, sizeof(Elf32_Ehdr));
|
||||||
|
+ memcpy(elf_header, ELFMAG, SELFMAG);
|
||||||
|
+ elf_header->e_ident[EI_CLASS] = ELFCLASS32;
|
||||||
|
+ elf_header->e_ident[EI_DATA] = s->dump_info.d_endian;
|
||||||
|
+ elf_header->e_ident[EI_VERSION] = EV_CURRENT;
|
||||||
|
+ elf_header->e_type = cpu_to_dump16(s, ET_CORE);
|
||||||
|
+ elf_header->e_machine = cpu_to_dump16(s, s->dump_info.d_machine);
|
||||||
|
+ elf_header->e_version = cpu_to_dump32(s, EV_CURRENT);
|
||||||
|
+ elf_header->e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
|
||||||
|
+ elf_header->e_phoff = cpu_to_dump32(s, s->phdr_offset);
|
||||||
|
+ elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr));
|
||||||
|
+ elf_header->e_phnum = cpu_to_dump16(s, phnum);
|
||||||
|
if (s->shdr_num) {
|
||||||
|
- elf_header.e_shoff = cpu_to_dump32(s, s->shdr_offset);
|
||||||
|
- elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr));
|
||||||
|
- elf_header.e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
+ elf_header->e_shoff = cpu_to_dump32(s, s->shdr_offset);
|
||||||
|
+ elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr));
|
||||||
|
+ elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num);
|
||||||
|
}
|
||||||
|
+}
|
||||||
|
|
||||||
|
- ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s);
|
||||||
|
+static void write_elf_header(DumpState *s, Error **errp)
|
||||||
|
+{
|
||||||
|
+ Elf32_Ehdr elf32_header;
|
||||||
|
+ Elf64_Ehdr elf64_header;
|
||||||
|
+ size_t header_size;
|
||||||
|
+ void *header_ptr;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
+ prepare_elf64_header(s, &elf64_header);
|
||||||
|
+ header_size = sizeof(elf64_header);
|
||||||
|
+ header_ptr = &elf64_header;
|
||||||
|
+ } else {
|
||||||
|
+ prepare_elf32_header(s, &elf32_header);
|
||||||
|
+ header_size = sizeof(elf32_header);
|
||||||
|
+ header_ptr = &elf32_header;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = fd_write_vmcore(header_ptr, header_size, s);
|
||||||
|
if (ret < 0) {
|
||||||
|
error_setg_errno(errp, -ret, "dump: failed to write elf header");
|
||||||
|
}
|
||||||
|
@@ -565,11 +575,7 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* write elf header to vmcore */
|
||||||
|
- if (dump_is_64bit(s)) {
|
||||||
|
- write_elf64_header(s, errp);
|
||||||
|
- } else {
|
||||||
|
- write_elf32_header(s, errp);
|
||||||
|
- }
|
||||||
|
+ write_elf_header(s, errp);
|
||||||
|
if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
420
SOURCES/kvm-dump-Use-ERRP_GUARD.patch
Normal file
420
SOURCES/kvm-dump-Use-ERRP_GUARD.patch
Normal file
@ -0,0 +1,420 @@
|
|||||||
|
From 4ca61efe246d62d420eb332655c0c8ead4cc762b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Wed, 30 Mar 2022 12:35:55 +0000
|
||||||
|
Subject: [PATCH 13/42] dump: Use ERRP_GUARD()
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [13/41] f735cd1dab0230000cfadd878765fdf4647b239c
|
||||||
|
|
||||||
|
Let's move to the new way of handling errors before changing the dump
|
||||||
|
code. This patch has mostly been generated by the coccinelle script
|
||||||
|
scripts/coccinelle/errp-guard.cocci.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220330123603.107120-2-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 86a518bba4f4d7c9016fc5b104fe1e58b00ad756)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 144 ++++++++++++++++++++++------------------------------
|
||||||
|
1 file changed, 61 insertions(+), 83 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 662d0a62cd..9876123f2e 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -390,23 +390,21 @@ static void write_data(DumpState *s, void *buf, int length, Error **errp)
|
||||||
|
static void write_memory(DumpState *s, GuestPhysBlock *block, ram_addr_t start,
|
||||||
|
int64_t size, Error **errp)
|
||||||
|
{
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
int64_t i;
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < size / s->dump_info.page_size; i++) {
|
||||||
|
write_data(s, block->host_addr + start + i * s->dump_info.page_size,
|
||||||
|
- s->dump_info.page_size, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ s->dump_info.page_size, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((size % s->dump_info.page_size) != 0) {
|
||||||
|
write_data(s, block->host_addr + start + i * s->dump_info.page_size,
|
||||||
|
- size % s->dump_info.page_size, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ size % s->dump_info.page_size, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -476,11 +474,11 @@ static void get_offset_range(hwaddr phys_addr,
|
||||||
|
|
||||||
|
static void write_elf_loads(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
hwaddr offset, filesz;
|
||||||
|
MemoryMapping *memory_mapping;
|
||||||
|
uint32_t phdr_index = 1;
|
||||||
|
uint32_t max_index;
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
|
||||||
|
if (s->have_section) {
|
||||||
|
max_index = s->sh_info;
|
||||||
|
@@ -494,14 +492,13 @@ static void write_elf_loads(DumpState *s, Error **errp)
|
||||||
|
s, &offset, &filesz);
|
||||||
|
if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
write_elf64_load(s, memory_mapping, phdr_index++, offset,
|
||||||
|
- filesz, &local_err);
|
||||||
|
+ filesz, errp);
|
||||||
|
} else {
|
||||||
|
write_elf32_load(s, memory_mapping, phdr_index++, offset,
|
||||||
|
- filesz, &local_err);
|
||||||
|
+ filesz, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -514,7 +511,7 @@ static void write_elf_loads(DumpState *s, Error **errp)
|
||||||
|
/* write elf header, PT_NOTE and elf note to vmcore. */
|
||||||
|
static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the vmcore's format is:
|
||||||
|
@@ -542,73 +539,64 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
|
||||||
|
/* write elf header to vmcore */
|
||||||
|
if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
- write_elf64_header(s, &local_err);
|
||||||
|
+ write_elf64_header(s, errp);
|
||||||
|
} else {
|
||||||
|
- write_elf32_header(s, &local_err);
|
||||||
|
+ write_elf32_header(s, errp);
|
||||||
|
}
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->dump_info.d_class == ELFCLASS64) {
|
||||||
|
/* write PT_NOTE to vmcore */
|
||||||
|
- write_elf64_note(s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf64_note(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write all PT_LOAD to vmcore */
|
||||||
|
- write_elf_loads(s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf_loads(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write section to vmcore */
|
||||||
|
if (s->have_section) {
|
||||||
|
- write_elf_section(s, 1, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf_section(s, 1, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write notes to vmcore */
|
||||||
|
- write_elf64_notes(fd_write_vmcore, s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf64_notes(fd_write_vmcore, s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* write PT_NOTE to vmcore */
|
||||||
|
- write_elf32_note(s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf32_note(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write all PT_LOAD to vmcore */
|
||||||
|
- write_elf_loads(s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf_loads(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write section to vmcore */
|
||||||
|
if (s->have_section) {
|
||||||
|
- write_elf_section(s, 0, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf_section(s, 0, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write notes to vmcore */
|
||||||
|
- write_elf32_notes(fd_write_vmcore, s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf32_notes(fd_write_vmcore, s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -644,9 +632,9 @@ static int get_next_block(DumpState *s, GuestPhysBlock *block)
|
||||||
|
/* write all memory to vmcore */
|
||||||
|
static void dump_iterate(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
GuestPhysBlock *block;
|
||||||
|
int64_t size;
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
|
||||||
|
do {
|
||||||
|
block = s->next_block;
|
||||||
|
@@ -658,9 +646,8 @@ static void dump_iterate(DumpState *s, Error **errp)
|
||||||
|
size -= block->target_end - (s->begin + s->length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- write_memory(s, block, s->start, size, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_memory(s, block, s->start, size, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -669,11 +656,10 @@ static void dump_iterate(DumpState *s, Error **errp)
|
||||||
|
|
||||||
|
static void create_vmcore(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
|
||||||
|
- dump_begin(s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ dump_begin(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -810,6 +796,7 @@ static bool note_name_equal(DumpState *s,
|
||||||
|
/* write common header, sub header and elf note to vmcore */
|
||||||
|
static void create_header32(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
DiskDumpHeader32 *dh = NULL;
|
||||||
|
KdumpSubHeader32 *kh = NULL;
|
||||||
|
size_t size;
|
||||||
|
@@ -818,7 +805,6 @@ static void create_header32(DumpState *s, Error **errp)
|
||||||
|
uint32_t bitmap_blocks;
|
||||||
|
uint32_t status = 0;
|
||||||
|
uint64_t offset_note;
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
|
||||||
|
/* write common header, the version of kdump-compressed format is 6th */
|
||||||
|
size = sizeof(DiskDumpHeader32);
|
||||||
|
@@ -894,9 +880,8 @@ static void create_header32(DumpState *s, Error **errp)
|
||||||
|
s->note_buf_offset = 0;
|
||||||
|
|
||||||
|
/* use s->note_buf to store notes temporarily */
|
||||||
|
- write_elf32_notes(buf_write_note, s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf32_notes(buf_write_note, s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (write_buffer(s->fd, offset_note, s->note_buf,
|
||||||
|
@@ -922,6 +907,7 @@ out:
|
||||||
|
/* write common header, sub header and elf note to vmcore */
|
||||||
|
static void create_header64(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
DiskDumpHeader64 *dh = NULL;
|
||||||
|
KdumpSubHeader64 *kh = NULL;
|
||||||
|
size_t size;
|
||||||
|
@@ -930,7 +916,6 @@ static void create_header64(DumpState *s, Error **errp)
|
||||||
|
uint32_t bitmap_blocks;
|
||||||
|
uint32_t status = 0;
|
||||||
|
uint64_t offset_note;
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
|
||||||
|
/* write common header, the version of kdump-compressed format is 6th */
|
||||||
|
size = sizeof(DiskDumpHeader64);
|
||||||
|
@@ -1006,9 +991,8 @@ static void create_header64(DumpState *s, Error **errp)
|
||||||
|
s->note_buf_offset = 0;
|
||||||
|
|
||||||
|
/* use s->note_buf to store notes temporarily */
|
||||||
|
- write_elf64_notes(buf_write_note, s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_elf64_notes(buf_write_note, s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1472,8 +1456,8 @@ out:
|
||||||
|
|
||||||
|
static void create_kdump_vmcore(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
int ret;
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the kdump-compressed format is:
|
||||||
|
@@ -1503,21 +1487,18 @@ static void create_kdump_vmcore(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- write_dump_header(s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_dump_header(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- write_dump_bitmap(s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_dump_bitmap(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- write_dump_pages(s, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ write_dump_pages(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1647,10 +1628,10 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
DumpGuestMemoryFormat format, bool paging, bool has_filter,
|
||||||
|
int64_t begin, int64_t length, Error **errp)
|
||||||
|
{
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
VMCoreInfoState *vmci = vmcoreinfo_find();
|
||||||
|
CPUState *cpu;
|
||||||
|
int nr_cpus;
|
||||||
|
- Error *err = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
s->has_format = has_format;
|
||||||
|
@@ -1769,9 +1750,8 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
|
||||||
|
/* get memory mapping */
|
||||||
|
if (paging) {
|
||||||
|
- qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, &err);
|
||||||
|
- if (err != NULL) {
|
||||||
|
- error_propagate(errp, err);
|
||||||
|
+ qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
@@ -1870,33 +1850,32 @@ cleanup:
|
||||||
|
/* this operation might be time consuming. */
|
||||||
|
static void dump_process(DumpState *s, Error **errp)
|
||||||
|
{
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
DumpQueryResult *result = NULL;
|
||||||
|
|
||||||
|
if (s->has_format && s->format == DUMP_GUEST_MEMORY_FORMAT_WIN_DMP) {
|
||||||
|
#ifdef TARGET_X86_64
|
||||||
|
- create_win_dump(s, &local_err);
|
||||||
|
+ create_win_dump(s, errp);
|
||||||
|
#endif
|
||||||
|
} else if (s->has_format && s->format != DUMP_GUEST_MEMORY_FORMAT_ELF) {
|
||||||
|
- create_kdump_vmcore(s, &local_err);
|
||||||
|
+ create_kdump_vmcore(s, errp);
|
||||||
|
} else {
|
||||||
|
- create_vmcore(s, &local_err);
|
||||||
|
+ create_vmcore(s, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make sure status is written after written_size updates */
|
||||||
|
smp_wmb();
|
||||||
|
qatomic_set(&s->status,
|
||||||
|
- (local_err ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED));
|
||||||
|
+ (*errp ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED));
|
||||||
|
|
||||||
|
/* send DUMP_COMPLETED message (unconditionally) */
|
||||||
|
result = qmp_query_dump(NULL);
|
||||||
|
/* should never fail */
|
||||||
|
assert(result);
|
||||||
|
- qapi_event_send_dump_completed(result, !!local_err, (local_err ?
|
||||||
|
- error_get_pretty(local_err) : NULL));
|
||||||
|
+ qapi_event_send_dump_completed(result, !!*errp, (*errp ?
|
||||||
|
+ error_get_pretty(*errp) : NULL));
|
||||||
|
qapi_free_DumpQueryResult(result);
|
||||||
|
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
dump_cleanup(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1925,10 +1904,10 @@ void qmp_dump_guest_memory(bool paging, const char *file,
|
||||||
|
int64_t length, bool has_format,
|
||||||
|
DumpGuestMemoryFormat format, Error **errp)
|
||||||
|
{
|
||||||
|
+ ERRP_GUARD();
|
||||||
|
const char *p;
|
||||||
|
int fd = -1;
|
||||||
|
DumpState *s;
|
||||||
|
- Error *local_err = NULL;
|
||||||
|
bool detach_p = false;
|
||||||
|
|
||||||
|
if (runstate_check(RUN_STATE_INMIGRATE)) {
|
||||||
|
@@ -2028,9 +2007,8 @@ void qmp_dump_guest_memory(bool paging, const char *file,
|
||||||
|
dump_state_prepare(s);
|
||||||
|
|
||||||
|
dump_init(s, fd, has_format, format, paging, has_begin,
|
||||||
|
- begin, length, &local_err);
|
||||||
|
- if (local_err) {
|
||||||
|
- error_propagate(errp, local_err);
|
||||||
|
+ begin, length, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
qatomic_set(&s->status, DUMP_STATUS_FAILED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,150 @@
|
|||||||
|
From a918c7305ec7c68e8bc37b449f71e75d84124cd0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 08:38:13 +0000
|
||||||
|
Subject: [PATCH 32/42] dump: Use a buffer for ELF section data and headers
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [32/41] e1a03e202e67764581e486f37e13e479200e5846
|
||||||
|
|
||||||
|
Currently we're writing the NULL section header if we overflow the
|
||||||
|
physical header number in the ELF header. But in the future we'll add
|
||||||
|
custom section headers AND section data.
|
||||||
|
|
||||||
|
To facilitate this we need to rearange section handling a bit. As with
|
||||||
|
the other ELF headers we split the code into a prepare and a write
|
||||||
|
step.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20221017083822.43118-2-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit e41ed29bcee5cb16715317bcf290f6b5c196eb0a)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 75 +++++++++++++++++++++++++++++--------------
|
||||||
|
include/sysemu/dump.h | 2 ++
|
||||||
|
2 files changed, 53 insertions(+), 24 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 88177fa886..4142b4cc0c 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -381,31 +381,60 @@ static void write_elf_phdr_note(DumpState *s, Error **errp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void write_elf_section(DumpState *s, int type, Error **errp)
|
||||||
|
+static void prepare_elf_section_hdr_zero(DumpState *s)
|
||||||
|
{
|
||||||
|
- Elf32_Shdr shdr32;
|
||||||
|
- Elf64_Shdr shdr64;
|
||||||
|
- int shdr_size;
|
||||||
|
- void *shdr;
|
||||||
|
- int ret;
|
||||||
|
+ if (dump_is_64bit(s)) {
|
||||||
|
+ Elf64_Shdr *shdr64 = s->elf_section_hdrs;
|
||||||
|
|
||||||
|
- if (type == 0) {
|
||||||
|
- shdr_size = sizeof(Elf32_Shdr);
|
||||||
|
- memset(&shdr32, 0, shdr_size);
|
||||||
|
- shdr32.sh_info = cpu_to_dump32(s, s->phdr_num);
|
||||||
|
- shdr = &shdr32;
|
||||||
|
+ shdr64->sh_info = cpu_to_dump32(s, s->phdr_num);
|
||||||
|
} else {
|
||||||
|
- shdr_size = sizeof(Elf64_Shdr);
|
||||||
|
- memset(&shdr64, 0, shdr_size);
|
||||||
|
- shdr64.sh_info = cpu_to_dump32(s, s->phdr_num);
|
||||||
|
- shdr = &shdr64;
|
||||||
|
+ Elf32_Shdr *shdr32 = s->elf_section_hdrs;
|
||||||
|
+
|
||||||
|
+ shdr32->sh_info = cpu_to_dump32(s, s->phdr_num);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void prepare_elf_section_hdrs(DumpState *s)
|
||||||
|
+{
|
||||||
|
+ size_t len, sizeof_shdr;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Section ordering:
|
||||||
|
+ * - HDR zero
|
||||||
|
+ */
|
||||||
|
+ sizeof_shdr = dump_is_64bit(s) ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr);
|
||||||
|
+ len = sizeof_shdr * s->shdr_num;
|
||||||
|
+ s->elf_section_hdrs = g_malloc0(len);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * The first section header is ALWAYS a special initial section
|
||||||
|
+ * header.
|
||||||
|
+ *
|
||||||
|
+ * The header should be 0 with one exception being that if
|
||||||
|
+ * phdr_num is PN_XNUM then the sh_info field contains the real
|
||||||
|
+ * number of segment entries.
|
||||||
|
+ *
|
||||||
|
+ * As we zero allocate the buffer we will only need to modify
|
||||||
|
+ * sh_info for the PN_XNUM case.
|
||||||
|
+ */
|
||||||
|
+ if (s->phdr_num >= PN_XNUM) {
|
||||||
|
+ prepare_elf_section_hdr_zero(s);
|
||||||
|
}
|
||||||
|
+}
|
||||||
|
|
||||||
|
- ret = fd_write_vmcore(shdr, shdr_size, s);
|
||||||
|
+static void write_elf_section_headers(DumpState *s, Error **errp)
|
||||||
|
+{
|
||||||
|
+ size_t sizeof_shdr = dump_is_64bit(s) ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr);
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ prepare_elf_section_hdrs(s);
|
||||||
|
+
|
||||||
|
+ ret = fd_write_vmcore(s->elf_section_hdrs, s->shdr_num * sizeof_shdr, s);
|
||||||
|
if (ret < 0) {
|
||||||
|
- error_setg_errno(errp, -ret,
|
||||||
|
- "dump: failed to write section header table");
|
||||||
|
+ error_setg_errno(errp, -ret, "dump: failed to write section headers");
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ g_free(s->elf_section_hdrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_data(DumpState *s, void *buf, int length, Error **errp)
|
||||||
|
@@ -592,12 +621,10 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* write section to vmcore */
|
||||||
|
- if (s->shdr_num) {
|
||||||
|
- write_elf_section(s, 1, errp);
|
||||||
|
- if (*errp) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
+ /* write section headers to vmcore */
|
||||||
|
+ write_elf_section_headers(s, errp);
|
||||||
|
+ if (*errp) {
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write notes to vmcore */
|
||||||
|
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
|
||||||
|
index b62513d87d..9995f65dc8 100644
|
||||||
|
--- a/include/sysemu/dump.h
|
||||||
|
+++ b/include/sysemu/dump.h
|
||||||
|
@@ -177,6 +177,8 @@ typedef struct DumpState {
|
||||||
|
int64_t filter_area_begin; /* Start address of partial guest memory area */
|
||||||
|
int64_t filter_area_length; /* Length of partial guest memory area */
|
||||||
|
|
||||||
|
+ void *elf_section_hdrs; /* Pointer to section header buffer */
|
||||||
|
+
|
||||||
|
uint8_t *note_buf; /* buffer for notes */
|
||||||
|
size_t note_buf_offset; /* the writing place in note_buf */
|
||||||
|
uint32_t nr_cpus; /* number of guest's cpu */
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,104 @@
|
|||||||
|
From 987ede93fa4e3d058acddc19874e467faa116ede Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 08:38:14 +0000
|
||||||
|
Subject: [PATCH 33/42] dump: Write ELF section headers right after ELF header
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [33/41] e956040753533ac376e9763145192de1e216027d
|
||||||
|
|
||||||
|
Let's start bundling the writes of the headers and of the data so we
|
||||||
|
have a clear ordering between them. Since the ELF header uses offsets
|
||||||
|
to the headers we can freely order them.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20221017083822.43118-3-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit cb415fd61e48d52f81dcf38956e3f913651cff1c)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 31 ++++++++++++++-----------------
|
||||||
|
1 file changed, 14 insertions(+), 17 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 4142b4cc0c..d17537d4e9 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -584,6 +584,8 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
* --------------
|
||||||
|
* | elf header |
|
||||||
|
* --------------
|
||||||
|
+ * | sctn_hdr |
|
||||||
|
+ * --------------
|
||||||
|
* | PT_NOTE |
|
||||||
|
* --------------
|
||||||
|
* | PT_LOAD |
|
||||||
|
@@ -592,8 +594,6 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
* --------------
|
||||||
|
* | PT_LOAD |
|
||||||
|
* --------------
|
||||||
|
- * | sec_hdr |
|
||||||
|
- * --------------
|
||||||
|
* | elf note |
|
||||||
|
* --------------
|
||||||
|
* | memory |
|
||||||
|
@@ -609,20 +609,20 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* write PT_NOTE to vmcore */
|
||||||
|
- write_elf_phdr_note(s, errp);
|
||||||
|
+ /* write section headers to vmcore */
|
||||||
|
+ write_elf_section_headers(s, errp);
|
||||||
|
if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* write all PT_LOADs to vmcore */
|
||||||
|
- write_elf_phdr_loads(s, errp);
|
||||||
|
+ /* write PT_NOTE to vmcore */
|
||||||
|
+ write_elf_phdr_note(s, errp);
|
||||||
|
if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* write section headers to vmcore */
|
||||||
|
- write_elf_section_headers(s, errp);
|
||||||
|
+ /* write all PT_LOADs to vmcore */
|
||||||
|
+ write_elf_phdr_loads(s, errp);
|
||||||
|
if (*errp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -1877,16 +1877,13 @@ static void dump_init(DumpState *s, int fd, bool has_format,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dump_is_64bit(s)) {
|
||||||
|
- s->phdr_offset = sizeof(Elf64_Ehdr);
|
||||||
|
- s->shdr_offset = s->phdr_offset + sizeof(Elf64_Phdr) * s->phdr_num;
|
||||||
|
- s->note_offset = s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_num;
|
||||||
|
- s->memory_offset = s->note_offset + s->note_size;
|
||||||
|
+ s->shdr_offset = sizeof(Elf64_Ehdr);
|
||||||
|
+ s->phdr_offset = s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_num;
|
||||||
|
+ s->note_offset = s->phdr_offset + sizeof(Elf64_Phdr) * s->phdr_num;
|
||||||
|
} else {
|
||||||
|
-
|
||||||
|
- s->phdr_offset = sizeof(Elf32_Ehdr);
|
||||||
|
- s->shdr_offset = s->phdr_offset + sizeof(Elf32_Phdr) * s->phdr_num;
|
||||||
|
- s->note_offset = s->shdr_offset + sizeof(Elf32_Shdr) * s->shdr_num;
|
||||||
|
- s->memory_offset = s->note_offset + s->note_size;
|
||||||
|
+ s->shdr_offset = sizeof(Elf32_Ehdr);
|
||||||
|
+ s->phdr_offset = s->shdr_offset + sizeof(Elf32_Shdr) * s->shdr_num;
|
||||||
|
+ s->note_offset = s->phdr_offset + sizeof(Elf32_Phdr) * s->phdr_num;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
173
SOURCES/kvm-dump-fix-kdump-to-work-over-non-aligned-blocks.patch
Normal file
173
SOURCES/kvm-dump-fix-kdump-to-work-over-non-aligned-blocks.patch
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
From deaf4e0f5e90d227b7b9f3e5d1dff7fd0bc0206a Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
|
||||||
|
Date: Mon, 5 Sep 2022 16:06:21 +0400
|
||||||
|
Subject: [PATCH 31/42] dump: fix kdump to work over non-aligned blocks
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [31/41] b307bdce4a4791fc30160fa2a1678bd238f2432e
|
||||||
|
|
||||||
|
Rewrite get_next_page() to work over non-aligned blocks. When it
|
||||||
|
encounters non aligned addresses, it will try to fill a page provided by
|
||||||
|
the caller.
|
||||||
|
|
||||||
|
This solves a kdump crash with "tpm-crb-cmd" RAM memory region,
|
||||||
|
qemu-kvm: ../dump/dump.c:1162: _Bool get_next_page(GuestPhysBlock **,
|
||||||
|
uint64_t *, uint8_t **, DumpState *): Assertion `(block->target_start &
|
||||||
|
~target_page_mask) == 0' failed.
|
||||||
|
|
||||||
|
because:
|
||||||
|
guest_phys_block_add_section: target_start=00000000fed40080 target_end=00000000fed41000: added (count: 4)
|
||||||
|
|
||||||
|
Fixes:
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2120480
|
||||||
|
|
||||||
|
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Acked-by: David Hildenbrand <david@redhat.com>
|
||||||
|
(cherry picked from commit 94d788408d2d5a6474c99b2c9cf06913b9db7c58)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 79 +++++++++++++++++++++++++++++++++++++----------------
|
||||||
|
1 file changed, 56 insertions(+), 23 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 1c49232390..88177fa886 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -1117,50 +1117,81 @@ static uint64_t dump_pfn_to_paddr(DumpState *s, uint64_t pfn)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * exam every page and return the page frame number and the address of the page.
|
||||||
|
- * bufptr can be NULL. note: the blocks here is supposed to reflect guest-phys
|
||||||
|
- * blocks, so block->target_start and block->target_end should be interal
|
||||||
|
- * multiples of the target page size.
|
||||||
|
+ * Return the page frame number and the page content in *bufptr. bufptr can be
|
||||||
|
+ * NULL. If not NULL, *bufptr must contains a target page size of pre-allocated
|
||||||
|
+ * memory. This is not necessarily the memory returned.
|
||||||
|
*/
|
||||||
|
static bool get_next_page(GuestPhysBlock **blockptr, uint64_t *pfnptr,
|
||||||
|
uint8_t **bufptr, DumpState *s)
|
||||||
|
{
|
||||||
|
GuestPhysBlock *block = *blockptr;
|
||||||
|
- hwaddr addr, target_page_mask = ~((hwaddr)s->dump_info.page_size - 1);
|
||||||
|
- uint8_t *buf;
|
||||||
|
+ uint32_t page_size = s->dump_info.page_size;
|
||||||
|
+ uint8_t *buf = NULL, *hbuf;
|
||||||
|
+ hwaddr addr;
|
||||||
|
|
||||||
|
/* block == NULL means the start of the iteration */
|
||||||
|
if (!block) {
|
||||||
|
block = QTAILQ_FIRST(&s->guest_phys_blocks.head);
|
||||||
|
*blockptr = block;
|
||||||
|
addr = block->target_start;
|
||||||
|
+ *pfnptr = dump_paddr_to_pfn(s, addr);
|
||||||
|
} else {
|
||||||
|
- addr = dump_pfn_to_paddr(s, *pfnptr + 1);
|
||||||
|
+ *pfnptr += 1;
|
||||||
|
+ addr = dump_pfn_to_paddr(s, *pfnptr);
|
||||||
|
}
|
||||||
|
assert(block != NULL);
|
||||||
|
|
||||||
|
- if ((addr >= block->target_start) &&
|
||||||
|
- (addr + s->dump_info.page_size <= block->target_end)) {
|
||||||
|
- buf = block->host_addr + (addr - block->target_start);
|
||||||
|
- } else {
|
||||||
|
- /* the next page is in the next block */
|
||||||
|
- block = QTAILQ_NEXT(block, next);
|
||||||
|
- *blockptr = block;
|
||||||
|
- if (!block) {
|
||||||
|
- return false;
|
||||||
|
+ while (1) {
|
||||||
|
+ if (addr >= block->target_start && addr < block->target_end) {
|
||||||
|
+ size_t n = MIN(block->target_end - addr, page_size - addr % page_size);
|
||||||
|
+ hbuf = block->host_addr + (addr - block->target_start);
|
||||||
|
+ if (!buf) {
|
||||||
|
+ if (n == page_size) {
|
||||||
|
+ /* this is a whole target page, go for it */
|
||||||
|
+ assert(addr % page_size == 0);
|
||||||
|
+ buf = hbuf;
|
||||||
|
+ break;
|
||||||
|
+ } else if (bufptr) {
|
||||||
|
+ assert(*bufptr);
|
||||||
|
+ buf = *bufptr;
|
||||||
|
+ memset(buf, 0, page_size);
|
||||||
|
+ } else {
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ memcpy(buf + addr % page_size, hbuf, n);
|
||||||
|
+ addr += n;
|
||||||
|
+ if (addr % page_size == 0) {
|
||||||
|
+ /* we filled up the page */
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ /* the next page is in the next block */
|
||||||
|
+ *blockptr = block = QTAILQ_NEXT(block, next);
|
||||||
|
+ if (!block) {
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ addr = block->target_start;
|
||||||
|
+ /* are we still in the same page? */
|
||||||
|
+ if (dump_paddr_to_pfn(s, addr) != *pfnptr) {
|
||||||
|
+ if (buf) {
|
||||||
|
+ /* no, but we already filled something earlier, return it */
|
||||||
|
+ break;
|
||||||
|
+ } else {
|
||||||
|
+ /* else continue from there */
|
||||||
|
+ *pfnptr = dump_paddr_to_pfn(s, addr);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- addr = block->target_start;
|
||||||
|
- buf = block->host_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
- assert((block->target_start & ~target_page_mask) == 0);
|
||||||
|
- assert((block->target_end & ~target_page_mask) == 0);
|
||||||
|
- *pfnptr = dump_paddr_to_pfn(s, addr);
|
||||||
|
if (bufptr) {
|
||||||
|
*bufptr = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
- return true;
|
||||||
|
+ return buf != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_dump_bitmap(DumpState *s, Error **errp)
|
||||||
|
@@ -1306,6 +1337,7 @@ static void write_dump_pages(DumpState *s, Error **errp)
|
||||||
|
uint8_t *buf;
|
||||||
|
GuestPhysBlock *block_iter = NULL;
|
||||||
|
uint64_t pfn_iter;
|
||||||
|
+ g_autofree uint8_t *page = NULL;
|
||||||
|
|
||||||
|
/* get offset of page_desc and page_data in dump file */
|
||||||
|
offset_desc = s->offset_page;
|
||||||
|
@@ -1341,12 +1373,13 @@ static void write_dump_pages(DumpState *s, Error **errp)
|
||||||
|
}
|
||||||
|
|
||||||
|
offset_data += s->dump_info.page_size;
|
||||||
|
+ page = g_malloc(s->dump_info.page_size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dump memory to vmcore page by page. zero page will all be resided in the
|
||||||
|
* first page of page section
|
||||||
|
*/
|
||||||
|
- while (get_next_page(&block_iter, &pfn_iter, &buf, s)) {
|
||||||
|
+ for (buf = page; get_next_page(&block_iter, &pfn_iter, &buf, s); buf = page) {
|
||||||
|
/* check zero page */
|
||||||
|
if (is_zero_page(buf, s->dump_info.page_size)) {
|
||||||
|
ret = write_cache(&page_desc, &pd_zero, sizeof(PageDescriptor),
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
75
SOURCES/kvm-dump-simplify-a-bit-kdump-get_next_page.patch
Normal file
75
SOURCES/kvm-dump-simplify-a-bit-kdump-get_next_page.patch
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
From bb55fde4d8ca587e2ef52ce58a0c22e4d66a08dc Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
|
||||||
|
Date: Thu, 25 Aug 2022 12:40:12 +0400
|
||||||
|
Subject: [PATCH 30/42] dump: simplify a bit kdump get_next_page()
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [30/41] 417ac19fa96036e0242f40121ac6e87a9f3f70ba
|
||||||
|
|
||||||
|
This should be functionally equivalent, but slightly easier to read,
|
||||||
|
with simplified paths and checks at the end of the function.
|
||||||
|
|
||||||
|
The following patch is a major rewrite to get rid of the assert().
|
||||||
|
|
||||||
|
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Reviewed-by: David Hildenbrand <david@redhat.com>
|
||||||
|
(cherry picked from commit 08df343874fcddd260021a04ce3c5a34f2c48164)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 21 ++++++++-------------
|
||||||
|
1 file changed, 8 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index c2c1341ad7..1c49232390 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -1133,17 +1133,11 @@ static bool get_next_page(GuestPhysBlock **blockptr, uint64_t *pfnptr,
|
||||||
|
if (!block) {
|
||||||
|
block = QTAILQ_FIRST(&s->guest_phys_blocks.head);
|
||||||
|
*blockptr = block;
|
||||||
|
- assert((block->target_start & ~target_page_mask) == 0);
|
||||||
|
- assert((block->target_end & ~target_page_mask) == 0);
|
||||||
|
- *pfnptr = dump_paddr_to_pfn(s, block->target_start);
|
||||||
|
- if (bufptr) {
|
||||||
|
- *bufptr = block->host_addr;
|
||||||
|
- }
|
||||||
|
- return true;
|
||||||
|
+ addr = block->target_start;
|
||||||
|
+ } else {
|
||||||
|
+ addr = dump_pfn_to_paddr(s, *pfnptr + 1);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- *pfnptr = *pfnptr + 1;
|
||||||
|
- addr = dump_pfn_to_paddr(s, *pfnptr);
|
||||||
|
+ assert(block != NULL);
|
||||||
|
|
||||||
|
if ((addr >= block->target_start) &&
|
||||||
|
(addr + s->dump_info.page_size <= block->target_end)) {
|
||||||
|
@@ -1155,12 +1149,13 @@ static bool get_next_page(GuestPhysBlock **blockptr, uint64_t *pfnptr,
|
||||||
|
if (!block) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
- assert((block->target_start & ~target_page_mask) == 0);
|
||||||
|
- assert((block->target_end & ~target_page_mask) == 0);
|
||||||
|
- *pfnptr = dump_paddr_to_pfn(s, block->target_start);
|
||||||
|
+ addr = block->target_start;
|
||||||
|
buf = block->host_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ assert((block->target_start & ~target_page_mask) == 0);
|
||||||
|
+ assert((block->target_end & ~target_page_mask) == 0);
|
||||||
|
+ *pfnptr = dump_paddr_to_pfn(s, addr);
|
||||||
|
if (bufptr) {
|
||||||
|
*bufptr = buf;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,81 @@
|
|||||||
|
From edead46187b1e55ad5e238332780aef19f1bc214 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
Date: Wed, 9 Nov 2022 18:41:18 -0500
|
||||||
|
Subject: [PATCH 1/2] hw/acpi: Add ospm_status hook implementation for acpi-ged
|
||||||
|
|
||||||
|
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-MergeRequest: 228: qemu-kvm: backport some aarch64 fixes
|
||||||
|
RH-Bugzilla: 2132609
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||||||
|
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||||
|
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||||
|
RH-Commit: [1/2] 99730b1a27666ca745dc28d90751c938d43f1682 (jmaloy/qemu-kvm)
|
||||||
|
|
||||||
|
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2132609
|
||||||
|
Upstream: Merged
|
||||||
|
|
||||||
|
commit d4424bebceaa8ffbc23060ce45e52a9bb817e3c9
|
||||||
|
Author: Keqian Zhu <zhukeqian1@huawei.com>
|
||||||
|
Date: Tue Aug 16 17:49:57 2022 +0800
|
||||||
|
|
||||||
|
hw/acpi: Add ospm_status hook implementation for acpi-ged
|
||||||
|
|
||||||
|
Setup an ARM virtual machine of machine virt and execute qmp "query-acpi-ospm-status"
|
||||||
|
causes segmentation fault with following dumpstack:
|
||||||
|
#1 0x0000aaaaab64235c in qmp_query_acpi_ospm_status (errp=errp@entry=0xfffffffff030) at ../monitor/qmp-cmds.c:312
|
||||||
|
#2 0x0000aaaaabfc4e20 in qmp_marshal_query_acpi_ospm_status (args=<optimized out>, ret=0xffffea4ffe90, errp=0xffffea4ffe88) at qapi/qapi-commands-acpi.c:63
|
||||||
|
#3 0x0000aaaaabff8ba0 in do_qmp_dispatch_bh (opaque=0xffffea4ffe98) at ../qapi/qmp-dispatch.c:128
|
||||||
|
#4 0x0000aaaaac02e594 in aio_bh_call (bh=0xffffe0004d80) at ../util/async.c:150
|
||||||
|
#5 aio_bh_poll (ctx=ctx@entry=0xaaaaad0f6040) at ../util/async.c:178
|
||||||
|
#6 0x0000aaaaac00bd40 in aio_dispatch (ctx=ctx@entry=0xaaaaad0f6040) at ../util/aio-posix.c:421
|
||||||
|
#7 0x0000aaaaac02e010 in aio_ctx_dispatch (source=0xaaaaad0f6040, callback=<optimized out>, user_data=<optimized out>) at ../util/async.c:320
|
||||||
|
#8 0x0000fffff76f6884 in g_main_context_dispatch () at /usr/lib64/libglib-2.0.so.0
|
||||||
|
#9 0x0000aaaaac0452d4 in glib_pollfds_poll () at ../util/main-loop.c:297
|
||||||
|
#10 os_host_main_loop_wait (timeout=0) at ../util/main-loop.c:320
|
||||||
|
#11 main_loop_wait (nonblocking=nonblocking@entry=0) at ../util/main-loop.c:596
|
||||||
|
#12 0x0000aaaaab5c9e50 in qemu_main_loop () at ../softmmu/runstate.c:734
|
||||||
|
#13 0x0000aaaaab185370 in qemu_main (argc=argc@entry=47, argv=argv@entry=0xfffffffff518, envp=envp@entry=0x0) at ../softmmu/main.c:38
|
||||||
|
#14 0x0000aaaaab16f99c in main (argc=47, argv=0xfffffffff518) at ../softmmu/main.c:47
|
||||||
|
|
||||||
|
Fixes: ebb62075021a ("hw/acpi: Add ACPI Generic Event Device Support")
|
||||||
|
Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
|
||||||
|
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||||
|
Message-id: 20220816094957.31700-1-zhukeqian1@huawei.com
|
||||||
|
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||||
|
|
||||||
|
(cherry picked from commit d4424bebceaa8ffbc23060ce45e52a9bb817e3c9)
|
||||||
|
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
---
|
||||||
|
hw/acpi/generic_event_device.c | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c
|
||||||
|
index e28457a7d1..a3d31631fe 100644
|
||||||
|
--- a/hw/acpi/generic_event_device.c
|
||||||
|
+++ b/hw/acpi/generic_event_device.c
|
||||||
|
@@ -267,6 +267,13 @@ static void acpi_ged_unplug_cb(HotplugHandler *hotplug_dev,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void acpi_ged_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list)
|
||||||
|
+{
|
||||||
|
+ AcpiGedState *s = ACPI_GED(adev);
|
||||||
|
+
|
||||||
|
+ acpi_memory_ospm_status(&s->memhp_state, list);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
|
||||||
|
{
|
||||||
|
AcpiGedState *s = ACPI_GED(adev);
|
||||||
|
@@ -409,6 +416,7 @@ static void acpi_ged_class_init(ObjectClass *class, void *data)
|
||||||
|
hc->unplug_request = acpi_ged_unplug_request_cb;
|
||||||
|
hc->unplug = acpi_ged_unplug_cb;
|
||||||
|
|
||||||
|
+ adevc->ospm_status = acpi_ged_ospm_status;
|
||||||
|
adevc->send_event = acpi_ged_send_event;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,52 @@
|
|||||||
|
From 100f33ff8a1d55986e43b99ba8726abc29ee8d26 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
Date: Mon, 5 Dec 2022 15:32:55 -0500
|
||||||
|
Subject: [PATCH 5/5] hw/display/qxl: Assert memory slot fits in preallocated
|
||||||
|
MemoryRegion
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-MergeRequest: 240: hw/display/qxl: Have qxl_log_command Return early if no log_cmd handler
|
||||||
|
RH-Bugzilla: 2148545
|
||||||
|
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
RH-Commit: [5/5] f809ce48e7989dd6547b7c8bf1a5efc3fdcacbac (jmaloy/jons-qemu-kvm)
|
||||||
|
|
||||||
|
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2148545
|
||||||
|
CVE: CVE-2022-4144
|
||||||
|
Upstream: Merged
|
||||||
|
|
||||||
|
commit 86fdb0582c653a9824183679403a85f588260d62
|
||||||
|
Author: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Date: Mon Nov 28 21:27:41 2022 +0100
|
||||||
|
|
||||||
|
hw/display/qxl: Assert memory slot fits in preallocated MemoryRegion
|
||||||
|
|
||||||
|
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Message-Id: <20221128202741.4945-6-philmd@linaro.org>
|
||||||
|
|
||||||
|
(cherry picked from commit 86fdb0582c653a9824183679403a85f588260d62)
|
||||||
|
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
---
|
||||||
|
hw/display/qxl.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
|
||||||
|
index 2a4b2d4158..bcd9e8716a 100644
|
||||||
|
--- a/hw/display/qxl.c
|
||||||
|
+++ b/hw/display/qxl.c
|
||||||
|
@@ -1372,6 +1372,7 @@ static int qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta,
|
||||||
|
qxl_set_guest_bug(d, "%s: pci_region = %d", __func__, pci_region);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
+ assert(guest_end - pci_start <= memory_region_size(mr));
|
||||||
|
|
||||||
|
virt_start = (intptr_t)memory_region_get_ram_ptr(mr);
|
||||||
|
memslot.slot_id = slot_id;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,130 @@
|
|||||||
|
From 4e1bfbe3a0a113fe3cf39336a9d7da4e8c2a21ea Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
Date: Mon, 5 Dec 2022 15:32:55 -0500
|
||||||
|
Subject: [PATCH 4/5] hw/display/qxl: Avoid buffer overrun in qxl_phys2virt
|
||||||
|
(CVE-2022-4144)
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-MergeRequest: 240: hw/display/qxl: Have qxl_log_command Return early if no log_cmd handler
|
||||||
|
RH-Bugzilla: 2148545
|
||||||
|
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
RH-Commit: [4/5] afe53f8d9b31c6fd8211fe172173151f3255e67c (jmaloy/jons-qemu-kvm)
|
||||||
|
|
||||||
|
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2148545
|
||||||
|
CVE: CVE-2022-4144
|
||||||
|
Upstream: Merged
|
||||||
|
|
||||||
|
commit 6dbbf055148c6f1b7d8a3251a65bd6f3d1e1f622
|
||||||
|
Author: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Date: Mon Nov 28 21:27:40 2022 +0100
|
||||||
|
|
||||||
|
hw/display/qxl: Avoid buffer overrun in qxl_phys2virt (CVE-2022-4144)
|
||||||
|
|
||||||
|
Have qxl_get_check_slot_offset() return false if the requested
|
||||||
|
buffer size does not fit within the slot memory region.
|
||||||
|
|
||||||
|
Similarly qxl_phys2virt() now returns NULL in such case, and
|
||||||
|
qxl_dirty_one_surface() aborts.
|
||||||
|
|
||||||
|
This avoids buffer overrun in the host pointer returned by
|
||||||
|
memory_region_get_ram_ptr().
|
||||||
|
|
||||||
|
Fixes: CVE-2022-4144 (out-of-bounds read)
|
||||||
|
Reported-by: Wenxu Yin (@awxylitol)
|
||||||
|
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1336
|
||||||
|
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Message-Id: <20221128202741.4945-5-philmd@linaro.org>
|
||||||
|
|
||||||
|
(cherry picked from commit 6dbbf055148c6f1b7d8a3251a65bd6f3d1e1f622)
|
||||||
|
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
---
|
||||||
|
hw/display/qxl.c | 27 +++++++++++++++++++++++----
|
||||||
|
hw/display/qxl.h | 2 +-
|
||||||
|
2 files changed, 24 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
|
||||||
|
index aa9065183e..2a4b2d4158 100644
|
||||||
|
--- a/hw/display/qxl.c
|
||||||
|
+++ b/hw/display/qxl.c
|
||||||
|
@@ -1412,11 +1412,13 @@ static void qxl_reset_surfaces(PCIQXLDevice *d)
|
||||||
|
|
||||||
|
/* can be also called from spice server thread context */
|
||||||
|
static bool qxl_get_check_slot_offset(PCIQXLDevice *qxl, QXLPHYSICAL pqxl,
|
||||||
|
- uint32_t *s, uint64_t *o)
|
||||||
|
+ uint32_t *s, uint64_t *o,
|
||||||
|
+ size_t size_requested)
|
||||||
|
{
|
||||||
|
uint64_t phys = le64_to_cpu(pqxl);
|
||||||
|
uint32_t slot = (phys >> (64 - 8)) & 0xff;
|
||||||
|
uint64_t offset = phys & 0xffffffffffff;
|
||||||
|
+ uint64_t size_available;
|
||||||
|
|
||||||
|
if (slot >= NUM_MEMSLOTS) {
|
||||||
|
qxl_set_guest_bug(qxl, "slot too large %d >= %d", slot,
|
||||||
|
@@ -1440,6 +1442,23 @@ static bool qxl_get_check_slot_offset(PCIQXLDevice *qxl, QXLPHYSICAL pqxl,
|
||||||
|
slot, offset, qxl->guest_slots[slot].size);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
+ size_available = memory_region_size(qxl->guest_slots[slot].mr);
|
||||||
|
+ if (qxl->guest_slots[slot].offset + offset >= size_available) {
|
||||||
|
+ qxl_set_guest_bug(qxl,
|
||||||
|
+ "slot %d offset %"PRIu64" > region size %"PRIu64"\n",
|
||||||
|
+ slot, qxl->guest_slots[slot].offset + offset,
|
||||||
|
+ size_available);
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ size_available -= qxl->guest_slots[slot].offset + offset;
|
||||||
|
+ if (size_requested > size_available) {
|
||||||
|
+ qxl_set_guest_bug(qxl,
|
||||||
|
+ "slot %d offset %"PRIu64" size %zu: "
|
||||||
|
+ "overrun by %"PRIu64" bytes\n",
|
||||||
|
+ slot, offset, size_requested,
|
||||||
|
+ size_requested - size_available);
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
*s = slot;
|
||||||
|
*o = offset;
|
||||||
|
@@ -1459,7 +1478,7 @@ void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id,
|
||||||
|
offset = le64_to_cpu(pqxl) & 0xffffffffffff;
|
||||||
|
return (void *)(intptr_t)offset;
|
||||||
|
case MEMSLOT_GROUP_GUEST:
|
||||||
|
- if (!qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset)) {
|
||||||
|
+ if (!qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset, size)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ptr = memory_region_get_ram_ptr(qxl->guest_slots[slot].mr);
|
||||||
|
@@ -1925,9 +1944,9 @@ static void qxl_dirty_one_surface(PCIQXLDevice *qxl, QXLPHYSICAL pqxl,
|
||||||
|
uint32_t slot;
|
||||||
|
bool rc;
|
||||||
|
|
||||||
|
- rc = qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset);
|
||||||
|
- assert(rc == true);
|
||||||
|
size = (uint64_t)height * abs(stride);
|
||||||
|
+ rc = qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset, size);
|
||||||
|
+ assert(rc == true);
|
||||||
|
trace_qxl_surfaces_dirty(qxl->id, offset, size);
|
||||||
|
qxl_set_dirty(qxl->guest_slots[slot].mr,
|
||||||
|
qxl->guest_slots[slot].offset + offset,
|
||||||
|
diff --git a/hw/display/qxl.h b/hw/display/qxl.h
|
||||||
|
index c784315daa..89ca832cf9 100644
|
||||||
|
--- a/hw/display/qxl.h
|
||||||
|
+++ b/hw/display/qxl.h
|
||||||
|
@@ -157,7 +157,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(PCIQXLDevice, PCI_QXL)
|
||||||
|
*
|
||||||
|
* Returns a host pointer to a buffer placed at offset @phys within the
|
||||||
|
* active slot @group_id of the PCI VGA RAM memory region associated with
|
||||||
|
- * the @qxl device. If the slot is inactive, or the offset is out
|
||||||
|
+ * the @qxl device. If the slot is inactive, or the offset + size are out
|
||||||
|
* of the memory region, returns NULL.
|
||||||
|
*
|
||||||
|
* Use with care; by the time this function returns, the returned pointer is
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
70
SOURCES/kvm-hw-display-qxl-Document-qxl_phys2virt.patch
Normal file
70
SOURCES/kvm-hw-display-qxl-Document-qxl_phys2virt.patch
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
From 068c531fb968ec04509b85f524d0745e6acf5449 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
Date: Mon, 5 Dec 2022 15:32:55 -0500
|
||||||
|
Subject: [PATCH 2/5] hw/display/qxl: Document qxl_phys2virt()
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-MergeRequest: 240: hw/display/qxl: Have qxl_log_command Return early if no log_cmd handler
|
||||||
|
RH-Bugzilla: 2148545
|
||||||
|
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
RH-Commit: [2/5] f84c0b379022c527fc2508a242443d86454944c0 (jmaloy/jons-qemu-kvm)
|
||||||
|
|
||||||
|
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2148545
|
||||||
|
CVE: CVE-2022-4144
|
||||||
|
Upstream: Merged
|
||||||
|
|
||||||
|
commit b1901de83a9456cde26fc755f71ca2b7b3ef50fc
|
||||||
|
Author: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Date: Mon Nov 28 21:27:38 2022 +0100
|
||||||
|
|
||||||
|
hw/display/qxl: Document qxl_phys2virt()
|
||||||
|
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Message-Id: <20221128202741.4945-3-philmd@linaro.org>
|
||||||
|
|
||||||
|
(cherry picked from commit b1901de83a9456cde26fc755f71ca2b7b3ef50fc)
|
||||||
|
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
---
|
||||||
|
hw/display/qxl.h | 19 +++++++++++++++++++
|
||||||
|
1 file changed, 19 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/display/qxl.h b/hw/display/qxl.h
|
||||||
|
index 30d21f4d0b..c938f88a2f 100644
|
||||||
|
--- a/hw/display/qxl.h
|
||||||
|
+++ b/hw/display/qxl.h
|
||||||
|
@@ -147,6 +147,25 @@ OBJECT_DECLARE_SIMPLE_TYPE(PCIQXLDevice, PCI_QXL)
|
||||||
|
#define QXL_DEFAULT_REVISION (QXL_REVISION_STABLE_V12 + 1)
|
||||||
|
|
||||||
|
/* qxl.c */
|
||||||
|
+/**
|
||||||
|
+ * qxl_phys2virt: Get a pointer within a PCI VRAM memory region.
|
||||||
|
+ *
|
||||||
|
+ * @qxl: QXL device
|
||||||
|
+ * @phys: physical offset of buffer within the VRAM
|
||||||
|
+ * @group_id: memory slot group
|
||||||
|
+ *
|
||||||
|
+ * Returns a host pointer to a buffer placed at offset @phys within the
|
||||||
|
+ * active slot @group_id of the PCI VGA RAM memory region associated with
|
||||||
|
+ * the @qxl device. If the slot is inactive, or the offset is out
|
||||||
|
+ * of the memory region, returns NULL.
|
||||||
|
+ *
|
||||||
|
+ * Use with care; by the time this function returns, the returned pointer is
|
||||||
|
+ * not protected by RCU anymore. If the caller is not within an RCU critical
|
||||||
|
+ * section and does not hold the iothread lock, it must have other means of
|
||||||
|
+ * protecting the pointer, such as a reference to the region that includes
|
||||||
|
+ * the incoming ram_addr_t.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id);
|
||||||
|
void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...)
|
||||||
|
GCC_FMT_ATTR(2, 3);
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,74 @@
|
|||||||
|
From 5ec8d909d40fa04ef2c3572e01509a1866786070 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
Date: Mon, 5 Dec 2022 15:32:55 -0500
|
||||||
|
Subject: [PATCH 1/5] hw/display/qxl: Have qxl_log_command Return early if no
|
||||||
|
log_cmd handler
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-MergeRequest: 240: hw/display/qxl: Have qxl_log_command Return early if no log_cmd handler
|
||||||
|
RH-Bugzilla: 2148545
|
||||||
|
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
RH-Commit: [1/5] 33d94f40c46cccbc32d108d1035365917bf90356 (jmaloy/jons-qemu-kvm)
|
||||||
|
|
||||||
|
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2148545
|
||||||
|
CVE: CVE-2022-4144
|
||||||
|
Upstream: Merged
|
||||||
|
|
||||||
|
commit 61c34fc194b776ecadc39fb26b061331107e5599
|
||||||
|
Author: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Date: Mon Nov 28 21:27:37 2022 +0100
|
||||||
|
|
||||||
|
hw/display/qxl: Have qxl_log_command Return early if no log_cmd handler
|
||||||
|
|
||||||
|
Only 3 command types are logged: no need to call qxl_phys2virt()
|
||||||
|
for the other types. Using different cases will help to pass
|
||||||
|
different structure sizes to qxl_phys2virt() in a pair of commits.
|
||||||
|
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Message-Id: <20221128202741.4945-2-philmd@linaro.org>
|
||||||
|
|
||||||
|
(cherry picked from commit 61c34fc194b776ecadc39fb26b061331107e5599)
|
||||||
|
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
---
|
||||||
|
hw/display/qxl-logger.c | 11 +++++++++++
|
||||||
|
1 file changed, 11 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/display/qxl-logger.c b/hw/display/qxl-logger.c
|
||||||
|
index 68bfa47568..1bcf803db6 100644
|
||||||
|
--- a/hw/display/qxl-logger.c
|
||||||
|
+++ b/hw/display/qxl-logger.c
|
||||||
|
@@ -247,6 +247,16 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext)
|
||||||
|
qxl_name(qxl_type, ext->cmd.type),
|
||||||
|
compat ? "(compat)" : "");
|
||||||
|
|
||||||
|
+ switch (ext->cmd.type) {
|
||||||
|
+ case QXL_CMD_DRAW:
|
||||||
|
+ break;
|
||||||
|
+ case QXL_CMD_SURFACE:
|
||||||
|
+ break;
|
||||||
|
+ case QXL_CMD_CURSOR:
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
data = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||||
|
if (!data) {
|
||||||
|
return 1;
|
||||||
|
@@ -269,6 +279,7 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext)
|
||||||
|
qxl_log_cmd_cursor(qxl, data, ext->group_id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+out:
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,234 @@
|
|||||||
|
From 0e6bd3911c4971f575aac7e9cd726467b52fe544 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
Date: Mon, 5 Dec 2022 15:32:55 -0500
|
||||||
|
Subject: [PATCH 3/5] hw/display/qxl: Pass requested buffer size to
|
||||||
|
qxl_phys2virt()
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-MergeRequest: 240: hw/display/qxl: Have qxl_log_command Return early if no log_cmd handler
|
||||||
|
RH-Bugzilla: 2148545
|
||||||
|
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
RH-Commit: [3/5] 8e362d67fe7fef9eb457cfb15d75b298fed725c3 (jmaloy/jons-qemu-kvm)
|
||||||
|
|
||||||
|
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2148545
|
||||||
|
CVE: CVE-2022-4144
|
||||||
|
Upstream: Merged
|
||||||
|
|
||||||
|
commit 8efec0ef8bbc1e75a7ebf6e325a35806ece9b39f
|
||||||
|
Author: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Date: Mon Nov 28 21:27:39 2022 +0100
|
||||||
|
|
||||||
|
hw/display/qxl: Pass requested buffer size to qxl_phys2virt()
|
||||||
|
|
||||||
|
Currently qxl_phys2virt() doesn't check for buffer overrun.
|
||||||
|
In order to do so in the next commit, pass the buffer size
|
||||||
|
as argument.
|
||||||
|
|
||||||
|
For QXLCursor in qxl_render_cursor() -> qxl_cursor() we
|
||||||
|
verify the size of the chunked data ahead, checking we can
|
||||||
|
access 'sizeof(QXLCursor) + chunk->data_size' bytes.
|
||||||
|
Since in the SPICE_CURSOR_TYPE_MONO case the cursor is
|
||||||
|
assumed to fit in one chunk, no change are required.
|
||||||
|
In SPICE_CURSOR_TYPE_ALPHA the ahead read is handled in
|
||||||
|
qxl_unpack_chunks().
|
||||||
|
|
||||||
|
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||||
|
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Message-Id: <20221128202741.4945-4-philmd@linaro.org>
|
||||||
|
|
||||||
|
(cherry picked from commit 8efec0ef8bbc1e75a7ebf6e325a35806ece9b39f)
|
||||||
|
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
---
|
||||||
|
hw/display/qxl-logger.c | 11 ++++++++---
|
||||||
|
hw/display/qxl-render.c | 20 ++++++++++++++++----
|
||||||
|
hw/display/qxl.c | 14 +++++++++-----
|
||||||
|
hw/display/qxl.h | 4 +++-
|
||||||
|
4 files changed, 36 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/display/qxl-logger.c b/hw/display/qxl-logger.c
|
||||||
|
index 1bcf803db6..35c38f6252 100644
|
||||||
|
--- a/hw/display/qxl-logger.c
|
||||||
|
+++ b/hw/display/qxl-logger.c
|
||||||
|
@@ -106,7 +106,7 @@ static int qxl_log_image(PCIQXLDevice *qxl, QXLPHYSICAL addr, int group_id)
|
||||||
|
QXLImage *image;
|
||||||
|
QXLImageDescriptor *desc;
|
||||||
|
|
||||||
|
- image = qxl_phys2virt(qxl, addr, group_id);
|
||||||
|
+ image = qxl_phys2virt(qxl, addr, group_id, sizeof(QXLImage));
|
||||||
|
if (!image) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@@ -214,7 +214,8 @@ int qxl_log_cmd_cursor(PCIQXLDevice *qxl, QXLCursorCmd *cmd, int group_id)
|
||||||
|
cmd->u.set.position.y,
|
||||||
|
cmd->u.set.visible ? "yes" : "no",
|
||||||
|
cmd->u.set.shape);
|
||||||
|
- cursor = qxl_phys2virt(qxl, cmd->u.set.shape, group_id);
|
||||||
|
+ cursor = qxl_phys2virt(qxl, cmd->u.set.shape, group_id,
|
||||||
|
+ sizeof(QXLCursor));
|
||||||
|
if (!cursor) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@@ -236,6 +237,7 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext)
|
||||||
|
{
|
||||||
|
bool compat = ext->flags & QXL_COMMAND_FLAG_COMPAT;
|
||||||
|
void *data;
|
||||||
|
+ size_t datasz;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!qxl->cmdlog) {
|
||||||
|
@@ -249,15 +251,18 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext)
|
||||||
|
|
||||||
|
switch (ext->cmd.type) {
|
||||||
|
case QXL_CMD_DRAW:
|
||||||
|
+ datasz = compat ? sizeof(QXLCompatDrawable) : sizeof(QXLDrawable);
|
||||||
|
break;
|
||||||
|
case QXL_CMD_SURFACE:
|
||||||
|
+ datasz = sizeof(QXLSurfaceCmd);
|
||||||
|
break;
|
||||||
|
case QXL_CMD_CURSOR:
|
||||||
|
+ datasz = sizeof(QXLCursorCmd);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
- data = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||||
|
+ data = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id, datasz);
|
||||||
|
if (!data) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
diff --git a/hw/display/qxl-render.c b/hw/display/qxl-render.c
|
||||||
|
index ca217004bf..fcfd40c3ac 100644
|
||||||
|
--- a/hw/display/qxl-render.c
|
||||||
|
+++ b/hw/display/qxl-render.c
|
||||||
|
@@ -107,7 +107,9 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
|
||||||
|
qxl->guest_primary.resized = 0;
|
||||||
|
qxl->guest_primary.data = qxl_phys2virt(qxl,
|
||||||
|
qxl->guest_primary.surface.mem,
|
||||||
|
- MEMSLOT_GROUP_GUEST);
|
||||||
|
+ MEMSLOT_GROUP_GUEST,
|
||||||
|
+ qxl->guest_primary.abs_stride
|
||||||
|
+ * height);
|
||||||
|
if (!qxl->guest_primary.data) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
@@ -228,7 +230,8 @@ static void qxl_unpack_chunks(void *dest, size_t size, PCIQXLDevice *qxl,
|
||||||
|
if (offset == size) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
- chunk = qxl_phys2virt(qxl, chunk->next_chunk, group_id);
|
||||||
|
+ chunk = qxl_phys2virt(qxl, chunk->next_chunk, group_id,
|
||||||
|
+ sizeof(QXLDataChunk) + chunk->data_size);
|
||||||
|
if (!chunk) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -295,7 +298,8 @@ fail:
|
||||||
|
/* called from spice server thread context only */
|
||||||
|
int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
|
||||||
|
{
|
||||||
|
- QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||||
|
+ QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id,
|
||||||
|
+ sizeof(QXLCursorCmd));
|
||||||
|
QXLCursor *cursor;
|
||||||
|
QEMUCursor *c;
|
||||||
|
|
||||||
|
@@ -314,7 +318,15 @@ int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
|
||||||
|
}
|
||||||
|
switch (cmd->type) {
|
||||||
|
case QXL_CURSOR_SET:
|
||||||
|
- cursor = qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id);
|
||||||
|
+ /* First read the QXLCursor to get QXLDataChunk::data_size ... */
|
||||||
|
+ cursor = qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id,
|
||||||
|
+ sizeof(QXLCursor));
|
||||||
|
+ if (!cursor) {
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ /* Then read including the chunked data following QXLCursor. */
|
||||||
|
+ cursor = qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id,
|
||||||
|
+ sizeof(QXLCursor) + cursor->chunk.data_size);
|
||||||
|
if (!cursor) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
|
||||||
|
index 29c80b4289..aa9065183e 100644
|
||||||
|
--- a/hw/display/qxl.c
|
||||||
|
+++ b/hw/display/qxl.c
|
||||||
|
@@ -274,7 +274,8 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
|
||||||
|
QXL_IO_MONITORS_CONFIG_ASYNC));
|
||||||
|
}
|
||||||
|
|
||||||
|
- cfg = qxl_phys2virt(qxl, qxl->guest_monitors_config, MEMSLOT_GROUP_GUEST);
|
||||||
|
+ cfg = qxl_phys2virt(qxl, qxl->guest_monitors_config, MEMSLOT_GROUP_GUEST,
|
||||||
|
+ sizeof(QXLMonitorsConfig));
|
||||||
|
if (cfg != NULL && cfg->count == 1) {
|
||||||
|
qxl->guest_primary.resized = 1;
|
||||||
|
qxl->guest_head0_width = cfg->heads[0].width;
|
||||||
|
@@ -459,7 +460,8 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
|
||||||
|
switch (le32_to_cpu(ext->cmd.type)) {
|
||||||
|
case QXL_CMD_SURFACE:
|
||||||
|
{
|
||||||
|
- QXLSurfaceCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||||
|
+ QXLSurfaceCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id,
|
||||||
|
+ sizeof(QXLSurfaceCmd));
|
||||||
|
|
||||||
|
if (!cmd) {
|
||||||
|
return 1;
|
||||||
|
@@ -494,7 +496,8 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
|
||||||
|
}
|
||||||
|
case QXL_CMD_CURSOR:
|
||||||
|
{
|
||||||
|
- QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||||
|
+ QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id,
|
||||||
|
+ sizeof(QXLCursorCmd));
|
||||||
|
|
||||||
|
if (!cmd) {
|
||||||
|
return 1;
|
||||||
|
@@ -1444,7 +1447,8 @@ static bool qxl_get_check_slot_offset(PCIQXLDevice *qxl, QXLPHYSICAL pqxl,
|
||||||
|
}
|
||||||
|
|
||||||
|
/* can be also called from spice server thread context */
|
||||||
|
-void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id)
|
||||||
|
+void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id,
|
||||||
|
+ size_t size)
|
||||||
|
{
|
||||||
|
uint64_t offset;
|
||||||
|
uint32_t slot;
|
||||||
|
@@ -1952,7 +1956,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = qxl_phys2virt(qxl, qxl->guest_surfaces.cmds[i],
|
||||||
|
- MEMSLOT_GROUP_GUEST);
|
||||||
|
+ MEMSLOT_GROUP_GUEST, sizeof(QXLSurfaceCmd));
|
||||||
|
assert(cmd);
|
||||||
|
assert(cmd->type == QXL_SURFACE_CMD_CREATE);
|
||||||
|
qxl_dirty_one_surface(qxl, cmd->u.surface_create.data,
|
||||||
|
diff --git a/hw/display/qxl.h b/hw/display/qxl.h
|
||||||
|
index c938f88a2f..c784315daa 100644
|
||||||
|
--- a/hw/display/qxl.h
|
||||||
|
+++ b/hw/display/qxl.h
|
||||||
|
@@ -153,6 +153,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(PCIQXLDevice, PCI_QXL)
|
||||||
|
* @qxl: QXL device
|
||||||
|
* @phys: physical offset of buffer within the VRAM
|
||||||
|
* @group_id: memory slot group
|
||||||
|
+ * @size: size of the buffer
|
||||||
|
*
|
||||||
|
* Returns a host pointer to a buffer placed at offset @phys within the
|
||||||
|
* active slot @group_id of the PCI VGA RAM memory region associated with
|
||||||
|
@@ -166,7 +167,8 @@ OBJECT_DECLARE_SIMPLE_TYPE(PCIQXLDevice, PCI_QXL)
|
||||||
|
* the incoming ram_addr_t.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
-void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id);
|
||||||
|
+void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id,
|
||||||
|
+ size_t size);
|
||||||
|
void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...)
|
||||||
|
GCC_FMT_ATTR(2, 3);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -1,16 +1,15 @@
|
|||||||
From 1bd939d374ec2e994ff47c84e16fa3bc1323a0fd Mon Sep 17 00:00:00 2001
|
From f96220d64a31a4a52b2d132a503048579946f982 Mon Sep 17 00:00:00 2001
|
||||||
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||||
Date: Thu, 18 Aug 2022 17:01:13 +0200
|
Date: Thu, 18 Aug 2022 17:01:13 +0200
|
||||||
Subject: [PATCH 2/2] i386: do kvm_put_msr_feature_control() first thing when
|
Subject: [PATCH 3/3] i386: do kvm_put_msr_feature_control() first thing when
|
||||||
vCPU is reset
|
vCPU is reset
|
||||||
|
|
||||||
RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com>
|
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
|
||||||
RH-MergeRequest: 216: i386: fix 'system_reset' when the VM is in VMX root operation
|
RH-MergeRequest: 219: Synchronize qemu-6.2.0-20.el8.1 build from RHEL 8.7 to RHEL 8.8
|
||||||
RH-Bugzilla: 2116743
|
RH-Bugzilla: 2125271
|
||||||
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
RH-Commit: [2/2] 08e1e67db96801e4a35aa6b60a93b2c2f1641220
|
||||||
RH-Commit: [2/2] f838a57f74487eb394794de00006d5d2b9e84344
|
|
||||||
|
|
||||||
kvm_put_sregs2() fails to reset 'locked' CR4/CR0 bits upon vCPU reset when
|
kvm_put_sregs2() fails to reset 'locked' CR4/CR0 bits upon vCPU reset when
|
||||||
it is in VMX root operation. Do kvm_put_msr_feature_control() before
|
it is in VMX root operation. Do kvm_put_msr_feature_control() before
|
||||||
@ -64,5 +63,5 @@ index 81d729dc40..a06221d3e5 100644
|
|||||||
|
|
||||||
if (level == KVM_PUT_FULL_STATE) {
|
if (level == KVM_PUT_FULL_STATE) {
|
||||||
--
|
--
|
||||||
2.31.1
|
2.35.3
|
||||||
|
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
From 4ad00e318f8afbee0e455cfbb6bc693c808d87f3 Mon Sep 17 00:00:00 2001
|
From 46e54544c3480658111d6f111d6c265dcea2e19b Mon Sep 17 00:00:00 2001
|
||||||
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||||
Date: Thu, 18 Aug 2022 17:01:12 +0200
|
Date: Thu, 18 Aug 2022 17:01:12 +0200
|
||||||
Subject: [PATCH 1/2] i386: reset KVM nested state upon CPU reset
|
Subject: [PATCH 2/3] i386: reset KVM nested state upon CPU reset
|
||||||
|
|
||||||
RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com>
|
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
|
||||||
RH-MergeRequest: 216: i386: fix 'system_reset' when the VM is in VMX root operation
|
RH-MergeRequest: 219: Synchronize qemu-6.2.0-20.el8.1 build from RHEL 8.7 to RHEL 8.8
|
||||||
RH-Bugzilla: 2116743
|
RH-Bugzilla: 2125271
|
||||||
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
RH-Commit: [1/2] de4db7bceb6baaf69aec8b0ae9aa8887aa869e15
|
||||||
RH-Commit: [1/2] 20d2dabeda74b8cd5135228980a2414e66dc64f3
|
|
||||||
|
|
||||||
Make sure env->nested_state is cleaned up when a vCPU is reset, it may
|
Make sure env->nested_state is cleaned up when a vCPU is reset, it may
|
||||||
be stale after an incoming migration, kvm_arch_put_registers() may
|
be stale after an incoming migration, kvm_arch_put_registers() may
|
||||||
@ -91,5 +90,5 @@ index bd439e56ad..81d729dc40 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
--
|
--
|
||||||
2.31.1
|
2.35.3
|
||||||
|
|
||||||
|
43
SOURCES/kvm-include-elf.h-add-s390x-note-types.patch
Normal file
43
SOURCES/kvm-include-elf.h-add-s390x-note-types.patch
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
From 3fceb3b60a60c5008eecf99e45e269b757042b5a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 08:38:20 +0000
|
||||||
|
Subject: [PATCH 39/42] include/elf.h: add s390x note types
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [39/41] ebf0873744905abbe9cfc423a56c6d1b4f2ae936
|
||||||
|
|
||||||
|
Adding two s390x note types
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
Message-Id: <20221017083822.43118-9-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 5433669c7a1884cc0394c360148965edf7519884)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
include/elf.h | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/include/elf.h b/include/elf.h
|
||||||
|
index 811bf4a1cb..4edab8e5a2 100644
|
||||||
|
--- a/include/elf.h
|
||||||
|
+++ b/include/elf.h
|
||||||
|
@@ -1647,6 +1647,8 @@ typedef struct elf64_shdr {
|
||||||
|
#define NT_TASKSTRUCT 4
|
||||||
|
#define NT_AUXV 6
|
||||||
|
#define NT_PRXFPREG 0x46e62b7f /* copied from gdb5.1/include/elf/common.h */
|
||||||
|
+#define NT_S390_PV_CPU_DATA 0x30e /* s390 protvirt cpu dump data */
|
||||||
|
+#define NT_S390_RI_CB 0x30d /* s390 runtime instrumentation */
|
||||||
|
#define NT_S390_GS_CB 0x30b /* s390 guarded storage registers */
|
||||||
|
#define NT_S390_VXRS_HIGH 0x30a /* s390 vector registers 16-31 */
|
||||||
|
#define NT_S390_VXRS_LOW 0x309 /* s390 vector registers 0-15 (lower half) */
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,111 @@
|
|||||||
|
From 21b19213328826327eba18199b790425659af7d8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Thomas Huth <thuth@redhat.com>
|
||||||
|
Date: Fri, 29 Jul 2022 16:55:34 +0200
|
||||||
|
Subject: [PATCH 1/3] redhat: Update linux-headers/linux/kvm.h to v5.18-rc6
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <None>
|
||||||
|
RH-MergeRequest: 220: s390x: Fix skey test in kvm_unit_test
|
||||||
|
RH-Bugzilla: 2124757
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Commit: [1/2] e514a00305cb0caab9d3acc0efb325853daa6d51
|
||||||
|
|
||||||
|
Upstream Status: RHEL-only
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2124757
|
||||||
|
|
||||||
|
Based on upstream commit e4082063e47e9731dbeb1c26174c17f6038f577f
|
||||||
|
("linux-headers: Update to v5.18-rc6"), but this is focusing on
|
||||||
|
the file linux-headers/linux/kvm.h only (since the other changes
|
||||||
|
related to the VFIO renaming might break some stuff).
|
||||||
|
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit 71516db15469a02600932a5c1f0d4a9626a91193)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
linux-headers/linux/kvm.h | 27 +++++++++++++++++++++------
|
||||||
|
1 file changed, 21 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
|
||||||
|
index d232feaae9..0d05d02ee4 100644
|
||||||
|
--- a/linux-headers/linux/kvm.h
|
||||||
|
+++ b/linux-headers/linux/kvm.h
|
||||||
|
@@ -445,7 +445,11 @@ struct kvm_run {
|
||||||
|
#define KVM_SYSTEM_EVENT_RESET 2
|
||||||
|
#define KVM_SYSTEM_EVENT_CRASH 3
|
||||||
|
__u32 type;
|
||||||
|
- __u64 flags;
|
||||||
|
+ __u32 ndata;
|
||||||
|
+ union {
|
||||||
|
+ __u64 flags;
|
||||||
|
+ __u64 data[16];
|
||||||
|
+ };
|
||||||
|
} system_event;
|
||||||
|
/* KVM_EXIT_S390_STSI */
|
||||||
|
struct {
|
||||||
|
@@ -562,9 +566,12 @@ struct kvm_s390_mem_op {
|
||||||
|
__u32 op; /* type of operation */
|
||||||
|
__u64 buf; /* buffer in userspace */
|
||||||
|
union {
|
||||||
|
- __u8 ar; /* the access register number */
|
||||||
|
+ struct {
|
||||||
|
+ __u8 ar; /* the access register number */
|
||||||
|
+ __u8 key; /* access key, ignored if flag unset */
|
||||||
|
+ };
|
||||||
|
__u32 sida_offset; /* offset into the sida */
|
||||||
|
- __u8 reserved[32]; /* should be set to 0 */
|
||||||
|
+ __u8 reserved[32]; /* ignored */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/* types for kvm_s390_mem_op->op */
|
||||||
|
@@ -572,9 +579,12 @@ struct kvm_s390_mem_op {
|
||||||
|
#define KVM_S390_MEMOP_LOGICAL_WRITE 1
|
||||||
|
#define KVM_S390_MEMOP_SIDA_READ 2
|
||||||
|
#define KVM_S390_MEMOP_SIDA_WRITE 3
|
||||||
|
+#define KVM_S390_MEMOP_ABSOLUTE_READ 4
|
||||||
|
+#define KVM_S390_MEMOP_ABSOLUTE_WRITE 5
|
||||||
|
/* flags for kvm_s390_mem_op->flags */
|
||||||
|
#define KVM_S390_MEMOP_F_CHECK_ONLY (1ULL << 0)
|
||||||
|
#define KVM_S390_MEMOP_F_INJECT_EXCEPTION (1ULL << 1)
|
||||||
|
+#define KVM_S390_MEMOP_F_SKEY_PROTECTION (1ULL << 2)
|
||||||
|
|
||||||
|
/* for KVM_INTERRUPT */
|
||||||
|
struct kvm_interrupt {
|
||||||
|
@@ -1134,6 +1144,12 @@ struct kvm_ppc_resize_hpt {
|
||||||
|
#define KVM_CAP_VM_GPA_BITS 207
|
||||||
|
#define KVM_CAP_XSAVE2 208
|
||||||
|
#define KVM_CAP_SYS_ATTRIBUTES 209
|
||||||
|
+#define KVM_CAP_PPC_AIL_MODE_3 210
|
||||||
|
+#define KVM_CAP_S390_MEM_OP_EXTENSION 211
|
||||||
|
+#define KVM_CAP_PMU_CAPABILITY 212
|
||||||
|
+#define KVM_CAP_DISABLE_QUIRKS2 213
|
||||||
|
+/* #define KVM_CAP_VM_TSC_CONTROL 214 */
|
||||||
|
+#define KVM_CAP_SYSTEM_EVENT_DATA 215
|
||||||
|
|
||||||
|
#ifdef KVM_CAP_IRQ_ROUTING
|
||||||
|
|
||||||
|
@@ -1624,9 +1640,6 @@ struct kvm_enc_region {
|
||||||
|
#define KVM_S390_NORMAL_RESET _IO(KVMIO, 0xc3)
|
||||||
|
#define KVM_S390_CLEAR_RESET _IO(KVMIO, 0xc4)
|
||||||
|
|
||||||
|
-/* Available with KVM_CAP_XSAVE2 */
|
||||||
|
-#define KVM_GET_XSAVE2 _IOR(KVMIO, 0xcf, struct kvm_xsave)
|
||||||
|
-
|
||||||
|
struct kvm_s390_pv_sec_parm {
|
||||||
|
__u64 origin;
|
||||||
|
__u64 length;
|
||||||
|
@@ -1973,6 +1986,8 @@ struct kvm_dirty_gfn {
|
||||||
|
#define KVM_BUS_LOCK_DETECTION_OFF (1 << 0)
|
||||||
|
#define KVM_BUS_LOCK_DETECTION_EXIT (1 << 1)
|
||||||
|
|
||||||
|
+#define KVM_PMU_CAP_DISABLE (1 << 0)
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* struct kvm_stats_header - Header of per vm/vcpu binary statistics data.
|
||||||
|
* @flags: Some extra information for header, always 0 for now.
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
124
SOURCES/kvm-s390x-Add-KVM-PV-dump-interface.patch
Normal file
124
SOURCES/kvm-s390x-Add-KVM-PV-dump-interface.patch
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
From 95c229506a6e7261fce184488e880a94f9ba0789 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 08:38:21 +0000
|
||||||
|
Subject: [PATCH 40/42] s390x: Add KVM PV dump interface
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [40/41] 5df512a63b2ed17991489565b70f89f4efc0b639
|
||||||
|
|
||||||
|
Let's add a few bits of code which hide the new KVM PV dump API from
|
||||||
|
us via new functions.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
|
||||||
|
[ Marc-André: fix up for compilation issue ]
|
||||||
|
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20221017083822.43118-10-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 753ca06f4706cd6e57750a606afb08c5c5299643)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/pv.c | 51 +++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
include/hw/s390x/pv.h | 9 ++++++++
|
||||||
|
2 files changed, 60 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/pv.c b/hw/s390x/pv.c
|
||||||
|
index 4c012f2eeb..728ba24547 100644
|
||||||
|
--- a/hw/s390x/pv.c
|
||||||
|
+++ b/hw/s390x/pv.c
|
||||||
|
@@ -175,6 +175,57 @@ bool kvm_s390_pv_info_basic_valid(void)
|
||||||
|
return info_valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int s390_pv_dump_cmd(uint64_t subcmd, uint64_t uaddr, uint64_t gaddr,
|
||||||
|
+ uint64_t len)
|
||||||
|
+{
|
||||||
|
+ struct kvm_s390_pv_dmp dmp = {
|
||||||
|
+ .subcmd = subcmd,
|
||||||
|
+ .buff_addr = uaddr,
|
||||||
|
+ .buff_len = len,
|
||||||
|
+ .gaddr = gaddr,
|
||||||
|
+ };
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = s390_pv_cmd(KVM_PV_DUMP, (void *)&dmp);
|
||||||
|
+ if (ret) {
|
||||||
|
+ error_report("KVM DUMP command %ld failed", subcmd);
|
||||||
|
+ }
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int kvm_s390_dump_cpu(S390CPU *cpu, void *buff)
|
||||||
|
+{
|
||||||
|
+ struct kvm_s390_pv_dmp dmp = {
|
||||||
|
+ .subcmd = KVM_PV_DUMP_CPU,
|
||||||
|
+ .buff_addr = (uint64_t)buff,
|
||||||
|
+ .gaddr = 0,
|
||||||
|
+ .buff_len = info_dump.dump_cpu_buffer_len,
|
||||||
|
+ };
|
||||||
|
+ struct kvm_pv_cmd pv = {
|
||||||
|
+ .cmd = KVM_PV_DUMP,
|
||||||
|
+ .data = (uint64_t)&dmp,
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ return kvm_vcpu_ioctl(CPU(cpu), KVM_S390_PV_CPU_COMMAND, &pv);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int kvm_s390_dump_init(void)
|
||||||
|
+{
|
||||||
|
+ return s390_pv_dump_cmd(KVM_PV_DUMP_INIT, 0, 0, 0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int kvm_s390_dump_mem_state(uint64_t gaddr, size_t len, void *dest)
|
||||||
|
+{
|
||||||
|
+ return s390_pv_dump_cmd(KVM_PV_DUMP_CONFIG_STOR_STATE, (uint64_t)dest,
|
||||||
|
+ gaddr, len);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int kvm_s390_dump_completion_data(void *buff)
|
||||||
|
+{
|
||||||
|
+ return s390_pv_dump_cmd(KVM_PV_DUMP_COMPLETE, (uint64_t)buff, 0,
|
||||||
|
+ info_dump.dump_config_finalize_len);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#define TYPE_S390_PV_GUEST "s390-pv-guest"
|
||||||
|
OBJECT_DECLARE_SIMPLE_TYPE(S390PVGuest, S390_PV_GUEST)
|
||||||
|
|
||||||
|
diff --git a/include/hw/s390x/pv.h b/include/hw/s390x/pv.h
|
||||||
|
index e5ea0eca16..9360aa1091 100644
|
||||||
|
--- a/include/hw/s390x/pv.h
|
||||||
|
+++ b/include/hw/s390x/pv.h
|
||||||
|
@@ -51,6 +51,10 @@ uint64_t kvm_s390_pv_dmp_get_size_cpu(void);
|
||||||
|
uint64_t kvm_s390_pv_dmp_get_size_mem_state(void);
|
||||||
|
uint64_t kvm_s390_pv_dmp_get_size_completion_data(void);
|
||||||
|
bool kvm_s390_pv_info_basic_valid(void);
|
||||||
|
+int kvm_s390_dump_init(void);
|
||||||
|
+int kvm_s390_dump_cpu(S390CPU *cpu, void *buff);
|
||||||
|
+int kvm_s390_dump_mem_state(uint64_t addr, size_t len, void *dest);
|
||||||
|
+int kvm_s390_dump_completion_data(void *buff);
|
||||||
|
#else /* CONFIG_KVM */
|
||||||
|
static inline bool s390_is_pv(void) { return false; }
|
||||||
|
static inline int s390_pv_query_info(void) { return 0; }
|
||||||
|
@@ -66,6 +70,11 @@ static inline uint64_t kvm_s390_pv_dmp_get_size_cpu(void) { return 0; }
|
||||||
|
static inline uint64_t kvm_s390_pv_dmp_get_size_mem_state(void) { return 0; }
|
||||||
|
static inline uint64_t kvm_s390_pv_dmp_get_size_completion_data(void) { return 0; }
|
||||||
|
static inline bool kvm_s390_pv_info_basic_valid(void) { return false; }
|
||||||
|
+static inline int kvm_s390_dump_init(void) { return 0; }
|
||||||
|
+static inline int kvm_s390_dump_cpu(S390CPU *cpu, void *buff) { return 0; }
|
||||||
|
+static inline int kvm_s390_dump_mem_state(uint64_t addr, size_t len,
|
||||||
|
+ void *dest) { return 0; }
|
||||||
|
+static inline int kvm_s390_dump_completion_data(void *buff) { return 0; }
|
||||||
|
#endif /* CONFIG_KVM */
|
||||||
|
|
||||||
|
int s390_pv_kvm_init(ConfidentialGuestSupport *cgs, Error **errp);
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
113
SOURCES/kvm-s390x-Add-protected-dump-cap.patch
Normal file
113
SOURCES/kvm-s390x-Add-protected-dump-cap.patch
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
From 7634eed5aea61dc94f9a828c62ef3da9aeaa62ae Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 08:38:18 +0000
|
||||||
|
Subject: [PATCH 37/42] s390x: Add protected dump cap
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [37/41] 52e1e7bf1a00ce3a220d3db2f733a65548bfec6d
|
||||||
|
|
||||||
|
Add a protected dump capability for later feature checking.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
|
||||||
|
Reviewed-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Message-Id: <20221017083822.43118-7-frankja@linux.ibm.com>
|
||||||
|
[ Marc-André - Add missing stubs when !kvm ]
|
||||||
|
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
(cherry picked from commit ad3b2e693daac6ed92db7361236028851d37c77c)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
target/s390x/kvm/kvm.c | 7 +++++++
|
||||||
|
target/s390x/kvm/kvm_s390x.h | 1 +
|
||||||
|
target/s390x/kvm/meson.build | 2 ++
|
||||||
|
target/s390x/kvm/stubs.c | 12 ++++++++++++
|
||||||
|
4 files changed, 22 insertions(+)
|
||||||
|
create mode 100644 target/s390x/kvm/stubs.c
|
||||||
|
|
||||||
|
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
|
||||||
|
index 30712487d4..d36b44f32a 100644
|
||||||
|
--- a/target/s390x/kvm/kvm.c
|
||||||
|
+++ b/target/s390x/kvm/kvm.c
|
||||||
|
@@ -159,6 +159,7 @@ static int cap_hpage_1m;
|
||||||
|
static int cap_vcpu_resets;
|
||||||
|
static int cap_protected;
|
||||||
|
static int cap_zpci_op;
|
||||||
|
+static int cap_protected_dump;
|
||||||
|
|
||||||
|
static bool mem_op_storage_key_support;
|
||||||
|
|
||||||
|
@@ -365,6 +366,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||||
|
cap_vcpu_resets = kvm_check_extension(s, KVM_CAP_S390_VCPU_RESETS);
|
||||||
|
cap_protected = kvm_check_extension(s, KVM_CAP_S390_PROTECTED);
|
||||||
|
cap_zpci_op = kvm_check_extension(s, KVM_CAP_S390_ZPCI_OP);
|
||||||
|
+ cap_protected_dump = kvm_check_extension(s, KVM_CAP_S390_PROTECTED_DUMP);
|
||||||
|
|
||||||
|
kvm_vm_enable_cap(s, KVM_CAP_S390_USER_SIGP, 0);
|
||||||
|
kvm_vm_enable_cap(s, KVM_CAP_S390_VECTOR_REGISTERS, 0);
|
||||||
|
@@ -2042,6 +2044,11 @@ int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
|
||||||
|
return kvm_vm_ioctl(kvm_state, KVM_IOEVENTFD, &kick);
|
||||||
|
}
|
||||||
|
|
||||||
|
+int kvm_s390_get_protected_dump(void)
|
||||||
|
+{
|
||||||
|
+ return cap_protected_dump;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int kvm_s390_get_ri(void)
|
||||||
|
{
|
||||||
|
return cap_ri;
|
||||||
|
diff --git a/target/s390x/kvm/kvm_s390x.h b/target/s390x/kvm/kvm_s390x.h
|
||||||
|
index aaae8570de..f9785564d0 100644
|
||||||
|
--- a/target/s390x/kvm/kvm_s390x.h
|
||||||
|
+++ b/target/s390x/kvm/kvm_s390x.h
|
||||||
|
@@ -26,6 +26,7 @@ int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state);
|
||||||
|
void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu);
|
||||||
|
int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu);
|
||||||
|
int kvm_s390_get_hpage_1m(void);
|
||||||
|
+int kvm_s390_get_protected_dump(void);
|
||||||
|
int kvm_s390_get_ri(void);
|
||||||
|
int kvm_s390_get_zpci_op(void);
|
||||||
|
int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
|
||||||
|
diff --git a/target/s390x/kvm/meson.build b/target/s390x/kvm/meson.build
|
||||||
|
index d1356356b1..aef52b6686 100644
|
||||||
|
--- a/target/s390x/kvm/meson.build
|
||||||
|
+++ b/target/s390x/kvm/meson.build
|
||||||
|
@@ -1,6 +1,8 @@
|
||||||
|
|
||||||
|
s390x_ss.add(when: 'CONFIG_KVM', if_true: files(
|
||||||
|
'kvm.c'
|
||||||
|
+), if_false: files(
|
||||||
|
+ 'stubs.c'
|
||||||
|
))
|
||||||
|
|
||||||
|
# Newer kernels on s390 check for an S390_PGSTE program header and
|
||||||
|
diff --git a/target/s390x/kvm/stubs.c b/target/s390x/kvm/stubs.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..5fd63b9a7e
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/target/s390x/kvm/stubs.c
|
||||||
|
@@ -0,0 +1,12 @@
|
||||||
|
+/*
|
||||||
|
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include "qemu/osdep.h"
|
||||||
|
+
|
||||||
|
+#include "kvm_s390x.h"
|
||||||
|
+
|
||||||
|
+int kvm_s390_get_protected_dump(void)
|
||||||
|
+{
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
174
SOURCES/kvm-s390x-Introduce-PV-query-interface.patch
Normal file
174
SOURCES/kvm-s390x-Introduce-PV-query-interface.patch
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
From 760236b3633a8f532631256a899cab969e772196 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 08:38:19 +0000
|
||||||
|
Subject: [PATCH 38/42] s390x: Introduce PV query interface
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [38/41] 3090615d81ec6b9e4c306f7fc3709e1935ff5a79
|
||||||
|
|
||||||
|
Introduce an interface over which we can get information about UV data.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
|
||||||
|
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
Message-Id: <20221017083822.43118-8-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 03d83ecfae46bf5e0074cb5808043b30df34064b)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/pv.c | 61 ++++++++++++++++++++++++++++++++++++++
|
||||||
|
hw/s390x/s390-virtio-ccw.c | 6 ++++
|
||||||
|
include/hw/s390x/pv.h | 10 +++++++
|
||||||
|
3 files changed, 77 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/pv.c b/hw/s390x/pv.c
|
||||||
|
index 401b63d6cb..4c012f2eeb 100644
|
||||||
|
--- a/hw/s390x/pv.c
|
||||||
|
+++ b/hw/s390x/pv.c
|
||||||
|
@@ -20,6 +20,11 @@
|
||||||
|
#include "exec/confidential-guest-support.h"
|
||||||
|
#include "hw/s390x/ipl.h"
|
||||||
|
#include "hw/s390x/pv.h"
|
||||||
|
+#include "target/s390x/kvm/kvm_s390x.h"
|
||||||
|
+
|
||||||
|
+static bool info_valid;
|
||||||
|
+static struct kvm_s390_pv_info_vm info_vm;
|
||||||
|
+static struct kvm_s390_pv_info_dump info_dump;
|
||||||
|
|
||||||
|
static int __s390_pv_cmd(uint32_t cmd, const char *cmdname, void *data)
|
||||||
|
{
|
||||||
|
@@ -56,6 +61,42 @@ static int __s390_pv_cmd(uint32_t cmd, const char *cmdname, void *data)
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
+int s390_pv_query_info(void)
|
||||||
|
+{
|
||||||
|
+ struct kvm_s390_pv_info info = {
|
||||||
|
+ .header.id = KVM_PV_INFO_VM,
|
||||||
|
+ .header.len_max = sizeof(info.header) + sizeof(info.vm),
|
||||||
|
+ };
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ /* Info API's first user is dump so they are bundled */
|
||||||
|
+ if (!kvm_s390_get_protected_dump()) {
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ rc = s390_pv_cmd(KVM_PV_INFO, &info);
|
||||||
|
+ if (rc) {
|
||||||
|
+ error_report("KVM PV INFO cmd %x failed: %s",
|
||||||
|
+ info.header.id, strerror(-rc));
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+ memcpy(&info_vm, &info.vm, sizeof(info.vm));
|
||||||
|
+
|
||||||
|
+ info.header.id = KVM_PV_INFO_DUMP;
|
||||||
|
+ info.header.len_max = sizeof(info.header) + sizeof(info.dump);
|
||||||
|
+ rc = s390_pv_cmd(KVM_PV_INFO, &info);
|
||||||
|
+ if (rc) {
|
||||||
|
+ error_report("KVM PV INFO cmd %x failed: %s",
|
||||||
|
+ info.header.id, strerror(-rc));
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ memcpy(&info_dump, &info.dump, sizeof(info.dump));
|
||||||
|
+ info_valid = true;
|
||||||
|
+
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int s390_pv_vm_enable(void)
|
||||||
|
{
|
||||||
|
return s390_pv_cmd(KVM_PV_ENABLE, NULL);
|
||||||
|
@@ -114,6 +155,26 @@ void s390_pv_inject_reset_error(CPUState *cs)
|
||||||
|
env->regs[r1 + 1] = DIAG_308_RC_INVAL_FOR_PV;
|
||||||
|
}
|
||||||
|
|
||||||
|
+uint64_t kvm_s390_pv_dmp_get_size_cpu(void)
|
||||||
|
+{
|
||||||
|
+ return info_dump.dump_cpu_buffer_len;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+uint64_t kvm_s390_pv_dmp_get_size_completion_data(void)
|
||||||
|
+{
|
||||||
|
+ return info_dump.dump_config_finalize_len;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+uint64_t kvm_s390_pv_dmp_get_size_mem_state(void)
|
||||||
|
+{
|
||||||
|
+ return info_dump.dump_config_mem_buffer_per_1m;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool kvm_s390_pv_info_basic_valid(void)
|
||||||
|
+{
|
||||||
|
+ return info_valid;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#define TYPE_S390_PV_GUEST "s390-pv-guest"
|
||||||
|
OBJECT_DECLARE_SIMPLE_TYPE(S390PVGuest, S390_PV_GUEST)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||||
|
index bd80e72cf8..a9617ab79f 100644
|
||||||
|
--- a/hw/s390x/s390-virtio-ccw.c
|
||||||
|
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||||
|
@@ -365,6 +365,12 @@ static int s390_machine_protect(S390CcwMachineState *ms)
|
||||||
|
|
||||||
|
ms->pv = true;
|
||||||
|
|
||||||
|
+ /* Will return 0 if API is not available since it's not vital */
|
||||||
|
+ rc = s390_pv_query_info();
|
||||||
|
+ if (rc) {
|
||||||
|
+ goto out_err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Set SE header and unpack */
|
||||||
|
rc = s390_ipl_prepare_pv_header();
|
||||||
|
if (rc) {
|
||||||
|
diff --git a/include/hw/s390x/pv.h b/include/hw/s390x/pv.h
|
||||||
|
index 1f1f545bfc..e5ea0eca16 100644
|
||||||
|
--- a/include/hw/s390x/pv.h
|
||||||
|
+++ b/include/hw/s390x/pv.h
|
||||||
|
@@ -38,6 +38,7 @@ static inline bool s390_is_pv(void)
|
||||||
|
return ccw->pv;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int s390_pv_query_info(void);
|
||||||
|
int s390_pv_vm_enable(void);
|
||||||
|
void s390_pv_vm_disable(void);
|
||||||
|
int s390_pv_set_sec_parms(uint64_t origin, uint64_t length);
|
||||||
|
@@ -46,8 +47,13 @@ void s390_pv_prep_reset(void);
|
||||||
|
int s390_pv_verify(void);
|
||||||
|
void s390_pv_unshare(void);
|
||||||
|
void s390_pv_inject_reset_error(CPUState *cs);
|
||||||
|
+uint64_t kvm_s390_pv_dmp_get_size_cpu(void);
|
||||||
|
+uint64_t kvm_s390_pv_dmp_get_size_mem_state(void);
|
||||||
|
+uint64_t kvm_s390_pv_dmp_get_size_completion_data(void);
|
||||||
|
+bool kvm_s390_pv_info_basic_valid(void);
|
||||||
|
#else /* CONFIG_KVM */
|
||||||
|
static inline bool s390_is_pv(void) { return false; }
|
||||||
|
+static inline int s390_pv_query_info(void) { return 0; }
|
||||||
|
static inline int s390_pv_vm_enable(void) { return 0; }
|
||||||
|
static inline void s390_pv_vm_disable(void) {}
|
||||||
|
static inline int s390_pv_set_sec_parms(uint64_t origin, uint64_t length) { return 0; }
|
||||||
|
@@ -56,6 +62,10 @@ static inline void s390_pv_prep_reset(void) {}
|
||||||
|
static inline int s390_pv_verify(void) { return 0; }
|
||||||
|
static inline void s390_pv_unshare(void) {}
|
||||||
|
static inline void s390_pv_inject_reset_error(CPUState *cs) {};
|
||||||
|
+static inline uint64_t kvm_s390_pv_dmp_get_size_cpu(void) { return 0; }
|
||||||
|
+static inline uint64_t kvm_s390_pv_dmp_get_size_mem_state(void) { return 0; }
|
||||||
|
+static inline uint64_t kvm_s390_pv_dmp_get_size_completion_data(void) { return 0; }
|
||||||
|
+static inline bool kvm_s390_pv_info_basic_valid(void) { return false; }
|
||||||
|
#endif /* CONFIG_KVM */
|
||||||
|
|
||||||
|
int s390_pv_kvm_init(ConfidentialGuestSupport *cgs, Error **errp);
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,209 @@
|
|||||||
|
From 429c4cc750affe82b89867668ff2515a8a66732e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Thomas Huth <thuth@redhat.com>
|
||||||
|
Date: Fri, 18 Nov 2022 15:23:19 +0100
|
||||||
|
Subject: [PATCH 2/3] s390x: Register TYPE_S390_CCW_MACHINE properties as class
|
||||||
|
properties
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-MergeRequest: 233: s390x: Document the "loadparm" machine property
|
||||||
|
RH-Bugzilla: 2128225
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [2/2] 28a0086cb0e8be2535deafdd9115cadd7ff033f3
|
||||||
|
|
||||||
|
Currently, when running 'qemu-system-s390x -M s390-ccw-virtio,help'
|
||||||
|
the s390x-specific properties are not listed anymore. This happens
|
||||||
|
because since commit d8fb7d0969 ("vl: switch -M parsing to keyval")
|
||||||
|
the properties have to be defined at the class level and not at the
|
||||||
|
instance level anymore. Fix it on s390x now, too, by moving the
|
||||||
|
registration of the properties to the class level"
|
||||||
|
|
||||||
|
Fixes: d8fb7d0969 ("vl: switch -M parsing to keyval")
|
||||||
|
Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
|
||||||
|
Message-Id: <20221103170150.20789-2-pmorel@linux.ibm.com>
|
||||||
|
[thuth: Add patch description]
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit 1fd396e32288bbf536483c74b68cb3ee86005a9f)
|
||||||
|
|
||||||
|
Conflicts:
|
||||||
|
hw/s390x/s390-virtio-ccw.c
|
||||||
|
(dropped the "zpcii-disable" property code - it's not used in downstream)
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-virtio-ccw.c | 117 +++++++++++++++++++++----------------
|
||||||
|
1 file changed, 67 insertions(+), 50 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||||
|
index a9617ab79f..4a7cd21cac 100644
|
||||||
|
--- a/hw/s390x/s390-virtio-ccw.c
|
||||||
|
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||||
|
@@ -42,6 +42,7 @@
|
||||||
|
#include "sysemu/sysemu.h"
|
||||||
|
#include "hw/s390x/pv.h"
|
||||||
|
#include "migration/blocker.h"
|
||||||
|
+#include "qapi/visitor.h"
|
||||||
|
|
||||||
|
static Error *pv_mig_blocker;
|
||||||
|
|
||||||
|
@@ -588,38 +589,6 @@ static ram_addr_t s390_fixup_ram_size(ram_addr_t sz)
|
||||||
|
return newsz;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void ccw_machine_class_init(ObjectClass *oc, void *data)
|
||||||
|
-{
|
||||||
|
- MachineClass *mc = MACHINE_CLASS(oc);
|
||||||
|
- NMIClass *nc = NMI_CLASS(oc);
|
||||||
|
- HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
|
||||||
|
- S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
|
||||||
|
-
|
||||||
|
- s390mc->ri_allowed = true;
|
||||||
|
- s390mc->cpu_model_allowed = true;
|
||||||
|
- s390mc->css_migration_enabled = true;
|
||||||
|
- s390mc->hpage_1m_allowed = true;
|
||||||
|
- mc->init = ccw_init;
|
||||||
|
- mc->reset = s390_machine_reset;
|
||||||
|
- mc->block_default_type = IF_VIRTIO;
|
||||||
|
- mc->no_cdrom = 1;
|
||||||
|
- mc->no_floppy = 1;
|
||||||
|
- mc->no_parallel = 1;
|
||||||
|
- mc->no_sdcard = 1;
|
||||||
|
- mc->max_cpus = S390_MAX_CPUS;
|
||||||
|
- mc->has_hotpluggable_cpus = true;
|
||||||
|
- assert(!mc->get_hotplug_handler);
|
||||||
|
- mc->get_hotplug_handler = s390_get_hotplug_handler;
|
||||||
|
- mc->cpu_index_to_instance_props = s390_cpu_index_to_props;
|
||||||
|
- mc->possible_cpu_arch_ids = s390_possible_cpu_arch_ids;
|
||||||
|
- /* it is overridden with 'host' cpu *in kvm_arch_init* */
|
||||||
|
- mc->default_cpu_type = S390_CPU_TYPE_NAME("qemu");
|
||||||
|
- hc->plug = s390_machine_device_plug;
|
||||||
|
- hc->unplug_request = s390_machine_device_unplug_request;
|
||||||
|
- nc->nmi_monitor_handler = s390_nmi;
|
||||||
|
- mc->default_ram_id = "s390.ram";
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp)
|
||||||
|
{
|
||||||
|
S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
|
||||||
|
@@ -694,19 +663,29 @@ bool hpage_1m_allowed(void)
|
||||||
|
return get_machine_class()->hpage_1m_allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static char *machine_get_loadparm(Object *obj, Error **errp)
|
||||||
|
+static void machine_get_loadparm(Object *obj, Visitor *v,
|
||||||
|
+ const char *name, void *opaque,
|
||||||
|
+ Error **errp)
|
||||||
|
{
|
||||||
|
S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
|
||||||
|
+ char *str = g_strndup((char *) ms->loadparm, sizeof(ms->loadparm));
|
||||||
|
|
||||||
|
- /* make a NUL-terminated string */
|
||||||
|
- return g_strndup((char *) ms->loadparm, sizeof(ms->loadparm));
|
||||||
|
+ visit_type_str(v, name, &str, errp);
|
||||||
|
+ g_free(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void machine_set_loadparm(Object *obj, const char *val, Error **errp)
|
||||||
|
+static void machine_set_loadparm(Object *obj, Visitor *v,
|
||||||
|
+ const char *name, void *opaque,
|
||||||
|
+ Error **errp)
|
||||||
|
{
|
||||||
|
S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
|
||||||
|
+ char *val;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
+ if (!visit_type_str(v, name, &val, errp)) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
for (i = 0; i < sizeof(ms->loadparm) && val[i]; i++) {
|
||||||
|
uint8_t c = qemu_toupper(val[i]); /* mimic HMC */
|
||||||
|
|
||||||
|
@@ -724,29 +703,67 @@ static void machine_set_loadparm(Object *obj, const char *val, Error **errp)
|
||||||
|
ms->loadparm[i] = ' '; /* pad right with spaces */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-static inline void s390_machine_initfn(Object *obj)
|
||||||
|
+
|
||||||
|
+static void ccw_machine_class_init(ObjectClass *oc, void *data)
|
||||||
|
{
|
||||||
|
- object_property_add_bool(obj, "aes-key-wrap",
|
||||||
|
- machine_get_aes_key_wrap,
|
||||||
|
- machine_set_aes_key_wrap);
|
||||||
|
- object_property_set_description(obj, "aes-key-wrap",
|
||||||
|
+ MachineClass *mc = MACHINE_CLASS(oc);
|
||||||
|
+ NMIClass *nc = NMI_CLASS(oc);
|
||||||
|
+ HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
|
||||||
|
+ S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
|
||||||
|
+
|
||||||
|
+ s390mc->ri_allowed = true;
|
||||||
|
+ s390mc->cpu_model_allowed = true;
|
||||||
|
+ s390mc->css_migration_enabled = true;
|
||||||
|
+ s390mc->hpage_1m_allowed = true;
|
||||||
|
+ mc->init = ccw_init;
|
||||||
|
+ mc->reset = s390_machine_reset;
|
||||||
|
+ mc->block_default_type = IF_VIRTIO;
|
||||||
|
+ mc->no_cdrom = 1;
|
||||||
|
+ mc->no_floppy = 1;
|
||||||
|
+ mc->no_parallel = 1;
|
||||||
|
+ mc->no_sdcard = 1;
|
||||||
|
+ mc->max_cpus = S390_MAX_CPUS;
|
||||||
|
+ mc->has_hotpluggable_cpus = true;
|
||||||
|
+ assert(!mc->get_hotplug_handler);
|
||||||
|
+ mc->get_hotplug_handler = s390_get_hotplug_handler;
|
||||||
|
+ mc->cpu_index_to_instance_props = s390_cpu_index_to_props;
|
||||||
|
+ mc->possible_cpu_arch_ids = s390_possible_cpu_arch_ids;
|
||||||
|
+ /* it is overridden with 'host' cpu *in kvm_arch_init* */
|
||||||
|
+ mc->default_cpu_type = S390_CPU_TYPE_NAME("qemu");
|
||||||
|
+ hc->plug = s390_machine_device_plug;
|
||||||
|
+ hc->unplug_request = s390_machine_device_unplug_request;
|
||||||
|
+ nc->nmi_monitor_handler = s390_nmi;
|
||||||
|
+ mc->default_ram_id = "s390.ram";
|
||||||
|
+
|
||||||
|
+ object_class_property_add_bool(oc, "aes-key-wrap",
|
||||||
|
+ machine_get_aes_key_wrap,
|
||||||
|
+ machine_set_aes_key_wrap);
|
||||||
|
+ object_class_property_set_description(oc, "aes-key-wrap",
|
||||||
|
"enable/disable AES key wrapping using the CPACF wrapping key");
|
||||||
|
- object_property_set_bool(obj, "aes-key-wrap", true, NULL);
|
||||||
|
|
||||||
|
- object_property_add_bool(obj, "dea-key-wrap",
|
||||||
|
- machine_get_dea_key_wrap,
|
||||||
|
- machine_set_dea_key_wrap);
|
||||||
|
- object_property_set_description(obj, "dea-key-wrap",
|
||||||
|
+ object_class_property_add_bool(oc, "dea-key-wrap",
|
||||||
|
+ machine_get_dea_key_wrap,
|
||||||
|
+ machine_set_dea_key_wrap);
|
||||||
|
+ object_class_property_set_description(oc, "dea-key-wrap",
|
||||||
|
"enable/disable DEA key wrapping using the CPACF wrapping key");
|
||||||
|
- object_property_set_bool(obj, "dea-key-wrap", true, NULL);
|
||||||
|
- object_property_add_str(obj, "loadparm",
|
||||||
|
- machine_get_loadparm, machine_set_loadparm);
|
||||||
|
- object_property_set_description(obj, "loadparm",
|
||||||
|
+
|
||||||
|
+ object_class_property_add(oc, "loadparm", "loadparm",
|
||||||
|
+ machine_get_loadparm, machine_set_loadparm,
|
||||||
|
+ NULL, NULL);
|
||||||
|
+ object_class_property_set_description(oc, "loadparm",
|
||||||
|
"Up to 8 chars in set of [A-Za-z0-9. ] (lower case chars converted"
|
||||||
|
" to upper case) to pass to machine loader, boot manager,"
|
||||||
|
" and guest kernel");
|
||||||
|
}
|
||||||
|
|
||||||
|
+static inline void s390_machine_initfn(Object *obj)
|
||||||
|
+{
|
||||||
|
+ S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
|
||||||
|
+
|
||||||
|
+ ms->aes_key_wrap = true;
|
||||||
|
+ ms->dea_key_wrap = true;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static const TypeInfo ccw_machine_info = {
|
||||||
|
.name = TYPE_S390_CCW_MACHINE,
|
||||||
|
.parent = TYPE_MACHINE,
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,178 @@
|
|||||||
|
From 8020177f1c40da2a9ca09fa20dc90eda65739671 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 2 Sep 2022 13:27:31 -0400
|
||||||
|
Subject: [PATCH 06/42] s390x/pci: add routine to get host function handle from
|
||||||
|
CLP info
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [6/41] 8ab652cf4095e61f5f55726d41111de227d452e7
|
||||||
|
|
||||||
|
In order to interface with the underlying host zPCI device, we need
|
||||||
|
to know its function handle. Add a routine to grab this from the
|
||||||
|
vfio CLP capabilities chain.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
|
||||||
|
Message-Id: <20220902172737.170349-3-mjrosato@linux.ibm.com>
|
||||||
|
[thuth: Replace free(info) with g_free(info)]
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit 21fa15298d88db2050a713cdf79c10cb0e09146f)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-pci-vfio.c | 83 ++++++++++++++++++++++++++------
|
||||||
|
include/hw/s390x/s390-pci-vfio.h | 5 ++
|
||||||
|
2 files changed, 72 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-vfio.c b/hw/s390x/s390-pci-vfio.c
|
||||||
|
index 6f80a47e29..08bcc55e85 100644
|
||||||
|
--- a/hw/s390x/s390-pci-vfio.c
|
||||||
|
+++ b/hw/s390x/s390-pci-vfio.c
|
||||||
|
@@ -124,6 +124,27 @@ static void s390_pci_read_base(S390PCIBusDevice *pbdev,
|
||||||
|
pbdev->zpci_fn.pft = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static bool get_host_fh(S390PCIBusDevice *pbdev, struct vfio_device_info *info,
|
||||||
|
+ uint32_t *fh)
|
||||||
|
+{
|
||||||
|
+ struct vfio_info_cap_header *hdr;
|
||||||
|
+ struct vfio_device_info_cap_zpci_base *cap;
|
||||||
|
+ VFIOPCIDevice *vpci = container_of(pbdev->pdev, VFIOPCIDevice, pdev);
|
||||||
|
+
|
||||||
|
+ hdr = vfio_get_device_info_cap(info, VFIO_DEVICE_INFO_CAP_ZPCI_BASE);
|
||||||
|
+
|
||||||
|
+ /* Can only get the host fh with version 2 or greater */
|
||||||
|
+ if (hdr == NULL || hdr->version < 2) {
|
||||||
|
+ trace_s390_pci_clp_cap(vpci->vbasedev.name,
|
||||||
|
+ VFIO_DEVICE_INFO_CAP_ZPCI_BASE);
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ cap = (void *) hdr;
|
||||||
|
+
|
||||||
|
+ *fh = cap->fh;
|
||||||
|
+ return true;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void s390_pci_read_group(S390PCIBusDevice *pbdev,
|
||||||
|
struct vfio_device_info *info)
|
||||||
|
{
|
||||||
|
@@ -217,25 +238,13 @@ static void s390_pci_read_pfip(S390PCIBusDevice *pbdev,
|
||||||
|
memcpy(pbdev->zpci_fn.pfip, cap->pfip, CLP_PFIP_NR_SEGMENTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/*
|
||||||
|
- * This function will issue the VFIO_DEVICE_GET_INFO ioctl and look for
|
||||||
|
- * capabilities that contain information about CLP features provided by the
|
||||||
|
- * underlying host.
|
||||||
|
- * On entry, defaults have already been placed into the guest CLP response
|
||||||
|
- * buffers. On exit, defaults will have been overwritten for any CLP features
|
||||||
|
- * found in the capability chain; defaults will remain for any CLP features not
|
||||||
|
- * found in the chain.
|
||||||
|
- */
|
||||||
|
-void s390_pci_get_clp_info(S390PCIBusDevice *pbdev)
|
||||||
|
+static struct vfio_device_info *get_device_info(S390PCIBusDevice *pbdev,
|
||||||
|
+ uint32_t argsz)
|
||||||
|
{
|
||||||
|
- g_autofree struct vfio_device_info *info = NULL;
|
||||||
|
+ struct vfio_device_info *info = g_malloc0(argsz);
|
||||||
|
VFIOPCIDevice *vfio_pci;
|
||||||
|
- uint32_t argsz;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
- argsz = sizeof(*info);
|
||||||
|
- info = g_malloc0(argsz);
|
||||||
|
-
|
||||||
|
vfio_pci = container_of(pbdev->pdev, VFIOPCIDevice, pdev);
|
||||||
|
fd = vfio_pci->vbasedev.fd;
|
||||||
|
|
||||||
|
@@ -250,7 +259,8 @@ retry:
|
||||||
|
|
||||||
|
if (ioctl(fd, VFIO_DEVICE_GET_INFO, info)) {
|
||||||
|
trace_s390_pci_clp_dev_info(vfio_pci->vbasedev.name);
|
||||||
|
- return;
|
||||||
|
+ g_free(info);
|
||||||
|
+ return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->argsz > argsz) {
|
||||||
|
@@ -259,6 +269,47 @@ retry:
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ return info;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Get the host function handle from the vfio CLP capabilities chain. Returns
|
||||||
|
+ * true if a fh value was placed into the provided buffer. Returns false
|
||||||
|
+ * if a fh could not be obtained (ioctl failed or capabilitiy version does
|
||||||
|
+ * not include the fh)
|
||||||
|
+ */
|
||||||
|
+bool s390_pci_get_host_fh(S390PCIBusDevice *pbdev, uint32_t *fh)
|
||||||
|
+{
|
||||||
|
+ g_autofree struct vfio_device_info *info = NULL;
|
||||||
|
+
|
||||||
|
+ assert(fh);
|
||||||
|
+
|
||||||
|
+ info = get_device_info(pbdev, sizeof(*info));
|
||||||
|
+ if (!info) {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return get_host_fh(pbdev, info, fh);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * This function will issue the VFIO_DEVICE_GET_INFO ioctl and look for
|
||||||
|
+ * capabilities that contain information about CLP features provided by the
|
||||||
|
+ * underlying host.
|
||||||
|
+ * On entry, defaults have already been placed into the guest CLP response
|
||||||
|
+ * buffers. On exit, defaults will have been overwritten for any CLP features
|
||||||
|
+ * found in the capability chain; defaults will remain for any CLP features not
|
||||||
|
+ * found in the chain.
|
||||||
|
+ */
|
||||||
|
+void s390_pci_get_clp_info(S390PCIBusDevice *pbdev)
|
||||||
|
+{
|
||||||
|
+ g_autofree struct vfio_device_info *info = NULL;
|
||||||
|
+
|
||||||
|
+ info = get_device_info(pbdev, sizeof(*info));
|
||||||
|
+ if (!info) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Find the CLP features provided and fill in the guest CLP responses.
|
||||||
|
* Always call s390_pci_read_base first as information from this could
|
||||||
|
diff --git a/include/hw/s390x/s390-pci-vfio.h b/include/hw/s390x/s390-pci-vfio.h
|
||||||
|
index ff708aef50..ae1b126ff7 100644
|
||||||
|
--- a/include/hw/s390x/s390-pci-vfio.h
|
||||||
|
+++ b/include/hw/s390x/s390-pci-vfio.h
|
||||||
|
@@ -20,6 +20,7 @@ bool s390_pci_update_dma_avail(int fd, unsigned int *avail);
|
||||||
|
S390PCIDMACount *s390_pci_start_dma_count(S390pciState *s,
|
||||||
|
S390PCIBusDevice *pbdev);
|
||||||
|
void s390_pci_end_dma_count(S390pciState *s, S390PCIDMACount *cnt);
|
||||||
|
+bool s390_pci_get_host_fh(S390PCIBusDevice *pbdev, uint32_t *fh);
|
||||||
|
void s390_pci_get_clp_info(S390PCIBusDevice *pbdev);
|
||||||
|
#else
|
||||||
|
static inline bool s390_pci_update_dma_avail(int fd, unsigned int *avail)
|
||||||
|
@@ -33,6 +34,10 @@ static inline S390PCIDMACount *s390_pci_start_dma_count(S390pciState *s,
|
||||||
|
}
|
||||||
|
static inline void s390_pci_end_dma_count(S390pciState *s,
|
||||||
|
S390PCIDMACount *cnt) { }
|
||||||
|
+static inline bool s390_pci_get_host_fh(S390PCIBusDevice *pbdev, uint32_t *fh)
|
||||||
|
+{
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
static inline void s390_pci_get_clp_info(S390PCIBusDevice *pbdev) { }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,99 @@
|
|||||||
|
From de6319fe0ce09297beae5ff4636c03217abe6f26 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 3 Dec 2021 09:27:06 -0500
|
||||||
|
Subject: [PATCH 04/42] s390x/pci: add supported DT information to clp response
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [4/41] 275668f6d38fbc1dfa2f1aa8f58b2c319de2657d
|
||||||
|
|
||||||
|
The DTSM is a mask that specifies which I/O Address Translation designation
|
||||||
|
types are supported. Today QEMU only supports DT=1.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Reviewed-by: Eric Farman <farman@linux.ibm.com>
|
||||||
|
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
|
||||||
|
Message-Id: <20211203142706.427279-5-mjrosato@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit ac6aa30ac47b2abaf142f76de46374da2a98f6e7)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-pci-bus.c | 1 +
|
||||||
|
hw/s390x/s390-pci-inst.c | 1 +
|
||||||
|
hw/s390x/s390-pci-vfio.c | 1 +
|
||||||
|
include/hw/s390x/s390-pci-bus.h | 1 +
|
||||||
|
include/hw/s390x/s390-pci-clp.h | 3 ++-
|
||||||
|
5 files changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
|
||||||
|
index 1b51a72838..01b58ebc70 100644
|
||||||
|
--- a/hw/s390x/s390-pci-bus.c
|
||||||
|
+++ b/hw/s390x/s390-pci-bus.c
|
||||||
|
@@ -782,6 +782,7 @@ static void s390_pci_init_default_group(void)
|
||||||
|
resgrp->i = 128;
|
||||||
|
resgrp->maxstbl = 128;
|
||||||
|
resgrp->version = 0;
|
||||||
|
+ resgrp->dtsm = ZPCI_DTSM;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_pbdev_info(S390PCIBusDevice *pbdev)
|
||||||
|
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
|
||||||
|
index 07bab85ce5..6d400d4147 100644
|
||||||
|
--- a/hw/s390x/s390-pci-inst.c
|
||||||
|
+++ b/hw/s390x/s390-pci-inst.c
|
||||||
|
@@ -329,6 +329,7 @@ int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_t ra)
|
||||||
|
stw_p(&resgrp->i, group->zpci_group.i);
|
||||||
|
stw_p(&resgrp->maxstbl, group->zpci_group.maxstbl);
|
||||||
|
resgrp->version = group->zpci_group.version;
|
||||||
|
+ resgrp->dtsm = group->zpci_group.dtsm;
|
||||||
|
stw_p(&resgrp->hdr.rsp, CLP_RC_OK);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
diff --git a/hw/s390x/s390-pci-vfio.c b/hw/s390x/s390-pci-vfio.c
|
||||||
|
index 2a153fa8c9..6f80a47e29 100644
|
||||||
|
--- a/hw/s390x/s390-pci-vfio.c
|
||||||
|
+++ b/hw/s390x/s390-pci-vfio.c
|
||||||
|
@@ -160,6 +160,7 @@ static void s390_pci_read_group(S390PCIBusDevice *pbdev,
|
||||||
|
resgrp->i = cap->noi;
|
||||||
|
resgrp->maxstbl = cap->maxstbl;
|
||||||
|
resgrp->version = cap->version;
|
||||||
|
+ resgrp->dtsm = ZPCI_DTSM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/include/hw/s390x/s390-pci-bus.h b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
index 2727e7bdef..da3cde2bb4 100644
|
||||||
|
--- a/include/hw/s390x/s390-pci-bus.h
|
||||||
|
+++ b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
@@ -37,6 +37,7 @@
|
||||||
|
#define ZPCI_MAX_UID 0xffff
|
||||||
|
#define UID_UNDEFINED 0
|
||||||
|
#define UID_CHECKING_ENABLED 0x01
|
||||||
|
+#define ZPCI_DTSM 0x40
|
||||||
|
|
||||||
|
OBJECT_DECLARE_SIMPLE_TYPE(S390pciState, S390_PCI_HOST_BRIDGE)
|
||||||
|
OBJECT_DECLARE_SIMPLE_TYPE(S390PCIBus, S390_PCI_BUS)
|
||||||
|
diff --git a/include/hw/s390x/s390-pci-clp.h b/include/hw/s390x/s390-pci-clp.h
|
||||||
|
index 96b8e3f133..cc8c8662b8 100644
|
||||||
|
--- a/include/hw/s390x/s390-pci-clp.h
|
||||||
|
+++ b/include/hw/s390x/s390-pci-clp.h
|
||||||
|
@@ -163,7 +163,8 @@ typedef struct ClpRspQueryPciGrp {
|
||||||
|
uint8_t fr;
|
||||||
|
uint16_t maxstbl;
|
||||||
|
uint16_t mui;
|
||||||
|
- uint64_t reserved3;
|
||||||
|
+ uint8_t dtsm;
|
||||||
|
+ uint8_t reserved3[7];
|
||||||
|
uint64_t dasm; /* dma address space mask */
|
||||||
|
uint64_t msia; /* MSI address */
|
||||||
|
uint64_t reserved4;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,60 @@
|
|||||||
|
From 5bd57d8ac3a4e75337eae81a3623b4dc2b417e2f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 2 Sep 2022 13:27:33 -0400
|
||||||
|
Subject: [PATCH 08/42] s390x/pci: don't fence interpreted devices without
|
||||||
|
MSI-X
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [8/41] 52bad4368e9494c43133338b386dc0cc159aeedc
|
||||||
|
|
||||||
|
Lack of MSI-X support is not an issue for interpreted passthrough
|
||||||
|
devices, so let's let these in. This will allow, for example, ISM
|
||||||
|
devices to be passed through -- but only when interpretation is
|
||||||
|
available and being used.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Reviewed-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
|
||||||
|
Message-Id: <20220902172737.170349-5-mjrosato@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit 15d0e7942d3b31ff71d8e0e8cec3a8203214f19b)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-pci-bus.c | 6 +++++-
|
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
|
||||||
|
index 18bfae0465..07c7c155e3 100644
|
||||||
|
--- a/hw/s390x/s390-pci-bus.c
|
||||||
|
+++ b/hw/s390x/s390-pci-bus.c
|
||||||
|
@@ -881,6 +881,10 @@ static int s390_pci_msix_init(S390PCIBusDevice *pbdev)
|
||||||
|
|
||||||
|
static void s390_pci_msix_free(S390PCIBusDevice *pbdev)
|
||||||
|
{
|
||||||
|
+ if (pbdev->msix.entries == 0) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
memory_region_del_subregion(&pbdev->iommu->mr, &pbdev->msix_notify_mr);
|
||||||
|
object_unparent(OBJECT(&pbdev->msix_notify_mr));
|
||||||
|
}
|
||||||
|
@@ -1093,7 +1097,7 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
|
pbdev->interp = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (s390_pci_msix_init(pbdev)) {
|
||||||
|
+ if (s390_pci_msix_init(pbdev) && !pbdev->interp) {
|
||||||
|
error_setg(errp, "MSI-X support is mandatory "
|
||||||
|
"in the S390 architecture");
|
||||||
|
return;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,77 @@
|
|||||||
|
From 67ebb71d56e95adf185ab4971939e31c4c899863 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 3 Dec 2021 09:27:04 -0500
|
||||||
|
Subject: [PATCH 02/42] s390x/pci: don't use hard-coded dma range in reg_ioat
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [2/41] c7897321f9848ef8f115130832774bbcd6724f03
|
||||||
|
|
||||||
|
Instead use the values from clp info, they will either be the hard-coded
|
||||||
|
values or what came from the host driver via vfio.
|
||||||
|
|
||||||
|
Fixes: 9670ee752727 ("s390x/pci: use a PCI Function structure")
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Reviewed-by: Eric Farman <farman@linux.ibm.com>
|
||||||
|
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
|
||||||
|
Message-Id: <20211203142706.427279-3-mjrosato@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit df7ce0a94d9283f0656b4bc0f21566973ff649a3)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-pci-inst.c | 9 +++++----
|
||||||
|
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
|
||||||
|
index 1c8ad91175..11b7f6bfa1 100644
|
||||||
|
--- a/hw/s390x/s390-pci-inst.c
|
||||||
|
+++ b/hw/s390x/s390-pci-inst.c
|
||||||
|
@@ -916,9 +916,10 @@ int pci_dereg_irqs(S390PCIBusDevice *pbdev)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int reg_ioat(CPUS390XState *env, S390PCIIOMMU *iommu, ZpciFib fib,
|
||||||
|
+static int reg_ioat(CPUS390XState *env, S390PCIBusDevice *pbdev, ZpciFib fib,
|
||||||
|
uintptr_t ra)
|
||||||
|
{
|
||||||
|
+ S390PCIIOMMU *iommu = pbdev->iommu;
|
||||||
|
uint64_t pba = ldq_p(&fib.pba);
|
||||||
|
uint64_t pal = ldq_p(&fib.pal);
|
||||||
|
uint64_t g_iota = ldq_p(&fib.iota);
|
||||||
|
@@ -927,7 +928,7 @@ static int reg_ioat(CPUS390XState *env, S390PCIIOMMU *iommu, ZpciFib fib,
|
||||||
|
|
||||||
|
pba &= ~0xfff;
|
||||||
|
pal |= 0xfff;
|
||||||
|
- if (pba > pal || pba < ZPCI_SDMA_ADDR || pal > ZPCI_EDMA_ADDR) {
|
||||||
|
+ if (pba > pal || pba < pbdev->zpci_fn.sdma || pal > pbdev->zpci_fn.edma) {
|
||||||
|
s390_program_interrupt(env, PGM_OPERAND, ra);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
@@ -1125,7 +1126,7 @@ int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar,
|
||||||
|
} else if (pbdev->iommu->enabled) {
|
||||||
|
cc = ZPCI_PCI_LS_ERR;
|
||||||
|
s390_set_status_code(env, r1, ZPCI_MOD_ST_SEQUENCE);
|
||||||
|
- } else if (reg_ioat(env, pbdev->iommu, fib, ra)) {
|
||||||
|
+ } else if (reg_ioat(env, pbdev, fib, ra)) {
|
||||||
|
cc = ZPCI_PCI_LS_ERR;
|
||||||
|
s390_set_status_code(env, r1, ZPCI_MOD_ST_INSUF_RES);
|
||||||
|
}
|
||||||
|
@@ -1150,7 +1151,7 @@ int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar,
|
||||||
|
s390_set_status_code(env, r1, ZPCI_MOD_ST_SEQUENCE);
|
||||||
|
} else {
|
||||||
|
pci_dereg_ioat(pbdev->iommu);
|
||||||
|
- if (reg_ioat(env, pbdev->iommu, fib, ra)) {
|
||||||
|
+ if (reg_ioat(env, pbdev, fib, ra)) {
|
||||||
|
cc = ZPCI_PCI_LS_ERR;
|
||||||
|
s390_set_status_code(env, r1, ZPCI_MOD_ST_INSUF_RES);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,265 @@
|
|||||||
|
From 362fae654bbae03741003e565fb95d73d8c0025f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 2 Sep 2022 13:27:34 -0400
|
||||||
|
Subject: [PATCH 09/42] s390x/pci: enable adapter event notification for
|
||||||
|
interpreted devices
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [9/41] 771975c436c7cb608e0e9e40edd732ac310beb69
|
||||||
|
|
||||||
|
Use the associated kvm ioctl operation to enable adapter event notification
|
||||||
|
and forwarding for devices when requested. This feature will be set up
|
||||||
|
with or without firmware assist based upon the 'forwarding_assist' setting.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Message-Id: <20220902172737.170349-6-mjrosato@linux.ibm.com>
|
||||||
|
[thuth: Rename "forwarding_assist" property to "forwarding-assist"]
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit d0bc7091c2013ad2fa164100cf7b17962370e8ab)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-pci-bus.c | 20 ++++++++++++++---
|
||||||
|
hw/s390x/s390-pci-inst.c | 40 +++++++++++++++++++++++++++++++--
|
||||||
|
hw/s390x/s390-pci-kvm.c | 30 +++++++++++++++++++++++++
|
||||||
|
include/hw/s390x/s390-pci-bus.h | 1 +
|
||||||
|
include/hw/s390x/s390-pci-kvm.h | 14 ++++++++++++
|
||||||
|
5 files changed, 100 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
|
||||||
|
index 07c7c155e3..cd152ce711 100644
|
||||||
|
--- a/hw/s390x/s390-pci-bus.c
|
||||||
|
+++ b/hw/s390x/s390-pci-bus.c
|
||||||
|
@@ -190,7 +190,10 @@ void s390_pci_sclp_deconfigure(SCCB *sccb)
|
||||||
|
rc = SCLP_RC_NO_ACTION_REQUIRED;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
- if (pbdev->summary_ind) {
|
||||||
|
+ if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) {
|
||||||
|
+ /* Interpreted devices were using interrupt forwarding */
|
||||||
|
+ s390_pci_kvm_aif_disable(pbdev);
|
||||||
|
+ } else if (pbdev->summary_ind) {
|
||||||
|
pci_dereg_irqs(pbdev);
|
||||||
|
}
|
||||||
|
if (pbdev->iommu->enabled) {
|
||||||
|
@@ -1082,6 +1085,7 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
|
} else {
|
||||||
|
DPRINTF("zPCI interpretation facilities missing.\n");
|
||||||
|
pbdev->interp = false;
|
||||||
|
+ pbdev->forwarding_assist = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pbdev->iommu->dma_limit = s390_pci_start_dma_count(s, pbdev);
|
||||||
|
@@ -1090,11 +1094,13 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
|
if (!pbdev->interp) {
|
||||||
|
/* Do vfio passthrough but intercept for I/O */
|
||||||
|
pbdev->fh |= FH_SHM_VFIO;
|
||||||
|
+ pbdev->forwarding_assist = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pbdev->fh |= FH_SHM_EMUL;
|
||||||
|
/* Always intercept emulated devices */
|
||||||
|
pbdev->interp = false;
|
||||||
|
+ pbdev->forwarding_assist = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s390_pci_msix_init(pbdev) && !pbdev->interp) {
|
||||||
|
@@ -1244,7 +1250,10 @@ static void s390_pcihost_reset(DeviceState *dev)
|
||||||
|
/* Process all pending unplug requests */
|
||||||
|
QTAILQ_FOREACH_SAFE(pbdev, &s->zpci_devs, link, next) {
|
||||||
|
if (pbdev->unplug_requested) {
|
||||||
|
- if (pbdev->summary_ind) {
|
||||||
|
+ if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) {
|
||||||
|
+ /* Interpreted devices were using interrupt forwarding */
|
||||||
|
+ s390_pci_kvm_aif_disable(pbdev);
|
||||||
|
+ } else if (pbdev->summary_ind) {
|
||||||
|
pci_dereg_irqs(pbdev);
|
||||||
|
}
|
||||||
|
if (pbdev->iommu->enabled) {
|
||||||
|
@@ -1382,7 +1391,10 @@ static void s390_pci_device_reset(DeviceState *dev)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (pbdev->summary_ind) {
|
||||||
|
+ if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) {
|
||||||
|
+ /* Interpreted devices were using interrupt forwarding */
|
||||||
|
+ s390_pci_kvm_aif_disable(pbdev);
|
||||||
|
+ } else if (pbdev->summary_ind) {
|
||||||
|
pci_dereg_irqs(pbdev);
|
||||||
|
}
|
||||||
|
if (pbdev->iommu->enabled) {
|
||||||
|
@@ -1428,6 +1440,8 @@ static Property s390_pci_device_properties[] = {
|
||||||
|
DEFINE_PROP_S390_PCI_FID("fid", S390PCIBusDevice, fid),
|
||||||
|
DEFINE_PROP_STRING("target", S390PCIBusDevice, target),
|
||||||
|
DEFINE_PROP_BOOL("interpret", S390PCIBusDevice, interp, true),
|
||||||
|
+ DEFINE_PROP_BOOL("forwarding-assist", S390PCIBusDevice, forwarding_assist,
|
||||||
|
+ true),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
|
||||||
|
index 651ec38635..20a9bcc7af 100644
|
||||||
|
--- a/hw/s390x/s390-pci-inst.c
|
||||||
|
+++ b/hw/s390x/s390-pci-inst.c
|
||||||
|
@@ -1066,6 +1066,32 @@ static void fmb_update(void *opaque)
|
||||||
|
timer_mod(pbdev->fmb_timer, t + pbdev->pci_group->zpci_group.mui);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int mpcifc_reg_int_interp(S390PCIBusDevice *pbdev, ZpciFib *fib)
|
||||||
|
+{
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ rc = s390_pci_kvm_aif_enable(pbdev, fib, pbdev->forwarding_assist);
|
||||||
|
+ if (rc) {
|
||||||
|
+ DPRINTF("Failed to enable interrupt forwarding\n");
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mpcifc_dereg_int_interp(S390PCIBusDevice *pbdev, ZpciFib *fib)
|
||||||
|
+{
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ rc = s390_pci_kvm_aif_disable(pbdev);
|
||||||
|
+ if (rc) {
|
||||||
|
+ DPRINTF("Failed to disable interrupt forwarding\n");
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar,
|
||||||
|
uintptr_t ra)
|
||||||
|
{
|
||||||
|
@@ -1120,7 +1146,12 @@ int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar,
|
||||||
|
|
||||||
|
switch (oc) {
|
||||||
|
case ZPCI_MOD_FC_REG_INT:
|
||||||
|
- if (pbdev->summary_ind) {
|
||||||
|
+ if (pbdev->interp) {
|
||||||
|
+ if (mpcifc_reg_int_interp(pbdev, &fib)) {
|
||||||
|
+ cc = ZPCI_PCI_LS_ERR;
|
||||||
|
+ s390_set_status_code(env, r1, ZPCI_MOD_ST_SEQUENCE);
|
||||||
|
+ }
|
||||||
|
+ } else if (pbdev->summary_ind) {
|
||||||
|
cc = ZPCI_PCI_LS_ERR;
|
||||||
|
s390_set_status_code(env, r1, ZPCI_MOD_ST_SEQUENCE);
|
||||||
|
} else if (reg_irqs(env, pbdev, fib)) {
|
||||||
|
@@ -1129,7 +1160,12 @@ int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar,
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ZPCI_MOD_FC_DEREG_INT:
|
||||||
|
- if (!pbdev->summary_ind) {
|
||||||
|
+ if (pbdev->interp) {
|
||||||
|
+ if (mpcifc_dereg_int_interp(pbdev, &fib)) {
|
||||||
|
+ cc = ZPCI_PCI_LS_ERR;
|
||||||
|
+ s390_set_status_code(env, r1, ZPCI_MOD_ST_SEQUENCE);
|
||||||
|
+ }
|
||||||
|
+ } else if (!pbdev->summary_ind) {
|
||||||
|
cc = ZPCI_PCI_LS_ERR;
|
||||||
|
s390_set_status_code(env, r1, ZPCI_MOD_ST_SEQUENCE);
|
||||||
|
} else {
|
||||||
|
diff --git a/hw/s390x/s390-pci-kvm.c b/hw/s390x/s390-pci-kvm.c
|
||||||
|
index 0f16104a74..9134fe185f 100644
|
||||||
|
--- a/hw/s390x/s390-pci-kvm.c
|
||||||
|
+++ b/hw/s390x/s390-pci-kvm.c
|
||||||
|
@@ -11,12 +11,42 @@
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
|
||||||
|
+#include <linux/kvm.h>
|
||||||
|
+
|
||||||
|
#include "kvm/kvm_s390x.h"
|
||||||
|
#include "hw/s390x/pv.h"
|
||||||
|
+#include "hw/s390x/s390-pci-bus.h"
|
||||||
|
#include "hw/s390x/s390-pci-kvm.h"
|
||||||
|
+#include "hw/s390x/s390-pci-inst.h"
|
||||||
|
#include "cpu_models.h"
|
||||||
|
|
||||||
|
bool s390_pci_kvm_interp_allowed(void)
|
||||||
|
{
|
||||||
|
return kvm_s390_get_zpci_op() && !s390_is_pv();
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+int s390_pci_kvm_aif_enable(S390PCIBusDevice *pbdev, ZpciFib *fib, bool assist)
|
||||||
|
+{
|
||||||
|
+ struct kvm_s390_zpci_op args = {
|
||||||
|
+ .fh = pbdev->fh,
|
||||||
|
+ .op = KVM_S390_ZPCIOP_REG_AEN,
|
||||||
|
+ .u.reg_aen.ibv = fib->aibv,
|
||||||
|
+ .u.reg_aen.sb = fib->aisb,
|
||||||
|
+ .u.reg_aen.noi = FIB_DATA_NOI(fib->data),
|
||||||
|
+ .u.reg_aen.isc = FIB_DATA_ISC(fib->data),
|
||||||
|
+ .u.reg_aen.sbo = FIB_DATA_AISBO(fib->data),
|
||||||
|
+ .u.reg_aen.flags = (assist) ? 0 : KVM_S390_ZPCIOP_REGAEN_HOST
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ return kvm_vm_ioctl(kvm_state, KVM_S390_ZPCI_OP, &args);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int s390_pci_kvm_aif_disable(S390PCIBusDevice *pbdev)
|
||||||
|
+{
|
||||||
|
+ struct kvm_s390_zpci_op args = {
|
||||||
|
+ .fh = pbdev->fh,
|
||||||
|
+ .op = KVM_S390_ZPCIOP_DEREG_AEN
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ return kvm_vm_ioctl(kvm_state, KVM_S390_ZPCI_OP, &args);
|
||||||
|
+}
|
||||||
|
diff --git a/include/hw/s390x/s390-pci-bus.h b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
index a9843dfe97..5b09f0cf2f 100644
|
||||||
|
--- a/include/hw/s390x/s390-pci-bus.h
|
||||||
|
+++ b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
@@ -351,6 +351,7 @@ struct S390PCIBusDevice {
|
||||||
|
bool pci_unplug_request_processed;
|
||||||
|
bool unplug_requested;
|
||||||
|
bool interp;
|
||||||
|
+ bool forwarding_assist;
|
||||||
|
QTAILQ_ENTRY(S390PCIBusDevice) link;
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/include/hw/s390x/s390-pci-kvm.h b/include/hw/s390x/s390-pci-kvm.h
|
||||||
|
index 80a2e7d0ca..933814a402 100644
|
||||||
|
--- a/include/hw/s390x/s390-pci-kvm.h
|
||||||
|
+++ b/include/hw/s390x/s390-pci-kvm.h
|
||||||
|
@@ -12,13 +12,27 @@
|
||||||
|
#ifndef HW_S390_PCI_KVM_H
|
||||||
|
#define HW_S390_PCI_KVM_H
|
||||||
|
|
||||||
|
+#include "hw/s390x/s390-pci-bus.h"
|
||||||
|
+#include "hw/s390x/s390-pci-inst.h"
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_KVM
|
||||||
|
bool s390_pci_kvm_interp_allowed(void);
|
||||||
|
+int s390_pci_kvm_aif_enable(S390PCIBusDevice *pbdev, ZpciFib *fib, bool assist);
|
||||||
|
+int s390_pci_kvm_aif_disable(S390PCIBusDevice *pbdev);
|
||||||
|
#else
|
||||||
|
static inline bool s390_pci_kvm_interp_allowed(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
+static inline int s390_pci_kvm_aif_enable(S390PCIBusDevice *pbdev, ZpciFib *fib,
|
||||||
|
+ bool assist)
|
||||||
|
+{
|
||||||
|
+ return -EINVAL;
|
||||||
|
+}
|
||||||
|
+static inline int s390_pci_kvm_aif_disable(S390PCIBusDevice *pbdev)
|
||||||
|
+{
|
||||||
|
+ return -EINVAL;
|
||||||
|
+}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
319
SOURCES/kvm-s390x-pci-enable-for-load-store-interpretation.patch
Normal file
319
SOURCES/kvm-s390x-pci-enable-for-load-store-interpretation.patch
Normal file
@ -0,0 +1,319 @@
|
|||||||
|
From 62fbb66d18f598d0896164383aab465e093fb0c1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 2 Sep 2022 13:27:32 -0400
|
||||||
|
Subject: [PATCH 07/42] s390x/pci: enable for load/store interpretation
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [7/41] 3a96e901e295bb9e0c530638c45b5da5d60c00bd
|
||||||
|
|
||||||
|
If the ZPCI_OP ioctl reports that is is available and usable, then the
|
||||||
|
underlying KVM host will enable load/store intepretation for any guest
|
||||||
|
device without a SHM bit in the guest function handle. For a device that
|
||||||
|
will be using interpretation support, ensure the guest function handle
|
||||||
|
matches the host function handle; this value is re-checked every time the
|
||||||
|
guest issues a SET PCI FN to enable the guest device as it is the only
|
||||||
|
opportunity to reflect function handle changes.
|
||||||
|
|
||||||
|
By default, unless interpret=off is specified, interpretation support will
|
||||||
|
always be assumed and exploited if the necessary ioctl and features are
|
||||||
|
available on the host kernel. When these are unavailable, we will silently
|
||||||
|
revert to the interception model; this allows existing guest configurations
|
||||||
|
to work unmodified on hosts with and without zPCI interpretation support,
|
||||||
|
allowing QEMU to choose the best support model available.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
Message-Id: <20220902172737.170349-4-mjrosato@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit dd1d5fd9684beeb0c14c39f497ef2aa9ac683aa7)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/meson.build | 1 +
|
||||||
|
hw/s390x/s390-pci-bus.c | 66 ++++++++++++++++++++++++++++++++-
|
||||||
|
hw/s390x/s390-pci-inst.c | 16 ++++++++
|
||||||
|
hw/s390x/s390-pci-kvm.c | 22 +++++++++++
|
||||||
|
include/hw/s390x/s390-pci-bus.h | 1 +
|
||||||
|
include/hw/s390x/s390-pci-kvm.h | 24 ++++++++++++
|
||||||
|
target/s390x/kvm/kvm.c | 7 ++++
|
||||||
|
target/s390x/kvm/kvm_s390x.h | 1 +
|
||||||
|
8 files changed, 137 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 hw/s390x/s390-pci-kvm.c
|
||||||
|
create mode 100644 include/hw/s390x/s390-pci-kvm.h
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/meson.build b/hw/s390x/meson.build
|
||||||
|
index 28484256ec..6e6e47fcda 100644
|
||||||
|
--- a/hw/s390x/meson.build
|
||||||
|
+++ b/hw/s390x/meson.build
|
||||||
|
@@ -23,6 +23,7 @@ s390x_ss.add(when: 'CONFIG_KVM', if_true: files(
|
||||||
|
's390-skeys-kvm.c',
|
||||||
|
's390-stattrib-kvm.c',
|
||||||
|
'pv.c',
|
||||||
|
+ 's390-pci-kvm.c',
|
||||||
|
))
|
||||||
|
s390x_ss.add(when: 'CONFIG_TCG', if_true: files(
|
||||||
|
'tod-tcg.c',
|
||||||
|
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
|
||||||
|
index 01b58ebc70..18bfae0465 100644
|
||||||
|
--- a/hw/s390x/s390-pci-bus.c
|
||||||
|
+++ b/hw/s390x/s390-pci-bus.c
|
||||||
|
@@ -16,6 +16,7 @@
|
||||||
|
#include "qapi/visitor.h"
|
||||||
|
#include "hw/s390x/s390-pci-bus.h"
|
||||||
|
#include "hw/s390x/s390-pci-inst.h"
|
||||||
|
+#include "hw/s390x/s390-pci-kvm.h"
|
||||||
|
#include "hw/s390x/s390-pci-vfio.h"
|
||||||
|
#include "hw/pci/pci_bus.h"
|
||||||
|
#include "hw/qdev-properties.h"
|
||||||
|
@@ -971,12 +972,51 @@ static void s390_pci_update_subordinate(PCIDevice *dev, uint32_t nr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int s390_pci_interp_plug(S390pciState *s, S390PCIBusDevice *pbdev)
|
||||||
|
+{
|
||||||
|
+ uint32_t idx, fh;
|
||||||
|
+
|
||||||
|
+ if (!s390_pci_get_host_fh(pbdev, &fh)) {
|
||||||
|
+ return -EPERM;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * The host device is already in an enabled state, but we always present
|
||||||
|
+ * the initial device state to the guest as disabled (ZPCI_FS_DISABLED).
|
||||||
|
+ * Therefore, mask off the enable bit from the passthrough handle until
|
||||||
|
+ * the guest issues a CLP SET PCI FN later to enable the device.
|
||||||
|
+ */
|
||||||
|
+ pbdev->fh = fh & ~FH_MASK_ENABLE;
|
||||||
|
+
|
||||||
|
+ /* Next, see if the idx is already in-use */
|
||||||
|
+ idx = pbdev->fh & FH_MASK_INDEX;
|
||||||
|
+ if (pbdev->idx != idx) {
|
||||||
|
+ if (s390_pci_find_dev_by_idx(s, idx)) {
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+ /*
|
||||||
|
+ * Update the idx entry with the passed through idx
|
||||||
|
+ * If the relinquished idx is lower than next_idx, use it
|
||||||
|
+ * to replace next_idx
|
||||||
|
+ */
|
||||||
|
+ g_hash_table_remove(s->zpci_table, &pbdev->idx);
|
||||||
|
+ if (idx < s->next_idx) {
|
||||||
|
+ s->next_idx = idx;
|
||||||
|
+ }
|
||||||
|
+ pbdev->idx = idx;
|
||||||
|
+ g_hash_table_insert(s->zpci_table, &pbdev->idx, pbdev);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
|
||||||
|
PCIDevice *pdev = NULL;
|
||||||
|
S390PCIBusDevice *pbdev = NULL;
|
||||||
|
+ int rc;
|
||||||
|
|
||||||
|
if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
|
||||||
|
PCIBridge *pb = PCI_BRIDGE(dev);
|
||||||
|
@@ -1022,12 +1062,35 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
|
set_pbdev_info(pbdev);
|
||||||
|
|
||||||
|
if (object_dynamic_cast(OBJECT(dev), "vfio-pci")) {
|
||||||
|
- pbdev->fh |= FH_SHM_VFIO;
|
||||||
|
+ /*
|
||||||
|
+ * By default, interpretation is always requested; if the available
|
||||||
|
+ * facilities indicate it is not available, fallback to the
|
||||||
|
+ * interception model.
|
||||||
|
+ */
|
||||||
|
+ if (pbdev->interp) {
|
||||||
|
+ if (s390_pci_kvm_interp_allowed()) {
|
||||||
|
+ rc = s390_pci_interp_plug(s, pbdev);
|
||||||
|
+ if (rc) {
|
||||||
|
+ error_setg(errp, "Plug failed for zPCI device in "
|
||||||
|
+ "interpretation mode: %d", rc);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ DPRINTF("zPCI interpretation facilities missing.\n");
|
||||||
|
+ pbdev->interp = false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
pbdev->iommu->dma_limit = s390_pci_start_dma_count(s, pbdev);
|
||||||
|
/* Fill in CLP information passed via the vfio region */
|
||||||
|
s390_pci_get_clp_info(pbdev);
|
||||||
|
+ if (!pbdev->interp) {
|
||||||
|
+ /* Do vfio passthrough but intercept for I/O */
|
||||||
|
+ pbdev->fh |= FH_SHM_VFIO;
|
||||||
|
+ }
|
||||||
|
} else {
|
||||||
|
pbdev->fh |= FH_SHM_EMUL;
|
||||||
|
+ /* Always intercept emulated devices */
|
||||||
|
+ pbdev->interp = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s390_pci_msix_init(pbdev)) {
|
||||||
|
@@ -1360,6 +1423,7 @@ static Property s390_pci_device_properties[] = {
|
||||||
|
DEFINE_PROP_UINT16("uid", S390PCIBusDevice, uid, UID_UNDEFINED),
|
||||||
|
DEFINE_PROP_S390_PCI_FID("fid", S390PCIBusDevice, fid),
|
||||||
|
DEFINE_PROP_STRING("target", S390PCIBusDevice, target),
|
||||||
|
+ DEFINE_PROP_BOOL("interpret", S390PCIBusDevice, interp, true),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
|
||||||
|
index 6d400d4147..651ec38635 100644
|
||||||
|
--- a/hw/s390x/s390-pci-inst.c
|
||||||
|
+++ b/hw/s390x/s390-pci-inst.c
|
||||||
|
@@ -18,6 +18,8 @@
|
||||||
|
#include "sysemu/hw_accel.h"
|
||||||
|
#include "hw/s390x/s390-pci-inst.h"
|
||||||
|
#include "hw/s390x/s390-pci-bus.h"
|
||||||
|
+#include "hw/s390x/s390-pci-kvm.h"
|
||||||
|
+#include "hw/s390x/s390-pci-vfio.h"
|
||||||
|
#include "hw/s390x/tod.h"
|
||||||
|
|
||||||
|
#ifndef DEBUG_S390PCI_INST
|
||||||
|
@@ -246,6 +248,20 @@ int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_t ra)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Take this opportunity to make sure we still have an accurate
|
||||||
|
+ * host fh. It's possible part of the handle changed while the
|
||||||
|
+ * device was disabled to the guest (e.g. vfio hot reset for
|
||||||
|
+ * ISM during plug)
|
||||||
|
+ */
|
||||||
|
+ if (pbdev->interp) {
|
||||||
|
+ /* Take this opportunity to make sure we are sync'd with host */
|
||||||
|
+ if (!s390_pci_get_host_fh(pbdev, &pbdev->fh) ||
|
||||||
|
+ !(pbdev->fh & FH_MASK_ENABLE)) {
|
||||||
|
+ stw_p(&ressetpci->hdr.rsp, CLP_RC_SETPCIFN_FH);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
pbdev->fh |= FH_MASK_ENABLE;
|
||||||
|
pbdev->state = ZPCI_FS_ENABLED;
|
||||||
|
stl_p(&ressetpci->fh, pbdev->fh);
|
||||||
|
diff --git a/hw/s390x/s390-pci-kvm.c b/hw/s390x/s390-pci-kvm.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..0f16104a74
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/hw/s390x/s390-pci-kvm.c
|
||||||
|
@@ -0,0 +1,22 @@
|
||||||
|
+/*
|
||||||
|
+ * s390 zPCI KVM interfaces
|
||||||
|
+ *
|
||||||
|
+ * Copyright 2022 IBM Corp.
|
||||||
|
+ * Author(s): Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
+ *
|
||||||
|
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
|
||||||
|
+ * your option) any later version. See the COPYING file in the top-level
|
||||||
|
+ * directory.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include "qemu/osdep.h"
|
||||||
|
+
|
||||||
|
+#include "kvm/kvm_s390x.h"
|
||||||
|
+#include "hw/s390x/pv.h"
|
||||||
|
+#include "hw/s390x/s390-pci-kvm.h"
|
||||||
|
+#include "cpu_models.h"
|
||||||
|
+
|
||||||
|
+bool s390_pci_kvm_interp_allowed(void)
|
||||||
|
+{
|
||||||
|
+ return kvm_s390_get_zpci_op() && !s390_is_pv();
|
||||||
|
+}
|
||||||
|
diff --git a/include/hw/s390x/s390-pci-bus.h b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
index da3cde2bb4..a9843dfe97 100644
|
||||||
|
--- a/include/hw/s390x/s390-pci-bus.h
|
||||||
|
+++ b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
@@ -350,6 +350,7 @@ struct S390PCIBusDevice {
|
||||||
|
IndAddr *indicator;
|
||||||
|
bool pci_unplug_request_processed;
|
||||||
|
bool unplug_requested;
|
||||||
|
+ bool interp;
|
||||||
|
QTAILQ_ENTRY(S390PCIBusDevice) link;
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/include/hw/s390x/s390-pci-kvm.h b/include/hw/s390x/s390-pci-kvm.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..80a2e7d0ca
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/include/hw/s390x/s390-pci-kvm.h
|
||||||
|
@@ -0,0 +1,24 @@
|
||||||
|
+/*
|
||||||
|
+ * s390 PCI KVM interfaces
|
||||||
|
+ *
|
||||||
|
+ * Copyright 2022 IBM Corp.
|
||||||
|
+ * Author(s): Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
+ *
|
||||||
|
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
|
||||||
|
+ * your option) any later version. See the COPYING file in the top-level
|
||||||
|
+ * directory.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef HW_S390_PCI_KVM_H
|
||||||
|
+#define HW_S390_PCI_KVM_H
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_KVM
|
||||||
|
+bool s390_pci_kvm_interp_allowed(void);
|
||||||
|
+#else
|
||||||
|
+static inline bool s390_pci_kvm_interp_allowed(void)
|
||||||
|
+{
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#endif
|
||||||
|
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
|
||||||
|
index ba04997da1..30712487d4 100644
|
||||||
|
--- a/target/s390x/kvm/kvm.c
|
||||||
|
+++ b/target/s390x/kvm/kvm.c
|
||||||
|
@@ -158,6 +158,7 @@ static int cap_ri;
|
||||||
|
static int cap_hpage_1m;
|
||||||
|
static int cap_vcpu_resets;
|
||||||
|
static int cap_protected;
|
||||||
|
+static int cap_zpci_op;
|
||||||
|
|
||||||
|
static bool mem_op_storage_key_support;
|
||||||
|
|
||||||
|
@@ -363,6 +364,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||||
|
cap_s390_irq = kvm_check_extension(s, KVM_CAP_S390_INJECT_IRQ);
|
||||||
|
cap_vcpu_resets = kvm_check_extension(s, KVM_CAP_S390_VCPU_RESETS);
|
||||||
|
cap_protected = kvm_check_extension(s, KVM_CAP_S390_PROTECTED);
|
||||||
|
+ cap_zpci_op = kvm_check_extension(s, KVM_CAP_S390_ZPCI_OP);
|
||||||
|
|
||||||
|
kvm_vm_enable_cap(s, KVM_CAP_S390_USER_SIGP, 0);
|
||||||
|
kvm_vm_enable_cap(s, KVM_CAP_S390_VECTOR_REGISTERS, 0);
|
||||||
|
@@ -2579,3 +2581,8 @@ bool kvm_arch_cpu_check_are_resettable(void)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+int kvm_s390_get_zpci_op(void)
|
||||||
|
+{
|
||||||
|
+ return cap_zpci_op;
|
||||||
|
+}
|
||||||
|
diff --git a/target/s390x/kvm/kvm_s390x.h b/target/s390x/kvm/kvm_s390x.h
|
||||||
|
index 05a5e1e6f4..aaae8570de 100644
|
||||||
|
--- a/target/s390x/kvm/kvm_s390x.h
|
||||||
|
+++ b/target/s390x/kvm/kvm_s390x.h
|
||||||
|
@@ -27,6 +27,7 @@ void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu);
|
||||||
|
int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu);
|
||||||
|
int kvm_s390_get_hpage_1m(void);
|
||||||
|
int kvm_s390_get_ri(void);
|
||||||
|
+int kvm_s390_get_zpci_op(void);
|
||||||
|
int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
|
||||||
|
int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_clock);
|
||||||
|
int kvm_s390_set_clock(uint8_t tod_high, uint64_t tod_clock);
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,192 @@
|
|||||||
|
From b98a5bc4c21284dd0a8a1c86b91af81fcb75f060 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 2 Sep 2022 13:27:35 -0400
|
||||||
|
Subject: [PATCH 10/42] s390x/pci: let intercept devices have separate PCI
|
||||||
|
groups
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [10/41] 1545bdcd2e21386afa9869f0414e96eecb62647d
|
||||||
|
|
||||||
|
Let's use the reserved pool of simulated PCI groups to allow intercept
|
||||||
|
devices to have separate groups from interpreted devices as some group
|
||||||
|
values may be different. If we run out of simulated PCI groups, subsequent
|
||||||
|
intercept devices just get the default group.
|
||||||
|
Furthermore, if we encounter any PCI groups from hostdevs that are marked
|
||||||
|
as simulated, let's just assign them to the default group to avoid
|
||||||
|
conflicts between host simulated groups and our own simulated groups.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
|
||||||
|
Message-Id: <20220902172737.170349-7-mjrosato@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit 30dcf4f7fd23bef7d72a2454c60881710fd4c785)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-pci-bus.c | 19 ++++++++++++++--
|
||||||
|
hw/s390x/s390-pci-vfio.c | 40 ++++++++++++++++++++++++++++++---
|
||||||
|
include/hw/s390x/s390-pci-bus.h | 6 ++++-
|
||||||
|
3 files changed, 59 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
|
||||||
|
index cd152ce711..d8b1e44a02 100644
|
||||||
|
--- a/hw/s390x/s390-pci-bus.c
|
||||||
|
+++ b/hw/s390x/s390-pci-bus.c
|
||||||
|
@@ -748,13 +748,14 @@ static void s390_pci_iommu_free(S390pciState *s, PCIBus *bus, int32_t devfn)
|
||||||
|
object_unref(OBJECT(iommu));
|
||||||
|
}
|
||||||
|
|
||||||
|
-S390PCIGroup *s390_group_create(int id)
|
||||||
|
+S390PCIGroup *s390_group_create(int id, int host_id)
|
||||||
|
{
|
||||||
|
S390PCIGroup *group;
|
||||||
|
S390pciState *s = s390_get_phb();
|
||||||
|
|
||||||
|
group = g_new0(S390PCIGroup, 1);
|
||||||
|
group->id = id;
|
||||||
|
+ group->host_id = host_id;
|
||||||
|
QTAILQ_INSERT_TAIL(&s->zpci_groups, group, link);
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
@@ -772,12 +773,25 @@ S390PCIGroup *s390_group_find(int id)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+S390PCIGroup *s390_group_find_host_sim(int host_id)
|
||||||
|
+{
|
||||||
|
+ S390PCIGroup *group;
|
||||||
|
+ S390pciState *s = s390_get_phb();
|
||||||
|
+
|
||||||
|
+ QTAILQ_FOREACH(group, &s->zpci_groups, link) {
|
||||||
|
+ if (group->id >= ZPCI_SIM_GRP_START && group->host_id == host_id) {
|
||||||
|
+ return group;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void s390_pci_init_default_group(void)
|
||||||
|
{
|
||||||
|
S390PCIGroup *group;
|
||||||
|
ClpRspQueryPciGrp *resgrp;
|
||||||
|
|
||||||
|
- group = s390_group_create(ZPCI_DEFAULT_FN_GRP);
|
||||||
|
+ group = s390_group_create(ZPCI_DEFAULT_FN_GRP, ZPCI_DEFAULT_FN_GRP);
|
||||||
|
resgrp = &group->zpci_group;
|
||||||
|
resgrp->fr = 1;
|
||||||
|
resgrp->dasm = 0;
|
||||||
|
@@ -825,6 +839,7 @@ static void s390_pcihost_realize(DeviceState *dev, Error **errp)
|
||||||
|
NULL, g_free);
|
||||||
|
s->zpci_table = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, NULL);
|
||||||
|
s->bus_no = 0;
|
||||||
|
+ s->next_sim_grp = ZPCI_SIM_GRP_START;
|
||||||
|
QTAILQ_INIT(&s->pending_sei);
|
||||||
|
QTAILQ_INIT(&s->zpci_devs);
|
||||||
|
QTAILQ_INIT(&s->zpci_dma_limit);
|
||||||
|
diff --git a/hw/s390x/s390-pci-vfio.c b/hw/s390x/s390-pci-vfio.c
|
||||||
|
index 08bcc55e85..338f436e87 100644
|
||||||
|
--- a/hw/s390x/s390-pci-vfio.c
|
||||||
|
+++ b/hw/s390x/s390-pci-vfio.c
|
||||||
|
@@ -150,13 +150,18 @@ static void s390_pci_read_group(S390PCIBusDevice *pbdev,
|
||||||
|
{
|
||||||
|
struct vfio_info_cap_header *hdr;
|
||||||
|
struct vfio_device_info_cap_zpci_group *cap;
|
||||||
|
+ S390pciState *s = s390_get_phb();
|
||||||
|
ClpRspQueryPciGrp *resgrp;
|
||||||
|
VFIOPCIDevice *vpci = container_of(pbdev->pdev, VFIOPCIDevice, pdev);
|
||||||
|
+ uint8_t start_gid = pbdev->zpci_fn.pfgid;
|
||||||
|
|
||||||
|
hdr = vfio_get_device_info_cap(info, VFIO_DEVICE_INFO_CAP_ZPCI_GROUP);
|
||||||
|
|
||||||
|
- /* If capability not provided, just use the default group */
|
||||||
|
- if (hdr == NULL) {
|
||||||
|
+ /*
|
||||||
|
+ * If capability not provided or the underlying hostdev is simulated, just
|
||||||
|
+ * use the default group.
|
||||||
|
+ */
|
||||||
|
+ if (hdr == NULL || pbdev->zpci_fn.pfgid >= ZPCI_SIM_GRP_START) {
|
||||||
|
trace_s390_pci_clp_cap(vpci->vbasedev.name,
|
||||||
|
VFIO_DEVICE_INFO_CAP_ZPCI_GROUP);
|
||||||
|
pbdev->zpci_fn.pfgid = ZPCI_DEFAULT_FN_GRP;
|
||||||
|
@@ -165,11 +170,40 @@ static void s390_pci_read_group(S390PCIBusDevice *pbdev,
|
||||||
|
}
|
||||||
|
cap = (void *) hdr;
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * For an intercept device, let's use an existing simulated group if one
|
||||||
|
+ * one was already created for other intercept devices in this group.
|
||||||
|
+ * If not, create a new simulated group if any are still available.
|
||||||
|
+ * If all else fails, just fall back on the default group.
|
||||||
|
+ */
|
||||||
|
+ if (!pbdev->interp) {
|
||||||
|
+ pbdev->pci_group = s390_group_find_host_sim(pbdev->zpci_fn.pfgid);
|
||||||
|
+ if (pbdev->pci_group) {
|
||||||
|
+ /* Use existing simulated group */
|
||||||
|
+ pbdev->zpci_fn.pfgid = pbdev->pci_group->id;
|
||||||
|
+ return;
|
||||||
|
+ } else {
|
||||||
|
+ if (s->next_sim_grp == ZPCI_DEFAULT_FN_GRP) {
|
||||||
|
+ /* All out of simulated groups, use default */
|
||||||
|
+ trace_s390_pci_clp_cap(vpci->vbasedev.name,
|
||||||
|
+ VFIO_DEVICE_INFO_CAP_ZPCI_GROUP);
|
||||||
|
+ pbdev->zpci_fn.pfgid = ZPCI_DEFAULT_FN_GRP;
|
||||||
|
+ pbdev->pci_group = s390_group_find(ZPCI_DEFAULT_FN_GRP);
|
||||||
|
+ return;
|
||||||
|
+ } else {
|
||||||
|
+ /* We can assign a new simulated group */
|
||||||
|
+ pbdev->zpci_fn.pfgid = s->next_sim_grp;
|
||||||
|
+ s->next_sim_grp++;
|
||||||
|
+ /* Fall through to create the new sim group using CLP info */
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* See if the PCI group is already defined, create if not */
|
||||||
|
pbdev->pci_group = s390_group_find(pbdev->zpci_fn.pfgid);
|
||||||
|
|
||||||
|
if (!pbdev->pci_group) {
|
||||||
|
- pbdev->pci_group = s390_group_create(pbdev->zpci_fn.pfgid);
|
||||||
|
+ pbdev->pci_group = s390_group_create(pbdev->zpci_fn.pfgid, start_gid);
|
||||||
|
|
||||||
|
resgrp = &pbdev->pci_group->zpci_group;
|
||||||
|
if (cap->flags & VFIO_DEVICE_INFO_ZPCI_FLAG_REFRESH) {
|
||||||
|
diff --git a/include/hw/s390x/s390-pci-bus.h b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
index 5b09f0cf2f..0605fcea24 100644
|
||||||
|
--- a/include/hw/s390x/s390-pci-bus.h
|
||||||
|
+++ b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
@@ -315,13 +315,16 @@ typedef struct ZpciFmb {
|
||||||
|
QEMU_BUILD_BUG_MSG(offsetof(ZpciFmb, fmt0) != 48, "padding in ZpciFmb");
|
||||||
|
|
||||||
|
#define ZPCI_DEFAULT_FN_GRP 0xFF
|
||||||
|
+#define ZPCI_SIM_GRP_START 0xF0
|
||||||
|
typedef struct S390PCIGroup {
|
||||||
|
ClpRspQueryPciGrp zpci_group;
|
||||||
|
int id;
|
||||||
|
+ int host_id;
|
||||||
|
QTAILQ_ENTRY(S390PCIGroup) link;
|
||||||
|
} S390PCIGroup;
|
||||||
|
-S390PCIGroup *s390_group_create(int id);
|
||||||
|
+S390PCIGroup *s390_group_create(int id, int host_id);
|
||||||
|
S390PCIGroup *s390_group_find(int id);
|
||||||
|
+S390PCIGroup *s390_group_find_host_sim(int host_id);
|
||||||
|
|
||||||
|
struct S390PCIBusDevice {
|
||||||
|
DeviceState qdev;
|
||||||
|
@@ -370,6 +373,7 @@ struct S390pciState {
|
||||||
|
QTAILQ_HEAD(, S390PCIBusDevice) zpci_devs;
|
||||||
|
QTAILQ_HEAD(, S390PCIDMACount) zpci_dma_limit;
|
||||||
|
QTAILQ_HEAD(, S390PCIGroup) zpci_groups;
|
||||||
|
+ uint8_t next_sim_grp;
|
||||||
|
};
|
||||||
|
|
||||||
|
S390pciState *s390_get_phb(void);
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,52 @@
|
|||||||
|
From 65f90bfccf7500978879c15104a79de58173a06b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 2 Sep 2022 13:27:36 -0400
|
||||||
|
Subject: [PATCH 11/42] s390x/pci: reflect proper maxstbl for groups of
|
||||||
|
interpreted devices
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [11/41] 9ac2f5dedef3d743ef621525eef222a3e09d63b3
|
||||||
|
|
||||||
|
The maximum supported store block length might be different depending
|
||||||
|
on whether the instruction is interpretively executed (firmware-reported
|
||||||
|
maximum) or handled via userspace intercept (host kernel API maximum).
|
||||||
|
Choose the best available value during group creation.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
|
||||||
|
Message-Id: <20220902172737.170349-8-mjrosato@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit 9ee8f7e46a7d42ede69a4780200129bf1acb0d01)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-pci-vfio.c | 6 +++++-
|
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-vfio.c b/hw/s390x/s390-pci-vfio.c
|
||||||
|
index 338f436e87..2aefa508a0 100644
|
||||||
|
--- a/hw/s390x/s390-pci-vfio.c
|
||||||
|
+++ b/hw/s390x/s390-pci-vfio.c
|
||||||
|
@@ -213,7 +213,11 @@ static void s390_pci_read_group(S390PCIBusDevice *pbdev,
|
||||||
|
resgrp->msia = cap->msi_addr;
|
||||||
|
resgrp->mui = cap->mui;
|
||||||
|
resgrp->i = cap->noi;
|
||||||
|
- resgrp->maxstbl = cap->maxstbl;
|
||||||
|
+ if (pbdev->interp && hdr->version >= 2) {
|
||||||
|
+ resgrp->maxstbl = cap->imaxstbl;
|
||||||
|
+ } else {
|
||||||
|
+ resgrp->maxstbl = cap->maxstbl;
|
||||||
|
+ }
|
||||||
|
resgrp->version = cap->version;
|
||||||
|
resgrp->dtsm = ZPCI_DTSM;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,49 @@
|
|||||||
|
From 55294fc4a955491f1fd947e4d98bd6df832c88ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 3 Dec 2021 09:27:03 -0500
|
||||||
|
Subject: [PATCH 01/42] s390x/pci: use a reserved ID for the default PCI group
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [1/41] ad3ed38dec95acf0da04d7669fe772d798d039fc
|
||||||
|
|
||||||
|
The current default PCI group being used can technically collide with a
|
||||||
|
real group ID passed from a hostdev. Let's instead use a group ID that
|
||||||
|
comes from a special pool (0xF0-0xFF) that is architected to be reserved
|
||||||
|
for simulated devices.
|
||||||
|
|
||||||
|
Fixes: 28dc86a072 ("s390x/pci: use a PCI Group structure")
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Reviewed-by: Eric Farman <farman@linux.ibm.com>
|
||||||
|
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
|
||||||
|
Message-Id: <20211203142706.427279-2-mjrosato@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit b2892a2b9d45d25b909108ca633d19f9d8d673f5)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
include/hw/s390x/s390-pci-bus.h | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/include/hw/s390x/s390-pci-bus.h b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
index aa891c178d..2727e7bdef 100644
|
||||||
|
--- a/include/hw/s390x/s390-pci-bus.h
|
||||||
|
+++ b/include/hw/s390x/s390-pci-bus.h
|
||||||
|
@@ -313,7 +313,7 @@ typedef struct ZpciFmb {
|
||||||
|
} ZpciFmb;
|
||||||
|
QEMU_BUILD_BUG_MSG(offsetof(ZpciFmb, fmt0) != 48, "padding in ZpciFmb");
|
||||||
|
|
||||||
|
-#define ZPCI_DEFAULT_FN_GRP 0x20
|
||||||
|
+#define ZPCI_DEFAULT_FN_GRP 0xFF
|
||||||
|
typedef struct S390PCIGroup {
|
||||||
|
ClpRspQueryPciGrp zpci_group;
|
||||||
|
int id;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,59 @@
|
|||||||
|
From c251a7a16e776072b9c7bbc4e61cfa4f52599b0a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Date: Fri, 3 Dec 2021 09:27:05 -0500
|
||||||
|
Subject: [PATCH 03/42] s390x/pci: use the passthrough measurement update
|
||||||
|
interval
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [3/41] bc31ea731fe64e51522f1202e65528311397b919
|
||||||
|
|
||||||
|
We may have gotten a measurement update interval from the underlying host
|
||||||
|
via vfio -- Use it to set the interval via which we update the function
|
||||||
|
measurement block.
|
||||||
|
|
||||||
|
Fixes: 28dc86a072 ("s390x/pci: use a PCI Group structure")
|
||||||
|
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Reviewed-by: Eric Farman <farman@linux.ibm.com>
|
||||||
|
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
|
||||||
|
Message-Id: <20211203142706.427279-4-mjrosato@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit cb6d6a3e6aa1226b67fd218953dcb3866c3a6845)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-pci-inst.c | 5 +++--
|
||||||
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
|
||||||
|
index 11b7f6bfa1..07bab85ce5 100644
|
||||||
|
--- a/hw/s390x/s390-pci-inst.c
|
||||||
|
+++ b/hw/s390x/s390-pci-inst.c
|
||||||
|
@@ -1046,7 +1046,7 @@ static void fmb_update(void *opaque)
|
||||||
|
sizeof(pbdev->fmb.last_update))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
- timer_mod(pbdev->fmb_timer, t + DEFAULT_MUI);
|
||||||
|
+ timer_mod(pbdev->fmb_timer, t + pbdev->pci_group->zpci_group.mui);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar,
|
||||||
|
@@ -1204,7 +1204,8 @@ int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar,
|
||||||
|
}
|
||||||
|
pbdev->fmb_addr = fmb_addr;
|
||||||
|
timer_mod(pbdev->fmb_timer,
|
||||||
|
- qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + DEFAULT_MUI);
|
||||||
|
+ qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) +
|
||||||
|
+ pbdev->pci_group->zpci_group.mui);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
445
SOURCES/kvm-s390x-pv-Add-dump-support.patch
Normal file
445
SOURCES/kvm-s390x-pv-Add-dump-support.patch
Normal file
@ -0,0 +1,445 @@
|
|||||||
|
From 86aeb4fd7ff9395afba574e422d83f990ce1f047 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Date: Mon, 17 Oct 2022 08:38:22 +0000
|
||||||
|
Subject: [PATCH 41/42] s390x: pv: Add dump support
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [41/41] 2731c2329276e76013e3b3df21e9743bc74edd2b
|
||||||
|
|
||||||
|
Sometimes dumping a guest from the outside is the only way to get the
|
||||||
|
data that is needed. This can be the case if a dumping mechanism like
|
||||||
|
KDUMP hasn't been configured or data needs to be fetched at a specific
|
||||||
|
point. Dumping a protected guest from the outside without help from
|
||||||
|
fw/hw doesn't yield sufficient data to be useful. Hence we now
|
||||||
|
introduce PV dump support.
|
||||||
|
|
||||||
|
The PV dump support works by integrating the firmware into the dump
|
||||||
|
process. New Ultravisor calls are used to initiate the dump process,
|
||||||
|
dump cpu data, dump memory state and lastly complete the dump process.
|
||||||
|
The UV calls are exposed by KVM via the new KVM_PV_DUMP command and
|
||||||
|
its subcommands. The guest's data is fully encrypted and can only be
|
||||||
|
decrypted by the entity that owns the customer communication key for
|
||||||
|
the dumped guest. Also dumping needs to be allowed via a flag in the
|
||||||
|
SE header.
|
||||||
|
|
||||||
|
On the QEMU side of things we store the PV dump data in the newly
|
||||||
|
introduced architecture ELF sections (storage state and completion
|
||||||
|
data) and the cpu notes (for cpu dump data).
|
||||||
|
|
||||||
|
Users can use the zgetdump tool to convert the encrypted QEMU dump to an
|
||||||
|
unencrypted one.
|
||||||
|
|
||||||
|
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
|
||||||
|
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
|
||||||
|
Message-Id: <20221017083822.43118-11-frankja@linux.ibm.com>
|
||||||
|
(cherry picked from commit 113d8f4e95cf0450bea421263de6ec016c779ad0)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
dump/dump.c | 12 +-
|
||||||
|
include/sysemu/dump.h | 5 +
|
||||||
|
target/s390x/arch_dump.c | 262 +++++++++++++++++++++++++++++++++++----
|
||||||
|
3 files changed, 246 insertions(+), 33 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dump/dump.c b/dump/dump.c
|
||||||
|
index 4aa8fb64d2..5dee060b73 100644
|
||||||
|
--- a/dump/dump.c
|
||||||
|
+++ b/dump/dump.c
|
||||||
|
@@ -709,9 +709,9 @@ static void dump_begin(DumpState *s, Error **errp)
|
||||||
|
write_elf_notes(s, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int64_t dump_filtered_memblock_size(GuestPhysBlock *block,
|
||||||
|
- int64_t filter_area_start,
|
||||||
|
- int64_t filter_area_length)
|
||||||
|
+int64_t dump_filtered_memblock_size(GuestPhysBlock *block,
|
||||||
|
+ int64_t filter_area_start,
|
||||||
|
+ int64_t filter_area_length)
|
||||||
|
{
|
||||||
|
int64_t size, left, right;
|
||||||
|
|
||||||
|
@@ -729,9 +729,9 @@ static int64_t dump_filtered_memblock_size(GuestPhysBlock *block,
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int64_t dump_filtered_memblock_start(GuestPhysBlock *block,
|
||||||
|
- int64_t filter_area_start,
|
||||||
|
- int64_t filter_area_length)
|
||||||
|
+int64_t dump_filtered_memblock_start(GuestPhysBlock *block,
|
||||||
|
+ int64_t filter_area_start,
|
||||||
|
+ int64_t filter_area_length)
|
||||||
|
{
|
||||||
|
if (filter_area_length) {
|
||||||
|
/* return -1 if the block is not within filter area */
|
||||||
|
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
|
||||||
|
index 38ccac7190..4ffed0b659 100644
|
||||||
|
--- a/include/sysemu/dump.h
|
||||||
|
+++ b/include/sysemu/dump.h
|
||||||
|
@@ -215,4 +215,9 @@ typedef struct DumpState {
|
||||||
|
uint16_t cpu_to_dump16(DumpState *s, uint16_t val);
|
||||||
|
uint32_t cpu_to_dump32(DumpState *s, uint32_t val);
|
||||||
|
uint64_t cpu_to_dump64(DumpState *s, uint64_t val);
|
||||||
|
+
|
||||||
|
+int64_t dump_filtered_memblock_size(GuestPhysBlock *block, int64_t filter_area_start,
|
||||||
|
+ int64_t filter_area_length);
|
||||||
|
+int64_t dump_filtered_memblock_start(GuestPhysBlock *block, int64_t filter_area_start,
|
||||||
|
+ int64_t filter_area_length);
|
||||||
|
#endif
|
||||||
|
diff --git a/target/s390x/arch_dump.c b/target/s390x/arch_dump.c
|
||||||
|
index f60a14920d..a2329141e8 100644
|
||||||
|
--- a/target/s390x/arch_dump.c
|
||||||
|
+++ b/target/s390x/arch_dump.c
|
||||||
|
@@ -12,11 +12,13 @@
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
+#include "qemu/units.h"
|
||||||
|
#include "cpu.h"
|
||||||
|
#include "s390x-internal.h"
|
||||||
|
#include "elf.h"
|
||||||
|
#include "sysemu/dump.h"
|
||||||
|
-
|
||||||
|
+#include "hw/s390x/pv.h"
|
||||||
|
+#include "kvm/kvm_s390x.h"
|
||||||
|
|
||||||
|
struct S390xUserRegsStruct {
|
||||||
|
uint64_t psw[2];
|
||||||
|
@@ -76,9 +78,16 @@ typedef struct noteStruct {
|
||||||
|
uint64_t todcmp;
|
||||||
|
uint32_t todpreg;
|
||||||
|
uint64_t ctrs[16];
|
||||||
|
+ uint8_t dynamic[1]; /*
|
||||||
|
+ * Would be a flexible array member, if
|
||||||
|
+ * that was legal inside a union. Real
|
||||||
|
+ * size comes from PV info interface.
|
||||||
|
+ */
|
||||||
|
} contents;
|
||||||
|
} QEMU_PACKED Note;
|
||||||
|
|
||||||
|
+static bool pv_dump_initialized;
|
||||||
|
+
|
||||||
|
static void s390x_write_elf64_prstatus(Note *note, S390CPU *cpu, int id)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
@@ -177,28 +186,39 @@ static void s390x_write_elf64_prefix(Note *note, S390CPU *cpu, int id)
|
||||||
|
note->contents.prefix = cpu_to_be32((uint32_t)(cpu->env.psa));
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void s390x_write_elf64_pv(Note *note, S390CPU *cpu, int id)
|
||||||
|
+{
|
||||||
|
+ note->hdr.n_type = cpu_to_be32(NT_S390_PV_CPU_DATA);
|
||||||
|
+ if (!pv_dump_initialized) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ kvm_s390_dump_cpu(cpu, ¬e->contents.dynamic);
|
||||||
|
+}
|
||||||
|
|
||||||
|
typedef struct NoteFuncDescStruct {
|
||||||
|
int contents_size;
|
||||||
|
+ uint64_t (*note_size_func)(void); /* NULL for non-dynamic sized contents */
|
||||||
|
void (*note_contents_func)(Note *note, S390CPU *cpu, int id);
|
||||||
|
+ bool pvonly;
|
||||||
|
} NoteFuncDesc;
|
||||||
|
|
||||||
|
static const NoteFuncDesc note_core[] = {
|
||||||
|
- {sizeof_field(Note, contents.prstatus), s390x_write_elf64_prstatus},
|
||||||
|
- {sizeof_field(Note, contents.fpregset), s390x_write_elf64_fpregset},
|
||||||
|
- { 0, NULL}
|
||||||
|
+ {sizeof_field(Note, contents.prstatus), NULL, s390x_write_elf64_prstatus, false},
|
||||||
|
+ {sizeof_field(Note, contents.fpregset), NULL, s390x_write_elf64_fpregset, false},
|
||||||
|
+ { 0, NULL, NULL, false}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const NoteFuncDesc note_linux[] = {
|
||||||
|
- {sizeof_field(Note, contents.prefix), s390x_write_elf64_prefix},
|
||||||
|
- {sizeof_field(Note, contents.ctrs), s390x_write_elf64_ctrs},
|
||||||
|
- {sizeof_field(Note, contents.timer), s390x_write_elf64_timer},
|
||||||
|
- {sizeof_field(Note, contents.todcmp), s390x_write_elf64_todcmp},
|
||||||
|
- {sizeof_field(Note, contents.todpreg), s390x_write_elf64_todpreg},
|
||||||
|
- {sizeof_field(Note, contents.vregslo), s390x_write_elf64_vregslo},
|
||||||
|
- {sizeof_field(Note, contents.vregshi), s390x_write_elf64_vregshi},
|
||||||
|
- {sizeof_field(Note, contents.gscb), s390x_write_elf64_gscb},
|
||||||
|
- { 0, NULL}
|
||||||
|
+ {sizeof_field(Note, contents.prefix), NULL, s390x_write_elf64_prefix, false},
|
||||||
|
+ {sizeof_field(Note, contents.ctrs), NULL, s390x_write_elf64_ctrs, false},
|
||||||
|
+ {sizeof_field(Note, contents.timer), NULL, s390x_write_elf64_timer, false},
|
||||||
|
+ {sizeof_field(Note, contents.todcmp), NULL, s390x_write_elf64_todcmp, false},
|
||||||
|
+ {sizeof_field(Note, contents.todpreg), NULL, s390x_write_elf64_todpreg, false},
|
||||||
|
+ {sizeof_field(Note, contents.vregslo), NULL, s390x_write_elf64_vregslo, false},
|
||||||
|
+ {sizeof_field(Note, contents.vregshi), NULL, s390x_write_elf64_vregshi, false},
|
||||||
|
+ {sizeof_field(Note, contents.gscb), NULL, s390x_write_elf64_gscb, false},
|
||||||
|
+ {0, kvm_s390_pv_dmp_get_size_cpu, s390x_write_elf64_pv, true},
|
||||||
|
+ { 0, NULL, NULL, false}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int s390x_write_elf64_notes(const char *note_name,
|
||||||
|
@@ -207,22 +227,41 @@ static int s390x_write_elf64_notes(const char *note_name,
|
||||||
|
DumpState *s,
|
||||||
|
const NoteFuncDesc *funcs)
|
||||||
|
{
|
||||||
|
- Note note;
|
||||||
|
+ Note note, *notep;
|
||||||
|
const NoteFuncDesc *nf;
|
||||||
|
- int note_size;
|
||||||
|
+ int note_size, content_size;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
assert(strlen(note_name) < sizeof(note.name));
|
||||||
|
|
||||||
|
for (nf = funcs; nf->note_contents_func; nf++) {
|
||||||
|
- memset(¬e, 0, sizeof(note));
|
||||||
|
- note.hdr.n_namesz = cpu_to_be32(strlen(note_name) + 1);
|
||||||
|
- note.hdr.n_descsz = cpu_to_be32(nf->contents_size);
|
||||||
|
- g_strlcpy(note.name, note_name, sizeof(note.name));
|
||||||
|
- (*nf->note_contents_func)(¬e, cpu, id);
|
||||||
|
+ notep = ¬e;
|
||||||
|
+ if (nf->pvonly && !s390_is_pv()) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ content_size = nf->note_size_func ? nf->note_size_func() : nf->contents_size;
|
||||||
|
+ note_size = sizeof(note) - sizeof(notep->contents) + content_size;
|
||||||
|
+
|
||||||
|
+ /* Notes with dynamic sizes need to allocate a note */
|
||||||
|
+ if (nf->note_size_func) {
|
||||||
|
+ notep = g_malloc(note_size);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ memset(notep, 0, sizeof(note));
|
||||||
|
|
||||||
|
- note_size = sizeof(note) - sizeof(note.contents) + nf->contents_size;
|
||||||
|
- ret = f(¬e, note_size, s);
|
||||||
|
+ /* Setup note header data */
|
||||||
|
+ notep->hdr.n_descsz = cpu_to_be32(content_size);
|
||||||
|
+ notep->hdr.n_namesz = cpu_to_be32(strlen(note_name) + 1);
|
||||||
|
+ g_strlcpy(notep->name, note_name, sizeof(notep->name));
|
||||||
|
+
|
||||||
|
+ /* Get contents and write them out */
|
||||||
|
+ (*nf->note_contents_func)(notep, cpu, id);
|
||||||
|
+ ret = f(notep, note_size, s);
|
||||||
|
+
|
||||||
|
+ if (nf->note_size_func) {
|
||||||
|
+ g_free(notep);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
@@ -247,13 +286,179 @@ int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
return s390x_write_elf64_notes("LINUX", f, cpu, cpuid, s, note_linux);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* PV dump section size functions */
|
||||||
|
+static uint64_t get_mem_state_size_from_len(uint64_t len)
|
||||||
|
+{
|
||||||
|
+ return (len / (MiB)) * kvm_s390_pv_dmp_get_size_mem_state();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static uint64_t get_size_mem_state(DumpState *s)
|
||||||
|
+{
|
||||||
|
+ return get_mem_state_size_from_len(s->total_size);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static uint64_t get_size_completion_data(DumpState *s)
|
||||||
|
+{
|
||||||
|
+ return kvm_s390_pv_dmp_get_size_completion_data();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* PV dump section data functions*/
|
||||||
|
+static int get_data_completion(DumpState *s, uint8_t *buff)
|
||||||
|
+{
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ if (!pv_dump_initialized) {
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ rc = kvm_s390_dump_completion_data(buff);
|
||||||
|
+ if (!rc) {
|
||||||
|
+ pv_dump_initialized = false;
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int get_mem_state(DumpState *s, uint8_t *buff)
|
||||||
|
+{
|
||||||
|
+ int64_t memblock_size, memblock_start;
|
||||||
|
+ GuestPhysBlock *block;
|
||||||
|
+ uint64_t off;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
|
||||||
|
+ memblock_start = dump_filtered_memblock_start(block, s->filter_area_begin,
|
||||||
|
+ s->filter_area_length);
|
||||||
|
+ if (memblock_start == -1) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ memblock_size = dump_filtered_memblock_size(block, s->filter_area_begin,
|
||||||
|
+ s->filter_area_length);
|
||||||
|
+
|
||||||
|
+ off = get_mem_state_size_from_len(block->target_start);
|
||||||
|
+
|
||||||
|
+ rc = kvm_s390_dump_mem_state(block->target_start,
|
||||||
|
+ get_mem_state_size_from_len(memblock_size),
|
||||||
|
+ buff + off);
|
||||||
|
+ if (rc) {
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct sections {
|
||||||
|
+ uint64_t (*sections_size_func)(DumpState *s);
|
||||||
|
+ int (*sections_contents_func)(DumpState *s, uint8_t *buff);
|
||||||
|
+ char sctn_str[12];
|
||||||
|
+} sections[] = {
|
||||||
|
+ { get_size_mem_state, get_mem_state, "pv_mem_meta"},
|
||||||
|
+ { get_size_completion_data, get_data_completion, "pv_compl"},
|
||||||
|
+ {NULL , NULL, ""}
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static uint64_t arch_sections_write_hdr(DumpState *s, uint8_t *buff)
|
||||||
|
+{
|
||||||
|
+ Elf64_Shdr *shdr = (void *)buff;
|
||||||
|
+ struct sections *sctn = sections;
|
||||||
|
+ uint64_t off = s->section_offset;
|
||||||
|
+
|
||||||
|
+ if (!pv_dump_initialized) {
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (; sctn->sections_size_func; off += shdr->sh_size, sctn++, shdr++) {
|
||||||
|
+ memset(shdr, 0, sizeof(*shdr));
|
||||||
|
+ shdr->sh_type = SHT_PROGBITS;
|
||||||
|
+ shdr->sh_offset = off;
|
||||||
|
+ shdr->sh_size = sctn->sections_size_func(s);
|
||||||
|
+ shdr->sh_name = s->string_table_buf->len;
|
||||||
|
+ g_array_append_vals(s->string_table_buf, sctn->sctn_str, sizeof(sctn->sctn_str));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return (uintptr_t)shdr - (uintptr_t)buff;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* Add arch specific number of sections and their respective sizes */
|
||||||
|
+static void arch_sections_add(DumpState *s)
|
||||||
|
+{
|
||||||
|
+ struct sections *sctn = sections;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * We only do a PV dump if we are running a PV guest, KVM supports
|
||||||
|
+ * the dump API and we got valid dump length information.
|
||||||
|
+ */
|
||||||
|
+ if (!s390_is_pv() || !kvm_s390_get_protected_dump() ||
|
||||||
|
+ !kvm_s390_pv_info_basic_valid()) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Start the UV dump process by doing the initialize dump call via
|
||||||
|
+ * KVM as the proxy.
|
||||||
|
+ */
|
||||||
|
+ if (!kvm_s390_dump_init()) {
|
||||||
|
+ pv_dump_initialized = true;
|
||||||
|
+ } else {
|
||||||
|
+ /*
|
||||||
|
+ * Dump init failed, maybe the guest owner disabled dumping.
|
||||||
|
+ * We'll continue the non-PV dump process since this is no
|
||||||
|
+ * reason to crash qemu.
|
||||||
|
+ */
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (; sctn->sections_size_func; sctn++) {
|
||||||
|
+ s->shdr_num += 1;
|
||||||
|
+ s->elf_section_data_size += sctn->sections_size_func(s);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * After the PV dump has been initialized, the CPU data has been
|
||||||
|
+ * fetched and memory has been dumped, we need to grab the tweak data
|
||||||
|
+ * and the completion data.
|
||||||
|
+ */
|
||||||
|
+static int arch_sections_write(DumpState *s, uint8_t *buff)
|
||||||
|
+{
|
||||||
|
+ struct sections *sctn = sections;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ if (!pv_dump_initialized) {
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (; sctn->sections_size_func; sctn++) {
|
||||||
|
+ rc = sctn->sections_contents_func(s, buff);
|
||||||
|
+ buff += sctn->sections_size_func(s);
|
||||||
|
+ if (rc) {
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int cpu_get_dump_info(ArchDumpInfo *info,
|
||||||
|
const struct GuestPhysBlockList *guest_phys_blocks)
|
||||||
|
{
|
||||||
|
info->d_machine = EM_S390;
|
||||||
|
info->d_endian = ELFDATA2MSB;
|
||||||
|
info->d_class = ELFCLASS64;
|
||||||
|
-
|
||||||
|
+ /*
|
||||||
|
+ * This is evaluated for each dump so we can freely switch
|
||||||
|
+ * between PV and non-PV.
|
||||||
|
+ */
|
||||||
|
+ if (s390_is_pv() && kvm_s390_get_protected_dump() &&
|
||||||
|
+ kvm_s390_pv_info_basic_valid()) {
|
||||||
|
+ info->arch_sections_add_fn = *arch_sections_add;
|
||||||
|
+ info->arch_sections_write_hdr_fn = *arch_sections_write_hdr;
|
||||||
|
+ info->arch_sections_write_fn = *arch_sections_write;
|
||||||
|
+ } else {
|
||||||
|
+ info->arch_sections_add_fn = NULL;
|
||||||
|
+ info->arch_sections_write_hdr_fn = NULL;
|
||||||
|
+ info->arch_sections_write_fn = NULL;
|
||||||
|
+ }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -261,7 +466,7 @@ ssize_t cpu_get_note_size(int class, int machine, int nr_cpus)
|
||||||
|
{
|
||||||
|
int name_size = 8; /* "LINUX" or "CORE" + pad */
|
||||||
|
size_t elf_note_size = 0;
|
||||||
|
- int note_head_size;
|
||||||
|
+ int note_head_size, content_size;
|
||||||
|
const NoteFuncDesc *nf;
|
||||||
|
|
||||||
|
assert(class == ELFCLASS64);
|
||||||
|
@@ -270,12 +475,15 @@ ssize_t cpu_get_note_size(int class, int machine, int nr_cpus)
|
||||||
|
note_head_size = sizeof(Elf64_Nhdr);
|
||||||
|
|
||||||
|
for (nf = note_core; nf->note_contents_func; nf++) {
|
||||||
|
- elf_note_size = elf_note_size + note_head_size + name_size +
|
||||||
|
- nf->contents_size;
|
||||||
|
+ elf_note_size = elf_note_size + note_head_size + name_size + nf->contents_size;
|
||||||
|
}
|
||||||
|
for (nf = note_linux; nf->note_contents_func; nf++) {
|
||||||
|
+ if (nf->pvonly && !s390_is_pv()) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ content_size = nf->contents_size ? nf->contents_size : nf->note_size_func();
|
||||||
|
elf_note_size = elf_note_size + note_head_size + name_size +
|
||||||
|
- nf->contents_size;
|
||||||
|
+ content_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (elf_note_size) * nr_cpus;
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,55 @@
|
|||||||
|
From c7b14d3af7c73a3bf0c00911b85f202840d9b414 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= <clg@redhat.com>
|
||||||
|
Date: Mon, 7 Nov 2022 17:13:49 +0100
|
||||||
|
Subject: [PATCH 12/42] s390x/s390-virtio-ccw: Switch off zPCI enhancements on
|
||||||
|
older machines
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
|
||||||
|
RH-Bugzilla: 1664378 2043909
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-Commit: [12/41] 61e32bab6d68ee9abd6a0751944af82e002b05b4
|
||||||
|
|
||||||
|
zPCI enhancement features (interpretation and forward assist) were
|
||||||
|
recently introduced to improve performance on PCI passthrough devices.
|
||||||
|
To maintain the same behaviour on older Z machines, deactivate the
|
||||||
|
features with the associated properties.
|
||||||
|
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
Message-Id: <20221107161349.1032730-3-clg@kaod.org>
|
||||||
|
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit d3d1a406127f7da482eafbdc871c120c2770bb91)
|
||||||
|
[ clg: applied zPCI restrictions to rhel8.5.0 machine and below ]
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/s390-virtio-ccw.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
|
||||||
|
index bec270598b..bd80e72cf8 100644
|
||||||
|
--- a/hw/s390x/s390-virtio-ccw.c
|
||||||
|
+++ b/hw/s390x/s390-virtio-ccw.c
|
||||||
|
@@ -1130,8 +1130,14 @@ static void ccw_machine_rhel850_instance_options(MachineState *machine)
|
||||||
|
|
||||||
|
static void ccw_machine_rhel850_class_options(MachineClass *mc)
|
||||||
|
{
|
||||||
|
+ static GlobalProperty compat[] = {
|
||||||
|
+ { TYPE_S390_PCI_DEVICE, "interpret", "off", },
|
||||||
|
+ { TYPE_S390_PCI_DEVICE, "forwarding-assist", "off", },
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
ccw_machine_rhel860_class_options(mc);
|
||||||
|
compat_props_add(mc->compat_props, hw_compat_rhel_8_5, hw_compat_rhel_8_5_len);
|
||||||
|
+ compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||||
|
mc->smp_props.prefer_sockets = true;
|
||||||
|
}
|
||||||
|
DEFINE_CCW_MACHINE(rhel850, "rhel8.5.0", false);
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,70 @@
|
|||||||
|
From 90fcfe4b07afc5299c5ee69fa663ca46b597fd4b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nico Boehr <nrb@linux.ibm.com>
|
||||||
|
Date: Wed, 12 Oct 2022 14:32:29 +0200
|
||||||
|
Subject: [PATCH] s390x/tod-kvm: don't save/restore the TOD in PV guests
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||||
|
RH-MergeRequest: 244: s390x/tod-kvm: don't save/restore the TOD in PV guests
|
||||||
|
RH-Bugzilla: 2155448
|
||||||
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Commit: [1/1] 3cb3154dd7c1549c54cf8c0483b5f23b235f6db3
|
||||||
|
|
||||||
|
Under PV, the guest's TOD clock is under control of the ultravisor and the
|
||||||
|
hypervisor cannot change it.
|
||||||
|
|
||||||
|
With upcoming kernel changes[1], the Linux kernel will reject QEMU's
|
||||||
|
request to adjust the guest's clock in this case, so don't attempt to set
|
||||||
|
the clock.
|
||||||
|
|
||||||
|
This avoids the following warning message on save/restore of a PV guest:
|
||||||
|
|
||||||
|
warning: Unable to set KVM guest TOD clock: Operation not supported
|
||||||
|
|
||||||
|
[1] https://lore.kernel.org/all/20221011160712.928239-2-nrb@linux.ibm.com/
|
||||||
|
|
||||||
|
Fixes: c3347ed0d2ee ("s390x: protvirt: Support unpack facility")
|
||||||
|
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
|
||||||
|
Message-Id: <20221012123229.1196007-1-nrb@linux.ibm.com>
|
||||||
|
[thuth: Add curly braces]
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit 38621181ae3cbec62e3490fbc14f6ac01642d07a)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
hw/s390x/tod-kvm.c | 9 +++++++++
|
||||||
|
1 file changed, 9 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/tod-kvm.c b/hw/s390x/tod-kvm.c
|
||||||
|
index ec855811ae..c804c979b5 100644
|
||||||
|
--- a/hw/s390x/tod-kvm.c
|
||||||
|
+++ b/hw/s390x/tod-kvm.c
|
||||||
|
@@ -13,6 +13,7 @@
|
||||||
|
#include "qemu/module.h"
|
||||||
|
#include "sysemu/runstate.h"
|
||||||
|
#include "hw/s390x/tod.h"
|
||||||
|
+#include "hw/s390x/pv.h"
|
||||||
|
#include "kvm/kvm_s390x.h"
|
||||||
|
|
||||||
|
static void kvm_s390_get_tod_raw(S390TOD *tod, Error **errp)
|
||||||
|
@@ -84,6 +85,14 @@ static void kvm_s390_tod_vm_state_change(void *opaque, bool running,
|
||||||
|
S390TODState *td = opaque;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Under PV, the clock is under ultravisor control, hence we cannot restore
|
||||||
|
+ * it on resume.
|
||||||
|
+ */
|
||||||
|
+ if (s390_is_pv()) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (running && td->stopped) {
|
||||||
|
/* Set the old TOD when running the VM - start the TOD clock. */
|
||||||
|
kvm_s390_set_tod_raw(&td->base, &local_err);
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,65 @@
|
|||||||
|
From 3014c7c11b6e64433fe9f3c463bd91e318ac96b6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
Date: Wed, 9 Nov 2022 18:41:18 -0500
|
||||||
|
Subject: [PATCH 2/2] target/arm/kvm: Retry KVM_CREATE_VM call if it fails
|
||||||
|
EINTR
|
||||||
|
|
||||||
|
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-MergeRequest: 228: qemu-kvm: backport some aarch64 fixes
|
||||||
|
RH-Bugzilla: 2132609
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||||||
|
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||||
|
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||||
|
RH-Commit: [2/2] 8494bbfb3fcd8693f56312f984d2964d1ca275c2 (jmaloy/qemu-kvm)
|
||||||
|
|
||||||
|
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2132609
|
||||||
|
Upstream: Merged
|
||||||
|
|
||||||
|
commit bbde13cd14ad4eec18529ce0bf5876058464e124
|
||||||
|
Author: Peter Maydell <peter.maydell@linaro.org>
|
||||||
|
Date: Fri Sep 30 12:38:24 2022 +0100
|
||||||
|
|
||||||
|
target/arm/kvm: Retry KVM_CREATE_VM call if it fails EINTR
|
||||||
|
|
||||||
|
Occasionally the KVM_CREATE_VM ioctl can return EINTR, even though
|
||||||
|
there is no pending signal to be taken. In commit 94ccff13382055
|
||||||
|
we added a retry-on-EINTR loop to the KVM_CREATE_VM call in the
|
||||||
|
generic KVM code. Adopt the same approach for the use of the
|
||||||
|
ioctl in the Arm-specific KVM code (where we use it to create a
|
||||||
|
scratch VM for probing for various things).
|
||||||
|
|
||||||
|
For more information, see the mailing list thread:
|
||||||
|
https://lore.kernel.org/qemu-devel/8735e0s1zw.wl-maz@kernel.org/
|
||||||
|
|
||||||
|
Reported-by: Vitaly Chikunov <vt@altlinux.org>
|
||||||
|
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||||
|
Reviewed-by: Vitaly Chikunov <vt@altlinux.org>
|
||||||
|
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||||
|
Acked-by: Marc Zyngier <maz@kernel.org>
|
||||||
|
Message-id: 20220930113824.1933293-1-peter.maydell@linaro.org
|
||||||
|
|
||||||
|
(cherry picked from commit bbde13cd14ad4eec18529ce0bf5876058464e124)
|
||||||
|
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
---
|
||||||
|
target/arm/kvm.c | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
|
||||||
|
index bbf1ce7ba3..1ae4e51055 100644
|
||||||
|
--- a/target/arm/kvm.c
|
||||||
|
+++ b/target/arm/kvm.c
|
||||||
|
@@ -80,7 +80,9 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t *cpus_to_try,
|
||||||
|
if (max_vm_pa_size < 0) {
|
||||||
|
max_vm_pa_size = 0;
|
||||||
|
}
|
||||||
|
- vmfd = ioctl(kvmfd, KVM_CREATE_VM, max_vm_pa_size);
|
||||||
|
+ do {
|
||||||
|
+ vmfd = ioctl(kvmfd, KVM_CREATE_VM, max_vm_pa_size);
|
||||||
|
+ } while (vmfd == -1 && errno == EINTR);
|
||||||
|
if (vmfd < 0) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,106 @@
|
|||||||
|
From 8d1a60069cddcc69ef1a6f50f2b55343de348b57 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Date: Fri, 6 May 2022 17:39:56 +0200
|
||||||
|
Subject: [PATCH 2/3] target/s390x: kvm: Honor storage keys during emulation
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Cédric Le Goater <None>
|
||||||
|
RH-MergeRequest: 220: s390x: Fix skey test in kvm_unit_test
|
||||||
|
RH-Bugzilla: 2124757
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Commit: [2/2] 980dbb4eba8d2f1da7cf4113230d0a6483cffc4f
|
||||||
|
|
||||||
|
Storage key controlled protection is currently not honored when
|
||||||
|
emulating instructions.
|
||||||
|
If available, enable key protection for the MEM_OP ioctl, thereby
|
||||||
|
enabling it for the s390_cpu_virt_mem_* functions, when using kvm.
|
||||||
|
As a result, the emulation of the following instructions honors storage
|
||||||
|
keys:
|
||||||
|
|
||||||
|
* CLP
|
||||||
|
The Synch I/O CLP command would need special handling in order
|
||||||
|
to support storage keys, but is currently not supported.
|
||||||
|
* CHSC
|
||||||
|
Performing commands asynchronously would require special
|
||||||
|
handling, but commands are currently always synchronous.
|
||||||
|
* STSI
|
||||||
|
* TSCH
|
||||||
|
Must (and does) not change channel if terminated due to
|
||||||
|
protection.
|
||||||
|
* MSCH
|
||||||
|
Suppressed on protection, works because fetching instruction.
|
||||||
|
* SSCH
|
||||||
|
Suppressed on protection, works because fetching instruction.
|
||||||
|
* STSCH
|
||||||
|
* STCRW
|
||||||
|
Suppressed on protection, this works because no partial store is
|
||||||
|
possible, because the operand cannot span multiple pages.
|
||||||
|
* PCISTB
|
||||||
|
* MPCIFC
|
||||||
|
* STPCIFC
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2124757
|
||||||
|
|
||||||
|
Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
|
||||||
|
Message-Id: <20220506153956.2217601-3-scgl@linux.ibm.com>
|
||||||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
(cherry picked from commit 54354861d21b69ec0781f43e67b8d4f6edad7e3f)
|
||||||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||||
|
---
|
||||||
|
target/s390x/kvm/kvm.c | 9 +++++++++
|
||||||
|
1 file changed, 9 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
|
||||||
|
index c52434985b..ba04997da1 100644
|
||||||
|
--- a/target/s390x/kvm/kvm.c
|
||||||
|
+++ b/target/s390x/kvm/kvm.c
|
||||||
|
@@ -152,12 +152,15 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
|
||||||
|
static int cap_sync_regs;
|
||||||
|
static int cap_async_pf;
|
||||||
|
static int cap_mem_op;
|
||||||
|
+static int cap_mem_op_extension;
|
||||||
|
static int cap_s390_irq;
|
||||||
|
static int cap_ri;
|
||||||
|
static int cap_hpage_1m;
|
||||||
|
static int cap_vcpu_resets;
|
||||||
|
static int cap_protected;
|
||||||
|
|
||||||
|
+static bool mem_op_storage_key_support;
|
||||||
|
+
|
||||||
|
static int active_cmma;
|
||||||
|
|
||||||
|
static int kvm_s390_query_mem_limit(uint64_t *memory_limit)
|
||||||
|
@@ -355,6 +358,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||||
|
cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
|
||||||
|
cap_async_pf = kvm_check_extension(s, KVM_CAP_ASYNC_PF);
|
||||||
|
cap_mem_op = kvm_check_extension(s, KVM_CAP_S390_MEM_OP);
|
||||||
|
+ cap_mem_op_extension = kvm_check_extension(s, KVM_CAP_S390_MEM_OP_EXTENSION);
|
||||||
|
+ mem_op_storage_key_support = cap_mem_op_extension > 0;
|
||||||
|
cap_s390_irq = kvm_check_extension(s, KVM_CAP_S390_INJECT_IRQ);
|
||||||
|
cap_vcpu_resets = kvm_check_extension(s, KVM_CAP_S390_VCPU_RESETS);
|
||||||
|
cap_protected = kvm_check_extension(s, KVM_CAP_S390_PROTECTED);
|
||||||
|
@@ -843,6 +848,7 @@ int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf,
|
||||||
|
: KVM_S390_MEMOP_LOGICAL_READ,
|
||||||
|
.buf = (uint64_t)hostbuf,
|
||||||
|
.ar = ar,
|
||||||
|
+ .key = (cpu->env.psw.mask & PSW_MASK_KEY) >> PSW_SHIFT_KEY,
|
||||||
|
};
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
@@ -852,6 +858,9 @@ int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf,
|
||||||
|
if (!hostbuf) {
|
||||||
|
mem_op.flags |= KVM_S390_MEMOP_F_CHECK_ONLY;
|
||||||
|
}
|
||||||
|
+ if (mem_op_storage_key_support) {
|
||||||
|
+ mem_op.flags |= KVM_S390_MEMOP_F_SKEY_PROTECTION;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
ret = kvm_vcpu_ioctl(CPU(cpu), KVM_S390_MEM_OP, &mem_op);
|
||||||
|
if (ret < 0) {
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
@ -0,0 +1,80 @@
|
|||||||
|
From d3602e5afa1e90c5e33625fc528db7f96195bada Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
Date: Mon, 7 Nov 2022 19:59:46 -0500
|
||||||
|
Subject: [PATCH 42/42] ui/vnc-clipboard: fix integer underflow in
|
||||||
|
vnc_client_cut_text_ext
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-MergeRequest: 227: ui/vnc-clipboard: fix integer underflow in vnc_client_cut_text_ext
|
||||||
|
RH-Bugzilla: 2129760
|
||||||
|
RH-Acked-by: Mauro Matteo Cascella <None>
|
||||||
|
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
RH-Commit: [1/1] ac19a6c0777e308061bcb6d1de5cc9beaa105a3a (jmaloy/qemu-kvm)
|
||||||
|
|
||||||
|
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2129760
|
||||||
|
CVE: CVE-2022-3165
|
||||||
|
Upstream: Merged
|
||||||
|
|
||||||
|
commit d307040b18bfcb1393b910f1bae753d5c12a4dc7
|
||||||
|
Author: Mauro Matteo Cascella <mcascell@redhat.com>
|
||||||
|
Date: Sun Sep 25 22:45:11 2022 +0200
|
||||||
|
|
||||||
|
ui/vnc-clipboard: fix integer underflow in vnc_client_cut_text_ext
|
||||||
|
|
||||||
|
Extended ClientCutText messages start with a 4-byte header. If len < 4,
|
||||||
|
an integer underflow occurs in vnc_client_cut_text_ext. The result is
|
||||||
|
used to decompress data in a while loop in inflate_buffer, leading to
|
||||||
|
CPU consumption and denial of service. Prevent this by checking dlen in
|
||||||
|
protocol_client_msg.
|
||||||
|
|
||||||
|
Fixes: CVE-2022-3165
|
||||||
|
Fixes: 0bf41cab93e5 ("ui/vnc: clipboard support")
|
||||||
|
Reported-by: TangPeng <tangpeng@qianxin.com>
|
||||||
|
Signed-off-by: Mauro Matteo Cascella <mcascell@redhat.com>
|
||||||
|
Message-Id: <20220925204511.1103214-1-mcascell@redhat.com>
|
||||||
|
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
|
||||||
|
(cherry picked from commit d307040b18bfcb1393b910f1bae753d5c12a4dc7)
|
||||||
|
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
---
|
||||||
|
ui/vnc.c | 11 ++++++++---
|
||||||
|
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ui/vnc.c b/ui/vnc.c
|
||||||
|
index af02522e84..a14b6861be 100644
|
||||||
|
--- a/ui/vnc.c
|
||||||
|
+++ b/ui/vnc.c
|
||||||
|
@@ -2442,8 +2442,8 @@ static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
|
||||||
|
if (len == 1) {
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
+ uint32_t dlen = abs(read_s32(data, 4));
|
||||||
|
if (len == 8) {
|
||||||
|
- uint32_t dlen = abs(read_s32(data, 4));
|
||||||
|
if (dlen > (1 << 20)) {
|
||||||
|
error_report("vnc: client_cut_text msg payload has %u bytes"
|
||||||
|
" which exceeds our limit of 1MB.", dlen);
|
||||||
|
@@ -2456,8 +2456,13 @@ static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (read_s32(data, 4) < 0) {
|
||||||
|
- vnc_client_cut_text_ext(vs, abs(read_s32(data, 4)),
|
||||||
|
- read_u32(data, 8), data + 12);
|
||||||
|
+ if (dlen < 4) {
|
||||||
|
+ error_report("vnc: malformed payload (header less than 4 bytes)"
|
||||||
|
+ " in extended clipboard pseudo-encoding.");
|
||||||
|
+ vnc_client_error(vs);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ vnc_client_cut_text_ext(vs, dlen, read_u32(data, 8), data + 12);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vnc_client_cut_text(vs, read_u32(data, 4), data + 8);
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
90
SOURCES/kvm-ui-vnc.c-Fixed-a-deadlock-bug.patch
Normal file
90
SOURCES/kvm-ui-vnc.c-Fixed-a-deadlock-bug.patch
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
From ffdf44cb8b4c743e7ab0ce46d62687d7178f9a49 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
Date: Fri, 18 Nov 2022 20:26:54 -0500
|
||||||
|
Subject: [PATCH 3/3] ui/vnc.c: Fixed a deadlock bug.
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
RH-MergeRequest: 234: ui/vnc.c: Fixed a deadlock bug.
|
||||||
|
RH-Bugzilla: 2141896
|
||||||
|
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
RH-Commit: [1/1] d3d1d28d7b621a8ae8a593a5bd5303fa7951c17c (jmaloy/qemu-kvm)
|
||||||
|
|
||||||
|
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2141896
|
||||||
|
Upstream: Merged
|
||||||
|
|
||||||
|
commit 1dbbe6f172810026c51dc84ed927a3cc23017949
|
||||||
|
Author: Rao Lei <lei.rao@intel.com>
|
||||||
|
Date: Wed Jan 5 10:08:08 2022 +0800
|
||||||
|
|
||||||
|
ui/vnc.c: Fixed a deadlock bug.
|
||||||
|
|
||||||
|
The GDB statck is as follows:
|
||||||
|
(gdb) bt
|
||||||
|
0 __lll_lock_wait (futex=futex@entry=0x56211df20360, private=0) at lowlevellock.c:52
|
||||||
|
1 0x00007f263caf20a3 in __GI___pthread_mutex_lock (mutex=0x56211df20360) at ../nptl/pthread_mutex_lock.c:80
|
||||||
|
2 0x000056211a757364 in qemu_mutex_lock_impl (mutex=0x56211df20360, file=0x56211a804857 "../ui/vnc-jobs.h", line=60)
|
||||||
|
at ../util/qemu-thread-posix.c:80
|
||||||
|
3 0x000056211a0ef8c7 in vnc_lock_output (vs=0x56211df14200) at ../ui/vnc-jobs.h:60
|
||||||
|
4 0x000056211a0efcb7 in vnc_clipboard_send (vs=0x56211df14200, count=1, dwords=0x7ffdf1701338) at ../ui/vnc-clipboard.c:138
|
||||||
|
5 0x000056211a0f0129 in vnc_clipboard_notify (notifier=0x56211df244c8, data=0x56211dd1bbf0) at ../ui/vnc-clipboard.c:209
|
||||||
|
6 0x000056211a75dde8 in notifier_list_notify (list=0x56211afa17d0 <clipboard_notifiers>, data=0x56211dd1bbf0) at ../util/notify.c:39
|
||||||
|
7 0x000056211a0bf0e6 in qemu_clipboard_update (info=0x56211dd1bbf0) at ../ui/clipboard.c:50
|
||||||
|
8 0x000056211a0bf05d in qemu_clipboard_peer_release (peer=0x56211df244c0, selection=QEMU_CLIPBOARD_SELECTION_CLIPBOARD)
|
||||||
|
at ../ui/clipboard.c:41
|
||||||
|
9 0x000056211a0bef9b in qemu_clipboard_peer_unregister (peer=0x56211df244c0) at ../ui/clipboard.c:19
|
||||||
|
10 0x000056211a0d45f3 in vnc_disconnect_finish (vs=0x56211df14200) at ../ui/vnc.c:1358
|
||||||
|
11 0x000056211a0d4c9d in vnc_client_read (vs=0x56211df14200) at ../ui/vnc.c:1611
|
||||||
|
12 0x000056211a0d4df8 in vnc_client_io (ioc=0x56211ce70690, condition=G_IO_IN, opaque=0x56211df14200) at ../ui/vnc.c:1649
|
||||||
|
13 0x000056211a5b976c in qio_channel_fd_source_dispatch
|
||||||
|
(source=0x56211ce50a00, callback=0x56211a0d4d71 <vnc_client_io>, user_data=0x56211df14200) at ../io/channel-watch.c:84
|
||||||
|
14 0x00007f263ccede8e in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
|
||||||
|
15 0x000056211a77d4a1 in glib_pollfds_poll () at ../util/main-loop.c:232
|
||||||
|
16 0x000056211a77d51f in os_host_main_loop_wait (timeout=958545) at ../util/main-loop.c:255
|
||||||
|
17 0x000056211a77d630 in main_loop_wait (nonblocking=0) at ../util/main-loop.c:531
|
||||||
|
18 0x000056211a45bc8e in qemu_main_loop () at ../softmmu/runstate.c:726
|
||||||
|
19 0x000056211a0b45fa in main (argc=69, argv=0x7ffdf1701778, envp=0x7ffdf17019a8) at ../softmmu/main.c:50
|
||||||
|
|
||||||
|
From the call trace, we can see it is a deadlock bug.
|
||||||
|
vnc_disconnect_finish will acquire the output_mutex.
|
||||||
|
But, the output_mutex will be acquired again in vnc_clipboard_send.
|
||||||
|
Repeated locking will cause deadlock. So, I move
|
||||||
|
qemu_clipboard_peer_unregister() behind vnc_unlock_output();
|
||||||
|
Fixes: 0bf41cab93e ("ui/vnc: clipboard support")
|
||||||
|
Signed-off-by: Lei Rao <lei.rao@intel.com>
|
||||||
|
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
Message-Id: <20220105020808.597325-1-lei.rao@intel.com>
|
||||||
|
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
|
||||||
|
(cherry picked from commit 1dbbe6f172810026c51dc84ed927a3cc23017949)
|
||||||
|
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||||
|
---
|
||||||
|
ui/vnc.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ui/vnc.c b/ui/vnc.c
|
||||||
|
index a14b6861be..76372ca1de 100644
|
||||||
|
--- a/ui/vnc.c
|
||||||
|
+++ b/ui/vnc.c
|
||||||
|
@@ -1354,12 +1354,12 @@ void vnc_disconnect_finish(VncState *vs)
|
||||||
|
/* last client gone */
|
||||||
|
vnc_update_server_surface(vs->vd);
|
||||||
|
}
|
||||||
|
+ vnc_unlock_output(vs);
|
||||||
|
+
|
||||||
|
if (vs->cbpeer.update.notify) {
|
||||||
|
qemu_clipboard_peer_unregister(&vs->cbpeer);
|
||||||
|
}
|
||||||
|
|
||||||
|
- vnc_unlock_output(vs);
|
||||||
|
-
|
||||||
|
qemu_mutex_destroy(&vs->output_mutex);
|
||||||
|
if (vs->bh != NULL) {
|
||||||
|
qemu_bh_delete(vs->bh);
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,102 @@
|
|||||||
|
From 56e2aef97e750ffdc572dcecbfc31314728d37a9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Halil Pasic <pasic@linux.ibm.com>
|
||||||
|
Date: Mon, 7 Mar 2022 12:29:39 +0100
|
||||||
|
Subject: [PATCH 2/2] virtio: fix feature negotiation for ACCESS_PLATFORM
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
RH-MergeRequest: 224: virtiofs on s390 secure execution
|
||||||
|
RH-Bugzilla: 2116302
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Cédric Le Goater <None>
|
||||||
|
RH-Commit: [2/2] 264d3bdbbde985f16ed6f5a1786547c25fb8cc04
|
||||||
|
|
||||||
|
Unlike most virtio features ACCESS_PLATFORM is considered mandatory by
|
||||||
|
QEMU, i.e. the driver must accept it if offered by the device. The
|
||||||
|
virtio specification says that the driver SHOULD accept the
|
||||||
|
ACCESS_PLATFORM feature if offered, and that the device MAY fail to
|
||||||
|
operate if ACCESS_PLATFORM was offered but not negotiated.
|
||||||
|
|
||||||
|
While a SHOULD ain't exactly a MUST, we are certainly allowed to fail
|
||||||
|
the device when the driver fences ACCESS_PLATFORM. With commit
|
||||||
|
2943b53f68 ("virtio: force VIRTIO_F_IOMMU_PLATFORM") we already made the
|
||||||
|
decision to do so whenever the get_dma_as() callback is implemented (by
|
||||||
|
the bus), which in practice means for the entirety of virtio-pci.
|
||||||
|
|
||||||
|
That means, if the device needs to translate I/O addresses, then
|
||||||
|
ACCESS_PLATFORM is mandatory. The aforementioned commit tells us in the
|
||||||
|
commit message that this is for security reasons. More precisely if we
|
||||||
|
were to allow a less then trusted driver (e.g. an user-space driver, or
|
||||||
|
a nested guest) to make the device bypass the IOMMU by not negotiating
|
||||||
|
ACCESS_PLATFORM, then the guest kernel would have no ability to
|
||||||
|
control/police (by programming the IOMMU) what pieces of guest memory
|
||||||
|
the driver may manipulate using the device. Which would break security
|
||||||
|
assumptions within the guest.
|
||||||
|
|
||||||
|
If ACCESS_PLATFORM is offered not because we want the device to utilize
|
||||||
|
an IOMMU and do address translation, but because the device does not
|
||||||
|
have access to the entire guest RAM, and needs the driver to grant
|
||||||
|
access to the bits it needs access to (e.g. confidential guest support),
|
||||||
|
we still require the guest to have the corresponding logic and to accept
|
||||||
|
ACCESS_PLATFORM. If the driver does not accept ACCESS_PLATFORM, then
|
||||||
|
things are bound to go wrong, and we may see failures much less graceful
|
||||||
|
than failing the device because the driver didn't negotiate
|
||||||
|
ACCESS_PLATFORM.
|
||||||
|
|
||||||
|
So let us make ACCESS_PLATFORM mandatory for the driver regardless
|
||||||
|
of whether the get_dma_as() callback is implemented or not.
|
||||||
|
|
||||||
|
Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
|
||||||
|
Fixes: 2943b53f68 ("virtio: force VIRTIO_F_IOMMU_PLATFORM")
|
||||||
|
|
||||||
|
Message-Id: <20220307112939.2780117-1-pasic@linux.ibm.com>
|
||||||
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
(cherry picked from commit 06134e2bc35dc21543d4cbcf31f858c03d383442)
|
||||||
|
---
|
||||||
|
hw/virtio/virtio-bus.c | 22 ++++++++++++++--------
|
||||||
|
1 file changed, 14 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
|
||||||
|
index 0f69d1c742..d7ec023adf 100644
|
||||||
|
--- a/hw/virtio/virtio-bus.c
|
||||||
|
+++ b/hw/virtio/virtio-bus.c
|
||||||
|
@@ -78,17 +78,23 @@ void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- vdev_has_iommu = virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM);
|
||||||
|
- if (klass->get_dma_as != NULL && has_iommu) {
|
||||||
|
+ vdev->dma_as = &address_space_memory;
|
||||||
|
+ if (has_iommu) {
|
||||||
|
+ vdev_has_iommu = virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM);
|
||||||
|
+ /*
|
||||||
|
+ * Present IOMMU_PLATFORM to the driver iff iommu_plattform=on and
|
||||||
|
+ * device operational. If the driver does not accept IOMMU_PLATFORM
|
||||||
|
+ * we fail the device.
|
||||||
|
+ */
|
||||||
|
virtio_add_feature(&vdev->host_features, VIRTIO_F_IOMMU_PLATFORM);
|
||||||
|
- vdev->dma_as = klass->get_dma_as(qbus->parent);
|
||||||
|
- if (!vdev_has_iommu && vdev->dma_as != &address_space_memory) {
|
||||||
|
- error_setg(errp,
|
||||||
|
+ if (klass->get_dma_as) {
|
||||||
|
+ vdev->dma_as = klass->get_dma_as(qbus->parent);
|
||||||
|
+ if (!vdev_has_iommu && vdev->dma_as != &address_space_memory) {
|
||||||
|
+ error_setg(errp,
|
||||||
|
"iommu_platform=true is not supported by the device");
|
||||||
|
- return;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- } else {
|
||||||
|
- vdev->dma_as = &address_space_memory;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,115 @@
|
|||||||
|
From c731ffdf9faee74e9522dff06e61cda817902088 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Halil Pasic <pasic@linux.ibm.com>
|
||||||
|
Date: Mon, 7 Feb 2022 12:28:57 +0100
|
||||||
|
Subject: [PATCH 1/2] virtio: fix the condition for iommu_platform not
|
||||||
|
supported
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
RH-MergeRequest: 224: virtiofs on s390 secure execution
|
||||||
|
RH-Bugzilla: 2116302
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
RH-Acked-by: Cédric Le Goater <None>
|
||||||
|
RH-Commit: [1/2] d7edc7e3905a04644c9ff44b0d36122c72068e08
|
||||||
|
|
||||||
|
The commit 04ceb61a40 ("virtio: Fail if iommu_platform is requested, but
|
||||||
|
unsupported") claims to fail the device hotplug when iommu_platform
|
||||||
|
is requested, but not supported by the (vhost) device. On the first
|
||||||
|
glance the condition for detecting that situation looks perfect, but
|
||||||
|
because a certain peculiarity of virtio_platform it ain't.
|
||||||
|
|
||||||
|
In fact the aforementioned commit introduces a regression. It breaks
|
||||||
|
virtio-fs support for Secure Execution, and most likely also for AMD SEV
|
||||||
|
or any other confidential guest scenario that relies encrypted guest
|
||||||
|
memory. The same also applies to any other vhost device that does not
|
||||||
|
support _F_ACCESS_PLATFORM.
|
||||||
|
|
||||||
|
The peculiarity is that iommu_platform and _F_ACCESS_PLATFORM collates
|
||||||
|
"device can not access all of the guest RAM" and "iova != gpa, thus
|
||||||
|
device needs to translate iova".
|
||||||
|
|
||||||
|
Confidential guest technologies currently rely on the device/hypervisor
|
||||||
|
offering _F_ACCESS_PLATFORM, so that, after the feature has been
|
||||||
|
negotiated, the guest grants access to the portions of memory the
|
||||||
|
device needs to see. So in for confidential guests, generally,
|
||||||
|
_F_ACCESS_PLATFORM is about the restricted access to memory, but not
|
||||||
|
about the addresses used being something else than guest physical
|
||||||
|
addresses.
|
||||||
|
|
||||||
|
This is the very reason for which commit f7ef7e6e3b ("vhost: correctly
|
||||||
|
turn on VIRTIO_F_IOMMU_PLATFORM") fences _F_ACCESS_PLATFORM from the
|
||||||
|
vhost device that does not need it, because on the vhost interface it
|
||||||
|
only means "I/O address translation is needed".
|
||||||
|
|
||||||
|
This patch takes inspiration from f7ef7e6e3b ("vhost: correctly turn on
|
||||||
|
VIRTIO_F_IOMMU_PLATFORM"), and uses the same condition for detecting the
|
||||||
|
situation when _F_ACCESS_PLATFORM is requested, but no I/O translation
|
||||||
|
by the device, and thus no device capability is needed. In this
|
||||||
|
situation claiming that the device does not support iommu_plattform=on
|
||||||
|
is counter-productive. So let us stop doing that!
|
||||||
|
|
||||||
|
Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
|
||||||
|
Reported-by: Jakob Naucke <Jakob.Naucke@ibm.com>
|
||||||
|
Fixes: 04ceb61a40 ("virtio: Fail if iommu_platform is requested, but
|
||||||
|
unsupported")
|
||||||
|
Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
|
||||||
|
Tested-by: Daniel Henrique Barboza <danielhb413@gmail.com>
|
||||||
|
Cc: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
Cc: qemu-stable@nongnu.org
|
||||||
|
|
||||||
|
Message-Id: <20220207112857.607829-1-pasic@linux.ibm.com>
|
||||||
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
Acked-by: Jason Wang <jasowang@redhat.com>
|
||||||
|
(cherry picked from commit e65902a913bf31ba79a83a3bd3621108b85cf645)
|
||||||
|
---
|
||||||
|
hw/virtio/virtio-bus.c | 12 +++++++-----
|
||||||
|
1 file changed, 7 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
|
||||||
|
index d23db98c56..0f69d1c742 100644
|
||||||
|
--- a/hw/virtio/virtio-bus.c
|
||||||
|
+++ b/hw/virtio/virtio-bus.c
|
||||||
|
@@ -48,6 +48,7 @@ void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp)
|
||||||
|
VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(bus);
|
||||||
|
VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
|
||||||
|
bool has_iommu = virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM);
|
||||||
|
+ bool vdev_has_iommu;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
DPRINTF("%s: plug device.\n", qbus->name);
|
||||||
|
@@ -69,11 +70,6 @@ void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (has_iommu && !virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM)) {
|
||||||
|
- error_setg(errp, "iommu_platform=true is not supported by the device");
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if (klass->device_plugged != NULL) {
|
||||||
|
klass->device_plugged(qbus->parent, &local_err);
|
||||||
|
}
|
||||||
|
@@ -82,9 +78,15 @@ void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ vdev_has_iommu = virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM);
|
||||||
|
if (klass->get_dma_as != NULL && has_iommu) {
|
||||||
|
virtio_add_feature(&vdev->host_features, VIRTIO_F_IOMMU_PLATFORM);
|
||||||
|
vdev->dma_as = klass->get_dma_as(qbus->parent);
|
||||||
|
+ if (!vdev_has_iommu && vdev->dma_as != &address_space_memory) {
|
||||||
|
+ error_setg(errp,
|
||||||
|
+ "iommu_platform=true is not supported by the device");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
} else {
|
||||||
|
vdev->dma_as = &address_space_memory;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,65 @@
|
|||||||
|
From ebf6be5ba316ffda354af5eb1f1241ad6543b3cd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yusuke Okada <okada.yusuke@jp.fujitsu.com>
|
||||||
|
Date: Thu, 18 Aug 2022 14:46:19 -0400
|
||||||
|
Subject: [PATCH 3/3] virtiofsd: use g_date_time_get_microsecond to get
|
||||||
|
subsecond
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
RH-MergeRequest: 222: virtiofsd: use g_date_time_get_microsecond to get subsecond
|
||||||
|
RH-Bugzilla: 2018885
|
||||||
|
RH-Acked-by: Vivek Goyal <None>
|
||||||
|
RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
RH-Acked-by: Sergio Lopez <slp@redhat.com>
|
||||||
|
RH-Commit: [1/1] da8795576acc7029044a801ef42676d66471a577
|
||||||
|
|
||||||
|
The "%f" specifier in g_date_time_format() is only available in glib
|
||||||
|
2.65.2 or later. If combined with older glib, the function returns null
|
||||||
|
and the timestamp displayed as "(null)".
|
||||||
|
|
||||||
|
For backward compatibility, g_date_time_get_microsecond should be used
|
||||||
|
to retrieve subsecond.
|
||||||
|
|
||||||
|
In this patch the g_date_time_format() leaves subsecond field as "%06d"
|
||||||
|
and let next snprintf to format with g_date_time_get_microsecond.
|
||||||
|
|
||||||
|
Signed-off-by: Yusuke Okada <okada.yusuke@jp.fujitsu.com>
|
||||||
|
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
Message-id: 20220818184618.2205172-1-yokada.996@gmail.com
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
(cherry picked from commit f16d15c9276bd8f501f861c39cbd4adc812d0c1d)
|
||||||
|
---
|
||||||
|
tools/virtiofsd/passthrough_ll.c | 7 +++++--
|
||||||
|
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c
|
||||||
|
index b3d0674f6d..523d8fbe1e 100644
|
||||||
|
--- a/tools/virtiofsd/passthrough_ll.c
|
||||||
|
+++ b/tools/virtiofsd/passthrough_ll.c
|
||||||
|
@@ -3791,6 +3791,7 @@ static void setup_nofile_rlimit(unsigned long rlimit_nofile)
|
||||||
|
static void log_func(enum fuse_log_level level, const char *fmt, va_list ap)
|
||||||
|
{
|
||||||
|
g_autofree char *localfmt = NULL;
|
||||||
|
+ char buf[64];
|
||||||
|
|
||||||
|
if (current_log_level < level) {
|
||||||
|
return;
|
||||||
|
@@ -3803,9 +3804,11 @@ static void log_func(enum fuse_log_level level, const char *fmt, va_list ap)
|
||||||
|
fmt);
|
||||||
|
} else {
|
||||||
|
g_autoptr(GDateTime) now = g_date_time_new_now_utc();
|
||||||
|
- g_autofree char *nowstr = g_date_time_format(now, "%Y-%m-%d %H:%M:%S.%f%z");
|
||||||
|
+ g_autofree char *nowstr = g_date_time_format(now,
|
||||||
|
+ "%Y-%m-%d %H:%M:%S.%%06d%z");
|
||||||
|
+ snprintf(buf, 64, nowstr, g_date_time_get_microsecond(now));
|
||||||
|
localfmt = g_strdup_printf("[%s] [ID: %08ld] %s",
|
||||||
|
- nowstr, syscall(__NR_gettid), fmt);
|
||||||
|
+ buf, syscall(__NR_gettid), fmt);
|
||||||
|
}
|
||||||
|
fmt = localfmt;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
@ -83,7 +83,7 @@ Obsoletes: %1-rhev <= %{epoch}:%{version}-%{release}
|
|||||||
Summary: QEMU is a machine emulator and virtualizer
|
Summary: QEMU is a machine emulator and virtualizer
|
||||||
Name: qemu-kvm
|
Name: qemu-kvm
|
||||||
Version: 6.2.0
|
Version: 6.2.0
|
||||||
Release: 20%{?rcrel}%{?dist}.1
|
Release: 28%{?rcrel}%{?dist}
|
||||||
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
||||||
Epoch: 15
|
Epoch: 15
|
||||||
License: GPLv2 and GPLv2+ and CC-BY
|
License: GPLv2 and GPLv2+ and CC-BY
|
||||||
@ -427,10 +427,169 @@ Patch163: kvm-QIOChannelSocket-Add-support-for-MSG_ZEROCOPY-IPV6.patch
|
|||||||
Patch164: kvm-pc-bios-s390-ccw-Fix-booting-with-logical-block-size.patch
|
Patch164: kvm-pc-bios-s390-ccw-Fix-booting-with-logical-block-size.patch
|
||||||
# For bz#2120279 - Wrong max_sectors_kb and Maximum transfer length on the pass-through device [rhel-8.7]
|
# For bz#2120279 - Wrong max_sectors_kb and Maximum transfer length on the pass-through device [rhel-8.7]
|
||||||
Patch165: kvm-scsi-generic-Fix-emulated-block-limits-VPD-page.patch
|
Patch165: kvm-scsi-generic-Fix-emulated-block-limits-VPD-page.patch
|
||||||
# For bz#2116743 - [RHEL8.7] Guests in VMX root operation fail to reboot with QEMU's 'system_reset' command
|
# For bz#2117149 - Can't run when memory backing with hugepages and backend type memfd
|
||||||
Patch166: kvm-i386-reset-KVM-nested-state-upon-CPU-reset.patch
|
Patch166: kvm-backends-hostmem-Fix-support-of-memory-backend-memfd.patch
|
||||||
# For bz#2116743 - [RHEL8.7] Guests in VMX root operation fail to reboot with QEMU's 'system_reset' command
|
# For bz#2125271 - [RHEL8.7] Guests in VMX root operation fail to reboot with QEMU's 'system_reset' command [rhel-8.8.0]
|
||||||
Patch167: kvm-i386-do-kvm_put_msr_feature_control-first-thing-when.patch
|
Patch167: kvm-i386-reset-KVM-nested-state-upon-CPU-reset.patch
|
||||||
|
# For bz#2125271 - [RHEL8.7] Guests in VMX root operation fail to reboot with QEMU's 'system_reset' command [rhel-8.8.0]
|
||||||
|
Patch168: kvm-i386-do-kvm_put_msr_feature_control-first-thing-when.patch
|
||||||
|
# For bz#2124757 - RHEL8: skey test in kvm_unit_test got failed
|
||||||
|
Patch169: kvm-redhat-Update-linux-headers-linux-kvm.h-to-v5.18-rc6.patch
|
||||||
|
# For bz#2124757 - RHEL8: skey test in kvm_unit_test got failed
|
||||||
|
Patch170: kvm-target-s390x-kvm-Honor-storage-keys-during-emulation.patch
|
||||||
|
# For bz#2018885 - [virtiofs] virtiofsd debug log's timestamp is NULL
|
||||||
|
Patch171: kvm-virtiofsd-use-g_date_time_get_microsecond-to-get-sub.patch
|
||||||
|
# For bz#2116302 - RHEL8.6 - virtiofs will not mount fs on secure execution guest
|
||||||
|
Patch172: kvm-virtio-fix-the-condition-for-iommu_platform-not-supp.patch
|
||||||
|
# For bz#2116302 - RHEL8.6 - virtiofs will not mount fs on secure execution guest
|
||||||
|
Patch173: kvm-virtio-fix-feature-negotiation-for-ACCESS_PLATFORM.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch174: kvm-s390x-pci-use-a-reserved-ID-for-the-default-PCI-grou.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch175: kvm-s390x-pci-don-t-use-hard-coded-dma-range-in-reg_ioat.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch176: kvm-s390x-pci-use-the-passthrough-measurement-update-int.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch177: kvm-s390x-pci-add-supported-DT-information-to-clp-respon.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch178: kvm-Update-linux-headers-to-v6.0-rc4.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch179: kvm-s390x-pci-add-routine-to-get-host-function-handle-fr.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch180: kvm-s390x-pci-enable-for-load-store-interpretation.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch181: kvm-s390x-pci-don-t-fence-interpreted-devices-without-MS.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch182: kvm-s390x-pci-enable-adapter-event-notification-for-inte.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch183: kvm-s390x-pci-let-intercept-devices-have-separate-PCI-gr.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch184: kvm-s390x-pci-reflect-proper-maxstbl-for-groups-of-inter.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch185: kvm-s390x-s390-virtio-ccw-Switch-off-zPCI-enhancements-o.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch186: kvm-dump-Use-ERRP_GUARD.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch187: kvm-dump-Remove-the-sh_info-variable.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch188: kvm-dump-Introduce-shdr_num-to-decrease-complexity.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch189: kvm-dump-Remove-the-section-if-when-calculating-the-memo.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch190: kvm-dump-Add-more-offset-variables.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch191: kvm-dump-Introduce-dump_is_64bit-helper-function.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch192: kvm-dump-Consolidate-phdr-note-writes.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch193: kvm-dump-Cleanup-dump_begin-write-functions.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch194: kvm-dump-Consolidate-elf-note-function.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch195: kvm-dump-Replace-opaque-DumpState-pointer-with-a-typed-o.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch196: kvm-dump-Rename-write_elf_loads-to-write_elf_phdr_loads.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch197: kvm-dump-Refactor-dump_iterate-and-introduce-dump_filter.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch198: kvm-dump-Rework-get_start_block.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch199: kvm-dump-Rework-filter-area-variables.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch200: kvm-dump-Rework-dump_calculate_size-function.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch201: kvm-dump-Split-elf-header-functions-into-prepare-and-wri.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch202: kvm-dump-Rename-write_elf-_phdr_note-to-prepare_elf-_phd.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch203: kvm-dump-simplify-a-bit-kdump-get_next_page.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch204: kvm-dump-fix-kdump-to-work-over-non-aligned-blocks.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch205: kvm-dump-Use-a-buffer-for-ELF-section-data-and-headers.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch206: kvm-dump-Write-ELF-section-headers-right-after-ELF-heade.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch207: kvm-dump-Reorder-struct-DumpState.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch208: kvm-dump-Reintroduce-memory_offset-and-section_offset.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch209: kvm-dump-Add-architecture-section-and-section-string-tab.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch210: kvm-s390x-Add-protected-dump-cap.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch211: kvm-s390x-Introduce-PV-query-interface.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch212: kvm-include-elf.h-add-s390x-note-types.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch213: kvm-s390x-Add-KVM-PV-dump-interface.patch
|
||||||
|
# For bz#1664378 - [IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part
|
||||||
|
# For bz#2043909 - [IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part
|
||||||
|
Patch214: kvm-s390x-pv-Add-dump-support.patch
|
||||||
|
# For bz#2129760 - CVE-2022-3165 virt:rhel/qemu-kvm: QEMU: VNC: integer underflow in vnc_client_cut_text_ext leads to CPU exhaustion [rhel-8]
|
||||||
|
Patch215: kvm-ui-vnc-clipboard-fix-integer-underflow-in-vnc_client.patch
|
||||||
|
# For bz#2132609 - qemu-kvm: backport some aarch64 fixes
|
||||||
|
Patch216: kvm-hw-acpi-Add-ospm_status-hook-implementation-for-acpi.patch
|
||||||
|
# For bz#2132609 - qemu-kvm: backport some aarch64 fixes
|
||||||
|
Patch217: kvm-target-arm-kvm-Retry-KVM_CREATE_VM-call-if-it-fails-.patch
|
||||||
|
# For bz#2128225 - [s390x] [RHEL8][s390x-ccw bios] lacking document about parameter loadparm in qemu
|
||||||
|
Patch218: kvm-docs-system-s390x-Document-the-loadparm-machine-prop.patch
|
||||||
|
# For bz#2128225 - [s390x] [RHEL8][s390x-ccw bios] lacking document about parameter loadparm in qemu
|
||||||
|
Patch219: kvm-s390x-Register-TYPE_S390_CCW_MACHINE-properties-as-c.patch
|
||||||
|
# For bz#2141896 - VMs hung on vnc_clipboard_send
|
||||||
|
Patch220: kvm-ui-vnc.c-Fixed-a-deadlock-bug.patch
|
||||||
|
# For bz#2148545 - CVE-2022-4144 virt:rhel/qemu-kvm: QEMU: QXL: qxl_phys2virt unsafe address translation can lead to out-of-bounds read [rhel-8]
|
||||||
|
Patch221: kvm-hw-display-qxl-Have-qxl_log_command-Return-early-if-.patch
|
||||||
|
# For bz#2148545 - CVE-2022-4144 virt:rhel/qemu-kvm: QEMU: QXL: qxl_phys2virt unsafe address translation can lead to out-of-bounds read [rhel-8]
|
||||||
|
Patch222: kvm-hw-display-qxl-Document-qxl_phys2virt.patch
|
||||||
|
# For bz#2148545 - CVE-2022-4144 virt:rhel/qemu-kvm: QEMU: QXL: qxl_phys2virt unsafe address translation can lead to out-of-bounds read [rhel-8]
|
||||||
|
Patch223: kvm-hw-display-qxl-Pass-requested-buffer-size-to-qxl_phy.patch
|
||||||
|
# For bz#2148545 - CVE-2022-4144 virt:rhel/qemu-kvm: QEMU: QXL: qxl_phys2virt unsafe address translation can lead to out-of-bounds read [rhel-8]
|
||||||
|
Patch224: kvm-hw-display-qxl-Avoid-buffer-overrun-in-qxl_phys2virt.patch
|
||||||
|
# For bz#2148545 - CVE-2022-4144 virt:rhel/qemu-kvm: QEMU: QXL: qxl_phys2virt unsafe address translation can lead to out-of-bounds read [rhel-8]
|
||||||
|
Patch225: kvm-hw-display-qxl-Assert-memory-slot-fits-in-preallocat.patch
|
||||||
|
# For bz#2155448 - RHEL8.8 - KVM: s390: pv: don't allow userspace to set the clock under PV - QEMU part
|
||||||
|
Patch226: kvm-s390x-tod-kvm-don-t-save-restore-the-TOD-in-PV-guest.patch
|
||||||
|
|
||||||
BuildRequires: wget
|
BuildRequires: wget
|
||||||
BuildRequires: rpm-build
|
BuildRequires: rpm-build
|
||||||
@ -1600,11 +1759,108 @@ sh %{_sysconfdir}/sysconfig/modules/kvm.modules &> /dev/null || :
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Wed Sep 14 2022 Miroslav Rezanina <mrezanin@redhat.com> - 6.2.0-20.el8.1
|
* Wed Jan 04 2023 Jon Maloy <jmaloy@redhat.com> - 6.2.0-28
|
||||||
- kvm-i386-reset-KVM-nested-state-upon-CPU-reset.patch [bz#2116743]
|
- kvm-s390x-tod-kvm-don-t-save-restore-the-TOD-in-PV-guest.patch [bz#2155448]
|
||||||
- kvm-i386-do-kvm_put_msr_feature_control-first-thing-when.patch [bz#2116743]
|
- Resolves: bz#2155448
|
||||||
- Resolves: bz#2116743
|
(RHEL8.8 - KVM: s390: pv: don't allow userspace to set the clock under PV - QEMU part)
|
||||||
([RHEL8.7] Guests in VMX root operation fail to reboot with QEMU's 'system_reset' command)
|
|
||||||
|
* Thu Dec 08 2022 Jon Maloy <jmaloy@redhat.com> - 6.2.0-27
|
||||||
|
- kvm-hw-display-qxl-Have-qxl_log_command-Return-early-if-.patch [bz#2148545]
|
||||||
|
- kvm-hw-display-qxl-Document-qxl_phys2virt.patch [bz#2148545]
|
||||||
|
- kvm-hw-display-qxl-Pass-requested-buffer-size-to-qxl_phy.patch [bz#2148545]
|
||||||
|
- kvm-hw-display-qxl-Avoid-buffer-overrun-in-qxl_phys2virt.patch [bz#2148545]
|
||||||
|
- kvm-hw-display-qxl-Assert-memory-slot-fits-in-preallocat.patch [bz#2148545]
|
||||||
|
- Resolves: bz#2148545
|
||||||
|
(CVE-2022-4144 virt:rhel/qemu-kvm: QEMU: QXL: qxl_phys2virt unsafe address translation can lead to out-of-bounds read [rhel-8])
|
||||||
|
|
||||||
|
* Wed Nov 23 2022 Jon Maloy <jmaloy@redhat.com> - 6.2.0-26
|
||||||
|
- kvm-docs-system-s390x-Document-the-loadparm-machine-prop.patch [bz#2128225]
|
||||||
|
- kvm-s390x-Register-TYPE_S390_CCW_MACHINE-properties-as-c.patch [bz#2128225]
|
||||||
|
- kvm-ui-vnc.c-Fixed-a-deadlock-bug.patch [bz#2141896]
|
||||||
|
- Resolves: bz#2128225
|
||||||
|
([s390x] [RHEL8][s390x-ccw bios] lacking document about parameter loadparm in qemu)
|
||||||
|
- Resolves: bz#2141896
|
||||||
|
(VMs hung on vnc_clipboard_send)
|
||||||
|
|
||||||
|
* Wed Nov 16 2022 Jon Maloy <jmaloy@redhat.com> - 6.2.0-25
|
||||||
|
- kvm-hw-acpi-Add-ospm_status-hook-implementation-for-acpi.patch [bz#2132609]
|
||||||
|
- kvm-target-arm-kvm-Retry-KVM_CREATE_VM-call-if-it-fails-.patch [bz#2132609]
|
||||||
|
- Resolves: bz#2132609
|
||||||
|
(qemu-kvm: backport some aarch64 fixes)
|
||||||
|
|
||||||
|
* Thu Nov 10 2022 Jon Maloy <jmaloy@redhat.com> - 6.2.0-24
|
||||||
|
- kvm-s390x-pci-use-a-reserved-ID-for-the-default-PCI-grou.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pci-don-t-use-hard-coded-dma-range-in-reg_ioat.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pci-use-the-passthrough-measurement-update-int.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pci-add-supported-DT-information-to-clp-respon.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-Update-linux-headers-to-v6.0-rc4.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pci-add-routine-to-get-host-function-handle-fr.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pci-enable-for-load-store-interpretation.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pci-don-t-fence-interpreted-devices-without-MS.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pci-enable-adapter-event-notification-for-inte.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pci-let-intercept-devices-have-separate-PCI-gr.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pci-reflect-proper-maxstbl-for-groups-of-inter.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-s390-virtio-ccw-Switch-off-zPCI-enhancements-o.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Use-ERRP_GUARD.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Remove-the-sh_info-variable.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Introduce-shdr_num-to-decrease-complexity.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Remove-the-section-if-when-calculating-the-memo.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Add-more-offset-variables.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Introduce-dump_is_64bit-helper-function.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Consolidate-phdr-note-writes.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Cleanup-dump_begin-write-functions.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Consolidate-elf-note-function.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Replace-opaque-DumpState-pointer-with-a-typed-o.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Rename-write_elf_loads-to-write_elf_phdr_loads.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Refactor-dump_iterate-and-introduce-dump_filter.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Rework-get_start_block.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Rework-filter-area-variables.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Rework-dump_calculate_size-function.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Split-elf-header-functions-into-prepare-and-wri.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Rename-write_elf-_phdr_note-to-prepare_elf-_phd.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-simplify-a-bit-kdump-get_next_page.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-fix-kdump-to-work-over-non-aligned-blocks.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Use-a-buffer-for-ELF-section-data-and-headers.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Write-ELF-section-headers-right-after-ELF-heade.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Reorder-struct-DumpState.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Reintroduce-memory_offset-and-section_offset.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-dump-Add-architecture-section-and-section-string-tab.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-Add-protected-dump-cap.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-Introduce-PV-query-interface.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-include-elf.h-add-s390x-note-types.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-Add-KVM-PV-dump-interface.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-s390x-pv-Add-dump-support.patch [bz#1664378 bz#2043909]
|
||||||
|
- kvm-ui-vnc-clipboard-fix-integer-underflow-in-vnc_client.patch [bz#2129760]
|
||||||
|
- Resolves: bz#1664378
|
||||||
|
([IBM 8.8 FEAT] Enhanced Interpretation for PCI Functions (kvm) - qemu part)
|
||||||
|
- Resolves: bz#2043909
|
||||||
|
([IBM 8.8 FEAT] KVM: Secure Execution guest dump encryption with customer keys - qemu part)
|
||||||
|
- Resolves: bz#2129760
|
||||||
|
(CVE-2022-3165 virt:rhel/qemu-kvm: QEMU: VNC: integer underflow in vnc_client_cut_text_ext leads to CPU exhaustion [rhel-8])
|
||||||
|
|
||||||
|
* Wed Oct 26 2022 Jon Maloy <jmaloy@redhat.com> - 6.2.0-23
|
||||||
|
- kvm-virtio-fix-the-condition-for-iommu_platform-not-supp.patch [bz#2116302]
|
||||||
|
- kvm-virtio-fix-feature-negotiation-for-ACCESS_PLATFORM.patch [bz#2116302]
|
||||||
|
- Resolves: bz#2116302
|
||||||
|
(RHEL8.6 - virtiofs will not mount fs on secure execution guest)
|
||||||
|
|
||||||
|
* Wed Oct 05 2022 Jon Maloy <jmaloy@redhat.com> - 6.2.0-22
|
||||||
|
- kvm-redhat-Update-linux-headers-linux-kvm.h-to-v5.18-rc6.patch [bz#2124757]
|
||||||
|
- kvm-target-s390x-kvm-Honor-storage-keys-during-emulation.patch [bz#2124757]
|
||||||
|
- kvm-virtiofsd-use-g_date_time_get_microsecond-to-get-sub.patch [bz#2018885]
|
||||||
|
- Resolves: bz#2124757
|
||||||
|
(RHEL8: skey test in kvm_unit_test got failed)
|
||||||
|
- Resolves: bz#2018885
|
||||||
|
([virtiofs] virtiofsd debug log's timestamp is NULL)
|
||||||
|
|
||||||
|
* Thu Sep 29 2022 Jon Maloy <jmaloy@redhat.com> - 6.2.0-21
|
||||||
|
- kvm-backends-hostmem-Fix-support-of-memory-backend-memfd.patch [bz#2117149]
|
||||||
|
- kvm-i386-reset-KVM-nested-state-upon-CPU-reset.patch [bz#2125271]
|
||||||
|
- kvm-i386-do-kvm_put_msr_feature_control-first-thing-when.patch [bz#2125271]
|
||||||
|
- Resolves: bz#2117149
|
||||||
|
(Can't run when memory backing with hugepages and backend type memfd)
|
||||||
|
- Resolves: bz#2125271
|
||||||
|
([RHEL8.7] Guests in VMX root operation fail to reboot with QEMU's 'system_reset' command [rhel-8.8.0])
|
||||||
|
|
||||||
* Fri Aug 26 2022 Jon Maloy <jmaloy@redhat.com> - 6.2.0-20
|
* Fri Aug 26 2022 Jon Maloy <jmaloy@redhat.com> - 6.2.0-20
|
||||||
- kvm-scsi-generic-Fix-emulated-block-limits-VPD-page.patch [bz#2120279]
|
- kvm-scsi-generic-Fix-emulated-block-limits-VPD-page.patch [bz#2120279]
|
||||||
|
Loading…
Reference in New Issue
Block a user