On Thu, Feb 22, 2024 at 05:03:09PM -1000, Richard Henderson wrote: > Handle combined host and guest alignment requirements. > Handle host and guest page size differences. > Handle SHM_EXEC. > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/115 > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > linux-user/mmap.c | 146 ++++++++++++++++++++++++++++++++++------------ > 1 file changed, 110 insertions(+), 36 deletions(-)
[...] > - /* find out the length of the shared memory segment */ > + /* > + * Because we can't use host shmat() unless the address is sufficiently > + * aligned for the host, we'll need to check both. > + * TODO: Could be fixed with softmmu. > + */ Are there any plans to introduce softmmu to qemu-user? [...] Reviewed-by: Ilya Leoshkevich <i...@linux.ibm.com> Please consider adding the reproducer to the series: >From 964164ada4de55ac01a56613f7b759e538803fc9 Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich <i...@linux.ibm.com> Date: Fri, 23 Feb 2024 12:31:40 +0100 Subject: [PATCH] tests/tcg: Check that shmat() does not break /proc/self/maps Add a regression test for a recently fixed issue, where shmat() desynced the guest and the host view of the address space and caused open("/proc/self/maps") to SEGV. Signed-off-by: Ilya Leoshkevich <i...@linux.ibm.com> --- tests/tcg/multiarch/linux/linux-shmat-maps.c | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 tests/tcg/multiarch/linux/linux-shmat-maps.c diff --git a/tests/tcg/multiarch/linux/linux-shmat-maps.c b/tests/tcg/multiarch/linux/linux-shmat-maps.c new file mode 100644 index 00000000000..4090bc77ba7 --- /dev/null +++ b/tests/tcg/multiarch/linux/linux-shmat-maps.c @@ -0,0 +1,40 @@ +/* + * Test that shmat() does not break /proc/self/maps. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include <assert.h> +#include <fcntl.h> +#include <stdlib.h> +#include <sys/ipc.h> +#include <sys/shm.h> +#include <unistd.h> + +int main(void) +{ + char buf[128]; + int err, fd; + int shmid; + ssize_t n; + void *p; + + shmid = shmget(IPC_PRIVATE, 0x400, IPC_CREAT | 0600); + assert(shmid != -1); + p = shmat(shmid, (void *)0x800000, 0); + assert(p != (void *)-1); + + fd = open("/proc/self/maps", O_RDONLY); + assert(fd != -1); + do { + n = read(fd, buf, sizeof(buf)); + assert(n >= 0); + } while (n != 0); + close(fd); + + err = shmdt(p); + assert(err == 0); + err = shmctl(shmid, IPC_RMID, NULL); + assert(err == 0); + + return EXIT_SUCCESS; +} -- 2.34.1