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
16int
17main(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