qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
To: "Alex Bennée" <alex.bennee@linaro.org>, qemu-devel@nongnu.org
Cc: "Beraldo Leal" <bleal@redhat.com>,
	"Laurent Vivier" <laurent@vivier.eu>,
	"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
	"Mahmoud Mandour" <ma.mandourr@gmail.com>,
	"Jiaxun Yang" <jiaxun.yang@flygoat.com>,
	"Yanan Wang" <wangyanan55@huawei.com>,
	"Thomas Huth" <thuth@redhat.com>, "John Snow" <jsnow@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	qemu-arm@nongnu.org, "Daniel P. Berrangé" <berrange@redhat.com>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	devel@lists.libvirt.org, "Cleber Rosa" <crosa@redhat.com>,
	kvm@vger.kernel.org, "Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Alexandre Iooss" <erdnaxe@crans.org>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Riku Voipio" <riku.voipio@iki.fi>,
	"Zhao Liu" <zhao1.liu@intel.com>,
	"Marcelo Tosatti" <mtosatti@redhat.com>,
	"Edgar E. Iglesias" <edgar.iglesias@gmail.com>,
	"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Ilya Leoshkevich" <iii@linux.ibm.com>
Subject: Re: [PATCH v2 07/20] tests/tcg/x86_64: Add cross-modifying code test
Date: Tue, 22 Oct 2024 13:36:20 -0700	[thread overview]
Message-ID: <6b18238b-f9c3-4046-964f-de16dc30d26e@linaro.org> (raw)
In-Reply-To: <20241022105614.839199-8-alex.bennee@linaro.org>

