types.h revision 8863:94039d51dda4
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/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
22/*	  All Rights Reserved  	*/
23
24
25/*
26 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
27 * Use is subject to license terms.
28 */
29
30#ifndef _SYS_TYPES_H
31#define	_SYS_TYPES_H
32
33#include <sys/feature_tests.h>
34#include <sys/isa_defs.h>
35
36/*
37 * Machine dependent definitions moved to <sys/machtypes.h>.
38 */
39#include <sys/machtypes.h>
40
41/*
42 * Include fixed width type declarations proposed by the ISO/JTC1/SC22/WG14 C
43 * committee's working draft for the revision of the current ISO C standard,
44 * ISO/IEC 9899:1990 Programming language - C.  These are not currently
45 * required by any standard but constitute a useful, general purpose set
46 * of type definitions which is namespace clean with respect to all standards.
47 */
48#ifdef	_KERNEL
49#include <sys/inttypes.h>
50#else	/* _KERNEL */
51#include <sys/int_types.h>
52#endif	/* _KERNEL */
53
54#if defined(_KERNEL) || defined(_SYSCALL32)
55#include <sys/types32.h>
56#endif
57
58#ifdef	__cplusplus
59extern "C" {
60#endif
61
62/*
63 * Strictly conforming ANSI C environments prior to the 1999
64 * revision of the C Standard (ISO/IEC 9899:1999) do not have
65 * the long long data type.
66 */
67#if defined(_LONGLONG_TYPE)
68typedef	long long		longlong_t;
69typedef	unsigned long long	u_longlong_t;
70#else
71/* used to reserve space and generate alignment */
72typedef union {
73	double	_d;
74	int32_t	_l[2];
75} longlong_t;
76typedef union {
77	double		_d;
78	uint32_t	_l[2];
79} u_longlong_t;
80#endif	/* defined(_LONGLONG_TYPE) */
81
82/*
83 * These types (t_{u}scalar_t) exist because the XTI/TPI/DLPI standards had
84 * to use them instead of int32_t and uint32_t because DEC had
85 * shipped 64-bit wide.
86 */
87#if defined(_LP64) || defined(_I32LPx)
88typedef int32_t		t_scalar_t;
89typedef uint32_t	t_uscalar_t;
90#else
91typedef long		t_scalar_t;	/* historical versions */
92typedef unsigned long	t_uscalar_t;
93#endif	/* defined(_LP64) || defined(_I32LPx) */
94
95/*
96 * POSIX Extensions
97 */
98typedef	unsigned char	uchar_t;
99typedef	unsigned short	ushort_t;
100typedef	unsigned int	uint_t;
101typedef	unsigned long	ulong_t;
102
103typedef	char		*caddr_t;	/* ?<core address> type */
104typedef	long		daddr_t;	/* <disk address> type */
105typedef	short		cnt_t;		/* ?<count> type */
106
107#if !defined(_PTRDIFF_T) || __cplusplus >= 199711L
108#define	_PTRDIFF_T
109#if defined(_LP64) || defined(_I32LPx)
110typedef	long	ptrdiff_t;		/* pointer difference */
111#else
112typedef	int	ptrdiff_t;		/* (historical version) */
113#endif
114#endif
115
116/*
117 * VM-related types
118 */
119typedef	ulong_t		pfn_t;		/* page frame number */
120typedef	ulong_t		pgcnt_t;	/* number of pages */
121typedef	long		spgcnt_t;	/* signed number of pages */
122
123typedef	uchar_t		use_t;		/* use count for swap.  */
124typedef	short		sysid_t;
125typedef	short		index_t;
126typedef void		*timeout_id_t;	/* opaque handle from timeout(9F) */
127typedef void		*bufcall_id_t;	/* opaque handle from bufcall(9F) */
128
129/*
130 * The size of off_t and related types depends on the setting of
131 * _FILE_OFFSET_BITS.  (Note that other system headers define other types
132 * related to those defined here.)
133 *
134 * If _LARGEFILE64_SOURCE is defined, variants of these types that are
135 * explicitly 64 bits wide become available.
136 */
137#ifndef _OFF_T
138#define	_OFF_T
139
140#if defined(_LP64) || _FILE_OFFSET_BITS == 32
141typedef long		off_t;		/* offsets within files */
142#elif _FILE_OFFSET_BITS == 64
143typedef longlong_t	off_t;		/* offsets within files */
144#endif
145
146#if defined(_LARGEFILE64_SOURCE)
147#ifdef _LP64
148typedef	off_t		off64_t;	/* offsets within files */
149#else
150typedef longlong_t	off64_t;	/* offsets within files */
151#endif
152#endif	/* _LARGEFILE64_SOURCE */
153
154#endif /* _OFF_T */
155
156#if defined(_LP64) || _FILE_OFFSET_BITS == 32
157typedef ulong_t		ino_t;		/* expanded inode type	*/
158typedef long		blkcnt_t;	/* count of file blocks */
159typedef ulong_t		fsblkcnt_t;	/* count of file system blocks */
160typedef ulong_t		fsfilcnt_t;	/* count of files */
161#elif _FILE_OFFSET_BITS == 64
162typedef u_longlong_t	ino_t;		/* expanded inode type	*/
163typedef longlong_t	blkcnt_t;	/* count of file blocks */
164typedef u_longlong_t	fsblkcnt_t;	/* count of file system blocks */
165typedef u_longlong_t	fsfilcnt_t;	/* count of files */
166#endif
167
168#if defined(_LARGEFILE64_SOURCE)
169#ifdef _LP64
170typedef	ino_t		ino64_t;	/* expanded inode type */
171typedef	blkcnt_t	blkcnt64_t;	/* count of file blocks */
172typedef	fsblkcnt_t	fsblkcnt64_t;	/* count of file system blocks */
173typedef	fsfilcnt_t	fsfilcnt64_t;	/* count of files */
174#else
175typedef u_longlong_t	ino64_t;	/* expanded inode type	*/
176typedef longlong_t	blkcnt64_t;	/* count of file blocks */
177typedef u_longlong_t	fsblkcnt64_t;	/* count of file system blocks */
178typedef u_longlong_t	fsfilcnt64_t;	/* count of files */
179#endif
180#endif	/* _LARGEFILE64_SOURCE */
181
182#ifdef _LP64
183typedef	int		blksize_t;	/* used for block sizes */
184#else
185typedef	long		blksize_t;	/* used for block sizes */
186#endif
187
188#if defined(__XOPEN_OR_POSIX)
189typedef enum { _B_FALSE, _B_TRUE } boolean_t;
190#else
191typedef enum { B_FALSE, B_TRUE } boolean_t;
192#ifdef _KERNEL
193#define	VALID_BOOLEAN(x)	(((x) == B_FALSE) || ((x) == B_TRUE))
194#define	VOID2BOOLEAN(x)		(((uintptr_t)(x) == 0) ? B_FALSE : B_TRUE)
195#endif /* _KERNEL */
196#endif /* defined(__XOPEN_OR_POSIX) */
197
198#ifdef _KERNEL
199#define	BOOLEAN2VOID(x)		((x) ? 1 : 0)
200#endif /* _KERNEL */
201
202/*
203 * The {u,}pad64_t types can be used in structures such that those structures
204 * may be accessed by code produced by compilation environments which don't
205 * support a 64 bit integral datatype.  The intention is not to allow
206 * use of these fields in such environments, but to maintain the alignment
207 * and offsets of the structure.
208 *
209 * Similar comments for {u,}pad128_t.
210 *
211 * Note that these types do NOT generate any stronger alignment constraints
212 * than those available in the underlying ABI.  See <sys/isa_defs.h>
213 */
214#if defined(_INT64_TYPE)
215typedef int64_t		pad64_t;
216typedef	uint64_t	upad64_t;
217#else
218typedef union {
219	double   _d;
220	int32_t  _l[2];
221} pad64_t;
222
223typedef union {
224	double   _d;
225	uint32_t _l[2];
226} upad64_t;
227#endif
228
229typedef union {
230	long double	_q;
231	int32_t		_l[4];
232} pad128_t;
233
234typedef union {
235	long double	_q;
236	uint32_t	_l[4];
237} upad128_t;
238
239typedef	longlong_t	offset_t;
240typedef	u_longlong_t	u_offset_t;
241typedef u_longlong_t	len_t;
242typedef	u_longlong_t	diskaddr_t;
243#if (defined(_KERNEL) || defined(_KMEMUSER) || defined(_BOOT))
244typedef	uint64_t	paddr_t;
245#endif
246
247/*
248 * Definitions remaining from previous partial support for 64-bit file
249 * offsets.  This partial support for devices greater than 2gb requires
250 * compiler support for long long.
251 */
252#ifdef _LONG_LONG_LTOH
253typedef union {
254	offset_t	_f;	/* Full 64 bit offset value */
255	struct {
256		int32_t	_l;	/* lower 32 bits of offset value */
257		int32_t	_u;	/* upper 32 bits of offset value */
258	} _p;
259} lloff_t;
260#endif
261
262#ifdef _LONG_LONG_HTOL
263typedef union {
264	offset_t	_f;	/* Full 64 bit offset value */
265	struct {
266		int32_t	_u;	/* upper 32 bits of offset value */
267		int32_t	_l;	/* lower 32 bits of offset value */
268	} _p;
269} lloff_t;
270#endif
271
272#ifdef _LONG_LONG_LTOH
273typedef union {
274	longlong_t	_f;	/* Full 64 bit disk address value */
275	struct {
276		int32_t	_l;	/* lower 32 bits of disk address value */
277		int32_t	_u;	/* upper 32 bits of disk address value */
278	} _p;
279} lldaddr_t;
280#endif
281
282#ifdef _LONG_LONG_HTOL
283typedef union {
284	longlong_t	_f;	/* Full 64 bit disk address value */
285	struct {
286		int32_t	_u;	/* upper 32 bits of disk address value */
287		int32_t	_l;	/* lower 32 bits of disk address value */
288	} _p;
289} lldaddr_t;
290#endif
291
292typedef uint_t k_fltset_t;	/* kernel fault set type */
293
294/*
295 * The following type is for various kinds of identifiers.  The
296 * actual type must be the same for all since some system calls
297 * (such as sigsend) take arguments that may be any of these
298 * types.  The enumeration type idtype_t defined in sys/procset.h
299 * is used to indicate what type of id is being specified --
300 * a process id, process group id, session id, scheduling class id,
301 * user id, group id, project id, task id or zone id.
302 */
303#if defined(_LP64) || defined(_I32LPx)
304typedef int		id_t;
305#else
306typedef	long		id_t;		/* (historical version) */
307#endif
308
309typedef id_t		lgrp_id_t;	/* lgroup ID */
310
311/*
312 * Type useconds_t is an unsigned integral type capable of storing
313 * values at least in the range of zero to 1,000,000.
314 */
315typedef uint_t		useconds_t;	/* Time, in microseconds */
316
317#ifndef	_SUSECONDS_T
318#define	_SUSECONDS_T
319typedef long	suseconds_t;	/* signed # of microseconds */
320#endif	/* _SUSECONDS_T */
321
322/*
323 * Typedefs for dev_t components.
324 */
325#if defined(_LP64) || defined(_I32LPx)
326typedef uint_t	major_t;	/* major part of device number */
327typedef uint_t	minor_t;	/* minor part of device number */
328#else
329typedef ulong_t	major_t;	/* (historical version) */
330typedef ulong_t	minor_t;	/* (historical version) */
331#endif
332
333/*
334 * The data type of a thread priority.
335 */
336typedef short	pri_t;
337
338/*
339 * The data type for a CPU flags field.  (Can be extended to larger unsigned
340 * types, if needed, limited by ability to update atomically.)
341 */
342typedef ushort_t	cpu_flag_t;
343
344/*
345 * For compatibility reasons the following typedefs (prefixed o_)
346 * can't grow regardless of the EFT definition. Although,
347 * applications should not explicitly use these typedefs
348 * they may be included via a system header definition.
349 * WARNING: These typedefs may be removed in a future
350 * release.
351 *		ex. the definitions in s5inode.h (now obsoleted)
352 *			remained small to preserve compatibility
353 *			in the S5 file system type.
354 */
355typedef	ushort_t o_mode_t;		/* old file attribute type */
356typedef short	o_dev_t;		/* old device type	*/
357typedef	ushort_t o_uid_t;		/* old UID type		*/
358typedef	o_uid_t	o_gid_t;		/* old GID type		*/
359typedef	short	o_nlink_t;		/* old file link type	*/
360typedef short	o_pid_t;		/* old process id type	*/
361typedef ushort_t o_ino_t;		/* old inode type	*/
362
363
364/*
365 * POSIX and XOPEN Declarations
366 */
367typedef	int	key_t;			/* IPC key type		*/
368#if defined(_LP64) || defined(_I32LPx)
369typedef	uint_t	mode_t;			/* file attribute type	*/
370#else
371typedef	ulong_t	mode_t;			/* (historical version) */
372#endif
373
374#ifndef	_UID_T
375#define	_UID_T
376typedef	unsigned int uid_t;		/* UID type		*/
377#endif	/* _UID_T */
378
379typedef	uid_t	gid_t;			/* GID type		*/
380
381typedef id_t    taskid_t;
382typedef id_t    projid_t;
383typedef	id_t	poolid_t;
384typedef id_t	zoneid_t;
385typedef id_t	ctid_t;
386
387/*
388 * POSIX definitions are same as defined in thread.h and synch.h.
389 * Any changes made to here should be reflected in corresponding
390 * files as described in comments.
391 */
392typedef	uint_t	pthread_t;	/* = thread_t in thread.h */
393typedef	uint_t	pthread_key_t;	/* = thread_key_t in thread.h */
394
395/* "Magic numbers" tagging synchronization object types */
396#define	_MUTEX_MAGIC	0x4d58		/* "MX" */
397#define	_SEMA_MAGIC	0x534d		/* "SM" */
398#define	_COND_MAGIC	0x4356		/* "CV" */
399#define	_RWL_MAGIC	0x5257		/* "RW" */
400
401typedef	struct _pthread_mutex {		/* = mutex_t in synch.h */
402	struct {
403		uint16_t	__pthread_mutex_flag1;
404		uint8_t		__pthread_mutex_flag2;
405		uint8_t		__pthread_mutex_ceiling;
406		uint16_t 	__pthread_mutex_type;
407		uint16_t 	__pthread_mutex_magic;
408	} __pthread_mutex_flags;
409	union {
410		struct {
411			uint8_t	__pthread_mutex_pad[8];
412		} __pthread_mutex_lock64;
413		struct {
414			uint32_t __pthread_ownerpid;
415			uint32_t __pthread_lockword;
416		} __pthread_mutex_lock32;
417		upad64_t __pthread_mutex_owner64;
418	} __pthread_mutex_lock;
419	upad64_t __pthread_mutex_data;
420} pthread_mutex_t;
421
422typedef	struct _pthread_cond {		/* = cond_t in synch.h */
423	struct {
424		uint8_t		__pthread_cond_flag[4];
425		uint16_t 	__pthread_cond_type;
426		uint16_t 	__pthread_cond_magic;
427	} __pthread_cond_flags;
428	upad64_t __pthread_cond_data;
429} pthread_cond_t;
430
431/*
432 * UNIX 98 Extension
433 */
434typedef	struct _pthread_rwlock {	/* = rwlock_t in synch.h */
435	int32_t		__pthread_rwlock_readers;
436	uint16_t	__pthread_rwlock_type;
437	uint16_t	__pthread_rwlock_magic;
438	pthread_mutex_t	__pthread_rwlock_mutex;
439	pthread_cond_t	__pthread_rwlock_readercv;
440	pthread_cond_t	__pthread_rwlock_writercv;
441} pthread_rwlock_t;
442
443/*
444 * SUSV3
445 */
446typedef struct {
447	uint32_t	__pthread_barrier_count;
448	uint32_t	__pthread_barrier_current;
449	upad64_t	__pthread_barrier_cycle;
450	upad64_t	__pthread_barrier_reserved;
451	pthread_mutex_t	__pthread_barrier_lock;
452	pthread_cond_t	__pthread_barrier_cond;
453} pthread_barrier_t;
454
455typedef	pthread_mutex_t	pthread_spinlock_t;
456
457/*
458 * attributes for threads, dynamically allocated by library
459 */
460typedef struct _pthread_attr {
461	void	*__pthread_attrp;
462} pthread_attr_t;
463
464/*
465 * attributes for mutex, dynamically allocated by library
466 */
467typedef struct _pthread_mutexattr {
468	void	*__pthread_mutexattrp;
469} pthread_mutexattr_t;
470
471/*
472 * attributes for cond, dynamically allocated by library
473 */
474typedef struct _pthread_condattr {
475	void	*__pthread_condattrp;
476} pthread_condattr_t;
477
478/*
479 * pthread_once
480 */
481typedef	struct _once {
482	upad64_t	__pthread_once_pad[4];
483} pthread_once_t;
484
485/*
486 * UNIX 98 Extensions
487 * attributes for rwlock, dynamically allocated by library
488 */
489typedef struct _pthread_rwlockattr {
490	void	*__pthread_rwlockattrp;
491} pthread_rwlockattr_t;
492
493/*
494 * SUSV3
495 * attributes for pthread_barrier_t, dynamically allocated by library
496 */
497typedef struct {
498	void	*__pthread_barrierattrp;
499} pthread_barrierattr_t;
500
501typedef ulong_t	dev_t;			/* expanded device type */
502
503#if defined(_LP64) || defined(_I32LPx)
504typedef	uint_t nlink_t;			/* file link type	*/
505typedef int	pid_t;			/* process id type	*/
506#else
507typedef	ulong_t	nlink_t;		/* (historical version) */
508typedef	long	pid_t;			/* (historical version) */
509#endif
510
511#if !defined(_SIZE_T) || __cplusplus >= 199711L
512#define	_SIZE_T
513#if defined(_LP64) || defined(_I32LPx)
514typedef	ulong_t	size_t;		/* size of something in bytes */
515#else
516typedef	uint_t	size_t;		/* (historical version) */
517#endif
518#endif	/* _SIZE_T */
519
520#ifndef _SSIZE_T
521#define	_SSIZE_T
522#if defined(_LP64) || defined(_I32LPx)
523typedef long	ssize_t;	/* size of something in bytes or -1 */
524#else
525typedef int	ssize_t;	/* (historical version) */
526#endif
527#endif	/* _SSIZE_T */
528
529#if !defined(_TIME_T) || __cplusplus >= 199711L
530#define	_TIME_T
531typedef	long		time_t;	/* time of day in seconds */
532#endif	/* _TIME_T */
533
534#if !defined(_CLOCK_T) || __cplusplus >= 199711L
535#define	_CLOCK_T
536typedef	long		clock_t; /* relative time in a specified resolution */
537#endif	/* ifndef _CLOCK_T */
538
539#ifndef _CLOCKID_T
540#define	_CLOCKID_T
541typedef	int	clockid_t;	/* clock identifier type */
542#endif	/* ifndef _CLOCKID_T */
543
544#ifndef _TIMER_T
545#define	_TIMER_T
546typedef	int	timer_t;	/* timer identifier type */
547#endif	/* ifndef _TIMER_T */
548
549#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
550
551/* BEGIN CSTYLED */
552typedef	unsigned char	unchar;
553typedef	unsigned short	ushort;
554typedef	unsigned int	uint;
555typedef	unsigned long	ulong;
556/* END CSTYLED */
557
558#if defined(_KERNEL)
559
560#define	SHRT_MIN	(-32768)	/* min value of a "short int" */
561#define	SHRT_MAX	32767		/* max value of a "short int" */
562#define	USHRT_MAX	65535		/* max of "unsigned short int" */
563#define	INT_MIN		(-2147483647-1) /* min value of an "int" */
564#define	INT_MAX		2147483647	/* max value of an "int" */
565#define	UINT_MAX	4294967295U	/* max value of an "unsigned int" */
566#if defined(_LP64)
567#define	LONG_MIN	(-9223372036854775807L-1L)
568					/* min value of a "long int" */
569#define	LONG_MAX	9223372036854775807L
570					/* max value of a "long int" */
571#define	ULONG_MAX	18446744073709551615UL
572					/* max of "unsigned long int" */
573#else /* _ILP32 */
574#define	LONG_MIN	(-2147483647L-1L)
575					/* min value of a "long int" */
576#define	LONG_MAX	2147483647L	/* max value of a "long int" */
577#define	ULONG_MAX	4294967295UL	/* max of "unsigned long int" */
578#endif
579
580#endif	/* defined(_KERNEL) */
581
582#define	P_MYPID	((pid_t)0)
583
584/*
585 * The following is the value of type id_t to use to indicate the
586 * caller's current id.  See procset.h for the type idtype_t
587 * which defines which kind of id is being specified.
588 */
589#define	P_MYID	(-1)
590#define	NOPID (pid_t)(-1)
591
592#ifndef NODEV
593#define	NODEV	(dev_t)(-1l)
594#ifdef _SYSCALL32
595#define	NODEV32	(dev32_t)(-1)
596#endif	/* _SYSCALL32 */
597#endif	/* NODEV */
598
599/*
600 * The following value of type pfn_t is used to indicate
601 * invalid page frame number.
602 */
603#define	PFN_INVALID	((pfn_t)-1)
604#define	PFN_SUSPENDED	((pfn_t)-2)
605
606/* BEGIN CSTYLED */
607typedef unsigned char	u_char;
608typedef unsigned short	u_short;
609typedef unsigned int	u_int;
610typedef unsigned long	u_long;
611typedef struct _quad { int val[2]; } quad_t;	/* used by UFS */
612typedef quad_t		quad;			/* used by UFS */
613/* END CSTYLED */
614
615/*
616 * Nested include for BSD/sockets source compatibility.
617 * (The select macros used to be defined here).
618 */
619#include <sys/select.h>
620
621#endif	/* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
622
623/*
624 * _VOID was defined to be either void or char but this is not
625 * required because previous SunOS compilers have accepted the void
626 * type. However, because many system header and source files use the
627 * void keyword, the volatile keyword, and ANSI C function prototypes,
628 * non-ANSI compilers cannot compile the system anyway. The _VOID macro
629 * should therefore not be used and remains for source compatibility
630 * only.
631 */
632/* CSTYLED */
633#define	_VOID	void
634
635#ifdef	__cplusplus
636}
637#endif
638
639#endif	/* _SYS_TYPES_H */
640