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 2014 Garrrett D'Amore <garrett@damore.org>
23 *
24 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
25 * Use is subject to license terms.
26 */
27
28/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
29/*	  All Rights Reserved	*/
30
31/*
32 * University Copyright- Copyright (c) 1982, 1986, 1988
33 * The Regents of the University of California
34 * All Rights Reserved
35 *
36 * University Acknowledgment- Portions of this document are derived from
37 * software developed by the University of California, Berkeley, and its
38 * contributors.
39 */
40
41#ifndef _SYS_RESOURCE_H
42#define	_SYS_RESOURCE_H
43
44#include <sys/feature_tests.h>
45
46#include <sys/types.h>
47#include <sys/time.h>
48
49#ifdef	__cplusplus
50extern "C" {
51#endif
52
53/*
54 * Process priority specifications
55 */
56#define	PRIO_PROCESS	0
57#define	PRIO_PGRP	1
58#define	PRIO_USER	2
59#define	PRIO_GROUP	3
60#define	PRIO_SESSION	4
61#define	PRIO_LWP	5
62#define	PRIO_TASK	6
63#define	PRIO_PROJECT	7
64#define	PRIO_ZONE	8
65#define	PRIO_CONTRACT	9
66
67/*
68 * Resource limits
69 */
70#define	RLIMIT_CPU	0		/* cpu time in seconds */
71#define	RLIMIT_FSIZE	1		/* maximum file size */
72#define	RLIMIT_DATA	2		/* data size */
73#define	RLIMIT_STACK	3		/* stack size */
74#define	RLIMIT_CORE	4		/* core file size */
75#define	RLIMIT_NOFILE	5		/* file descriptors */
76#define	RLIMIT_VMEM	6		/* maximum mapped memory */
77#define	RLIMIT_AS	RLIMIT_VMEM
78
79#define	RLIM_NLIMITS	7		/* number of resource limits */
80
81#if defined(_LP64)
82
83typedef	unsigned long	rlim_t;
84
85#define	RLIM_INFINITY	((rlim_t)-3)
86#define	RLIM_SAVED_MAX	((rlim_t)-2)
87#define	RLIM_SAVED_CUR	((rlim_t)-1)
88
89#else	/* _LP64 */
90
91/*
92 * The definitions of the following types and constants differ between the
93 * regular and large file compilation environments.
94 */
95#if _FILE_OFFSET_BITS == 32
96
97typedef unsigned long	rlim_t;
98
99#define	RLIM_INFINITY	0x7fffffff
100#define	RLIM_SAVED_MAX	0x7ffffffe
101#define	RLIM_SAVED_CUR	0x7ffffffd
102
103#else	/* _FILE_OFFSET_BITS == 32 */
104
105typedef u_longlong_t	rlim_t;
106
107#define	RLIM_INFINITY	((rlim_t)-3)
108#define	RLIM_SAVED_MAX	((rlim_t)-2)
109#define	RLIM_SAVED_CUR	((rlim_t)-1)
110
111#endif	/* _FILE_OFFSET_BITS == 32 */
112
113#endif	/* _LP64 */
114
115#if defined(_SYSCALL32)
116
117/* Kernel's view of user ILP32 rlimits */
118
119typedef	uint32_t	rlim32_t;
120
121#define	RLIM32_INFINITY		0x7fffffff
122#define	RLIM32_SAVED_MAX	0x7ffffffe
123#define	RLIM32_SAVED_CUR	0x7ffffffd
124
125struct rlimit32 {
126	rlim32_t	rlim_cur;	/* current limit */
127	rlim32_t	rlim_max;	/* maximum value for rlim_cur */
128};
129
130#endif /* _SYSCALL32 */
131
132struct rlimit {
133	rlim_t	rlim_cur;		/* current limit */
134	rlim_t	rlim_max;		/* maximum value for rlim_cur */
135};
136
137/* transitional large file interface versions */
138#ifdef	_LARGEFILE64_SOURCE
139
140typedef u_longlong_t	rlim64_t;
141
142#define	RLIM64_INFINITY		((rlim64_t)-3)
143#define	RLIM64_SAVED_MAX	((rlim64_t)-2)
144#define	RLIM64_SAVED_CUR	((rlim64_t)-1)
145
146struct rlimit64 {
147	rlim64_t	rlim_cur;	/* current limit */
148	rlim64_t	rlim_max;	/* maximum value for rlim_cur */
149};
150
151#endif
152
153/*
154 * Although the saved rlimits were initially introduced by the large file API,
155 * they are now available for all resource limits on the 64-bit kernel and for
156 * cpu time and file size limits on the 32-bit kernel.
157 */
158#if defined(_LP64)
159
160#define	RLIM_SAVED(x)	(1)			/* save all resource limits */
161#define	RLIM_NSAVED	RLIM_NLIMITS		/* size of u_saved_rlimits[] */
162
163#else	/* _LP64 */
164
165#define	RLIM_SAVED(x)	(x <= RLIMIT_FSIZE)	/* cpu time and file size */
166#define	RLIM_NSAVED	(RLIMIT_FSIZE + 1)	/* size of u_saved_rlimits[] */
167
168#endif	/* _LP64 */
169
170
171struct	rusage {
172	struct timeval ru_utime;	/* user time used */
173	struct timeval ru_stime;	/* system time used */
174	long	ru_maxrss;		/* <unimp> */
175	long	ru_ixrss;		/* <unimp> */
176	long	ru_idrss;		/* <unimp> */
177	long	ru_isrss;		/* <unimp> */
178	long	ru_minflt;		/* any page faults not requiring I/O */
179	long	ru_majflt;		/* any page faults requiring I/O */
180	long	ru_nswap;		/* swaps */
181	long	ru_inblock;		/* block input operations */
182	long	ru_oublock;		/* block output operations */
183	long	ru_msgsnd;		/* streams messsages sent */
184	long	ru_msgrcv;		/* streams messages received */
185	long	ru_nsignals;		/* signals received */
186	long	ru_nvcsw;		/* voluntary context switches */
187	long	ru_nivcsw;		/* involuntary " */
188};
189
190#define	_RUSAGESYS_GETRUSAGE		0	/* rusage process */
191#define	_RUSAGESYS_GETRUSAGE_CHLD	1	/* rusage child process */
192#define	_RUSAGESYS_GETRUSAGE_LWP	2	/* rusage lwp */
193#define	_RUSAGESYS_GETVMUSAGE		3	/* getvmusage */
194
195#if defined(_SYSCALL32)
196
197struct	rusage32 {
198	struct timeval32 ru_utime;	/* user time used */
199	struct timeval32 ru_stime;	/* system time used */
200	int	ru_maxrss;		/* <unimp> */
201	int	ru_ixrss;		/* <unimp> */
202	int	ru_idrss;		/* <unimp> */
203	int	ru_isrss;		/* <unimp> */
204	int	ru_minflt;		/* any page faults not requiring I/O */
205	int	ru_majflt;		/* any page faults requiring I/O */
206	int	ru_nswap;		/* swaps */
207	int	ru_inblock;		/* block input operations */
208	int	ru_oublock;		/* block output operations */
209	int	ru_msgsnd;		/* streams messages sent */
210	int	ru_msgrcv;		/* streams messages received */
211	int	ru_nsignals;		/* signals received */
212	int	ru_nvcsw;		/* voluntary context switches */
213	int	ru_nivcsw;		/* involuntary " */
214};
215
216#endif	/* _SYSCALL32 */
217
218
219#ifdef _KERNEL
220
221#include <sys/model.h>
222
223struct proc;
224
225#else
226
227#define	RUSAGE_SELF	0
228#define	RUSAGE_LWP	1
229#define	RUSAGE_CHILDREN	-1
230
231
232#if !defined(_LP64) && _FILE_OFFSET_BITS == 64
233/*
234 * large file compilation environment setup
235 */
236#ifdef __PRAGMA_REDEFINE_EXTNAME
237#pragma redefine_extname	setrlimit	setrlimit64
238#pragma redefine_extname	getrlimit	getrlimit64
239#else
240#define	setrlimit		setrlimit64
241#define	getrlimit		getrlimit64
242#define	rlimit			rlimit64
243#endif
244#endif	/* !_LP64 && _FILE_OFFSET_BITS == 64 */
245
246#if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
247/*
248 * In the LP64 compilation environment, map large file interfaces
249 * back to native versions where possible.
250 */
251#ifdef __PRAGMA_REDEFINE_EXTNAME
252#pragma	redefine_extname	setrlimit64	setrlimit
253#pragma	redefine_extname	getrlimit64	getrlimit
254#else
255#define	setrlimit64		setrlimit
256#define	getrlimit64		getrlimit
257#define	rlimit64		rlimit
258#endif
259#endif	/* _LP64 && _LARGEFILE64_SOURCE */
260
261extern int setrlimit(int, const struct rlimit *);
262extern int getrlimit(int, struct rlimit *);
263
264/* transitional large file interfaces */
265#if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
266	    !defined(__PRAGMA_REDEFINE_EXTNAME))
267extern int setrlimit64(int, const struct rlimit64 *);
268extern int getrlimit64(int, struct rlimit64 *);
269#endif	/* _LARGEFILE64_SOURCE... */
270
271extern int getpriority(int, id_t);
272extern int setpriority(int, id_t, int);
273extern int getrusage(int, struct rusage *);
274
275#endif	/* _KERNEL */
276
277#ifdef	__cplusplus
278}
279#endif
280
281#endif	/* _SYS_RESOURCE_H */
282