Skip to content

Commit

Permalink
tests/tcg: make test-mmap a little less aggressive
Browse files Browse the repository at this point in the history
The check_aligned_anonymous_unfixed_mmaps and
check_aligned_anonymous_unfixed_colliding_mmaps do a lot of mmap's and
copying of data. This is especially unfriendly to targets like hexagon
which have quite large pages and need to do sanity checks on each
memory access.

While we are at it clean-up the white space and style issues from the
legacy code. As we no longer do quite so much needless memory access
we can also remove the hexagon timeout hack.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
Message-Id: <20210709143005.1554-27-alex.bennee@linaro.org>
  • Loading branch information
stsquad committed Jul 14, 2021
1 parent 396c998 commit e2bcd3a
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 113 deletions.
9 changes: 0 additions & 9 deletions tests/tcg/hexagon/Makefile.target
Expand Up @@ -18,15 +18,6 @@
# Hexagon doesn't support gdb, so skip the EXTRA_RUNS
EXTRA_RUNS =

# Hexagon has 64K pages, so increase the timeout to keep
# test-mmap from timing out
ifeq ($(CONFIG_DEBUG_TCG),y)
TIMEOUT=800
else
TIMEOUT=500
endif


CFLAGS += -Wno-incompatible-pointer-types -Wno-undefined-internal
CFLAGS += -fno-unroll-loops

Expand Down
208 changes: 104 additions & 104 deletions tests/tcg/multiarch/test-mmap.c
Expand Up @@ -49,64 +49,62 @@ size_t test_fsize;

void check_aligned_anonymous_unfixed_mmaps(void)
{
void *p1;
void *p2;
void *p3;
void *p4;
void *p5;
uintptr_t p;
int i;

fprintf(stdout, "%s", __func__);
for (i = 0; i < 0x1fff; i++)
{
size_t len;

len = pagesize + (pagesize * i & 7);
p1 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
p2 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
p3 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
p4 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
p5 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

/* Make sure we get pages aligned with the pagesize. The
target expects this. */
fail_unless (p1 != MAP_FAILED);
fail_unless (p2 != MAP_FAILED);
fail_unless (p3 != MAP_FAILED);
fail_unless (p4 != MAP_FAILED);
fail_unless (p5 != MAP_FAILED);
p = (uintptr_t) p1;
D(printf ("p=%x\n", p));
fail_unless ((p & pagemask) == 0);
p = (uintptr_t) p2;
fail_unless ((p & pagemask) == 0);
p = (uintptr_t) p3;
fail_unless ((p & pagemask) == 0);
p = (uintptr_t) p4;
fail_unless ((p & pagemask) == 0);
p = (uintptr_t) p5;
fail_unless ((p & pagemask) == 0);

/* Make sure we can read from the entire area. */
memcpy (dummybuf, p1, pagesize);
memcpy (dummybuf, p2, pagesize);
memcpy (dummybuf, p3, pagesize);
memcpy (dummybuf, p4, pagesize);
memcpy (dummybuf, p5, pagesize);

munmap (p1, len);
munmap (p2, len);
munmap (p3, len);
munmap (p4, len);
munmap (p5, len);
}
fprintf(stdout, " passed\n");
void *p1;
void *p2;
void *p3;
void *p4;
void *p5;
uintptr_t p;
int i;
fprintf(stdout, "%s", __func__);
for (i = 0; i < 8; i++) {
size_t len;
len = pagesize + (pagesize * i);
p1 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
p2 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
p3 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
p4 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
p5 = mmap(NULL, len, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

/*
* Make sure we get pages aligned with the pagesize. The
* target expects this.
*/
fail_unless(p1 != MAP_FAILED);
fail_unless(p2 != MAP_FAILED);
fail_unless(p3 != MAP_FAILED);
fail_unless(p4 != MAP_FAILED);
fail_unless(p5 != MAP_FAILED);
p = (uintptr_t) p1;
D(printf("p=%x\n", p));
fail_unless((p & pagemask) == 0);
p = (uintptr_t) p2;
fail_unless((p & pagemask) == 0);
p = (uintptr_t) p3;
fail_unless((p & pagemask) == 0);
p = (uintptr_t) p4;
fail_unless((p & pagemask) == 0);
p = (uintptr_t) p5;
fail_unless((p & pagemask) == 0);

/* Make sure we can read from the entire area. */
memcpy(dummybuf, p1, pagesize);
memcpy(dummybuf, p2, pagesize);
memcpy(dummybuf, p3, pagesize);
memcpy(dummybuf, p4, pagesize);
memcpy(dummybuf, p5, pagesize);
munmap(p1, len);
munmap(p2, len);
munmap(p3, len);
munmap(p4, len);
munmap(p5, len);
}
fprintf(stdout, " passed\n");
}

void check_large_anonymous_unfixed_mmap(void)
Expand Down Expand Up @@ -135,52 +133,54 @@ void check_large_anonymous_unfixed_mmap(void)

void check_aligned_anonymous_unfixed_colliding_mmaps(void)
{
char *p1;
char *p2;
char *p3;
uintptr_t p;
int i;

fprintf(stdout, "%s", __func__);
for (i = 0; i < 0x2fff; i++)
{
int nlen;
p1 = mmap(NULL, pagesize, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
fail_unless (p1 != MAP_FAILED);
p = (uintptr_t) p1;
fail_unless ((p & pagemask) == 0);
memcpy (dummybuf, p1, pagesize);

p2 = mmap(NULL, pagesize, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
fail_unless (p2 != MAP_FAILED);
p = (uintptr_t) p2;
fail_unless ((p & pagemask) == 0);
memcpy (dummybuf, p2, pagesize);


munmap (p1, pagesize);
nlen = pagesize * 8;
p3 = mmap(NULL, nlen, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
fail_unless (p3 != MAP_FAILED);

/* Check if the mmaped areas collide. */
if (p3 < p2
&& (p3 + nlen) > p2)
fail_unless (0);

memcpy (dummybuf, p3, pagesize);

/* Make sure we get pages aligned with the pagesize. The
target expects this. */
p = (uintptr_t) p3;
fail_unless ((p & pagemask) == 0);
munmap (p2, pagesize);
munmap (p3, nlen);
}
fprintf(stdout, " passed\n");
char *p1;
char *p2;
char *p3;
uintptr_t p;
int i;

fprintf(stdout, "%s", __func__);
for (i = 0; i < 2; i++) {
int nlen;
p1 = mmap(NULL, pagesize, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
fail_unless(p1 != MAP_FAILED);
p = (uintptr_t) p1;
fail_unless((p & pagemask) == 0);
memcpy(dummybuf, p1, pagesize);

p2 = mmap(NULL, pagesize, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
fail_unless(p2 != MAP_FAILED);
p = (uintptr_t) p2;
fail_unless((p & pagemask) == 0);
memcpy(dummybuf, p2, pagesize);


munmap(p1, pagesize);
nlen = pagesize * 8;
p3 = mmap(NULL, nlen, PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
fail_unless(p3 != MAP_FAILED);

/* Check if the mmaped areas collide. */
if (p3 < p2
&& (p3 + nlen) > p2) {
fail_unless(0);
}

memcpy(dummybuf, p3, pagesize);

/*
* Make sure we get pages aligned with the pagesize. The
* target expects this.
*/
p = (uintptr_t) p3;
fail_unless((p & pagemask) == 0);
munmap(p2, pagesize);
munmap(p3, nlen);
}
fprintf(stdout, " passed\n");
}

void check_aligned_anonymous_fixed_mmaps(void)
Expand Down

0 comments on commit e2bcd3a

Please sign in to comment.