On 10/22/24 03:56, Alex Bennée wrote:
> From: Ilya Leoshkevich <iii@linux.ibm.com>
> 
> commit f025692c992c ("accel/tcg: Clear PAGE_WRITE before translation")
> fixed cross-modifying code handling, but did not add a test. The
> changed code was further improved recently [1], and I was not sure
> whether these modifications were safe (spoiler: they were fine).
> 
> Add a test to make sure there are no regressions.
> 
> [1] https://lists.gnu.org/archive/html/qemu-devel/2022-09/msg00034.html
> 
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> Message-Id: <20241001150617.9977-1-iii@linux.ibm.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
>   tests/tcg/x86_64/cross-modifying-code.c | 80 +++++++++++++++++++++++++
>   tests/tcg/x86_64/Makefile.target        |  4 ++
>   2 files changed, 84 insertions(+)
>   create mode 100644 tests/tcg/x86_64/cross-modifying-code.c
> 
> diff --git a/tests/tcg/x86_64/cross-modifying-code.c b/tests/tcg/x86_64/cross-modifying-code.c
> new file mode 100644
> index 0000000000..2704df6061
> --- /dev/null
> +++ b/tests/tcg/x86_64/cross-modifying-code.c
> @@ -0,0 +1,80 @@
> +/*
> + * Test patching code, running in one thread, from another thread.
> + *
> + * Intel SDM calls this "cross-modifying code" and recommends a special
> + * sequence, which requires both threads to cooperate.
> + *
> + * Linux kernel uses a different sequence that does not require cooperation and
> + * involves patching the first byte with int3.
> + *
> + * Finally, there is user-mode software out there that simply uses atomics, and
> + * that seems to be good enough in practice. Test that QEMU has no problems
> + * with this as well.
> + */
> +
> +#include <assert.h>
> +#include <pthread.h>
> +#include <stdbool.h>
> +#include <stdlib.h>
> +
> +void add1_or_nop(long *x);
> +asm(".pushsection .rwx,\"awx\",@progbits\n"
> +    ".globl add1_or_nop\n"
> +    /* addq $0x1,(%rdi) */
> +    "add1_or_nop: .byte 0x48, 0x83, 0x07, 0x01\n"
> +    "ret\n"
> +    ".popsection\n");
> +
> +#define THREAD_WAIT 0
> +#define THREAD_PATCH 1
> +#define THREAD_STOP 2
> +
> +static void *thread_func(void *arg)
> +{
> +    int val = 0x0026748d; /* nop */
> +
> +    while (true) {
> +        switch (__atomic_load_n((int *)arg, __ATOMIC_SEQ_CST)) {
> +        case THREAD_WAIT:
> +            break;
> +        case THREAD_PATCH:
> +            val = __atomic_exchange_n((int *)&add1_or_nop, val,
> +                                      __ATOMIC_SEQ_CST);
> +            break;
> +        case THREAD_STOP:
> +            return NULL;
> +        default:
> +            assert(false);
> +            __builtin_unreachable();

Use g_assert_not_reached() instead.
checkpatch emits an error for it now.

> +        }
> +    }
> +}
> +
> +#define INITIAL 42
> +#define COUNT 1000000
> +
> +int main(void)
> +{
> +    int command = THREAD_WAIT;
> +    pthread_t thread;
> +    long x = 0;
> +    int err;
> +    int i;
> +
> +    err = pthread_create(&thread, NULL, &thread_func, &command);
> +    assert(err == 0);
> +
> +    __atomic_store_n(&command, THREAD_PATCH, __ATOMIC_SEQ_CST);
> +    for (i = 0; i < COUNT; i++) {
> +        add1_or_nop(&x);
> +    }
> +    __atomic_store_n(&command, THREAD_STOP, __ATOMIC_SEQ_CST);
> +
> +    err = pthread_join(thread, NULL);
> +    assert(err == 0);
> +
> +    assert(x >= INITIAL);
> +    assert(x <= INITIAL + COUNT);
> +
> +    return EXIT_SUCCESS;
> +}
> diff --git a/tests/tcg/x86_64/Makefile.target b/tests/tcg/x86_64/Makefile.target
> index 783ab5b21a..d6dff559c7 100644
> --- a/tests/tcg/x86_64/Makefile.target
> +++ b/tests/tcg/x86_64/Makefile.target
> @@ -17,6 +17,7 @@ X86_64_TESTS += cmpxchg
>   X86_64_TESTS += adox
>   X86_64_TESTS += test-1648
>   X86_64_TESTS += test-2175
> +X86_64_TESTS += cross-modifying-code
>   TESTS=$(MULTIARCH_TESTS) $(X86_64_TESTS) test-x86_64
>   else
>   TESTS=$(MULTIARCH_TESTS)
> @@ -27,6 +28,9 @@ adox: CFLAGS=-O2
>   run-test-i386-ssse3: QEMU_OPTS += -cpu max
>   run-plugin-test-i386-ssse3-%: QEMU_OPTS += -cpu max
>   
> +cross-modifying-code: CFLAGS+=-pthread
> +cross-modifying-code: LDFLAGS+=-pthread
> +
>   test-x86_64: LDFLAGS+=-lm -lc
>   test-x86_64: test-i386.c test-i386.h test-i386-shift.h test-i386-muldiv.h
>   	$(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)

