All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: qemu-devel@nongnu.org
Cc: qemu-s390x@nongnu.org, "Cornelia Huck" <cohuck@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Thomas Huth" <thuth@redhat.com>,
	"Richard Henderson" <rth@twiddle.net>
Subject: Re: [PATCH v1] tests/tcg: target/s390x: Test MVC
Date: Fri, 20 Sep 2019 14:03:30 +0200	[thread overview]
Message-ID: <5cbd350c-0fb6-2b6b-e64b-04bd7f7f0b65@redhat.com> (raw)
In-Reply-To: <20190919092829.15393-1-david@redhat.com>

On 19.09.19 11:28, David Hildenbrand wrote:
> Let's add a test that especially verifies that no data will be touched
> in case we cross page boundaries and one page access triggers a fault.
> 
> Before the fault-safe handling fixes, the test failes with:
>       TEST    mvc on s390x
>     data modified during a fault
>     make[2]: *** [../Makefile.target:116: run-mvc] Error 1
> 
> Cc: Alex Bennée <alex.bennee@linaro.org>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  tests/tcg/s390x/Makefile.target |   1 +
>  tests/tcg/s390x/mvc.c           | 109 ++++++++++++++++++++++++++++++++
>  2 files changed, 110 insertions(+)
>  create mode 100644 tests/tcg/s390x/mvc.c
> 
> diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target
> index 6a3bfa8b29..241ef28f61 100644
> --- a/tests/tcg/s390x/Makefile.target
> +++ b/tests/tcg/s390x/Makefile.target
> @@ -7,3 +7,4 @@ TESTS+=exrl-trt
>  TESTS+=exrl-trtr
>  TESTS+=pack
>  TESTS+=mvo
> +TESTS+=mvc
> diff --git a/tests/tcg/s390x/mvc.c b/tests/tcg/s390x/mvc.c
> new file mode 100644
> index 0000000000..aa552d52e5
> --- /dev/null
> +++ b/tests/tcg/s390x/mvc.c
> @@ -0,0 +1,109 @@
> +#include <stdint.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <sys/mman.h>
> +#include <signal.h>
> +#include <setjmp.h>
> +
> +jmp_buf jmp_env;
> +
> +static void handle_sigsegv(int sig)
> +{
> +    siglongjmp(jmp_env, 1);
> +}
> +
> +#define ALLOC_SIZE (2 * 4096)
> +
> +static inline void mvc_256(const char *dst, const char *src)
> +{
> +    asm volatile (
> +        "    mvc 0(256,%[dst]),0(%[src])\n"
> +        :
> +        : [dst] "d" (dst),
> +          [src] "d" (src)
> +        : "memory");
> +}
> +
> +int main(void)
> +{
> +    char *src, *dst;
> +    int i;
> +
> +    /* register the SIGSEGV handler */
> +    if (signal(SIGSEGV, handle_sigsegv) == SIG_ERR) {
> +        fprintf(stderr, "SIGSEGV not registered\n");
> +        return 1;
> +    }
> +
> +    /* prepare the buffers - two consecutive pages */
> +    src = valloc(ALLOC_SIZE);
> +    dst = valloc(ALLOC_SIZE);
> +    memset(src, 0xff, ALLOC_SIZE);
> +    memset(dst, 0x0, ALLOC_SIZE);
> +
> +    /* protect the second pages */
> +    if (mprotect(src + 4096, 4096, PROT_NONE) ||
> +        mprotect(dst + 4096, 4096, PROT_NONE)) {
> +        fprintf(stderr, "mprotect failed\n");
> +        return 1;
> +    }
> +
> +    /* fault on second destination page */
> +    if (sigsetjmp(jmp_env, 1) == 0) {
> +        mvc_256(dst + 4096 - 128, src);
> +        fprintf(stderr, "fault not triggered\n");
> +        return 1;
> +    }
> +
> +    /* fault on second source page */
> +    if (sigsetjmp(jmp_env, 1) == 0) {
> +        mvc_256(dst, src + 4096 - 128);
> +        fprintf(stderr, "fault not triggered\n");
> +        return 1;
> +    }
> +
> +    /* fault on second source and second destination page */
> +    if (sigsetjmp(jmp_env, 1) == 0) {
> +        mvc_256(dst + 4096 - 128, src + 4096 - 128);
> +        fprintf(stderr, "fault not triggered\n");
> +        return 1;
> +    }
> +
> +    /* restore permissions */
> +    if (mprotect(src + 4096, 4096, PROT_READ | PROT_WRITE) ||
> +        mprotect(dst + 4096, 4096, PROT_READ | PROT_WRITE)) {
> +        fprintf(stderr, "mprotect failed\n");
> +        return 1;
> +    }
> +
> +    /* no data must be touched during the faults */
> +    for (i = 0; i < ALLOC_SIZE; i++) {
> +        if (src[i] != 0xff || dst[i]) {
> +            fprintf(stderr, "data modified during a fault\n");
> +            return 1;
> +        }
> +    }
> +
> +    /* test if MVC works now correctly accross page boundaries */
> +    mvc_256(dst + 4096 - 128, src + 4096 - 128);
> +    for (i = 0; i < ALLOC_SIZE; i++) {
> +        if (src[i] != 0xff) {
> +            fprintf(stderr, "src modified\n");
> +            return 1;
> +        }
> +        if (i < 4096 - 128 || i >= 4096 + 128) {
> +            if (dst[i]) {
> +                fprintf(stderr, "wrong dst modified\n");
> +                return 1;
> +            }
> +        } else {
> +            if (dst[i] != 0xff) {
> +                fprintf(stderr, "wrong data moved\n");
> +                return 1;
> +            }
> +        }
> +    }
> +
> +    return 0;
> +}
> 

I'll send this along with the updated pull request of

"[PULL SUBSYSTEM s390x 00/29] s390x/tcg: mem_helper: Fault-safe handling"

-- 

Thanks,

David / dhildenb


  parent reply	other threads:[~2019-09-20 12:05 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-19  9:28 [Qemu-devel] [PATCH v1] tests/tcg: target/s390x: Test MVC David Hildenbrand
2019-09-19  9:41 ` David Hildenbrand
2019-09-19 16:01   ` Richard Henderson
2019-09-20  9:14     ` David Hildenbrand
2019-09-20 12:03 ` David Hildenbrand [this message]
2019-09-20 13:02   ` 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=5cbd350c-0fb6-2b6b-e64b-04bd7f7f0b65@redhat.com \
    --to=david@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=cohuck@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=thuth@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.