Print this page
OS-5569 uberdata32_t is missing ul_brand member
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Approved by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-5192 need faster clock_gettime
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
Reviewed by: Ryan Zezeski <ryan@zinascii.com>
OS-2844 lx brand should support 64-bit user-land
OS-3280 need a way to specify the root of a native system in the lx brand
OS-3279 lx brand should allow delegated datasets
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>


 948         /*
 949          * Every object before this point has size and alignment of 64 bytes.
 950          * Don't add any other type of data before this point.
 951          */
 952         char    primary_map;    /* set when primary link map is initialized */
 953         char    bucket_init;    /* set when bucket[NBUCKETS] is initialized */
 954         char    pad[2];
 955         uberflags_t     uberflags;
 956         queue_head_t    *queue_head;
 957         thr_hash_table_t *thr_hash_table;
 958         uint_t          hash_size;      /* # of entries in thr_hash_table[] */
 959         uint_t          hash_mask;      /* hash_size - 1 */
 960         ulwp_t  *ulwp_one;      /* main thread */
 961         ulwp_t  *all_lwps;      /* circular ul_forw/ul_back list of live lwps */
 962         ulwp_t  *all_zombies;   /* circular ul_forw/ul_back list of zombies */
 963         int     nthreads;       /* total number of live threads/lwps */
 964         int     nzombies;       /* total number of zombie threads */
 965         int     ndaemons;       /* total number of THR_DAEMON threads/lwps */
 966         pid_t   pid;            /* the current process's pid */
 967         void    (*sigacthandler)(int, siginfo_t *, void *);

 968         ulwp_t  *lwp_stacks;
 969         ulwp_t  *lwp_laststack;
 970         int     nfreestack;
 971         int     thread_stack_cache;
 972         ulwp_t  *ulwp_freelist;
 973         ulwp_t  *ulwp_lastfree;
 974         ulwp_t  *ulwp_replace_free;
 975         ulwp_t  *ulwp_replace_last;
 976         atfork_t        *atforklist;    /* circular Q for fork handlers */
 977         robust_t        **robustlocks;  /* table of registered robust locks */
 978         robust_t        *robustlist;    /* list of registered robust locks */
 979         char    *progname;      /* the basename of the program, from argv[0] */


 980         struct uberdata **tdb_bootstrap;
 981         tdb_t   tdb;            /* thread debug interfaces (for libc_db) */
 982 } uberdata_t;
 983 
 984 #define link_lock       _link_lock.pad_lock
 985 #define ld_lock         _ld_lock.pad_lock
 986 #define fork_lock       _fork_lock.pad_lock
 987 #define atfork_lock     _atfork_lock.pad_lock
 988 #define callout_lock    _callout_lock.pad_lock
 989 #define tdb_hash_lock   _tdb_hash_lock.pad_lock
 990 
 991 #pragma align 64(__uberdata)
 992 extern  uberdata_t      __uberdata;
 993 extern  uberdata_t      **__tdb_bootstrap;      /* known to libc_db and mdb */
 994 extern  int             primary_link_map;
 995 
 996 #define ulwp_mutex(ulwp, udp)   \
 997         (&(udp)->thr_hash_table[(ulwp)->ul_ix].hash_lock)
 998 #define ulwp_condvar(ulwp, udp) \
 999         (&(udp)->thr_hash_table[(ulwp)->ul_ix].hash_cond)


1161         atexit_root32_t atexit_root;
1162         quickexit_root32_t quickexit_root;
1163         tsd_metadata32_t tsd_metadata;
1164         tls_metadata32_t tls_metadata;
1165         char            primary_map;
1166         char            bucket_init;
1167         char            pad[2];
1168         uberflags_t     uberflags;
1169         caddr32_t       queue_head;
1170         caddr32_t       thr_hash_table;
1171         uint_t          hash_size;
1172         uint_t          hash_mask;
1173         caddr32_t       ulwp_one;
1174         caddr32_t       all_lwps;
1175         caddr32_t       all_zombies;
1176         int             nthreads;
1177         int             nzombies;
1178         int             ndaemons;
1179         int             pid;
1180         caddr32_t       sigacthandler;

