Home | History | Annotate | Download | only in inc
      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 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #ifndef _LIBC_INT_H
     28 #define	_LIBC_INT_H
     29 
     30 #ifdef	__cplusplus
     31 extern "C" {
     32 #endif
     33 
     34 /*
     35  * Libc/rtld Runtime Interface
     36  */
     37 #define	CI_NULL		0		/* (void) last entry */
     38 #define	CI_VERSION	1		/* current version of ri_interface */
     39 #define	CI_ATEXIT	2		/* _preexec_exit_handlers() address */
     40 #define	CI_LCMESSAGES	3		/* message locale */
     41 #define	CI_BIND_GUARD	4		/* bind_guard() address */
     42 #define	CI_BIND_CLEAR	5		/* bind_clear() address */
     43 #define	CI_THR_SELF	6		/* thr_self() address */
     44 #define	CI_TLS_MODADD	7		/* __tls_mod_add() address */
     45 #define	CI_TLS_MODREM	8		/* __tls_mod_remove() address */
     46 #define	CI_TLS_STATMOD	9		/* __tls_static_mods() address */
     47 #define	CI_THRINIT	10		/* libc thread initialization */
     48 #define	CI_CRITICAL	11		/* critical level query interface */
     49 
     50 #define	CI_MAX		12
     51 
     52 #define	CI_V_NONE	0		/* ci_version versions */
     53 #define	CI_V_ONE	1		/* original version */
     54 #define	CI_V_TWO	2
     55 #define	CI_V_THREE	3
     56 #define	CI_V_FOUR	4
     57 #define	CI_V_FIVE	5
     58 #define	CI_V_SIX	6
     59 #define	CI_V_CURRENT	CI_V_SIX	/* current version of libc interface */
     60 #define	CI_V_NUM	7		/* number of CI_V_* numbers */
     61 
     62 /*
     63  * Flags for the bindguard routines.
     64  * THR_FLG_RTLD used to live in usr/src/cmd/sgs/rtld/common/_rtld.h
     65  * THR_FLG_NOLOCK and THR_FLG_REENTER are new in version CI_V_FIVE.
     66  */
     67 #define	THR_FLG_RTLD	0x00000001	/* bind_guard() flag */
     68 #define	THR_FLG_NOLOCK	0x00000002	/* don't use ld.so.1's lock */
     69 #define	THR_FLG_REENTER	0x00000004	/* temporary leave / reenter */
     70 
     71 /*
     72  * Libc to ld.so.1 interface communication structure.
     73  */
     74 typedef struct {
     75 	int	ci_tag;
     76 	union {
     77 		int	(*ci_func)();
     78 		long	ci_val;
     79 		char	*ci_ptr;
     80 	} ci_un;
     81 } Lc_interface;
     82 
     83 /*
     84  * Address range returned via CI_ATEXIT.  Note, the address range array passed
     85  * back from ld.so.1 is maintained by ld.so.1 and should not be freed by libc.
     86  */
     87 typedef struct {
     88 	void *	lb;			/* lower bound */
     89 	void *	ub;			/* upper bound */
     90 } Lc_addr_range_t;
     91 
     92 /*
     93  * Thread-Local storage data type and interfaces shared between
     94  * libc & ld.so.1.
     95  */
     96 
     97 typedef struct {
     98 	unsigned long	ti_moduleid;	/* module ID for TLS var */
     99 	unsigned long	ti_tlsoffset;	/* offset into tls block for TLS var */
    100 } TLS_index;
    101 
    102 
    103 typedef struct {
    104 	const char	*tm_modname;		/* name of object */
    105 						/*	containing TLS */
    106 	unsigned long	tm_modid;		/* TLS module id */
    107 	void *		tm_tlsblock;		/* pointer to r/o init image */
    108 	unsigned long	tm_filesz;		/* initialized file size */
    109 	unsigned long	tm_memsz;		/* memory size */
    110 	long		tm_stattlsoffset;	/* signed offset into static */
    111 						/*	TLS block */
    112 	unsigned long	tm_flags;
    113 	void *		tm_tlsinitarray;	/* TLS .init function array */
    114 	unsigned long	tm_tlsinitarraycnt;	/* # of entries in initarray */
    115 	void *		tm_tlsfiniarray;	/* TLS .fini function array */
    116 	unsigned long	tm_tlsfiniarraycnt;	/* # of entries in finiarray */
    117 	unsigned long	tm_pad[5];		/* future expansion */
    118 } TLS_modinfo;
    119 
    120 #ifdef _SYSCALL32
    121 typedef struct {
    122 	caddr32_t	tm_modname;		/* name of object */
    123 						/*	containing TLS */
    124 	uint32_t	tm_modid;		/* TLS module id */
    125 	caddr32_t	tm_tlsblock;		/* pointer to r/o init image */
    126 	uint32_t	tm_filesz;		/* initialized file size */
    127 	uint32_t	tm_memsz;		/* memory size */
    128 	int32_t		tm_stattlsoffset;	/* signed offset into static */
    129 						/*	TLS block */
    130 	uint32_t	tm_flags;
    131 	caddr32_t	tm_tlsinitarray;	/* TLS .init function array */
    132 	uint32_t	tm_tlsinitarraycnt;	/* # of entries in initarray */
    133 	caddr32_t	tm_tlsfiniarray;	/* TLS .fini function array */
    134 	uint32_t	tm_tlsfiniarraycnt;	/* # of entries in finiarray */
    135 	uint32_t	tm_pad[5];		/* future expansion */
    136 } TLS_modinfo32;
    137 #endif
    138 
    139 
    140 /*
    141  * Flag values for TLS_modifo.tm_flags
    142  */
    143 #define	TM_FLG_STATICTLS	0x0001		/* Static TLS module */
    144 
    145 
    146 #ifdef	__cplusplus
    147 }
    148 #endif
    149 
    150 #endif /* _LIBC_INT_H */
    151