From a709bef57f7bcf376010e5751bb08464897f6f0a Mon Sep 17 00:00:00 2001 From: Jingyun Hua Date: Thu, 22 Aug 2024 11:40:05 +0000 Subject: [PATCH] community/qemu: backport fixes for loongarch64 ref: https://gitlab.com/qemu-project/qemu/-/issues/2504 https://gitlab.com/qemu-project/qemu/-/commit/a4ad4a9d98f7fbde806f07da21e69f39e134cdf1 --- community/qemu/APKBUILD | 4 +- ...er-Handle-short-reads-in-mmap_h_gt_g.patch | 100 ++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 community/qemu/linux-user-Handle-short-reads-in-mmap_h_gt_g.patch diff --git a/community/qemu/APKBUILD b/community/qemu/APKBUILD index c603f9bd060..6f067bf779d 100644 --- a/community/qemu/APKBUILD +++ b/community/qemu/APKBUILD @@ -4,7 +4,7 @@ # Maintainer: Natanael Copa pkgname=qemu pkgver=9.0.2 -pkgrel=0 +pkgrel=1 pkgdesc="QEMU is a generic machine emulator and virtualizer" url="https://qemu.org/" arch="all" @@ -219,6 +219,7 @@ source="https://download.qemu.org/qemu-$pkgver.tar.xz musl-initialise-msghdr.patch fix-strerrorname_np.patch liburing.patch + linux-user-Handle-short-reads-in-mmap_h_gt_g.patch $pkgname-guest-agent.confd $pkgname-guest-agent.initd @@ -594,6 +595,7 @@ d5b4626193fa9b7c687a649aa5ea37d8a74fd2e556a66a71e31af618a0990e144beae253b82b89ef 7a6340df8aa28811af20cd23b98ba95fc8072d4d4d3a2d497604386396892cf26716d0755821e47d02c8eded203133d7dde100537c117e2a047179e4f93883cf musl-initialise-msghdr.patch 7df4b0979d11fb0b7d2dbb073d7249677b0f51381dfbeb1bec2e44d29dd6e1d752468d7f9fb5b42deed6bdf184e81358e7b6dc54b36db326f3336cd6121a1a60 fix-strerrorname_np.patch 75979455abcd9d9f25a966d829d578a06691163e297247c045ce67f94ebc916850b7be1080024a9db6bba9e3f7b88a8cc486f364fb7b028804862bc8634f00e4 liburing.patch +7e7e3768215c57dec0ca21f7c4d55174600d4077353b5f596187f8df0b1e4d1baa921ddf696ed69115871c5a4701f0aad81fd6e89b9d19331edd4192d251b168 linux-user-Handle-short-reads-in-mmap_h_gt_g.patch d90c034cae3f9097466854ed1a9f32ab4b02089fcdf7320e8f4da13b2b1ff65067233f48809911485e4431d7ec1a22448b934121bc9522a2dc489009e87e2b1f qemu-guest-agent.confd 1cd24c2444c5935a763c501af2b0da31635aad9cf62e55416d6477fcec153cddbe7de205d99616def11b085e0dd366ba22463d2270f831d884edbc307c7864a6 qemu-guest-agent.initd 9b7a89b20fcf737832cb7b4d5dc7d8301dd88169cbe5339eda69fbb51c2e537d8cb9ec7cf37600899e734209e63410d50d0821bce97e401421db39c294d97be2 80-kvm.rules diff --git a/community/qemu/linux-user-Handle-short-reads-in-mmap_h_gt_g.patch b/community/qemu/linux-user-Handle-short-reads-in-mmap_h_gt_g.patch new file mode 100644 index 00000000000..d1c61addb1c --- /dev/null +++ b/community/qemu/linux-user-Handle-short-reads-in-mmap_h_gt_g.patch @@ -0,0 +1,100 @@ +Patch from: +https://gitlab.com/qemu-project/qemu/-/commit/a4ad4a9d98f7fbde806f07da21e69f39e134cdf1 + +From a4ad4a9d98f7fbde806f07da21e69f39e134cdf1 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 16 Aug 2024 07:13:31 +1000 +Subject: [PATCH] linux-user: Handle short reads in mmap_h_gt_g +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In particular, if an image has a large bss, we can hit +EOF before reading all host_len bytes of the mapping. + +Create a helper, mmap_pread to handle the job for both +the larger block in mmap_h_gt_g itself, as well as the +smaller block in mmap_frag. + +Cc: qemu-stable@nongnu.org +Fixes: eb5027ac618 ("linux-user: Split out mmap_h_gt_g") +Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2504 +Signed-off-by: Richard Henderson +Message-Id: <20240820050848.165253-2-richard.henderson@linaro.org> +Reviewed-by: Philippe Mathieu-Daudé +--- + linux-user/mmap.c | 44 ++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 38 insertions(+), 6 deletions(-) + +diff --git a/linux-user/mmap.c b/linux-user/mmap.c +index 6418e811f6..e4bf5d5f39 100644 +--- a/linux-user/mmap.c ++++ b/linux-user/mmap.c +@@ -283,6 +283,40 @@ static int do_munmap(void *addr, size_t len) + return munmap(addr, len); + } + ++/* ++ * Perform a pread on behalf of target_mmap. We can reach EOF, we can be ++ * interrupted by signals, and in general there's no good error return path. ++ * If @zero, zero the rest of the block at EOF. ++ * Return true on success. ++ */ ++static bool mmap_pread(int fd, void *p, size_t len, off_t offset, bool zero) ++{ ++ while (1) { ++ ssize_t r = pread(fd, p, len, offset); ++ ++ if (likely(r == len)) { ++ /* Complete */ ++ return true; ++ } ++ if (r == 0) { ++ /* EOF */ ++ if (zero) { ++ memset(p, 0, len); ++ } ++ return true; ++ } ++ if (r > 0) { ++ /* Short read */ ++ p += r; ++ len -= r; ++ offset += r; ++ } else if (errno != EINTR) { ++ /* Error */ ++ return false; ++ } ++ } ++} ++ + /* + * Map an incomplete host page. + * +@@ -357,10 +391,9 @@ static bool mmap_frag(abi_ulong real_start, abi_ulong start, abi_ulong last, + /* Read or zero the new guest pages. */ + if (flags & MAP_ANONYMOUS) { + memset(g2h_untagged(start), 0, last - start + 1); +- } else { +- if (pread(fd, g2h_untagged(start), last - start + 1, offset) == -1) { +- return false; +- } ++ } else if (!mmap_pread(fd, g2h_untagged(start), last - start + 1, ++ offset, true)) { ++ return false; + } + + /* Put final protection */ +@@ -853,8 +886,7 @@ static abi_long mmap_h_gt_g(abi_ulong start, abi_ulong len, + } + + if (misaligned_offset) { +- /* TODO: The read could be short. */ +- if (pread(fd, p, host_len, offset + real_start - start) != host_len) { ++ if (!mmap_pread(fd, p, host_len, offset + real_start - start, false)) { + do_munmap(p, host_len); + return -1; + } +-- +2.46.0 +