1181         caddr32_t       lwp_stacks;
1182         caddr32_t       lwp_laststack;
1183         int             nfreestack;
1184         int             thread_stack_cache;
1185         caddr32_t       ulwp_freelist;
1186         caddr32_t       ulwp_lastfree;
1187         caddr32_t       ulwp_replace_free;
1188         caddr32_t       ulwp_replace_last;
1189         caddr32_t       atforklist;
1190         caddr32_t       robustlocks;
1191         caddr32_t       robustlist;
1192         caddr32_t       progname;


1193         caddr32_t       tdb_bootstrap;
1194         tdb32_t         tdb;
1195 } uberdata32_t;
1196 
1197 #endif  /* _SYSCALL32 */
1198 
1199 /* ul_stop values */
1200 #define TSTP_REGULAR    0x01    /* Stopped by thr_suspend() */
1201 #define TSTP_MUTATOR    0x08    /* stopped by thr_suspend_*mutator*() */
1202 #define TSTP_FORK       0x20    /* stopped by suspend_fork() */
1203 
1204 /*
1205  * Implementation-specific attribute types for pthread_mutexattr_init() etc.
1206  */
1207 
1208 typedef struct  _cvattr {
1209         int     pshared;
1210         clockid_t clockid;
1211 } cvattr_t;
1212 


1262 extern  void    getgregs(ulwp_t *, gregset_t);
1263 extern  void    setgregs(ulwp_t *, gregset_t);
1264 extern  void    thr_panic(const char *);
1265 #pragma rarely_called(thr_panic)
1266 extern  void    mutex_panic(mutex_t *, const char *);
1267 #pragma rarely_called(mutex_panic)
1268 extern  ulwp_t  *find_lwp(thread_t);
1269 extern  void    finish_init(void);
1270 extern  void    update_sched(ulwp_t *);
1271 extern  void    queue_alloc(void);
1272 extern  void    tmem_exit(void);
1273 extern  void    tsd_exit(void);
1274 extern  void    tsd_free(ulwp_t *);
1275 extern  void    tls_setup(void);
1276 extern  void    tls_exit(void);
1277 extern  void    tls_free(ulwp_t *);
1278 extern  void    rwl_free(ulwp_t *);
1279 extern  void    heldlock_exit(void);
1280 extern  void    heldlock_free(ulwp_t *);
1281 extern  void    sigacthandler(int, siginfo_t *, void *);

