1 /*- 2 * Copyright (c) 2023 Dmitry Chagin <dchagin@FreeBSD.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7 #include <sys/mman.h> 8 9 #include <err.h> 10 #include <fcntl.h> 11 #include <stdlib.h> 12 #include <unistd.h> 13 14 #define MAP_32BIT_MAX_ADDR ((vm_offset_t)1 << 31) 15 16 int 17 main(void) 18 { 19 size_t pagesize; 20 void *s32; 21 int fd; 22 23 if ((pagesize = getpagesize()) <= 0) 24 err(1, "getpagesize"); 25 26 fd = open("/dev/zero", O_RDONLY); 27 if (fd <= 0) 28 err(1, "open failed"); 29 30 s32 = mmap(NULL, pagesize, PROT_READ, MAP_32BIT | MAP_PRIVATE, fd, 0); 31 if (s32 == MAP_FAILED) 32 err(1, "mmap MAP_32BIT | MAP_PRIVATE failed"); 33 if (((vm_offset_t)s32 + pagesize) > MAP_32BIT_MAX_ADDR) 34 errx(1, "mmap invalid result %p", s32); 35 36 close(fd); 37 if (munmap(s32, pagesize) != 0) 38 err(1, "munmap failed"); 39 40 s32 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, 41 MAP_32BIT | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 42 if (s32 == MAP_FAILED) 43 err(1, "mmap MAP_32BIT | MAP_ANONYMOUS | MAP_PRIVATE failed"); 44 if (((vm_offset_t)s32 + pagesize) > MAP_32BIT_MAX_ADDR) 45 errx(1, "mmap invalid result %p", s32); 46 47 if (munmap(s32, pagesize) != 0) 48 err(1, "munmap failed"); 49 exit(0); 50 } 51