xref: /minix/sys/sys/shm.h (revision 0a6a1f1d)
1 /*	$NetBSD: shm.h,v 1.49 2015/05/13 01:16:15 pgoyette Exp $	*/
2 
3 /*-
4  * Copyright (c) 1999 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9  * NASA Ames Research Center.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34  * Copyright (c) 1994 Adam Glass
35  * All rights reserved.
36  *
37  * Redistribution and use in source and binary forms, with or without
38  * modification, are permitted provided that the following conditions
39  * are met:
40  * 1. Redistributions of source code must retain the above copyright
41  *    notice, this list of conditions and the following disclaimer.
42  * 2. Redistributions in binary form must reproduce the above copyright
43  *    notice, this list of conditions and the following disclaimer in the
44  *    documentation and/or other materials provided with the distribution.
45  * 3. All advertising materials mentioning features or use of this software
46  *    must display the following acknowledgement:
47  *      This product includes software developed by Adam Glass.
48  * 4. The name of the author may not be used to endorse or promote products
49  *    derived from this software without specific prior written permission
50  *
51  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
52  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
53  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
54  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
55  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
56  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
57  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
60  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61  */
62 
63 /*
64  * As defined+described in "X/Open System Interfaces and Headers"
65  *                         Issue 4, p. XXX
66  */
67 
68 #ifndef _SYS_SHM_H_
69 #define _SYS_SHM_H_
70 
71 #include <sys/cdefs.h>
72 #include <sys/featuretest.h>
73 
74 #include <sys/ipc.h>
75 
76 #define	SHM_RDONLY	010000	/* Attach read-only (else read-write) */
77 #define	SHM_RND		020000	/* Round attach address to SHMLBA */
78 #ifdef _KERNEL
79 #define _SHM_RMLINGER	040000	/* Attach even if segment removed */
80 #endif
81 
82 /* Segment low boundry address multiple */
83 #if defined(_KERNEL) || defined(_STANDALONE) || defined(_MODULE)
84 #define	SHMLBA		PAGE_SIZE
85 #else
86 /*
87  * SHMLBA uses libc's internal __sysconf() to retrieve the machine's
88  * page size. The value of _SC_PAGESIZE is 28 -- we hard code it so we do not
89  * need to include unistd.h
90  */
91 __BEGIN_DECLS
92 long __sysconf(int);
93 __END_DECLS
94 #define	SHMLBA		(__sysconf(28))
95 #endif
96 
97 typedef unsigned int	shmatt_t;
98 
99 struct shmid_ds {
100 	struct ipc_perm	shm_perm;	/* operation permission structure */
101 	size_t		shm_segsz;	/* size of segment in bytes */
102 	pid_t		shm_lpid;	/* process ID of last shm operation */
103 	pid_t		shm_cpid;	/* process ID of creator */
104 	shmatt_t	shm_nattch;	/* number of current attaches */
105 	time_t		shm_atime;	/* time of last shmat() */
106 	time_t		shm_dtime;	/* time of last shmdt() */
107 	time_t		shm_ctime;	/* time of last change by shmctl() */
108 
109 	/*
110 	 * These members are private and used only in the internal
111 	 * implementation of this interface.
112 	 */
113 	void		*_shm_internal;
114 };
115 
116 #if defined(_NETBSD_SOURCE)
117 /*
118  * Some systems (e.g. HP-UX) take these as the second (cmd) arg to shmctl().
119  */
120 #define	SHM_LOCK	3	/* Lock segment in memory. */
121 #define	SHM_UNLOCK	4	/* Unlock a segment locked by SHM_LOCK. */
122 #endif /* _NETBSD_SOURCE */
123 
124 #if defined(_NETBSD_SOURCE)
125 /*
126  * Permission definitions used in shmflag arguments to shmat(2) and shmget(2).
127  * Provided for source compatibility only; do not use in new code!
128  */
129 #define	SHM_R		IPC_R	/* S_IRUSR, R for owner */
130 #define	SHM_W		IPC_W	/* S_IWUSR, W for owner */
131 
132 /*
133  * System 5 style catch-all structure for shared memory constants that
134  * might be of interest to user programs.  Do we really want/need this?
135  */
136 struct shminfo {
137 	uint64_t	shmmax;	/* max shared memory segment size (bytes) */
138 	uint32_t	shmmin;	/* min shared memory segment size (bytes) */
139 	uint32_t	shmmni;	/* max number of shared memory identifiers */
140 	uint32_t	shmseg;	/* max shared memory segments per process */
141 	uint32_t	shmall;	/* max amount of shared memory (pages) */
142 };
143 
144 /* Warning: 64-bit structure padding is needed here */
145 struct shmid_ds_sysctl {
146 	struct		ipc_perm_sysctl shm_perm;
147 	uint64_t	shm_segsz;
148 	pid_t		shm_lpid;
149 	pid_t		shm_cpid;
150 	time_t		shm_atime;
151 	time_t		shm_dtime;
152 	time_t		shm_ctime;
153 	uint32_t	shm_nattch;
154 };
155 struct shm_sysctl_info {
156 	struct	shminfo shminfo;
157 	struct	shmid_ds_sysctl shmids[1];
158 };
159 #endif /* _NETBSD_SOURCE */
160 
161 #ifdef _KERNEL
162 extern struct shminfo shminfo;
163 extern struct shmid_ds *shmsegs;
164 extern int shm_nused;
165 
166 #define	SHMSEG_FREE		0x0200
167 #define	SHMSEG_REMOVED		0x0400
168 #define	SHMSEG_ALLOCATED	0x0800
169 #define	SHMSEG_WANTED		0x1000
170 #define	SHMSEG_RMLINGER		0x2000
171 #define	SHMSEG_WIRED		0x4000
172 
173 struct vmspace;
174 
175 void	shminit(void);
176 int	shmfini(void);
177 void	shmfork(struct vmspace *, struct vmspace *);
178 void	shmexit(struct vmspace *);
179 int	shmctl1(struct lwp *, int, int, struct shmid_ds *);
180 
181 #define SYSCTL_FILL_SHM(src, dst) do { \
182 	SYSCTL_FILL_PERM((src).shm_perm, (dst).shm_perm); \
183 	(dst).shm_segsz = (src).shm_segsz; \
184 	(dst).shm_lpid = (src).shm_lpid; \
185 	(dst).shm_cpid = (src).shm_cpid; \
186 	(dst).shm_atime = (src).shm_atime; \
187 	(dst).shm_dtime = (src).shm_dtime; \
188 	(dst).shm_ctime = (src).shm_ctime; \
189 	(dst).shm_nattch = (src).shm_nattch; \
190 } while (/*CONSTCOND*/ 0)
191 
192 #else /* !_KERNEL */
193 
194 __BEGIN_DECLS
195 void	*shmat(int, const void *, int);
196 int	shmctl(int, int, struct shmid_ds *) __RENAME(__shmctl50);
197 int	shmdt(const void *);
198 int	shmget(key_t, size_t, int);
199 __END_DECLS
200 
201 #endif /* !_KERNEL */
202 
203 #if defined(__minix)
204 /* ipcs ctl commands */
205 #define SHM_STAT       13
206 #define SHM_INFO       14
207 
208 struct shm_info
209 {
210        int used_ids;
211        unsigned long int shm_tot;  /* total allocated shm */
212        unsigned long int shm_rss;  /* total resident shm */
213        unsigned long int shm_swp;  /* total swapped shm */
214        unsigned long int swap_attempts;
215        unsigned long int swap_successes;
216 };
217 
218 #define SHMMNI 4096
219 #define SHMSEG 32              /* max shared segs per process */
220 
221 /* shm_mode upper byte flags */
222 #define SHM_DEST 01000                 /* segment will be destroyed on last detach */
223 #define SHM_LOCKED 02000               /* segment will not be swapped */
224 
225 #endif /* defined(__minix) */
226 
227 #endif /* !_SYS_SHM_H_ */
228