mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-15 15:32:51 +00:00
tests/tcg: make test-mmap a little less aggressive
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>
This commit is contained in:
parent
396c9984fd
commit
e2bcd3ad09
|
@ -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
|
||||
|
||||
|
|
|
@ -56,13 +56,10 @@ void check_aligned_anonymous_unfixed_mmaps(void)
|
|||
void *p5;
|
||||
uintptr_t p;
|
||||
int i;
|
||||
|
||||
fprintf(stdout, "%s", __func__);
|
||||
for (i = 0; i < 0x1fff; i++)
|
||||
{
|
||||
for (i = 0; i < 8; i++) {
|
||||
size_t len;
|
||||
|
||||
len = pagesize + (pagesize * i & 7);
|
||||
len = pagesize + (pagesize * i);
|
||||
p1 = mmap(NULL, len, PROT_READ,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
p2 = mmap(NULL, len, PROT_READ,
|
||||
|
@ -74,37 +71,38 @@ void check_aligned_anonymous_unfixed_mmaps(void)
|
|||
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);
|
||||
/*
|
||||
* 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);
|
||||
D(printf("p=%x\n", p));
|
||||
fail_unless((p & pagemask) == 0);
|
||||
p = (uintptr_t) p2;
|
||||
fail_unless ((p & pagemask) == 0);
|
||||
fail_unless((p & pagemask) == 0);
|
||||
p = (uintptr_t) p3;
|
||||
fail_unless ((p & pagemask) == 0);
|
||||
fail_unless((p & pagemask) == 0);
|
||||
p = (uintptr_t) p4;
|
||||
fail_unless ((p & pagemask) == 0);
|
||||
fail_unless((p & pagemask) == 0);
|
||||
p = (uintptr_t) p5;
|
||||
fail_unless ((p & pagemask) == 0);
|
||||
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);
|
||||
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");
|
||||
}
|
||||
|
@ -142,43 +140,45 @@ void check_aligned_anonymous_unfixed_colliding_mmaps(void)
|
|||
int i;
|
||||
|
||||
fprintf(stdout, "%s", __func__);
|
||||
for (i = 0; i < 0x2fff; i++)
|
||||
{
|
||||
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);
|
||||
fail_unless(p1 != MAP_FAILED);
|
||||
p = (uintptr_t) p1;
|
||||
fail_unless ((p & pagemask) == 0);
|
||||
memcpy (dummybuf, p1, pagesize);
|
||||
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);
|
||||
fail_unless(p2 != MAP_FAILED);
|
||||
p = (uintptr_t) p2;
|
||||
fail_unless ((p & pagemask) == 0);
|
||||
memcpy (dummybuf, p2, pagesize);
|
||||
fail_unless((p & pagemask) == 0);
|
||||
memcpy(dummybuf, p2, pagesize);
|
||||
|
||||
|
||||
munmap (p1, pagesize);
|
||||
munmap(p1, pagesize);
|
||||
nlen = pagesize * 8;
|
||||
p3 = mmap(NULL, nlen, PROT_READ,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
fail_unless (p3 != MAP_FAILED);
|
||||
fail_unless(p3 != MAP_FAILED);
|
||||
|
||||
/* Check if the mmaped areas collide. */
|
||||
if (p3 < p2
|
||||
&& (p3 + nlen) > p2)
|
||||
fail_unless (0);
|
||||
&& (p3 + nlen) > p2) {
|
||||
fail_unless(0);
|
||||
}
|
||||
|
||||
memcpy (dummybuf, p3, pagesize);
|
||||
memcpy(dummybuf, p3, pagesize);
|
||||
|
||||
/* Make sure we get pages aligned with the pagesize. The
|
||||
target expects this. */
|
||||
/*
|
||||
* 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);
|
||||
fail_unless((p & pagemask) == 0);
|
||||
munmap(p2, pagesize);
|
||||
munmap(p3, nlen);
|
||||
}
|
||||
fprintf(stdout, " passed\n");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue