qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
To: "Ilya Leoshkevich" <iii@linux.ibm.com>,
	"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>
Subject: Re: [PATCH v2 07/20] tests/tcg/x86_64: Add cross-modifying code test
Date: Tue, 22 Oct 2024 17:33:21 -0700	[thread overview]
Message-ID: <17ab6a26-bfd2-4ee6-8fc4-c371d266dcb1@linaro.org> (raw)
In-Reply-To: <4c383f09bd6bd9b488ad301e5f050b8c9971f3a2.camel@linux.ibm.com>

On 10/22/24 17:16, Ilya Leoshkevich wrote:
> On Tue, 2024-10-22 at 13:36 -0700, Pierrick Bouvier wrote:
>> 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.
> 
> Is there an easy way to include glib from testcases?
> It's located using meson, and I can't immediately see how to push the
> respective compiler flags to the test Makefiles - this seems to be
> currently handled by configure writing to $config_target_mak.
> 
> [...]
> 

Sorry you're right, I missed the fact tests don't have the deps we have 
in QEMU itself.
I don't think any test case include any extra dependency for now (and 
would make it hard to cross compile them too), so it's not worth trying 
to get the right glib header for this.

I don't now if it will be a problem when merging the series regarding 
checkpatch, but if it is, we can always replace this by abort, or exit.

> 

As it is,
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>

  reply	other threads:[~2024-10-23  0:34 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
2024-10-23  0:16     ` Ilya Leoshkevich
2024-10-23  0:33       ` Pierrick Bouvier [this message]
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=17ab6a26-bfd2-4ee6-8fc4-c371d266dcb1@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).