Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests Make the trigger_bus() test compatible with more CPUs ...



details:   https://anonhg.NetBSD.org/src/rev/8a7886f27f39
branches:  trunk
changeset: 319452:8a7886f27f39
user:      kamil <kamil%NetBSD.org@localhost>
date:      Wed May 30 17:31:34 2018 +0000

description:
Make the trigger_bus() test compatible with more CPUs (at least ALPHA)

If we write a byte character into a pointer, a compiler can emit a
read-modify-write operation, especially when a CPU cannot access directly
a character wide address.

In this scenario calling mmap(2) with PROT_WRITE, without PROT_READ will
emit unexpected trap.

There are two possible workarounds for this issue:
 - write register wide memory without rmw sequence,
 - mark the region with additional protection PROT_READ

Both work for NetBSD/alpha.

Go for the latter as perhaps more safe for dump compilers emitting rmw
sequences.

Investigated by <martin>

diffstat:

 tests/kernel/h_segv.c              |  6 +++---
 tests/lib/libc/sys/t_ptrace_wait.h |  4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diffs (45 lines):

diff -r 32983a467ae4 -r 8a7886f27f39 tests/kernel/h_segv.c
--- a/tests/kernel/h_segv.c     Wed May 30 17:17:11 2018 +0000
+++ b/tests/kernel/h_segv.c     Wed May 30 17:31:34 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: h_segv.c,v 1.5 2018/05/27 17:04:45 kamil Exp $ */
+/*     $NetBSD: h_segv.c,v 1.6 2018/05/30 17:31:34 kamil Exp $ */
 
 /*-
  * Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: h_segv.c,v 1.5 2018/05/27 17:04:45 kamil Exp $");
+__RCSID("$NetBSD: h_segv.c,v 1.6 2018/05/30 17:31:34 kamil Exp $");
 
 #include <sys/types.h>
 #include <sys/mman.h>
@@ -120,7 +120,7 @@
                err(EXIT_FAILURE, "tmpfile");
 
        /* Map an empty file with mmap(2) to a pointer. */
-       p = mmap(0, 1, PROT_WRITE, MAP_PRIVATE, fileno(fp), 0);
+       p = mmap(0, 1, PROT_READ|PROT_WRITE, MAP_PRIVATE, fileno(fp), 0);
        if (p == MAP_FAILED)
                err(EXIT_FAILURE, "mmap");
 
diff -r 32983a467ae4 -r 8a7886f27f39 tests/lib/libc/sys/t_ptrace_wait.h
--- a/tests/lib/libc/sys/t_ptrace_wait.h        Wed May 30 17:17:11 2018 +0000
+++ b/tests/lib/libc/sys/t_ptrace_wait.h        Wed May 30 17:31:34 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: t_ptrace_wait.h,v 1.9 2018/05/27 17:16:39 kamil Exp $  */
+/*     $NetBSD: t_ptrace_wait.h,v 1.10 2018/05/30 17:31:34 kamil Exp $ */
 
 /*-
  * Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -575,7 +575,7 @@
        FORKEE_ASSERT_NEQ((uintptr_t)fp, (uintptr_t)NULL);
 
        /* Map an empty file with mmap(2) to a pointer. */
-       p = mmap(0, 1, PROT_WRITE, MAP_PRIVATE, fileno(fp), 0);
+       p = mmap(0, 1, PROT_READ|PROT_WRITE, MAP_PRIVATE, fileno(fp), 0);
        FORKEE_ASSERT_NEQ((uintptr_t)p, (uintptr_t)MAP_FAILED);
 
        /* Invalid memory access causes CPU trap, translated to SIGBUS */



Home | Main Index | Thread Index | Old Index