It is my guess that the majority of the flakiness with the linux-user signals.c test is due to a race condition between translation and page writes. I vaguely recall a bug report about this, but I cannot find it now.
Since the vast majority of "self-modifying code" is due to signal delivery, work around this by allocating a new page, into which we write the signal handlers. A better workaround would be to implement the vdso that is required by many guests. However, that is a much larger problem, and some guests do not define a vdso in upstream linux. This serves as a decent fallback. Neither bit of work, I will note, solves the posited race condition described above. r~ Richard Henderson (21): linux-user: Add infrastructure for a signal trampoline page linux-user/aarch64: Implement setup_sigtramp linux-user/arm: Force v2 frames for fdpic linux-user/arm: Implement setup_sigtramp linux-user/alpha: Implement setup_sigtramp linux-user/cris: Implement setup_sigtramp linux-user/hexagon: Implement setup_sigtramp linux-user/hppa: Document non-use of setup_sigtramp linux-user/i386: Implement setup_sigtramp linux-user/m68k: Implement setup_sigtramp linux-user/microblaze: Implement setup_sigtramp linux-user/mips: Implement setup_sigtramp linux-user/nios2: Document non-use of setup_sigtramp linux-user/openrisc: Implement setup_sigtramp linux-user/ppc: Implement setup_sigtramp linux-user/riscv: Implement setup_sigtramp linux-user/s390x: Implement setup_sigtramp linux-user/sh4: Implement setup_sigtramp linux-user/sparc: Implement setup_sigtramp linux-user/xtensa: Implement setup_sigtramp linux-user: Remove default for TARGET_ARCH_HAS_SIGTRAMP_PAGE linux-user/aarch64/target_signal.h | 2 + linux-user/alpha/target_signal.h | 1 + linux-user/arm/target_signal.h | 2 + linux-user/cris/target_signal.h | 2 + linux-user/hexagon/target_signal.h | 2 + linux-user/hppa/target_signal.h | 14 ++ linux-user/i386/target_signal.h | 2 + linux-user/m68k/target_signal.h | 2 + linux-user/microblaze/target_signal.h | 2 + linux-user/mips/target_signal.h | 1 + linux-user/mips64/target_signal.h | 2 + linux-user/nios2/target_signal.h | 3 + linux-user/openrisc/target_signal.h | 2 + linux-user/ppc/target_signal.h | 2 + linux-user/qemu.h | 7 + linux-user/riscv/target_signal.h | 2 + linux-user/s390x/target_signal.h | 2 + linux-user/sh4/target_signal.h | 2 + linux-user/sparc/target_signal.h | 4 + linux-user/x86_64/target_signal.h | 3 + linux-user/xtensa/target_signal.h | 2 + linux-user/aarch64/signal.c | 28 ++-- linux-user/alpha/signal.c | 34 +++-- linux-user/arm/signal.c | 190 +++++++++++++++----------- linux-user/cris/signal.c | 29 ++-- linux-user/elfload.c | 13 ++ linux-user/hexagon/signal.c | 19 ++- linux-user/i386/signal.c | 42 +++--- linux-user/m68k/signal.c | 47 +++---- linux-user/microblaze/signal.c | 24 +++- linux-user/mips/signal.c | 39 ++++-- linux-user/openrisc/signal.c | 24 ++-- linux-user/ppc/signal.c | 34 ++--- linux-user/riscv/signal.c | 22 +-- linux-user/s390x/signal.c | 24 ++-- linux-user/sh4/signal.c | 40 +++--- linux-user/signal.c | 3 + linux-user/sparc/signal.c | 32 +++-- linux-user/xtensa/signal.c | 50 ++++--- 39 files changed, 488 insertions(+), 267 deletions(-) -- 2.25.1