xref: /illumos-gate/usr/src/cmd/mdb/common/mdb/mdb_ctf.h (revision c71ad176)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5cce40297SJonathan Adams  * Common Development and Distribution License (the "License").
6cce40297SJonathan Adams  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22cce40297SJonathan Adams  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
2528e4da25SMatthew Ahrens /*
26dcbf3bd6SGeorge Wilson  * Copyright (c) 2013, 2015 by Delphix. All rights reserved.
27a8ea0c9dSJohn Levon  * Copyright 2018 Joyent, Inc.
2828e4da25SMatthew Ahrens  */
297c478bd9Sstevel@tonic-gate 
307c478bd9Sstevel@tonic-gate #ifndef	_MDB_CTF_H
317c478bd9Sstevel@tonic-gate #define	_MDB_CTF_H
327c478bd9Sstevel@tonic-gate 
337c478bd9Sstevel@tonic-gate #include <mdb/mdb_target.h>
347c478bd9Sstevel@tonic-gate #include <libctf.h>
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate #ifdef _MDB
377c478bd9Sstevel@tonic-gate #include <sys/machelf.h>
38*c71ad176SRobert Mustacchi #include <mdb/mdb_modapi.h>
397c478bd9Sstevel@tonic-gate #endif
407c478bd9Sstevel@tonic-gate 
417c478bd9Sstevel@tonic-gate /*
427c478bd9Sstevel@tonic-gate  * The following directive tells the mapfile generator that prototypes and
437c478bd9Sstevel@tonic-gate  * declarations ending with an "Internal" comment should be excluded from the
447c478bd9Sstevel@tonic-gate  * mapfile.
457c478bd9Sstevel@tonic-gate  *
467c478bd9Sstevel@tonic-gate  * MAPFILE: exclude "Internal"
477c478bd9Sstevel@tonic-gate  */
487c478bd9Sstevel@tonic-gate 
497c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
507c478bd9Sstevel@tonic-gate extern "C" {
517c478bd9Sstevel@tonic-gate #endif
527c478bd9Sstevel@tonic-gate 
537c478bd9Sstevel@tonic-gate typedef struct mdb_ctf_id {
547c478bd9Sstevel@tonic-gate 	void *_opaque[2];
557c478bd9Sstevel@tonic-gate } mdb_ctf_id_t;
567c478bd9Sstevel@tonic-gate 
577c478bd9Sstevel@tonic-gate typedef struct mdb_ctf_funcinfo {
587c478bd9Sstevel@tonic-gate 	mdb_ctf_id_t mtf_return;	/* function return type */
597c478bd9Sstevel@tonic-gate 	uint_t mtf_argc;		/* number of arguments */
607c478bd9Sstevel@tonic-gate 	uint_t mtf_flags;		/* function attributes (see libctf.h) */
617c478bd9Sstevel@tonic-gate 	uint_t mtf_symidx;		/* for ctf_func_args */
627c478bd9Sstevel@tonic-gate } mdb_ctf_funcinfo_t;
637c478bd9Sstevel@tonic-gate 
647c478bd9Sstevel@tonic-gate typedef struct mdb_ctf_arinfo {
657c478bd9Sstevel@tonic-gate 	mdb_ctf_id_t mta_contents;	/* type of array conents */
667c478bd9Sstevel@tonic-gate 	mdb_ctf_id_t mta_index;		/* type of array index */
677c478bd9Sstevel@tonic-gate 	uint_t mta_nelems;		/* number of elements */
687c478bd9Sstevel@tonic-gate } mdb_ctf_arinfo_t;
697c478bd9Sstevel@tonic-gate 
70cce40297SJonathan Adams typedef int mdb_ctf_visit_f(const char *, mdb_ctf_id_t, mdb_ctf_id_t, ulong_t,
71cce40297SJonathan Adams     int, void *);
727c478bd9Sstevel@tonic-gate typedef int mdb_ctf_member_f(const char *, mdb_ctf_id_t, ulong_t, void *);
737c478bd9Sstevel@tonic-gate typedef int mdb_ctf_enum_f(const char *, int, void *);
747c478bd9Sstevel@tonic-gate typedef int mdb_ctf_type_f(mdb_ctf_id_t, void *);
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate extern int mdb_ctf_enabled_by_object(const char *);
777c478bd9Sstevel@tonic-gate 
787c478bd9Sstevel@tonic-gate extern int mdb_ctf_lookup_by_name(const char *, mdb_ctf_id_t *);
797c478bd9Sstevel@tonic-gate extern int mdb_ctf_lookup_by_addr(uintptr_t, mdb_ctf_id_t *);
807c478bd9Sstevel@tonic-gate 
817c478bd9Sstevel@tonic-gate extern int mdb_ctf_module_lookup(const char *, mdb_ctf_id_t *);
827c478bd9Sstevel@tonic-gate 
837c478bd9Sstevel@tonic-gate extern int mdb_ctf_func_info(const GElf_Sym *, const mdb_syminfo_t *,
847c478bd9Sstevel@tonic-gate     mdb_ctf_funcinfo_t *);
857c478bd9Sstevel@tonic-gate extern int mdb_ctf_func_args(const mdb_ctf_funcinfo_t *, uint_t,
867c478bd9Sstevel@tonic-gate     mdb_ctf_id_t *);
877c478bd9Sstevel@tonic-gate 
887c478bd9Sstevel@tonic-gate extern void mdb_ctf_type_invalidate(mdb_ctf_id_t *);
897c478bd9Sstevel@tonic-gate extern int mdb_ctf_type_valid(mdb_ctf_id_t);
907c478bd9Sstevel@tonic-gate extern int mdb_ctf_type_cmp(mdb_ctf_id_t, mdb_ctf_id_t);
917c478bd9Sstevel@tonic-gate 
927c478bd9Sstevel@tonic-gate extern int mdb_ctf_type_resolve(mdb_ctf_id_t, mdb_ctf_id_t *);
937c478bd9Sstevel@tonic-gate extern char *mdb_ctf_type_name(mdb_ctf_id_t, char *, size_t);
947c478bd9Sstevel@tonic-gate extern ssize_t mdb_ctf_type_size(mdb_ctf_id_t);
957c478bd9Sstevel@tonic-gate extern int mdb_ctf_type_kind(mdb_ctf_id_t);
967c478bd9Sstevel@tonic-gate extern int mdb_ctf_type_reference(const mdb_ctf_id_t, mdb_ctf_id_t *);
977c478bd9Sstevel@tonic-gate extern int mdb_ctf_type_encoding(mdb_ctf_id_t, ctf_encoding_t *);
987c478bd9Sstevel@tonic-gate extern int mdb_ctf_type_visit(mdb_ctf_id_t, mdb_ctf_visit_f *, void *);
997c478bd9Sstevel@tonic-gate 
1007c478bd9Sstevel@tonic-gate extern int mdb_ctf_array_info(mdb_ctf_id_t, mdb_ctf_arinfo_t *);
1017c478bd9Sstevel@tonic-gate extern const char *mdb_ctf_enum_name(mdb_ctf_id_t, int);
1027c478bd9Sstevel@tonic-gate 
1037c478bd9Sstevel@tonic-gate extern int mdb_ctf_member_iter(mdb_ctf_id_t, mdb_ctf_member_f *, void *);
1047c478bd9Sstevel@tonic-gate extern int mdb_ctf_enum_iter(mdb_ctf_id_t, mdb_ctf_enum_f *, void *);
1057c478bd9Sstevel@tonic-gate extern int mdb_ctf_type_iter(const char *, mdb_ctf_type_f *, void *);
1060a47c91cSRobert Mustacchi extern int mdb_ctf_type_delete(const mdb_ctf_id_t *);
1070a47c91cSRobert Mustacchi 
1080a47c91cSRobert Mustacchi /*
1090a47c91cSRobert Mustacchi  * Special values for mdb_ctf_type_iter.
1100a47c91cSRobert Mustacchi  */
1110a47c91cSRobert Mustacchi #define	MDB_CTF_SYNTHETIC_ITER	(const char *)(-1L)
1120a47c91cSRobert Mustacchi 
1130a47c91cSRobert Mustacchi #define	SYNTHETIC_ILP32	1
1140a47c91cSRobert Mustacchi #define	SYNTHETIC_LP64	2
1150a47c91cSRobert Mustacchi extern int mdb_ctf_synthetics_create_base(int);
1160a47c91cSRobert Mustacchi extern int mdb_ctf_synthetics_reset(void);
1170a47c91cSRobert Mustacchi 
1180a47c91cSRobert Mustacchi /*
1190a47c91cSRobert Mustacchi  * Synthetic creation routines
1200a47c91cSRobert Mustacchi  */
1210a47c91cSRobert Mustacchi extern int mdb_ctf_add_typedef(const char *, const mdb_ctf_id_t *,
1220a47c91cSRobert Mustacchi     mdb_ctf_id_t *);
1230a47c91cSRobert Mustacchi extern int mdb_ctf_add_struct(const char *, mdb_ctf_id_t *);
1240a47c91cSRobert Mustacchi extern int mdb_ctf_add_union(const char *, mdb_ctf_id_t *);
1250a47c91cSRobert Mustacchi extern int mdb_ctf_add_member(const mdb_ctf_id_t *, const char *,
1260a47c91cSRobert Mustacchi     const mdb_ctf_id_t *, mdb_ctf_id_t *);
1270a47c91cSRobert Mustacchi extern int mdb_ctf_add_array(const mdb_ctf_arinfo_t *, mdb_ctf_id_t *);
1280a47c91cSRobert Mustacchi extern int mdb_ctf_add_pointer(const mdb_ctf_id_t *, mdb_ctf_id_t *);
1297c478bd9Sstevel@tonic-gate 
1307c478bd9Sstevel@tonic-gate /* utility stuff */
1317c478bd9Sstevel@tonic-gate extern ctf_id_t mdb_ctf_type_id(mdb_ctf_id_t);
1327c478bd9Sstevel@tonic-gate extern ctf_file_t *mdb_ctf_type_file(mdb_ctf_id_t);
1337c478bd9Sstevel@tonic-gate 
1347c478bd9Sstevel@tonic-gate 
1357c478bd9Sstevel@tonic-gate extern int mdb_ctf_member_info(mdb_ctf_id_t, const char *,
1367c478bd9Sstevel@tonic-gate     ulong_t *, mdb_ctf_id_t *);
1377c478bd9Sstevel@tonic-gate extern int mdb_ctf_offsetof(mdb_ctf_id_t, const char *, ulong_t *);
1387c478bd9Sstevel@tonic-gate extern int mdb_ctf_num_members(mdb_ctf_id_t);
13928e4da25SMatthew Ahrens extern int mdb_ctf_offsetof_by_name(const char *, const char *);
140dcbf3bd6SGeorge Wilson extern ssize_t mdb_ctf_sizeof_by_name(const char *);
1417c478bd9Sstevel@tonic-gate 
1427c478bd9Sstevel@tonic-gate extern ssize_t mdb_ctf_offset_to_name(mdb_ctf_id_t, ulong_t, char *, size_t,
1437c478bd9Sstevel@tonic-gate     int, mdb_ctf_id_t *, ulong_t *);
1447c478bd9Sstevel@tonic-gate 
14528e4da25SMatthew Ahrens #define	MDB_CTF_VREAD_QUIET		0x100
146a8ea0c9dSJohn Levon #define	MDB_CTF_VREAD_IGNORE_ABSENT	0x200
1477c478bd9Sstevel@tonic-gate 
14828e4da25SMatthew Ahrens extern int mdb_ctf_vread(void *, const char *, const char *,
14928e4da25SMatthew Ahrens     uintptr_t, uint_t);
1507c478bd9Sstevel@tonic-gate extern int mdb_ctf_readsym(void *, const char *, const char *, uint_t);
1517c478bd9Sstevel@tonic-gate 
1527c478bd9Sstevel@tonic-gate #ifdef _MDB
1537c478bd9Sstevel@tonic-gate 
1547c478bd9Sstevel@tonic-gate extern ctf_file_t *mdb_ctf_open(const char *, int *);		/* Internal */
1557c478bd9Sstevel@tonic-gate extern ctf_file_t *mdb_ctf_bufopen(const void *, size_t,	/* Internal */
1567c478bd9Sstevel@tonic-gate     const void *, Shdr *, const void *, Shdr *, int *);
1572becb8cdSRobert Mustacchi extern int mdb_ctf_write(const char *, ctf_file_t *fp);		/* Internal */
1587c478bd9Sstevel@tonic-gate extern void mdb_ctf_close(ctf_file_t *fp);			/* Internal */
1590a47c91cSRobert Mustacchi extern int mdb_ctf_synthetics_init(void);			/* Internal */
1600a47c91cSRobert Mustacchi extern void mdb_ctf_synthetics_fini(void);			/* Internal */
1610a47c91cSRobert Mustacchi extern int mdb_ctf_synthetics_from_file(const char *);		/* Internal */
1622becb8cdSRobert Mustacchi extern int mdb_ctf_synthetics_to_file(const char *);		/* Internal */
163*c71ad176SRobert Mustacchi extern int cmd_typelist(uintptr_t, uint_t, int,			/* Internal */
164*c71ad176SRobert Mustacchi     const mdb_arg_t *);
1657c478bd9Sstevel@tonic-gate 
1667c478bd9Sstevel@tonic-gate #endif
1677c478bd9Sstevel@tonic-gate 
1687c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
1697c478bd9Sstevel@tonic-gate }
1707c478bd9Sstevel@tonic-gate #endif
1717c478bd9Sstevel@tonic-gate 
1727c478bd9Sstevel@tonic-gate #endif	/* _MDB_CTF_H */
173