1282 extern  void    signal_init(void);
1283 extern  int     sigequalset(const sigset_t *, const sigset_t *);
1284 extern  void    mutex_setup(void);
1285 extern  void    take_deferred_signal(int);
1286 extern  void    *setup_top_frame(void *, size_t, ulwp_t *);
1287 extern  int     setup_context(ucontext_t *, void *(*func)(ulwp_t *),
1288                         ulwp_t *ulwp, caddr_t stk, size_t stksize);
1289 extern  volatile sc_shared_t *setup_schedctl(void);
1290 extern  void    *lmalloc(size_t);
1291 extern  void    lfree(void *, size_t);
1292 extern  void    *libc_malloc(size_t);
1293 extern  void    *libc_realloc(void *, size_t);
1294 extern  void    libc_free(void *);
1295 extern  char    *libc_strdup(const char *);
1296 extern  void    ultos(uint64_t, int, char *);
1297 extern  void    lock_error(const mutex_t *, const char *, void *, const char *);
1298 extern  void    rwlock_error(const rwlock_t *, const char *, const char *);
1299 extern  void    thread_error(const char *);
1300 extern  void    grab_assert_lock(void);
1301 extern  void    dump_queue_statistics(void);




 948         /*
 949          * Every object before this point has size and alignment of 64 bytes.
 950          * Don't add any other type of data before this point.
 951          */
 952         char    primary_map;    /* set when primary link map is initialized */
 953         char    bucket_init;    /* set when bucket[NBUCKETS] is initialized */
 954         char    pad[2];
 955         uberflags_t     uberflags;
 956         queue_head_t    *queue_head;
 957         thr_hash_table_t *thr_hash_table;
 958         uint_t          hash_size;      /* # of entries in thr_hash_table[] */
 959         uint_t          hash_mask;      /* hash_size - 1 */
 960         ulwp_t  *ulwp_one;      /* main thread */
 961         ulwp_t  *all_lwps;      /* circular ul_forw/ul_back list of live lwps */
 962         ulwp_t  *all_zombies;   /* circular ul_forw/ul_back list of zombies */
 963         int     nthreads;       /* total number of live threads/lwps */
 964         int     nzombies;       /* total number of zombie threads */
 965         int     ndaemons;       /* total number of THR_DAEMON threads/lwps */
 966         pid_t   pid;            /* the current process's pid */
 967         void    (*sigacthandler)(int, siginfo_t *, void *);
 968         int     (*setctxt)(const ucontext_t *);
 969         ulwp_t  *lwp_stacks;
 970         ulwp_t  *lwp_laststack;
 971         int     nfreestack;
 972         int     thread_stack_cache;
 973         ulwp_t  *ulwp_freelist;
 974         ulwp_t  *ulwp_lastfree;
 975         ulwp_t  *ulwp_replace_free;
 976         ulwp_t  *ulwp_replace_last;
 977         atfork_t        *atforklist;    /* circular Q for fork handlers */
 978         robust_t        **robustlocks;  /* table of registered robust locks */
 979         robust_t        *robustlist;    /* list of registered robust locks */
 980         char    *progname;      /* the basename of the program, from argv[0] */
 981         char    *ub_broot;      /* the root of the native code in the brand */
 982         void    *ub_comm_page;  /* arch-specific comm page of kernel data */
 983         struct uberdata **tdb_bootstrap;
 984         tdb_t   tdb;            /* thread debug interfaces (for libc_db) */
 985 } uberdata_t;
 986 
 987 #define link_lock       _link_lock.pad_lock
 988 #define ld_lock         _ld_lock.pad_lock
 989 #define fork_lock       _fork_lock.pad_lock
 990 #define atfork_lock     _atfork_lock.pad_lock
 991 #define callout_lock    _callout_lock.pad_lock
 992 #define tdb_hash_lock   _tdb_hash_lock.pad_lock
 993 
 994 #pragma align 64(__uberdata)
 995 extern  uberdata_t      __uberdata;
 996 extern  uberdata_t      **__tdb_bootstrap;      /* known to libc_db and mdb */
 997 extern  int             primary_link_map;
 998 
 999 #define ulwp_mutex(ulwp, udp)   \
1000         (&(udp)->thr_hash_table[(ulwp)->ul_ix].hash_lock)
1001 #define ulwp_condvar(ulwp, udp) \
1002         (&(udp)->thr_hash_table[(ulwp)->ul_ix].hash_cond)


