diff options
Diffstat (limited to 'tests-m32/remap_file_pages.c')
-rw-r--r-- | tests-m32/remap_file_pages.c | 64 |
1 files changed, 52 insertions, 12 deletions
diff --git a/tests-m32/remap_file_pages.c b/tests-m32/remap_file_pages.c index 452d2de7..4e409630 100644 --- a/tests-m32/remap_file_pages.c +++ b/tests-m32/remap_file_pages.c @@ -1,7 +1,7 @@ /* * Check decoding of remap_file_pages syscall. * - * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org> + * Copyright (c) 2016-2017 Dmitry V. Levin <ldv@altlinux.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,22 +33,62 @@ #ifdef __NR_remap_file_pages # include <stdio.h> -# include <sys/mman.h> +# include <stdint.h> # include <unistd.h> +# include <linux/mman.h> + +static const char *errstr; + +static long +k_remap_file_pages(const kernel_ulong_t addr, + const kernel_ulong_t size, + const kernel_ulong_t prot, + const kernel_ulong_t pgoff, + const kernel_ulong_t flags) +{ + const long rc = syscall(__NR_remap_file_pages, + addr, size, prot, pgoff, flags); + errstr = sprintrc(rc); + return rc; +} int main(void) { - const unsigned long addr = (unsigned long) 0xfacefeeddeadbeefULL; - const unsigned long size = (unsigned long) 0xdefaced1bad2f00dULL; - const unsigned long prot = PROT_READ|PROT_WRITE|PROT_EXEC; - const unsigned long pgoff = (unsigned long) 0xcaf3babebad4deedULL; - const unsigned long flags = MAP_PRIVATE|MAP_ANONYMOUS; - - long rc = syscall(__NR_remap_file_pages, addr, size, prot, pgoff, flags); - printf("remap_file_pages(%#lx, %lu, %s, %lu, %s) = %ld %s (%m)\n", - addr, size, "PROT_READ|PROT_WRITE|PROT_EXEC", pgoff, - "MAP_PRIVATE|MAP_ANONYMOUS", rc, errno2name()); + kernel_ulong_t addr = (kernel_ulong_t) 0xfacefeeddeadbeefULL; + kernel_ulong_t size = (kernel_ulong_t) 0xdefaced1bad2f00dULL; + kernel_ulong_t prot = PROT_READ|PROT_WRITE|PROT_EXEC; + kernel_ulong_t pgoff = (kernel_ulong_t) 0xcaf3babebad4deedULL; + kernel_ulong_t flags = MAP_PRIVATE|MAP_ANONYMOUS; + + k_remap_file_pages(addr, size, prot, pgoff, flags); + printf("remap_file_pages(%#jx, %ju, %s, %ju, %s) = %s\n", + (uintmax_t) addr, (uintmax_t) size, + "PROT_READ|PROT_WRITE|PROT_EXEC", + (uintmax_t) pgoff, "MAP_PRIVATE|MAP_ANONYMOUS", errstr); + +#ifdef MAP_HUGETLB +# ifndef MAP_HUGE_2MB +# ifndef MAP_HUGE_SHIFT +# define MAP_HUGE_SHIFT 26 +# endif +# define MAP_HUGE_2MB (21 << MAP_HUGE_SHIFT) +# endif /* !MAP_HUGE_2MB */ + addr = (kernel_ulong_t) 0xfacefeeddeadf00dULL; + size = (kernel_ulong_t) 0xdefaced1bad2beefULL; + prot = (kernel_ulong_t) 0xdefaced00000000ULL | PROT_NONE; + flags = MAP_TYPE | MAP_FIXED | MAP_NORESERVE | MAP_HUGETLB | MAP_HUGE_2MB; + + k_remap_file_pages(addr, size, prot, pgoff, flags); + printf("remap_file_pages(%#jx, %ju, %s, %ju" + ", %#x /* MAP_??? */" + "|MAP_FIXED|MAP_NORESERVE|MAP_HUGETLB|21<<MAP_HUGE_SHIFT)" + " = %s\n", + (uintmax_t) addr, (uintmax_t) size, + prot == PROT_NONE ? "PROT_NONE" : + "0xdefaced00000000 /* PROT_??? */", + (uintmax_t) pgoff, MAP_TYPE, errstr); +#endif /* MAP_HUGETLB */ puts("+++ exited with 0 +++"); return 0; |