qemu-e2k/tests/tcg/multiarch/linux/linux-madvise.c
Richard Henderson 6ada861951 tests/tcg: Extend file in linux-madvise.c
When guest page size > host page size, this test can fail
due to the SIGBUS protection hack.  Avoid this by making
sure that the file size is at least one guest page.

Visible with alpha guest on x86_64 host.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Ilya Leoshkevich <iii@linux.ibm.com>
Acked-by: Helge Deller <deller@gmx.de>
Message-Id: <20240102015808.132373-26-richard.henderson@linaro.org>
2024-02-29 11:35:37 -10:00

73 lines
1.7 KiB
C

#include <assert.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
static void test_anonymous(void)
{
int pagesize = getpagesize();
char *page;
int ret;
page = mmap(NULL, pagesize, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
assert(page != MAP_FAILED);
/* Check that mprotect() does not interfere with MADV_DONTNEED. */
ret = mprotect(page, pagesize, PROT_READ | PROT_WRITE);
assert(ret == 0);
/* Check that MADV_DONTNEED clears the page. */
*page = 42;
ret = madvise(page, pagesize, MADV_DONTNEED);
assert(ret == 0);
assert(*page == 0);
ret = munmap(page, pagesize);
assert(ret == 0);
}
static void test_file(void)
{
char tempname[] = "/tmp/.cmadviseXXXXXX";
int pagesize = getpagesize();
ssize_t written;
char c = 42;
char *page;
int ret;
int fd;
fd = mkstemp(tempname);
assert(fd != -1);
ret = unlink(tempname);
assert(ret == 0);
written = write(fd, &c, sizeof(c));
assert(written == sizeof(c));
ret = ftruncate(fd, pagesize);
assert(ret == 0);
page = mmap(NULL, pagesize, PROT_READ, MAP_PRIVATE, fd, 0);
assert(page != MAP_FAILED);
/* Check that mprotect() does not interfere with MADV_DONTNEED. */
ret = mprotect(page, pagesize, PROT_READ | PROT_WRITE);
assert(ret == 0);
/* Check that MADV_DONTNEED resets the page. */
*page = 0;
ret = madvise(page, pagesize, MADV_DONTNEED);
assert(ret == 0);
assert(*page == c);
ret = munmap(page, pagesize);
assert(ret == 0);
ret = close(fd);
assert(ret == 0);
}
int main(void)
{
test_anonymous();
test_file();
return EXIT_SUCCESS;
}