1164         atexit_root32_t atexit_root;
1165         quickexit_root32_t quickexit_root;
1166         tsd_metadata32_t tsd_metadata;
1167         tls_metadata32_t tls_metadata;
1168         char            primary_map;
1169         char            bucket_init;
1170         char            pad[2];
1171         uberflags_t     uberflags;
1172         caddr32_t       queue_head;
1173         caddr32_t       thr_hash_table;
1174         uint_t          hash_size;
1175         uint_t          hash_mask;
1176         caddr32_t       ulwp_one;
1177         caddr32_t       all_lwps;
1178         caddr32_t       all_zombies;
1179         int             nthreads;
1180         int             nzombies;
1181         int             ndaemons;
1182         int             pid;
1183         caddr32_t       sigacthandler;
1184         caddr32_t       setctxt;
1185         caddr32_t       lwp_stacks;
1186         caddr32_t       lwp_laststack;
1187         int             nfreestack;
1188         int             thread_stack_cache;
1189         caddr32_t       ulwp_freelist;
1190         caddr32_t       ulwp_lastfree;
1191         caddr32_t       ulwp_replace_free;
1192         caddr32_t       ulwp_replace_last;
1193         caddr32_t       atforklist;
1194         caddr32_t       robustlocks;
1195         caddr32_t       robustlist;
1196         caddr32_t       progname;
1197         caddr32_t       ub_broot;
1198         caddr32_t       ub_comm_page;
1199         caddr32_t       tdb_bootstrap;
1200         tdb32_t         tdb;
1201 } uberdata32_t;
1202 
1203 #endif  /* _SYSCALL32 */
1204 
1205 /* ul_stop values */
1206 #define TSTP_REGULAR    0x01    /* Stopped by thr_suspend() */
1207 #define TSTP_MUTATOR    0x08    /* stopped by thr_suspend_*mutator*() */
1208 #define TSTP_FORK       0x20    /* stopped by suspend_fork() */
1209 
1210 /*
1211  * Implementation-specific attribute types for pthread_mutexattr_init() etc.
1212  */
1213 
1214 typedef struct  _cvattr {
1215         int     pshared;
1216         clockid_t clockid;
1217 } cvattr_t;
1218 


1268 extern  void    getgregs(ulwp_t *, gregset_t);
1269 extern  void    setgregs(ulwp_t *, gregset_t);
1270 extern  void    thr_panic(const char *);
1271 #pragma rarely_called(thr_panic)
1272 extern  void    mutex_panic(mutex_t *, const char *);
1273 #pragma rarely_called(mutex_panic)
1274 extern  ulwp_t  *find_lwp(thread_t);
1275 extern  void    finish_init(void);
1276 extern  void    update_sched(ulwp_t *);
1277 extern  void    queue_alloc(void);
1278 extern  void    tmem_exit(void);
1279 extern  void    tsd_exit(void);
1280 extern  void    tsd_free(ulwp_t *);
1281 extern  void    tls_setup(void);
1282 extern  void    tls_exit(void);
1283 extern  void    tls_free(ulwp_t *);
1284 extern  void    rwl_free(ulwp_t *);
1285 extern  void    heldlock_exit(void);
1286 extern  void    heldlock_free(ulwp_t *);
1287 extern  void    sigacthandler(int, siginfo_t *, void *);
1288 extern  int     setctxt(const ucontext_t *);
1289 extern  void    signal_init(void);
1290 extern  int     sigequalset(const sigset_t *, const sigset_t *);
1291 extern  void    mutex_setup(void);
1292 extern  void    take_deferred_signal(int);
1293 extern  void    *setup_top_frame(void *, size_t, ulwp_t *);
1294 extern  int     setup_context(ucontext_t *, void *(*func)(ulwp_t *),
1295                         ulwp_t *ulwp, caddr_t stk, size_t stksize);
1296 extern  volatile sc_shared_t *setup_schedctl(void);
1297 extern  void    *lmalloc(size_t);
1298 extern  void    lfree(void *, size_t);
1299 extern  void    *libc_malloc(size_t);
1300 extern  void    *libc_realloc(void *, size_t);
1301 extern  void    libc_free(void *);
1302 extern  char    *libc_strdup(const char *);
1303 extern  void    ultos(uint64_t, int, char *);
1304 extern  void    lock_error(const mutex_t *, const char *, void *, const char *);
1305 extern  void    rwlock_error(const rwlock_t *, const char *, const char *);
1306 extern  void    thread_error(const char *);
1307 extern  void    grab_assert_lock(void);
1308 extern  void    dump_queue_statistics(void);