With this change,
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>

  reply	other threads:[~2024-10-22 20:36 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-22 10:55 [PATCH v2 00/20] maintainer updates (testing, gdbstub, plugins) Alex Bennée
2024-10-22 10:55 ` [PATCH v2 01/20] tests/docker: Fix microblaze atomics Alex Bennée
2024-10-22 20:30   ` Pierrick Bouvier
2024-10-22 10:55 ` [PATCH v2 02/20] tests/docker: add NOFETCH env variable for testing Alex Bennée
2024-10-22 20:31   ` Pierrick Bouvier
2024-10-22 10:55 ` [PATCH v2 03/20] MAINTAINERS: mention my testing/next tree Alex Bennée
2024-10-22 11:20   ` Thomas Huth
2024-10-22 10:55 ` [PATCH v2 04/20] meson: hide tsan related warnings Alex Bennée
2024-10-22 10:55 ` [PATCH v2 05/20] docs/devel: update tsan build documentation Alex Bennée
2024-10-22 10:56 ` [PATCH v2 06/20] scripts/ci: remove architecture checks for build-environment updates Alex Bennée
2024-10-22 20:32   ` Pierrick Bouvier
2024-10-22 10:56 ` [PATCH v2 07/20] tests/tcg/x86_64: Add cross-modifying code test Alex Bennée
2024-10-22 20:36   ` Pierrick Bouvier [this message]
2024-10-23  0:16     ` Ilya Leoshkevich
2024-10-23  0:33       ` Pierrick Bouvier
2024-10-23  8:55         ` Alex Bennée
2024-10-22 10:56 ` [PATCH v2 08/20] accel/tcg: add tracepoints for cpu_loop_exit_atomic Alex Bennée
2024-10-22 10:56 ` [PATCH v2 09/20] dockerfiles: fix default targets for debian-loongarch-cross Alex Bennée
2024-10-22 10:56 ` [PATCH v2 10/20] gitlab: make check-[dco|patch] a little more verbose Alex Bennée
2024-10-22 11:04   ` Daniel P. Berrangé
2024-10-22 11:08   ` Thomas Huth
2024-10-22 10:56 ` [PATCH v2 11/20] MAINTAINERS: mention my gdbstub/next tree Alex Bennée
2024-10-22 11:29   ` Thomas Huth
2024-10-22 21:35   ` Philippe Mathieu-Daudé
2024-10-22 10:56 ` [PATCH v2 12/20] config/targets: update aarch64_be-linux-user gdb XML list Alex Bennée
2024-10-22 20:37   ` Pierrick Bouvier
2024-10-22 10:56 ` [PATCH v2 13/20] tests/tcg: enable basic testing for aarch64_be-linux-user Alex Bennée
2024-10-22 19:12   ` Richard Henderson
2024-10-22 20:39   ` Pierrick Bouvier
2024-10-22 21:37   ` Philippe Mathieu-Daudé
2024-10-22 10:56 ` [PATCH v2 14/20] tests/tcg/aarch64: Use raw strings for regexes in test-mte.py Alex Bennée
2024-10-22 10:56 ` [PATCH v2 15/20] testing: Enhance gdb probe script Alex Bennée
2024-10-22 20:39   ` Pierrick Bouvier
2024-10-22 10:56 ` [PATCH v2 16/20] MAINTAINERS: mention my plugins/next tree Alex Bennée
2024-10-22 20:40   ` Pierrick Bouvier
2024-10-22 10:56 ` [PATCH v2 17/20] plugins: add ability to register a GDB triggered callback Alex Bennée
2024-10-22 20:47   ` Pierrick Bouvier
2024-10-22 10:56 ` [PATCH v2 18/20] meson: build contrib/plugins with meson Alex Bennée
2024-10-23  7:51   ` Pierrick Bouvier
2024-10-23  8:57     ` Alex Bennée
2024-10-23 21:31       ` Pierrick Bouvier
2024-10-22 10:56 ` [PATCH v2 19/20] contrib/plugins: remove Makefile for contrib/plugins Alex Bennée
2024-10-22 10:56 ` [PATCH v2 20/20] plugins: fix qemu_plugin_reset Alex Bennée

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6b18238b-f9c3-4046-964f-de16dc30d26e@linaro.org \
    --to=pierrick.bouvier@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=berrange@redhat.com \
    --cc=bleal@redhat.com \
    --cc=crosa@redhat.com \
    --cc=devel@lists.libvirt.org \
    --cc=edgar.iglesias@gmail.com \
    --cc=eduardo@habkost.net \
    --cc=erdnaxe@crans.org \
    --cc=iii@linux.ibm.com \
    --cc=jiaxun.yang@flygoat.com \
    --cc=jsnow@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=laurent@vivier.eu \
    --cc=ma.mandourr@gmail.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mtosatti@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=riku.voipio@iki.fi \
    --cc=thuth@redhat.com \
    --cc=wainersm@redhat.com \
    --cc=wangyanan55@huawei.com \
    --cc=zhao1.liu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).