/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #include #include #include #include #include #include #include int ctf_leave_compressed = 0; static struct modlmisc modlmisc = { &mod_miscops, "Compact C Type Format routines" }; static struct modlinkage modlinkage = { MODREV_1, &modlmisc, NULL }; int _init(void) { return (mod_install(&modlinkage)); } int _info(struct modinfo *mip) { return (mod_info(&modlinkage, mip)); } int _fini(void) { return (mod_remove(&modlinkage)); } /*ARGSUSED*/ void * ctf_zopen(int *errp) { return ((void *)1); /* zmod is always loaded because we depend on it */ } /*ARGSUSED*/ const void * ctf_sect_mmap(ctf_sect_t *sp, int fd) { return (MAP_FAILED); /* we don't support this in the kernel */ } /*ARGSUSED*/ void ctf_sect_munmap(const ctf_sect_t *sp) { /* we don't support this in the kernel */ } /*ARGSUSED*/ ctf_file_t * ctf_fdopen(int fd, int *errp) { return (ctf_set_open_errno(errp, ENOTSUP)); } /*ARGSUSED*/ ctf_file_t * ctf_open(const char *filename, int *errp) { return (ctf_set_open_errno(errp, ENOTSUP)); } /*ARGSUSED*/ int ctf_write(ctf_file_t *fp, int fd) { return (ctf_set_errno(fp, ENOTSUP)); } int ctf_version(int version) { ASSERT(version > 0 && version <= CTF_VERSION); if (version > 0) _libctf_version = MIN(CTF_VERSION, version); return (_libctf_version); } /*ARGSUSED*/ ctf_file_t * ctf_fdcreate_int(int fd, int *errp, ctf_sect_t *ctfp) { if (errp != NULL) *errp = ENOTSUP; return (NULL); } /*ARGSUSED*/ ctf_file_t * ctf_modopen(struct module *mp, int *error) { ctf_sect_t ctfsect, symsect, strsect; ctf_file_t *fp = NULL; int err; if (error == NULL) error = &err; ctfsect.cts_name = ".SUNW_ctf"; ctfsect.cts_type = SHT_PROGBITS; ctfsect.cts_flags = SHF_ALLOC; ctfsect.cts_data = mp->ctfdata; ctfsect.cts_size = mp->ctfsize; ctfsect.cts_entsize = 1; ctfsect.cts_offset = 0; symsect.cts_name = ".symtab"; symsect.cts_type = SHT_SYMTAB; symsect.cts_flags = 0; symsect.cts_data = mp->symtbl; symsect.cts_size = mp->symhdr->sh_size; #ifdef _LP64 symsect.cts_entsize = sizeof (Elf64_Sym); #else symsect.cts_entsize = sizeof (Elf32_Sym); #endif symsect.cts_offset = 0; strsect.cts_name = ".strtab"; strsect.cts_type = SHT_STRTAB; strsect.cts_flags = 0; strsect.cts_data = mp->strings; strsect.cts_size = mp->strhdr->sh_size; strsect.cts_entsize = 1; strsect.cts_offset = 0; ASSERT(MUTEX_HELD(&mod_lock)); if ((fp = ctf_bufopen(&ctfsect, &symsect, &strsect, error)) == NULL) return (NULL); if (!ctf_leave_compressed && (caddr_t)fp->ctf_base != mp->ctfdata) { /* * We must have just uncompressed the CTF data. To avoid * others having to pay the (substantial) cost of decompressing * the data, we're going to substitute the uncompressed version * for the compressed version. Note that this implies that the * first CTF consumer will induce memory impact on the system * (but in the name of performance of future CTF consumers). */ kobj_set_ctf(mp, (caddr_t)fp->ctf_base, fp->ctf_size); fp->ctf_data.cts_data = fp->ctf_base; fp->ctf_data.cts_size = fp->ctf_size; } return (fp); } /* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #include #include #include /* * This module is used both during the normal operation of the kernel (i.e. * after kmem has been initialized) and during boot (before unix`_start has * been called). kobj_alloc is able to tell the difference between the two * cases, and as such must be used instead of kmem_alloc. */ void * ctf_data_alloc(size_t size) { void *buf = kobj_alloc(size, KM_NOWAIT|KM_SCRATCH); if (buf == NULL) return (MAP_FAILED); return (buf); } void ctf_data_free(void *buf, size_t size) { kobj_free(buf, size); } /*ARGSUSED*/ void ctf_data_protect(void *buf, size_t size) { /* we don't support this operation in the kernel */ } void * ctf_alloc(size_t size) { return (kobj_alloc(size, KM_NOWAIT|KM_TMP)); } /*ARGSUSED*/ void ctf_free(void *buf, size_t size) { kobj_free(buf, size); } /*ARGSUSED*/ const char * ctf_strerror(int err) { return (NULL); /* we don't support this operation in the kernel */ } /*PRINTFLIKE1*/ void ctf_dprintf(const char *format, ...) { if (_libctf_debug) { va_list alist; va_start(alist, format); (void) printf("ctf DEBUG: "); (void) vprintf(format, alist); va_end(alist); } } # # Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # # MAPFILE HEADER START # # WARNING: STOP NOW. DO NOT MODIFY THIS FILE. # Object versioning must comply with the rules detailed in # # usr/src/lib/README.mapfiles # # You should not be making modifications here until you've read the most current # copy of that file. If you need help, contact a gatekeeper for guidance. # # MAPFILE HEADER END # $mapfile_version 2 SYMBOL_SCOPE { global: ctf_add_array; ctf_add_const; ctf_add_enum; ctf_add_enumerator; ctf_add_float; ctf_add_forward; ctf_add_function; ctf_add_integer; ctf_add_member; ctf_add_pointer; ctf_add_restrict; ctf_add_struct; ctf_add_type; ctf_add_typedef; ctf_add_union; ctf_add_volatile; ctf_array_info; ctf_bufopen; ctf_close; ctf_create; ctf_discard; ctf_enum_iter; ctf_enum_name; ctf_enum_value; ctf_errmsg; ctf_errno; ctf_fdopen; ctf_func_args; ctf_func_info; ctf_getmodel; ctf_getspecific; ctf_import; ctf_label_info; ctf_label_iter; ctf_label_topmost; ctf_lookup_by_name; ctf_lookup_by_symbol; ctf_member_info; ctf_member_iter; ctf_modopen; ctf_open; ctf_parent_file; ctf_parent_name; ctf_setmodel; ctf_setspecific; ctf_set_array; ctf_type_align; ctf_type_cmp; ctf_type_compat; ctf_type_encoding; ctf_type_iter; ctf_type_kind; ctf_type_lname; ctf_type_name; ctf_type_pointer; ctf_type_reference; ctf_type_resolve; ctf_type_size; ctf_type_visit; ctf_update; ctf_version; ctf_write; _info; _init; _fini; local: *; };