Home | History | Annotate | Download | only in md
      1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /*
      3  * The contents of this file are subject to the Mozilla Public
      4  * License Version 1.1 (the "License"); you may not use this file
      5  * except in compliance with the License. You may obtain a copy of
      6  * the License at http://www.mozilla.org/MPL/
      7  *
      8  * Software distributed under the License is distributed on an "AS
      9  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
     10  * implied. See the License for the specific language governing
     11  * rights and limitations under the License.
     12  *
     13  * The Original Code is the Netscape Portable Runtime (NSPR).
     14  *
     15  * The Initial Developer of the Original Code is Netscape
     16  * Communications Corporation.  Portions created by Netscape are
     17  * Copyright (C) 1998-2000 Netscape Communications Corporation.  All
     18  * Rights Reserved.
     19  *
     20  * Contributor(s):
     21  *
     22  * Alternatively, the contents of this file may be used under the
     23  * terms of the GNU General Public License Version 2 or later (the
     24  * "GPL"), in which case the provisions of the GPL are applicable
     25  * instead of those above.  If you wish to allow use of your
     26  * version of this file only under the terms of the GPL and not to
     27  * allow others to use your version of this file under the MPL,
     28  * indicate your decision by deleting the provisions above and
     29  * replace them with the notice and other provisions required by
     30  * the GPL.  If you do not delete the provisions above, a recipient
     31  * may use your version of this file under either the MPL or the
     32  * GPL.
     33  */
     34 
     35 #ifndef nspr_aix_defs_h___
     36 #define nspr_aix_defs_h___
     37 
     38 #include <sys/types.h>
     39 #if defined(_PR_PTHREADS) || defined(PTHREADS_USER)
     40 #include <pthread.h>
     41 #endif
     42 
     43 /*
     44  * To pick up fd_set and the poll events.
     45  */
     46 #include <sys/select.h>
     47 #include <sys/poll.h>
     48 
     49 /*
     50  * Internal configuration macros
     51  */
     52 
     53 #define PR_LINKER_ARCH          "aix"
     54 #define _PR_SI_SYSNAME		    "AIX"
     55 #define _PR_SI_ARCHITECTURE	    "rs6000"
     56 #define PR_DLL_SUFFIX		    ".so"
     57 
     58 #define _PR_VMBASE	 	        0x30000000
     59 #define _PR_STACK_VMBASE	    0x50000000
     60 #define _MD_DEFAULT_STACK_SIZE	(2*65536L)
     61 #define _MD_MINIMUM_STACK_SIZE	(2*65536L)
     62 #define _MD_MMAP_FLAGS		    MAP_PRIVATE
     63 
     64 #define NEED_TIME_R
     65 #undef  HAVE_STACK_GROWING_UP
     66 #undef	HAVE_WEAK_IO_SYMBOLS
     67 #undef	HAVE_WEAK_MALLOC_SYMBOLS
     68 #define	HAVE_DLL
     69 #define	USE_DLFCN
     70 #define _PR_HAVE_SOCKADDR_LEN
     71 #define _PR_POLL_AVAILABLE
     72 #define _PR_USE_POLL
     73 #define _PR_STAT_HAS_ONLY_ST_ATIME
     74 #ifdef _PR_INET6
     75 #define _PR_HAVE_INET_NTOP
     76 #define _PR_HAVE_GETHOSTBYNAME2
     77 #define _PR_HAVE_GETADDRINFO
     78 #endif
     79 #define _PR_HAVE_SYSV_SEMAPHORES
     80 #define PR_HAVE_SYSV_NAMED_SHARED_MEMORY
     81 #define _PR_ACCEPT_INHERIT_NONBLOCK
     82 
     83 /* Timer operations */
     84 #if defined(AIX_TIMERS)
     85 extern PRIntervalTime _MD_AixGetInterval(void);
     86 #define _MD_GET_INTERVAL _MD_AixGetInterval
     87 
     88 extern PRIntervalTime _MD_AixIntervalPerSec(void);
     89 #define _MD_INTERVAL_PER_SEC _MD_AixIntervalPerSec
     90 
     91 #else  /* defined(AIX_TIMERS) */
     92 #define _MD_GET_INTERVAL        _PR_UNIX_GetInterval
     93 #define _MD_INTERVAL_PER_SEC    _PR_UNIX_TicksPerSecond
     94 #endif  /* defined(AIX_TIMERS) */
     95 
     96 #ifdef AIX_HAVE_ATOMIC_OP_H
     97 /* The atomic operations */
     98 #include <sys/atomic_op.h>
     99 #define _PR_HAVE_ATOMIC_OPS
    100 #ifndef IS_64
    101 #define _PR_HAVE_ATOMIC_CAS
    102 #endif
    103 #define _MD_INIT_ATOMIC()
    104 #define _MD_ATOMIC_INCREMENT(val)   ((PRInt32)fetch_and_add((atomic_p)val, 1) + 1)
    105 #define _MD_ATOMIC_ADD(ptr, val)   ((PRInt32)fetch_and_add((atomic_p)ptr, val) + val)
    106 #define _MD_ATOMIC_DECREMENT(val)   ((PRInt32)fetch_and_add((atomic_p)val, -1) - 1)
    107 #define _MD_ATOMIC_SET(val, newval) _AIX_AtomicSet(val, newval)
    108 #endif /* AIX_HAVE_ATOMIC_OP_H */
    109 
    110 #define USE_SETJMP
    111 
    112 #include <setjmp.h>
    113 
    114 #define _MD_GET_SP(_t)				(_t)->md.jb[3]
    115 #define _MD_SET_THR_SP(_t, _sp)		((_t)->md.jb[3] = (int) (_sp - 2 * 64))
    116 #define PR_NUM_GCREGS				_JBLEN
    117 
    118 #define CONTEXT(_th) 				((_th)->md.jb)
    119 #define SAVE_CONTEXT(_th)			_setjmp(CONTEXT(_th))
    120 #define GOTO_CONTEXT(_th)			_longjmp(CONTEXT(_th), 1)
    121 
    122 #ifdef PTHREADS_USER
    123 #include "_nspr_pthread.h"
    124 #else
    125 
    126 /*
    127 ** Initialize the thread context preparing it to execute _main.
    128 */
    129 #define _MD_INIT_CONTEXT(_thread, _sp, _main, status)	      \
    130     PR_BEGIN_MACRO				      \
    131         *status = PR_TRUE;              \
    132 	if (setjmp(CONTEXT(_thread))) {	\
    133 	    (*_main)();			\
    134 	}				\
    135 	_MD_GET_SP(_thread) = (int) (_sp - 2 * 64);		\
    136     PR_END_MACRO
    137 
    138 #define _MD_SWITCH_CONTEXT(_thread)  \
    139     if (!setjmp(CONTEXT(_thread))) { \
    140 	(_thread)->md.errcode = errno;  \
    141 	_PR_Schedule();		     \
    142     }
    143 
    144 /*
    145 ** Restore a thread context, saved by _MD_SWITCH_CONTEXT
    146 */
    147 #define _MD_RESTORE_CONTEXT(_thread) \
    148 {				     \
    149     errno = (_thread)->md.errcode; \
    150     _MD_SET_CURRENT_THREAD(_thread); \
    151     longjmp(CONTEXT(_thread), 1); \
    152 }
    153 
    154 /* Machine-dependent (MD) data structures */
    155 
    156 struct _MDThread {
    157     jmp_buf jb;
    158     int id;
    159     int errcode;
    160 };
    161 
    162 struct _MDThreadStack {
    163     PRInt8 notused;
    164 };
    165 
    166 struct _MDLock {
    167     PRInt8 notused;
    168 };
    169 
    170 struct _MDSemaphore {
    171     PRInt8 notused;
    172 };
    173 
    174 struct _MDCVar {
    175     PRInt8 notused;
    176 };
    177 
    178 struct _MDSegment {
    179     PRInt8 notused;
    180 };
    181 
    182 /*
    183  * md-specific cpu structure field
    184  */
    185 #define _PR_MD_MAX_OSFD FD_SETSIZE
    186 
    187 struct _MDCPU_Unix {
    188     PRCList ioQ;
    189     PRUint32 ioq_timeout;
    190     PRInt32 ioq_max_osfd;
    191     PRInt32 ioq_osfd_cnt;
    192 #ifndef _PR_USE_POLL
    193     fd_set fd_read_set, fd_write_set, fd_exception_set;
    194     PRInt16 fd_read_cnt[_PR_MD_MAX_OSFD],fd_write_cnt[_PR_MD_MAX_OSFD],
    195 				fd_exception_cnt[_PR_MD_MAX_OSFD];
    196 #else
    197 	struct pollfd *ioq_pollfds;
    198 	int ioq_pollfds_size;
    199 #endif	/* _PR_USE_POLL */
    200 };
    201 
    202 #define _PR_IOQ(_cpu)			((_cpu)->md.md_unix.ioQ)
    203 #define _PR_ADD_TO_IOQ(_pq, _cpu) PR_APPEND_LINK(&_pq.links, &_PR_IOQ(_cpu))
    204 #define _PR_FD_READ_SET(_cpu)		((_cpu)->md.md_unix.fd_read_set)
    205 #define _PR_FD_READ_CNT(_cpu)		((_cpu)->md.md_unix.fd_read_cnt)
    206 #define _PR_FD_WRITE_SET(_cpu)		((_cpu)->md.md_unix.fd_write_set)
    207 #define _PR_FD_WRITE_CNT(_cpu)		((_cpu)->md.md_unix.fd_write_cnt)
    208 #define _PR_FD_EXCEPTION_SET(_cpu)	((_cpu)->md.md_unix.fd_exception_set)
    209 #define _PR_FD_EXCEPTION_CNT(_cpu)	((_cpu)->md.md_unix.fd_exception_cnt)
    210 #define _PR_IOQ_TIMEOUT(_cpu)		((_cpu)->md.md_unix.ioq_timeout)
    211 #define _PR_IOQ_MAX_OSFD(_cpu)		((_cpu)->md.md_unix.ioq_max_osfd)
    212 #define _PR_IOQ_OSFD_CNT(_cpu)		((_cpu)->md.md_unix.ioq_osfd_cnt)
    213 #define _PR_IOQ_POLLFDS(_cpu)		((_cpu)->md.md_unix.ioq_pollfds)
    214 #define _PR_IOQ_POLLFDS_SIZE(_cpu)	((_cpu)->md.md_unix.ioq_pollfds_size)
    215 
    216 #define _PR_IOQ_MIN_POLLFDS_SIZE(_cpu)	32
    217 
    218 struct _MDCPU {
    219     struct _MDCPU_Unix md_unix;
    220 };
    221 
    222 #if !defined(_PR_PTHREADS)
    223 #define _MD_INIT_LOCKS()
    224 #endif
    225 
    226 #define _MD_NEW_LOCK(lock) PR_SUCCESS
    227 #define _MD_FREE_LOCK(lock)
    228 #define _MD_LOCK(lock)
    229 #define _MD_UNLOCK(lock)
    230 #define _MD_INIT_IO()
    231 #define _MD_IOQ_LOCK()
    232 #define _MD_IOQ_UNLOCK()
    233 
    234 #define _MD_EARLY_INIT          	_MD_EarlyInit
    235 #define _MD_FINAL_INIT			_PR_UnixInit
    236 #define _MD_INIT_RUNNING_CPU(cpu)	_MD_unix_init_running_cpu(cpu)
    237 #define _MD_INIT_THREAD			_MD_InitializeThread
    238 #define _MD_EXIT_THREAD(thread)
    239 #define	_MD_SUSPEND_THREAD(thread)
    240 #define	_MD_RESUME_THREAD(thread)
    241 #define _MD_CLEAN_THREAD(_thread)
    242 #endif /* PTHREADS_USER */
    243 
    244 #ifdef AIX_RENAME_SELECT
    245 #define _MD_SELECT	select
    246 #define _MD_POLL	poll
    247 #endif
    248 
    249 extern void _MD_aix_map_sendfile_error(int err);
    250 
    251 #endif /* nspr_aix_defs_h___ */
    252