xref: /illumos-gate/usr/src/uts/common/sys/shm.h (revision b4203d75)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
24  *
25  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  */
28 
29 /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
30 /*	  All Rights Reserved	*/
31 
32 /*
33  * Portions of this source code were derived from Berkeley 4.3 BSD
34  * under license from the Regents of the University of California.
35  */
36 
37 #ifndef	_SYS_SHM_H
38 #define	_SYS_SHM_H
39 
40 #include <sys/ipc.h>
41 
42 #ifdef	__cplusplus
43 extern "C" {
44 #endif
45 
46 /*
47  *	IPC Shared Memory Facility.
48  */
49 
50 /*
51  *	Implementation Constants.
52  */
53 #if (defined(_KERNEL) || defined(_KMEMUSER))
54 
55 #define	SHMLBA	PAGESIZE	/* segment low boundary address multiple */
56 				/* (SHMLBA must be a power of 2) */
57 #else
58 #include <sys/unistd.h>		/* needed for _SC_PAGESIZE */
59 extern long _sysconf(int);	/* System Private interface to sysconf() */
60 #define	SHMLBA	(_sysconf(_SC_PAGESIZE))
61 #endif	/* defined(_KERNEL) || defined(_KMEMUSER)) */
62 
63 /*
64  *	Permission Definitions.
65  */
66 #define	SHM_R	0400	/* read permission */
67 #define	SHM_W	0200	/* write permission */
68 
69 /*
70  *	Message Operation Flags.
71  */
72 #define	SHM_RDONLY	010000	/* attach read-only (else read-write) */
73 #define	SHM_RND		020000	/* round attach address to SHMLBA */
74 #define	SHM_SHARE_MMU	040000  /* share VM resources such as page table */
75 #define	SHM_PAGEABLE	0100000 /* pageable ISM */
76 
77 /*
78  * Valid flags bits for shmat shmflag argument.
79  */
80 #define	SHMAT_VALID_FLAGS_MASK		\
81 	(SHM_R | SHM_W | SHM_RDONLY | SHM_RND | SHM_SHARE_MMU | SHM_PAGEABLE)
82 
83 typedef unsigned long shmatt_t;
84 
85 /*
86  *	Structure Definitions.
87  */
88 struct shmid_ds {
89 	struct ipc_perm	shm_perm;	/* operation permission struct */
90 	size_t		shm_segsz;	/* size of segment in bytes */
91 #if defined(_LP64) || defined(_XOPEN_SOURCE)
92 	void		*shm_amp;
93 #else
94 	struct anon_map	*shm_amp;	/* segment anon_map pointer */
95 #endif
96 	ushort_t	shm_lkcnt;	/* number of times it is being locked */
97 	pid_t		shm_lpid;	/* pid of last shmop */
98 	pid_t		shm_cpid;	/* pid of creator */
99 	shmatt_t	shm_nattch;	/* number of attaches */
100 	ulong_t		shm_cnattch;	/* number of ISM attaches */
101 #if defined(_LP64)
102 	time_t		shm_atime;	/* last shmat time */
103 	time_t		shm_dtime;	/* last shmdt time */
104 	time_t		shm_ctime;	/* last change time */
105 	int64_t		shm_pad4[4];	/* reserve area */
106 #else	/* _LP64 */
107 	time_t		shm_atime;	/* last shmat time */
108 	int32_t		shm_pad1;	/* reserved for time_t expansion */
109 	time_t		shm_dtime;	/* last shmdt time */
110 	int32_t		shm_pad2;	/* reserved for time_t expansion */
111 	time_t		shm_ctime;	/* last change time */
112 	int32_t		shm_pad3;	/* reserved for time_t expansion */
113 	int32_t		shm_pad4[4];	/* reserve area  */
114 #endif	/* _LP64 */
115 };
116 
117 /*
118  * Shared memory control operations
119  */
120 #define	SHM_LOCK	3	/* Lock segment in core */
121 #define	SHM_UNLOCK	4	/* Unlock segment */
122 
123 #if !defined(_KERNEL)
124 int shmget(key_t, size_t, int);
125 int shmids(int *, uint_t, uint_t *);
126 int shmctl(int, int, struct shmid_ds *);
127 void *shmat(int, const void *, int);
128 #if defined(_XPG4)
129 int shmdt(const void *);
130 #else
131 int shmdt(char *);
132 #endif /* defined(_XPG4) */
133 #endif /* !defined(_KERNEL) */
134 
135 #ifdef	__cplusplus
136 }
137 #endif
138 
139 #endif	/* _SYS_SHM_H */
140