From: David Hildenbrand <david@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Thomas Huth" <thuth@redhat.com>,
"David Hildenbrand" <david@redhat.com>,
"Cornelia Huck" <cohuck@redhat.com>,
qemu-s390x@nongnu.org, "Alex Bennée" <alex.bennee@linaro.org>,
"Richard Henderson" <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH v1] tests/tcg: target/s390x: Test MVC
Date: Thu, 19 Sep 2019 11:28:29 +0200 [thread overview]
Message-ID: <20190919092829.15393-1-david@redhat.com> (raw)
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;
+}
--
2.21.0
next reply other threads:[~2019-09-19 9:29 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-19 9:28 David Hildenbrand [this message]
2019-09-19 9:41 ` [Qemu-devel] [PATCH v1] tests/tcg: target/s390x: Test MVC David Hildenbrand
2019-09-19 16:01 ` Richard Henderson
2019-09-20 9:14 ` David Hildenbrand
2019-09-20 12:03 ` David Hildenbrand
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=20190919092829.15393-1-david@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.