1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/* Copyright 2013 OmniTI Computer Consulting, Inc. All rights reserved. */
23/*
24 * Copyright 2014 Garrett D'Amore <garrett@damore.org>
25 *
26 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
27 * Use is subject to license terms.
28 * Copyright 2015 Joyent, Inc.  All rights reserved.
29 */
30
31/*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
32/*	  All Rights Reserved	*/
33
34/*
35 * University Copyright- Copyright (c) 1982, 1986, 1988
36 * The Regents of the University of California
37 * All Rights Reserved
38 *
39 * University Acknowledgment- Portions of this document are derived from
40 * software developed by the University of California, Berkeley, and its
41 * contributors.
42 */
43
44#ifndef	_SYS_MMAN_H
45#define	_SYS_MMAN_H
46
47#include <sys/feature_tests.h>
48
49#ifdef	__cplusplus
50extern "C" {
51#endif
52
53#if	!defined(_ASM) && !defined(_KERNEL)
54#include <sys/types.h>
55#endif	/* !_ASM && !_KERNEL */
56
57/*
58 * Protections are chosen from these bits, or-ed together.
59 * Note - not all implementations literally provide all possible
60 * combinations.  PROT_WRITE is often implemented as (PROT_READ |
61 * PROT_WRITE) and (PROT_EXECUTE as PROT_READ | PROT_EXECUTE).
62 * However, no implementation will permit a write to succeed
63 * where PROT_WRITE has not been set.  Also, no implementation will
64 * allow any access to succeed where prot is specified as PROT_NONE.
65 */
66#define	PROT_READ	0x1		/* pages can be read */
67#define	PROT_WRITE	0x2		/* pages can be written */
68#define	PROT_EXEC	0x4		/* pages can be executed */
69
70#ifdef	_KERNEL
71#define	PROT_USER	0x8		/* pages are user accessable */
72#define	PROT_ZFOD	(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_USER)
73#define	PROT_ALL	(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_USER)
74#endif	/* _KERNEL */
75
76#define	PROT_NONE	0x0		/* pages cannot be accessed */
77
78/* sharing types:  must choose either SHARED or PRIVATE */
79#define	MAP_SHARED	1		/* share changes */
80#define	MAP_PRIVATE	2		/* changes are private */
81#define	MAP_TYPE	0xf		/* mask for share type */
82
83/* other flags to mmap (or-ed in to MAP_SHARED or MAP_PRIVATE) */
84#define	MAP_FILE	0		/* map from file (default) */
85#define	MAP_FIXED	0x10		/* user assigns address */
86/* Not implemented */
87#define	MAP_RENAME	0x20		/* rename private pages to file */
88#define	MAP_NORESERVE	0x40		/* don't reserve needed swap area */
89/* Note that 0x80 is _MAP_LOW32, defined below */
90#define	MAP_ANON	0x100		/* map anonymous pages directly */
91#define	MAP_ANONYMOUS	MAP_ANON	/* (source compatibility) */
92#define	MAP_ALIGN	0x200		/* addr specifies alignment */
93#define	MAP_TEXT	0x400		/* map code segment */
94#define	MAP_INITDATA	0x800		/* map data segment */
95
96#ifdef _KERNEL
97#define	_MAP_TEXTREPL	0x1000
98#define	_MAP_RANDOMIZE	0x2000
99#endif /* _KERNEL */
100
101#if	(_POSIX_C_SOURCE <= 2) && !defined(_XPG4_2)
102/* these flags are used by memcntl */
103#define	PROC_TEXT	(PROT_EXEC | PROT_READ)
104#define	PROC_DATA	(PROT_READ | PROT_WRITE | PROT_EXEC)
105#define	SHARED		0x10
106#define	PRIVATE		0x20
107#define	VALID_ATTR  (PROT_READ|PROT_WRITE|PROT_EXEC|SHARED|PRIVATE)
108#endif	/* (_POSIX_C_SOURCE <= 2) && !defined(_XPG4_2) */
109
110#if	(_POSIX_C_SOURCE <= 2) || defined(_XPG4_2)
111#ifdef	_KERNEL
112#define	PROT_EXCL	0x20
113#endif	/* _KERNEL */
114
115#define	_MAP_LOW32	0x80	/* force mapping in lower 4G of address space */
116#define	MAP_32BIT	_MAP_LOW32
117
118/*
119 * For the sake of backward object compatibility, we use the _MAP_NEW flag.
120 * This flag will be automatically or'ed in by the C library for all
121 * new mmap calls.  Previous binaries with old mmap calls will continue
122 * to get 0 or -1 for return values.  New mmap calls will get the mapped
123 * address as the return value if successful and -1 on errors.  By default,
124 * new mmap calls automatically have the kernel assign the map address
125 * unless the MAP_FIXED flag is given.
126 */
127#define	_MAP_NEW	0x80000000	/* users should not need to use this */
128#endif	/* (_POSIX_C_SOURCE <= 2) */
129
130
131#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
132/* External flags for mmapobj syscall (Exclusive of MAP_* flags above) */
133#define	MMOBJ_PADDING		0x10000
134#define	MMOBJ_INTERPRET		0x20000
135
136#define	MMOBJ_ALL_FLAGS		(MMOBJ_PADDING | MMOBJ_INTERPRET)
137
138/*
139 * Values for mr_flags field of mmapobj_result_t below.
140 * The bottom 16 bits are mutually exclusive and thus only one
141 * of them can be set at a time.  Use MR_GET_TYPE below to check this value.
142 * The top 16 bits are used for flags which are not mutually exclusive and
143 * thus more than one of these flags can be set for a given mmapobj_result_t.
144 *
145 * MR_PADDING being set indicates that this memory range represents the user
146 * requested padding.
147 *
148 * MR_HDR_ELF being set indicates that the ELF header of the mapped object
149 * is mapped at mr_addr + mr_offset.
150 *
151 * MR_HDR_AOUT being set indicates that the AOUT (4.x) header of the mapped
152 * object is mapped at mr_addr + mr_offset.
153 */
154
155/*
156 * External flags for mr_flags field below.
157 */
158#define	MR_PADDING	0x1
159#define	MR_HDR_ELF	0x2
160#define	MR_HDR_AOUT	0x3
161
162/*
163 * Internal flags for mr_flags field below.
164 */
165#ifdef	_KERNEL
166#define	MR_RESV	0x80000000	/* overmapped /dev/null */
167#endif	/* _KERNEL */
168
169#define	MR_TYPE_MASK 0x0000ffff
170#define	MR_GET_TYPE(val)	((val) & MR_TYPE_MASK)
171
172#if	!defined(_ASM)
173typedef struct mmapobj_result {
174	caddr_t		mr_addr;	/* mapping address */
175	size_t		mr_msize;	/* mapping size */
176	size_t		mr_fsize;	/* file size */
177	size_t		mr_offset;	/* offset into file */
178	uint_t		mr_prot;	/* the protections provided */
179	uint_t		mr_flags;	/* info on the mapping */
180} mmapobj_result_t;
181
182#if defined(_KERNEL) || defined(_SYSCALL32)
183typedef struct mmapobj_result32 {
184	caddr32_t	mr_addr;	/* mapping address */
185	size32_t	mr_msize;	/* mapping size */
186	size32_t	mr_fsize;	/* file size */
187	size32_t	mr_offset;	/* offset into file */
188	uint_t		mr_prot;	/* the protections provided */
189	uint_t		mr_flags;	/* info on the mapping */
190} mmapobj_result32_t;
191#endif	/* defined(_KERNEL) || defined(_SYSCALL32) */
192#endif	/* !defined(_ASM) */
193#endif	/* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
194
195#if	!defined(_ASM) && !defined(_KERNEL)
196/*
197 * large file compilation environment setup
198 *
199 * In the LP64 compilation environment, map large file interfaces
200 * back to native versions where possible.
201 */
202
203#if !defined(_LP64) && _FILE_OFFSET_BITS == 64
204#ifdef	__PRAGMA_REDEFINE_EXTNAME
205#pragma redefine_extname	mmap	mmap64
206#else
207#define	mmap			mmap64
208#endif
209#endif /* !_LP64 && _FILE_OFFSET_BITS == 64 */
210
211#if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
212#ifdef	__PRAGMA_REDEFINE_EXTNAME
213#pragma	redefine_extname	mmap64	mmap
214#else
215#define	mmap64			mmap
216#endif
217#endif	/* _LP64 && _LARGEFILE64_SOURCE */
218
219#ifdef __PRAGMA_REDEFINE_EXTNAME
220#pragma redefine_extname	getpagesizes	getpagesizes2
221#else
222#define	getpagesizes	getpagesizes2
223#endif
224
225/*
226 * Except for old binaries mmap() will return the resultant
227 * address of mapping on success and (caddr_t)-1 on error.
228 */
229#if (_POSIX_C_SOURCE > 2) || defined(_XPG4_2)
230extern void *mmap(void *, size_t, int, int, int, off_t);
231extern int munmap(void *, size_t);
232extern int mprotect(void *, size_t, int);
233extern int msync(void *, size_t, int);
234#if (!defined(_XPG4_2) || (_POSIX_C_SOURCE > 2)) || defined(__EXTENSIONS__)
235extern int mlock(const void *, size_t);
236extern int munlock(const void *, size_t);
237#endif	/* (!defined(_XPG4_2) || (_POSIX_C_SOURCE > 2))... */
238/* transitional large file interface version */
239#if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
240	    !defined(__PRAGMA_REDEFINE_EXTNAME))
241extern void *mmap64(void *, size_t, int, int, int, off64_t);
242#endif	/* _LARGEFILE64_SOURCE... */
243#else	/* (_POSIX_C_SOURCE > 2) || defined(_XPG4_2) */
244extern caddr_t mmap(caddr_t, size_t, int, int, int, off_t);
245extern int munmap(caddr_t, size_t);
246extern int mprotect(caddr_t, size_t, int);
247extern int msync(caddr_t, size_t, int);
248extern int mlock(caddr_t, size_t);
249extern int munlock(caddr_t, size_t);
250extern int mincore(caddr_t, size_t, char *);
251extern int memcntl(caddr_t, size_t, int, caddr_t, int, int);
252extern int madvise(caddr_t, size_t, int);
253#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
254extern int getpagesizes(size_t *, int);
255extern int getpagesizes2(size_t *, int);
256extern int mmapobj(int, uint_t, mmapobj_result_t *, uint_t *, void *);
257/* guard visibility of uint64_t */
258#if defined(_INT64_TYPE)
259extern int meminfo(const uint64_t *, int, const uint_t *, int, uint64_t *,
260	uint_t *);
261#endif /* defined(_INT64_TYPE) */
262#endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
263/* transitional large file interface version */
264#ifdef	_LARGEFILE64_SOURCE
265extern caddr_t mmap64(caddr_t, size_t, int, int, int, off64_t);
266#endif
267#endif	/* (_POSIX_C_SOURCE > 2)  || defined(_XPG4_2) */
268
269#if (!defined(_XPG4_2) || (_POSIX_C_SOURCE > 2)) || defined(__EXTENSIONS__)
270extern int mlockall(int);
271extern int munlockall(void);
272extern int shm_open(const char *, int, mode_t);
273extern int shm_unlink(const char *);
274#endif
275
276#if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__)
277extern int posix_madvise(void *, size_t, int);
278#endif
279
280/* mmap failure value */
281#define	MAP_FAILED	((void *) -1)
282
283
284#endif	/* !_ASM && !_KERNEL */
285
286#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
287#if !defined(_ASM)
288/*
289 * structure for memcntl hat advise operations.
290 */
291struct memcntl_mha {
292	uint_t 		mha_cmd;	/* command(s) */
293	uint_t		mha_flags;
294	size_t		mha_pagesize;
295};
296
297#if defined(_SYSCALL32)
298struct memcntl_mha32 {
299	uint_t 		mha_cmd;	/* command(s) */
300	uint_t		mha_flags;
301	size32_t	mha_pagesize;
302};
303#endif	/* _SYSCALL32 */
304#endif	/* !defined(_ASM) */
305#endif	/* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
306
307#if	(_POSIX_C_SOURCE <= 2) && !defined(_XPG4_2) || defined(__EXTENSIONS__)
308/*
309 * advice to madvise
310 *
311 * Note, if more than 4 bits worth of advice (eg. 16) are specified then
312 * changes will be necessary to the struct vpage.
313 */
314#define	MADV_NORMAL		0	/* no further special treatment */
315#define	MADV_RANDOM		1	/* expect random page references */
316#define	MADV_SEQUENTIAL		2	/* expect sequential page references */
317#define	MADV_WILLNEED		3	/* will need these pages */
318#define	MADV_DONTNEED		4	/* don't need these pages */
319#define	MADV_FREE		5	/* contents can be freed */
320#define	MADV_ACCESS_DEFAULT	6	/* default access */
321#define	MADV_ACCESS_LWP		7	/* next LWP to access heavily */
322#define	MADV_ACCESS_MANY	8	/* many processes to access heavily */
323#define	MADV_PURGE		9	/* contents will be purged */
324
325#endif	/* (_POSIX_C_SOURCE <= 2) && !defined(_XPG4_2) ...  */
326
327#if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__)
328/* advice to posix_madvise */
329/* these values must be kept in sync with the MADV_* values, above */
330#define	POSIX_MADV_NORMAL	0	/* MADV_NORMAL */
331#define	POSIX_MADV_RANDOM	1	/* MADV_RANDOM */
332#define	POSIX_MADV_SEQUENTIAL	2	/* MADV_SEQUENTIAL */
333#define	POSIX_MADV_WILLNEED	3	/* MADV_WILLNEED */
334#define	POSIX_MADV_DONTNEED	4	/* MADV_DONTNEED */
335#endif
336
337/* flags to msync */
338#define	MS_OLDSYNC	0x0		/* old value of MS_SYNC */
339					/* modified for UNIX98 compliance */
340#define	MS_SYNC		0x4		/* wait for msync */
341#define	MS_ASYNC	0x1		/* return immediately */
342#define	MS_INVALIDATE	0x2		/* invalidate caches */
343
344#if	(_POSIX_C_SOURCE <= 2) && !defined(_XPG4_2) || defined(__EXTENSIONS__)
345/* functions to mctl */
346#define	MC_SYNC		1		/* sync with backing store */
347#define	MC_LOCK		2		/* lock pages in memory */
348#define	MC_UNLOCK	3		/* unlock pages from memory */
349#define	MC_ADVISE	4		/* give advice to management */
350#define	MC_LOCKAS	5		/* lock address space in memory */
351#define	MC_UNLOCKAS	6		/* unlock address space from memory */
352#define	MC_HAT_ADVISE	7		/* advise hat map size */
353#define	MC_INHERIT_ZERO	8		/* zero out regions on fork() */
354
355/* sub-commands for MC_HAT_ADVISE */
356#define	MHA_MAPSIZE_VA		0x1	/* set preferred page size */
357#define	MHA_MAPSIZE_BSSBRK	0x2	/* set preferred page size */
358					/* for last bss adjacent to */
359					/* brk area and brk area itself */
360#define	MHA_MAPSIZE_STACK	0x4	/* set preferred page size */
361					/* processes main stack */
362
363#endif	/* (_POSIX_C_SOURCE <= 2) && !defined(_XPG4_2) ... */
364
365#if (!defined(_XPG4_2) || (_POSIX_C_SOURCE > 2)) || defined(__EXTENSIONS__)
366/* flags to mlockall */
367#define	MCL_CURRENT	0x1		/* lock current mappings */
368#define	MCL_FUTURE	0x2		/* lock future mappings */
369#endif /* (!defined(_XPG4_2) || (_POSIX_C_SOURCE)) || defined(__EXTENSIONS__) */
370
371#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
372
373/* definitions for meminfosys syscall */
374#define	MISYS_MEMINFO		0x0
375
376#if !defined(_ASM)
377
378#if defined(_INT64_TYPE)
379/* private structure for meminfo */
380typedef struct meminfo {
381	const uint64_t *mi_inaddr;	/* array of input addresses */
382	const uint_t *mi_info_req;	/* array of types of info requested */
383	uint64_t *mi_outdata;		/* array of results are placed */
384	uint_t *mi_validity;		/* array of bitwise result codes */
385	int mi_info_count;		/* number of pieces of info requested */
386} meminfo_t;
387#endif /* defined(_INT64_TYPE) */
388
389#if defined(_SYSCALL32)
390typedef struct meminfo32 {
391	caddr32_t mi_inaddr;	/* array of input addresses */
392	caddr32_t mi_info_req;	/* array of types of information requested */
393	caddr32_t mi_outdata;	/* array of results are placed */
394	caddr32_t mi_validity;	/* array of bitwise result codes */
395	int32_t mi_info_count;	/* number of pieces of information requested */
396} meminfo32_t;
397#endif /* defined(_SYSCALL32) */
398
399#endif /* !defined(_ASM) */
400
401/*
402 * info_req request type definitions for meminfo
403 * request types starting with MEMINFO_V are used for Virtual addresses
404 * and should not be mixed with MEMINFO_PLGRP which is targeted for Physical
405 * addresses
406 */
407#define	MEMINFO_SHIFT		16
408#define	MEMINFO_MASK		(0xFF << MEMINFO_SHIFT)
409#define	MEMINFO_VPHYSICAL	(0x01 << MEMINFO_SHIFT)	/* get physical addr */
410#define	MEMINFO_VLGRP		(0x02 << MEMINFO_SHIFT) /* get lgroup */
411#define	MEMINFO_VPAGESIZE	(0x03 << MEMINFO_SHIFT) /* size of phys page */
412#define	MEMINFO_VREPLCNT	(0x04 << MEMINFO_SHIFT) /* no. of replica */
413#define	MEMINFO_VREPL		(0x05 << MEMINFO_SHIFT) /* physical replica */
414#define	MEMINFO_VREPL_LGRP	(0x06 << MEMINFO_SHIFT) /* lgrp of replica */
415#define	MEMINFO_PLGRP		(0x07 << MEMINFO_SHIFT) /* lgroup for paddr */
416
417/* maximum number of addresses meminfo() can process at a time */
418#define	MAX_MEMINFO_CNT	256
419
420/* maximum number of request types */
421#define	MAX_MEMINFO_REQ	31
422
423#endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
424
425#ifdef	__cplusplus
426}
427#endif
428
429#endif	/* _SYS_MMAN_H */
430