Merge branch 'master' of /opt/gnu-chroot/home/dtbartle/glibc-opensolaris
[kopensolaris-gnu/glibc.git] / NOTES.opensolaris
1 auxiliary vector (auxv_t):
2
3   Proper OpenSolaris does not support statically-linked executables (i.e. via
4   gcc -static). However, glibc does, but with certain restrictions. The kernel
5   only builds the auxv_t if the elf file is not of type ET_EXEC or if the
6   PT_INTERP program header exists. This means that dynamically-linked
7   executables and libaries get an auxv_t while statically-linked executables
8   don't. This means that statically-linked executables won't see PT_TLS, which
9   is needed for __thread support. We can test for the SHARED macro for libc
10   library code, but in general, __thread will not work.
11
12   In order to fix this, it should be a matter of changing the kernel to
13   unconditionally supply the auxv_t.
14
15 scheduling:
16
17   The OpenSolaris kernel allows for loadable schedule classes. A scheduling
18   class has an id (pc_cid), associated name (pc_clname), and class-specific
19   scheduling information. As new schedulers are loaded, they are incrementally
20   assigned new id's.
21
22   Since id's are assigned dynamically, there is no way to statically associate
23   a class id with a posix scheduler (i.e. SCHED_*). The only exception is
24   SCHED_SYS, which is guaranteed to have cid == 0.
25
26 privileges:
27
28   Each process has a set of privileges, represented by a prpriv_t. This struct
29   contains a header, followed by a number of priv_chunk_t blocks (the priv
30   sets), and finally followed by a number of priv_info_t blocks (per process
31   additional info).
32
33 threads:
34
35   The sun libpthread/libthread implementation assumes a 1:1 mapping between
36   pthread_t/thread_t and lwpid_t, while NPTL maps thread descriptors to
37   pthread_t. This behaviour was added to NPTL and maybe enabled by defining
38   PTHREAD_T_IS_TID.
39
40 mutex:
41
42   Recursive locks are represented by an 8-byte counter defined by the
43   mutex_rcount macro. The maximum number of recursive waiters is
44   UCHAR_MAX (255).
45
46   Various fields are defined in a 64-bit field. 32 of the bits are used to
47   hold the owner pid. 8-bits each are used for holding the lock byte, the
48   number of waiters, and the number of spinners. Solaris defines some macros
49   for accessing these (architecture dependent of course):
50
51     mutex_lockword (32-bits): This is used if only the lock bit needs to
52       touched.
53
54     mutex_lockword64 (64-bits): This is used if you need to atomically swap
55       both the lock bytes and the owner pid. Note that where the pid portion
56       is located is dependent on byte ordering.
57
58     mutex_lockbyte (8-bits): This is the actual lock byte. It is set to 1 when
59       the lock is locked, and 0 when unlocked.
60
61     mutex_waiters (8-bits): This is set to 1 when there is another thread
62       waiting and 0 when there are no other waiters.
63
64     mutex_spinners (8-bits): This byte is apparently unused.
65
66     mutex_ownerpid (32-bits): Set to the mutex owner's process pid when the
67       mutex is shared.
68
69   The data field (aka mutex_owner) is used by sun libc to store a pointer to
70   the thread-descriptor of the owning thread. We split this 64-bit field into
71   two fields:
72
73     mutex_owner (32-bits): The lwpid of the owning thread.
74
75     mutex_cond (32-bits): An in-use counter that is incremented when waiting on
76       a condition and decremented when we return (or are cancelled).
77
78   The kernel only touches the data field when it is cleared during cleanup for
79   certain mutex types.
80
81   The kernel does not handle recursive or error-checking mutexes.
82
83   The kernel does not set mutex_lockbyte for mutexes with the
84   LOCK_PRIO_INHERIT bit set.
85
86 semaphore:
87
88 condition variable:
89
90   The cond_waiters_kernel byte is set to 1 if there are waiters on the
91   condition variable and 0 otherwise. The cond_waiters_user byte is not
92   used by the kernel.
93
94   The only clock types supported by sun libc are CLOCK_REALTIME and
95   CLOCK_HIGHRES.
96
97   The data field is not used by the kernel.
98
99 reader-writer lock:
100
101   The kernel only supports shared/process reader-writer locks; the private
102   rwlock implementation must be completely implemented in libc. For the shared
103   case, readercv and writercv are used to track the owner (thread and process).
104   The sun docs also state that the sun implementation favours writers over
105   readers[0].
106
107   There is no apparent advantage in using the rwlock syscalls since any
108   private implementation that used the embedded mutex and cv's would also work
109   correctly in the shared case.
110
111   Our implementation adds three additional fields are included for tracking
112   the owner (thread and process) of a reader-writer lock.
113
114 [0] http://docs.sun.com/app/docs/doc/819-2243/rwlock-init-3c?a=view
115
116 sysconf:
117
118   Many of the _SC_ sysconf values are obtained via the systemconf syscall. The
119   following is a table of mappings from _SC_ to _CONFIG_ values. The third
120   column lists the value returned by sysdeps/posix/sysconf.c.
121
122     _SC_CHILD_MAX           _CONFIG_CHILD_MAX           _get_child_max
123     _SC_CLK_TCK             _CONFIG_CLK_TCK             _getclktck
124     _SC_NGROUPS_MAX         _CONFIG_NGROUPS             NGROUPS_MAX
125     _SC_OPEN_MAX            _CONFIG_OPEN_FILES          __getdtablesize
126     _SC_PAGESIZE            _CONFIG_PAGESIZE            __getpagesize
127     _SC_XOPEN_VERSION       _CONFIG_XOPEN_VER           _XOPEN_VERSION
128     _SC_STREAM_MAX          _CONFIG_OPEN_FILES          STREAM_MAX
129     _SC_NPROCESSORS_CONF    _CONFIG_NPROC_CONF          __get_nprocs_conf
130     _SC_NPROCESSORS_ONLN    _CONFIG_NPROC_ONLN          __get_nprocs
131     _SC_NPROCESSORS_MAX     _CONFIG_NPROC_MAX
132     _SC_STACK_PROT          _CONFIG_STACK_PROT
133     _SC_AIO_LISTIO_MAX      _CONFIG_AIO_LISTIO_MAX      AIO_LISTIO_MAX
134     _SC_AIO_MAX             _CONFIG_AIO_MAX             AIO_MAX
135     _SC_AIO_PRIO_DELTA_MAX  _CONFIG_AIO_PRIO_DELTA_MAX  AIO_PRIO_DELTA_MAX
136     _SC_DELAYTIMER_MAX      _CONFIG_DELAYTIMER_MAX      DELAYTIMER_MAX
137     _SC_MQ_OPEN_MAX         _CONFIG_MQ_OPEN_MAX         MQ_OPEN_MAX
138     _SC_MQ_PRIO_MAX         _CONFIG_MQ_PRIO_MAX         MQ_PRIO_MAX
139     _SC_RTSIG_MAX           _CONFIG_RTSIG_MAX           RTSIG_MAX
140     _SC_SEM_NSEMS_MAX       _CONFIG_SEM_NSEMS_MAX       SEM_NSEMS_MAX
141     _SC_SEM_VALUE_MAX       _CONFIG_SEM_VALUE_MAX       SEM_VALUE_MAX
142     _SC_SIGQUEUE_MAX        _CONFIG_SIGQUEUE_MAX        SIGQUEUE_MAX
143     _SC_SIGRT_MAX           _CONFIG_SIGRT_MAX
144     _SC_SIGRT_MIN           _CONFIG_SIGRT_MIN
145     _SC_TIMER_MAX           _CONFIG_TIMER_MAX           TIMER_MAX
146     _SC_PHYS_PAGES          _CONFIG_PHYS_PAGES          __get_phys_pages
147     _SC_AVPHYS_PAGES        _CONFIG_AVPHYS_PAGES        __get_avphys_pages
148     _SC_COHER_BLKSZ         _CONFIG_COHERENCY
149     _SC_SPLIT_CACHE         _CONFIG_SPLIT_CACHE
150     _SC_ICACHE_SZ           _CONFIG_ICACHESZ
151     _SC_DCACHE_SZ           _CONFIG_DCACHESZ
152     _SC_ICACHE_LINESZ       _CONFIG_ICACHELINESZ
153     _SC_DCACHE_LINESZ       _CONFIG_DCACHELINESZ
154     _SC_ICACHE_BLKSZ        _CONFIG_ICACHEBLKSZ
155     _SC_DCACHE_BLKSZ        _CONFIG_DCACHEBLKSZ
156     _SC_DCACHE_TBLKSZ       _CONFIG_DCACHETBLKSZ
157     _SC_ICACHE_ASSOC        _CONFIG_ICACHE_ASSOC
158     _SC_DCACHE_ASSOC        _CONFIG_DCACHE_ASSOC
159     _SC_MAXPID              _CONFIG_MAXPID
160     _SC_CPUID_MAX           _CONFIG_CPUID_MAX
161     _SC_EPHID_MAX           _CONFIG_EPHID_MAX
162     _SC_SYMLOOP_MAX         _CONFIG_SYMLOOP_MAX         SYMLOOP_MAX