1/*-
  2 * SPDX-License-Identifier: BSD-3-Clause
  3 *
  4 * Copyright (c) 1982, 1986, 1993
  5 *	The Regents of the University of California.  All rights reserved.
  6 *
  7 * Redistribution and use in source and binary forms, with or without
  8 * modification, are permitted provided that the following conditions
  9 * are met:
 10 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer.
 12 * 2. Redistributions in binary form must reproduce the above copyright
 13 *    notice, this list of conditions and the following disclaimer in the
 14 *    documentation and/or other materials provided with the distribution.
 15 * 3. Neither the name of the University nor the names of its contributors
 16 *    may be used to endorse or promote products derived from this software
 17 *    without specific prior written permission.
 18 *
 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 29 * SUCH DAMAGE.
 30 *
 31 *	@(#)mman.h	8.2 (Berkeley) 1/9/95
 32 */
 33
 34#ifndef _SYS_MMAN_H_
 35#define _SYS_MMAN_H_
 36
 37#include <sys/cdefs.h>
 38#include <sys/_types.h>
 39
 40#if __BSD_VISIBLE
 41/*
 42 * Inheritance for minherit()
 43 */
 44#define INHERIT_SHARE	0
 45#define INHERIT_COPY	1
 46#define INHERIT_NONE	2
 47#define INHERIT_ZERO	3
 48#endif
 49
 50/*
 51 * Protections are chosen from these bits, or-ed together
 52 */
 53#define	PROT_NONE	0x00	/* no permissions */
 54#define	PROT_READ	0x01	/* pages can be read */
 55#define	PROT_WRITE	0x02	/* pages can be written */
 56#define	PROT_EXEC	0x04	/* pages can be executed */
 57#if __BSD_VISIBLE
 58#define	_PROT_ALL	(PROT_READ | PROT_WRITE | PROT_EXEC)
 59#define	PROT_EXTRACT(prot)	((prot) & _PROT_ALL)
 60
 61#define	_PROT_MAX_SHIFT	16
 62#define	PROT_MAX(prot)		((prot) << _PROT_MAX_SHIFT)
 63#define	PROT_MAX_EXTRACT(prot)	(((prot) >> _PROT_MAX_SHIFT) & _PROT_ALL)
 64#endif
 65
 66/*
 67 * Flags contain sharing type and options.
 68 * Sharing types; choose one.
 69 */
 70#define	MAP_SHARED	0x0001		/* share changes */
 71#define	MAP_PRIVATE	0x0002		/* changes are private */
 72#if __BSD_VISIBLE
 73#define	MAP_COPY	MAP_PRIVATE	/* Obsolete */
 74#endif
 75
 76/*
 77 * Other flags
 78 */
 79#define	MAP_FIXED	 0x0010	/* map addr must be exactly as requested */
 80
 81#if __BSD_VISIBLE
 82#define	MAP_RESERVED0020 0x0020	/* previously unimplemented MAP_RENAME */
 83#define	MAP_RESERVED0040 0x0040	/* previously unimplemented MAP_NORESERVE */
 84#define	MAP_RESERVED0080 0x0080	/* previously misimplemented MAP_INHERIT */
 85#define	MAP_RESERVED0100 0x0100	/* previously unimplemented MAP_NOEXTEND */
 86#define	MAP_HASSEMAPHORE 0x0200	/* region may contain semaphores */
 87#define	MAP_STACK	 0x0400	/* region grows down, like a stack */
 88#define	MAP_NOSYNC	 0x0800 /* page to but do not sync underlying file */
 89
 90/*
 91 * Mapping type
 92 */
 93#define	MAP_FILE	 0x0000	/* map from file (default) */
 94#define	MAP_ANON	 0x1000	/* allocated from memory, swap space */
 95#ifndef _KERNEL
 96#define	MAP_ANONYMOUS	 MAP_ANON /* For compatibility. */
 97#endif /* !_KERNEL */
 98
 99/*
100 * Extended flags
101 */
102#define	MAP_GUARD	 0x00002000 /* reserve but don't map address range */
103#define	MAP_EXCL	 0x00004000 /* for MAP_FIXED, fail if address is used */
104#define	MAP_NOCORE	 0x00020000 /* dont include these pages in a coredump */
105#define	MAP_PREFAULT_READ 0x00040000 /* prefault mapping for reading */
106#define	MAP_32BIT	 0x00080000 /* map in the low 2GB of address space */
107
108/*
109 * Request specific alignment (n == log2 of the desired alignment).
110 *
111 * MAP_ALIGNED_SUPER requests optimal superpage alignment, but does
112 * not enforce a specific alignment.
113 */
114#define	MAP_ALIGNED(n)	 ((n) << MAP_ALIGNMENT_SHIFT)
115#define	MAP_ALIGNMENT_SHIFT	24
116#define	MAP_ALIGNMENT_MASK	MAP_ALIGNED(0xff)
117#define	MAP_ALIGNED_SUPER	MAP_ALIGNED(1) /* align on a superpage */
118
119/*
120 * Flags provided to shm_rename
121 */
122/* Don't overwrite dest, if it exists */
123#define SHM_RENAME_NOREPLACE	(1 << 0)
124/* Atomically swap src and dest */
125#define SHM_RENAME_EXCHANGE	(1 << 1)
126
127#endif /* __BSD_VISIBLE */
128
129#if __POSIX_VISIBLE >= 199309
130/*
131 * Process memory locking
132 */
133#define MCL_CURRENT	0x0001	/* Lock only current memory */
134#define MCL_FUTURE	0x0002	/* Lock all future memory as well */
135#endif
136
137/*
138 * Error return from mmap()
139 */
140#define MAP_FAILED	((void *)-1)
141
142/*
143 * msync() flags
144 */
145#define	MS_SYNC		0x0000	/* msync synchronously */
146#define MS_ASYNC	0x0001	/* return immediately */
147#define MS_INVALIDATE	0x0002	/* invalidate all cached data */
148
149/*
150 * Advice to madvise
151 */
152#define	_MADV_NORMAL	0	/* no further special treatment */
153#define	_MADV_RANDOM	1	/* expect random page references */
154#define	_MADV_SEQUENTIAL 2	/* expect sequential page references */
155#define	_MADV_WILLNEED	3	/* will need these pages */
156#define	_MADV_DONTNEED	4	/* dont need these pages */
157
158#if __BSD_VISIBLE
159#define	MADV_NORMAL	_MADV_NORMAL
160#define	MADV_RANDOM	_MADV_RANDOM
161#define	MADV_SEQUENTIAL _MADV_SEQUENTIAL
162#define	MADV_WILLNEED	_MADV_WILLNEED
163#define	MADV_DONTNEED	_MADV_DONTNEED
164#define	MADV_FREE	5	/* dont need these pages, and junk contents */
165#define	MADV_NOSYNC	6	/* try to avoid flushes to physical media */
166#define	MADV_AUTOSYNC	7	/* revert to default flushing strategy */
167#define	MADV_NOCORE	8	/* do not include these pages in a core file */
168#define	MADV_CORE	9	/* revert to including pages in a core file */
169#define	MADV_PROTECT	10	/* protect process from pageout kill */
170
171/*
172 * Return bits from mincore
173 */
174#define	MINCORE_INCORE	 	 0x1 /* Page is incore */
175#define	MINCORE_REFERENCED	 0x2 /* Page has been referenced by us */
176#define	MINCORE_MODIFIED	 0x4 /* Page has been modified by us */
177#define	MINCORE_REFERENCED_OTHER 0x8 /* Page has been referenced */
178#define	MINCORE_MODIFIED_OTHER	0x10 /* Page has been modified */
179#define	MINCORE_SUPER		0x60 /* Page is a "super" page */
180#define	MINCORE_PSIND(i)	(((i) << 5) & MINCORE_SUPER) /* Page size */
181
182/*
183 * Anonymous object constant for shm_open().
184 */
185#define	SHM_ANON		((char *)1)
186
187/*
188 * shmflags for shm_open2()
189 */
190#define	SHM_ALLOW_SEALING		0x00000001
191#define	SHM_GROW_ON_WRITE		0x00000002
192#define	SHM_LARGEPAGE			0x00000004
193
194#define	SHM_LARGEPAGE_ALLOC_DEFAULT	0
195#define	SHM_LARGEPAGE_ALLOC_NOWAIT	1
196#define	SHM_LARGEPAGE_ALLOC_HARD	2
197
198struct shm_largepage_conf {
199	int psind;
200	int alloc_policy;
201	int pad[10];
202};
203
204/*
205 * Flags for memfd_create().
206 */
207#define	MFD_CLOEXEC			0x00000001
208#define	MFD_ALLOW_SEALING		0x00000002
209
210#define	MFD_HUGETLB			0x00000004
211
212#define	MFD_HUGE_MASK			0xFC000000
213#define	MFD_HUGE_SHIFT			26
214#define	MFD_HUGE_64KB			(16 << MFD_HUGE_SHIFT)
215#define	MFD_HUGE_512KB			(19 << MFD_HUGE_SHIFT)
216#define	MFD_HUGE_1MB			(20 << MFD_HUGE_SHIFT)
217#define	MFD_HUGE_2MB			(21 << MFD_HUGE_SHIFT)
218#define	MFD_HUGE_8MB			(23 << MFD_HUGE_SHIFT)
219#define	MFD_HUGE_16MB			(24 << MFD_HUGE_SHIFT)
220#define	MFD_HUGE_32MB			(25 << MFD_HUGE_SHIFT)
221#define	MFD_HUGE_256MB			(28 << MFD_HUGE_SHIFT)
222#define	MFD_HUGE_512MB			(29 << MFD_HUGE_SHIFT)
223#define	MFD_HUGE_1GB			(30 << MFD_HUGE_SHIFT)
224#define	MFD_HUGE_2GB			(31 << MFD_HUGE_SHIFT)
225#define	MFD_HUGE_16GB			(34 << MFD_HUGE_SHIFT)
226
227#endif /* __BSD_VISIBLE */
228
229/*
230 * XXX missing POSIX_TYPED_MEM_* macros and
231 * posix_typed_mem_info structure.
232 */
233#if __POSIX_VISIBLE >= 200112
234#define	POSIX_MADV_NORMAL	_MADV_NORMAL
235#define	POSIX_MADV_RANDOM	_MADV_RANDOM
236#define	POSIX_MADV_SEQUENTIAL	_MADV_SEQUENTIAL
237#define	POSIX_MADV_WILLNEED	_MADV_WILLNEED
238#define	POSIX_MADV_DONTNEED	_MADV_DONTNEED
239#endif
240
241#ifndef _MODE_T_DECLARED
242typedef	__mode_t	mode_t;
243#define	_MODE_T_DECLARED
244#endif
245
246#ifndef _OFF_T_DECLARED
247typedef	__off_t		off_t;
248#define	_OFF_T_DECLARED
249#endif
250
251#ifndef _SIZE_T_DECLARED
252typedef	__size_t	size_t;
253#define	_SIZE_T_DECLARED
254#endif
255
256#if defined(_KERNEL) || defined(_WANT_FILE)
257#include <sys/lock.h>
258#include <sys/mutex.h>
259#include <sys/queue.h>
260#include <sys/rangelock.h>
261#include <vm/vm.h>
262
263struct file;
264
265struct shmfd {
266	vm_ooffset_t	shm_size;
267	vm_object_t	shm_object;
268	vm_pindex_t	shm_pages;	/* allocated pages */
269	int		shm_refs;
270	uid_t		shm_uid;
271	gid_t		shm_gid;
272	mode_t		shm_mode;
273	int		shm_kmappings;
274
275	/*
276	 * Values maintained solely to make this a better-behaved file
277	 * descriptor for fstat() to run on.
278	 */
279	struct timespec	shm_atime;
280	struct timespec	shm_mtime;
281	struct timespec	shm_ctime;
282	struct timespec	shm_birthtime;
283	ino_t		shm_ino;
284
285	struct label	*shm_label;		/* MAC label */
286	const char	*shm_path;
287
288	struct rangelock shm_rl;
289	struct mtx	shm_mtx;
290
291	int		shm_flags;
292	int		shm_seals;
293
294	/* largepage config */
295	int		shm_lp_psind;
296	int		shm_lp_alloc_policy;
297};
298#endif
299
300#ifdef _KERNEL
301struct prison;
302
303int	shm_map(struct file *fp, size_t size, off_t offset, void **memp);
304int	shm_unmap(struct file *fp, void *mem, size_t size);
305
306int	shm_access(struct shmfd *shmfd, struct ucred *ucred, int flags);
307struct shmfd *shm_alloc(struct ucred *ucred, mode_t mode, bool largepage);
308struct shmfd *shm_hold(struct shmfd *shmfd);
309void	shm_drop(struct shmfd *shmfd);
310int	shm_dotruncate(struct shmfd *shmfd, off_t length);
311bool	shm_largepage(struct shmfd *shmfd);
312void	shm_remove_prison(struct prison *pr);
313int	shm_get_path(struct vm_object *obj, char *path, size_t sz);
314
315extern struct fileops shm_ops;
316
317#define	MAP_32BIT_MAX_ADDR	((vm_offset_t)1 << 31)
318
319#else /* !_KERNEL */
320
321__BEGIN_DECLS
322/*
323 * XXX not yet implemented: posix_mem_offset(), posix_typed_mem_get_info(),
324 * posix_typed_mem_open().
325 */
326#if __BSD_VISIBLE
327int	getpagesizes(size_t *, int);
328int	madvise(void *, size_t, int);
329int	mincore(const void *, size_t, char *);
330int	minherit(void *, size_t, int);
331#endif
332int	mlock(const void *, size_t);
333#ifndef _MMAP_DECLARED
334#define	_MMAP_DECLARED
335void *	mmap(void *, size_t, int, int, int, off_t);
336#endif
337int	mprotect(void *, size_t, int);
338int	msync(void *, size_t, int);
339int	munlock(const void *, size_t);
340int	munmap(void *, size_t);
341#if __POSIX_VISIBLE >= 200112
342int	posix_madvise(void *, size_t, int);
343#endif
344#if __POSIX_VISIBLE >= 199309
345int	mlockall(int);
346int	munlockall(void);
347int	shm_open(const char *, int, mode_t);
348int	shm_unlink(const char *);
349#endif
350#if __BSD_VISIBLE
351int	memfd_create(const char *, unsigned int);
352int	shm_create_largepage(const char *, int, int, int, mode_t);
353int	shm_rename(const char *, const char *, int);
354#endif
355__END_DECLS
356
357#endif /* !_KERNEL */
358
359#endif /* !_SYS_MMAN_H_ */