4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
24 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
28 * Copyright (c) 2015, Joyent, Inc.
31 #include <sys/sysmacros.h>
32 #include <sys/param.h>
35 #include <sys/debug.h>
38 * This static string is used as the template for initially populating a
39 * dynamic container's string table. We always store \0 in the first byte,
40 * and we use the generic string "PARENT" to mark this container's parent
41 * if one is associated with the container using ctf_import().
43 static const char _CTF_STRTAB_TEMPLATE
[] = "\0PARENT";
46 * To create an empty CTF container, we just declare a zeroed header and call
47 * ctf_bufopen() on it. If ctf_bufopen succeeds, we mark the new container r/w
48 * and initialize the dynamic members. We set dtstrlen to 1 to reserve the
49 * first byte of the string table for a \0 byte, and we start assigning type
50 * IDs at 1 because type ID 0 is used as a sentinel.
55 static const ctf_header_t hdr
= { { CTF_MAGIC
, CTF_VERSION
, 0 } };
57 const ulong_t hashlen
= 128;
58 ctf_dtdef_t
**hash
= ctf_alloc(hashlen
* sizeof (ctf_dtdef_t
*));
63 return (ctf_set_open_errno(errp
, EAGAIN
));
65 cts
.cts_name
= _CTF_SECTION
;
66 cts
.cts_type
= SHT_PROGBITS
;
69 cts
.cts_size
= sizeof (hdr
);
73 if ((fp
= ctf_bufopen(&cts
, NULL
, NULL
, errp
)) == NULL
) {
74 ctf_free(hash
, hashlen
* sizeof (ctf_dtdef_t
*));
78 fp
->ctf_flags
|= LCTF_RDWR
;
79 fp
->ctf_dthashlen
= hashlen
;
80 bzero(hash
, hashlen
* sizeof (ctf_dtdef_t
*));
81 fp
->ctf_dthash
= hash
;
82 fp
->ctf_dtstrlen
= sizeof (_CTF_STRTAB_TEMPLATE
);
90 ctf_fdcreate(int fd
, int *errp
)
93 static const ctf_header_t hdr
= { { CTF_MAGIC
, CTF_VERSION
, 0 } };
95 const ulong_t hashlen
= 128;
100 return (ctf_create(errp
));
102 hash
= ctf_alloc(hashlen
* sizeof (ctf_dtdef_t
*));
105 return (ctf_set_open_errno(errp
, EAGAIN
));
107 cts
.cts_name
= _CTF_SECTION
;
108 cts
.cts_type
= SHT_PROGBITS
;
111 cts
.cts_size
= sizeof (hdr
);
115 if ((fp
= ctf_fdcreate_int(fd
, errp
, &cts
)) == NULL
) {
116 ctf_free(hash
, hashlen
* sizeof (ctf_dtdef_t
*));
120 fp
->ctf_flags
|= LCTF_RDWR
;
121 fp
->ctf_dthashlen
= hashlen
;
122 bzero(hash
, hashlen
* sizeof (ctf_dtdef_t
*));
123 fp
->ctf_dthash
= hash
;
124 fp
->ctf_dtstrlen
= sizeof (_CTF_STRTAB_TEMPLATE
);
125 fp
->ctf_dtnextid
= 1;
132 ctf_copy_smembers(ctf_dtdef_t
*dtd
, uint_t soff
, uchar_t
*t
)
134 ctf_dmdef_t
*dmd
= ctf_list_next(&dtd
->dtd_u
.dtu_members
);
137 for (; dmd
!= NULL
; dmd
= ctf_list_next(dmd
)) {
140 soff
+= strlen(dmd
->dmd_name
) + 1;
144 ctm
.ctm_type
= (ushort_t
)dmd
->dmd_type
;
145 ctm
.ctm_offset
= (ushort_t
)dmd
->dmd_offset
;
147 bcopy(&ctm
, t
, sizeof (ctm
));
155 ctf_copy_lmembers(ctf_dtdef_t
*dtd
, uint_t soff
, uchar_t
*t
)
157 ctf_dmdef_t
*dmd
= ctf_list_next(&dtd
->dtd_u
.dtu_members
);
160 for (; dmd
!= NULL
; dmd
= ctf_list_next(dmd
)) {
162 ctlm
.ctlm_name
= soff
;
163 soff
+= strlen(dmd
->dmd_name
) + 1;
167 ctlm
.ctlm_type
= (ushort_t
)dmd
->dmd_type
;
169 ctlm
.ctlm_offsethi
= CTF_OFFSET_TO_LMEMHI(dmd
->dmd_offset
);
170 ctlm
.ctlm_offsetlo
= CTF_OFFSET_TO_LMEMLO(dmd
->dmd_offset
);
172 bcopy(&ctlm
, t
, sizeof (ctlm
));
180 ctf_copy_emembers(ctf_dtdef_t
*dtd
, uint_t soff
, uchar_t
*t
)
182 ctf_dmdef_t
*dmd
= ctf_list_next(&dtd
->dtd_u
.dtu_members
);
185 for (; dmd
!= NULL
; dmd
= ctf_list_next(dmd
)) {
187 cte
.cte_value
= dmd
->dmd_value
;
188 soff
+= strlen(dmd
->dmd_name
) + 1;
189 bcopy(&cte
, t
, sizeof (cte
));
197 ctf_copy_membnames(ctf_dtdef_t
*dtd
, uchar_t
*s
)
199 ctf_dmdef_t
*dmd
= ctf_list_next(&dtd
->dtd_u
.dtu_members
);
202 for (; dmd
!= NULL
; dmd
= ctf_list_next(dmd
)) {
203 if (dmd
->dmd_name
== NULL
)
204 continue; /* skip anonymous members */
205 len
= strlen(dmd
->dmd_name
) + 1;
206 bcopy(dmd
->dmd_name
, s
, len
);
214 * Only types of dyanmic CTF containers contain reference counts. These
215 * containers are marked RD/WR. Because of that we basically make this a no-op
216 * for compatability with non-dynamic CTF sections. This is also a no-op for
217 * types which are not dynamic types. It is the responsibility of the caller to
218 * make sure it is a valid type. We help that caller out on debug builds.
220 * Note that the reference counts are not maintained for types that are not
221 * within this container. In other words if we have a type in a parent, that
222 * will not have its reference count increased. On the flip side, the parent
223 * will not be allowed to remove dynamic types if it has children.
226 ctf_ref_inc(ctf_file_t
*fp
, ctf_id_t tid
)
228 ctf_dtdef_t
*dtd
= ctf_dtd_lookup(fp
, tid
);
233 if (!(fp
->ctf_flags
& LCTF_RDWR
))
240 * Just as with ctf_ref_inc, this is a no-op on non-writeable containers and the
241 * caller should ensure that this is already a valid type.
244 ctf_ref_dec(ctf_file_t
*fp
, ctf_id_t tid
)
246 ctf_dtdef_t
*dtd
= ctf_dtd_lookup(fp
, tid
);
251 if (!(fp
->ctf_flags
& LCTF_RDWR
))
254 ASSERT(dtd
->dtd_ref
>= 1);
259 * If the specified CTF container is writable and has been modified, reload
260 * this container with the updated type definitions. In order to make this
261 * code and the rest of libctf as simple as possible, we perform updates by
262 * taking the dynamic type definitions and creating an in-memory CTF file
263 * containing the definitions, and then call ctf_bufopen() on it. This not
264 * only leverages ctf_bufopen(), but also avoids having to bifurcate the rest
265 * of the library code with different lookup paths for static and dynamic
266 * type definitions. We are therefore optimizing greatly for lookup over
267 * update, which we assume will be an uncommon operation. We perform one
268 * extra trick here for the benefit of callers and to keep our code simple:
269 * ctf_bufopen() will return a new ctf_file_t, but we want to keep the fp
270 * constant for the caller, so after ctf_bufopen() returns, we use bcopy to
271 * swap the interior of the old and new ctf_file_t's, and then free the old.
273 * Note that the lists of dynamic types stays around and the resulting container
274 * is still writeable. Furthermore, the reference counts that are on the dtd's
278 ctf_update(ctf_file_t
*fp
)
280 ctf_file_t ofp
, *nfp
;
281 ctf_header_t hdr
, *bhdr
;
285 ctf_sect_t cts
, *symp
, *strp
;
289 uint16_t *obj
, *func
;
290 size_t size
, objsize
, funcsize
, labelsize
, plen
;
297 uintptr_t symbase
= (uintptr_t)fp
->ctf_symtab
.cts_data
;
298 uintptr_t strbase
= (uintptr_t)fp
->ctf_strtab
.cts_data
;
300 if (!(fp
->ctf_flags
& LCTF_RDWR
))
301 return (ctf_set_errno(fp
, ECTF_RDONLY
));
303 if (!(fp
->ctf_flags
& LCTF_DIRTY
))
304 return (0); /* no update required */
307 * Fill in an initial CTF header. We will leave the label, object,
308 * and function sections empty and only output a header, type section,
309 * and string table. The type section begins at a 4-byte aligned
310 * boundary past the CTF header itself (at relative offset zero).
312 bzero(&hdr
, sizeof (hdr
));
313 hdr
.cth_magic
= CTF_MAGIC
;
314 hdr
.cth_version
= CTF_VERSION
;
316 if (fp
->ctf_flags
& LCTF_CHILD
) {
317 if (fp
->ctf_parname
== NULL
) {
319 hdr
.cth_parname
= 1; /* i.e. _CTF_STRTAB_TEMPLATE[1] */
322 plen
= strlen(fp
->ctf_parname
) + 1;
323 plabel
= ctf_label_topmost(fp
->ctf_parent
);
331 * Iterate over the labels that we have.
333 for (labelsize
= 0, dld
= ctf_list_next(&fp
->ctf_dldefs
);
334 dld
!= NULL
; dld
= ctf_list_next(dld
))
335 labelsize
+= sizeof (ctf_lblent_t
);
338 * Iterate through the dynamic type definition list and compute the
339 * size of the CTF type section we will need to generate.
341 for (size
= 0, dtd
= ctf_list_next(&fp
->ctf_dtdefs
);
342 dtd
!= NULL
; dtd
= ctf_list_next(dtd
)) {
344 uint_t kind
= CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
);
345 uint_t vlen
= CTF_INFO_VLEN(dtd
->dtd_data
.ctt_info
);
347 if (dtd
->dtd_data
.ctt_size
!= CTF_LSIZE_SENT
)
348 size
+= sizeof (ctf_stype_t
);
350 size
+= sizeof (ctf_type_t
);
355 size
+= sizeof (uint_t
);
358 size
+= sizeof (ctf_array_t
);
361 size
+= sizeof (ushort_t
) * (vlen
+ (vlen
& 1));
365 if (dtd
->dtd_data
.ctt_size
< CTF_LSTRUCT_THRESH
)
366 size
+= sizeof (ctf_member_t
) * vlen
;
368 size
+= sizeof (ctf_lmember_t
) * vlen
;
371 size
+= sizeof (ctf_enum_t
) * vlen
;
377 * An entry for each object must exist in the data section. However, if
378 * the symbol is SHN_UNDEF, then it is skipped. For objects, the storage
379 * is just the size of the 2-byte id. For functions it's always 2 bytes,
380 * plus 2 bytes per argument and the return type.
382 dsd
= ctf_list_next(&fp
->ctf_dsdefs
);
383 for (objsize
= 0, funcsize
= 0, i
= 0; i
< fp
->ctf_nsyms
; i
++) {
386 if (fp
->ctf_symtab
.cts_entsize
== sizeof (Elf32_Sym
)) {
387 const Elf32_Sym
*symp
= (Elf32_Sym
*)symbase
+ i
;
389 type
= ELF32_ST_TYPE(symp
->st_info
);
390 if (ctf_sym_valid(strbase
, type
, symp
->st_shndx
,
391 symp
->st_value
, symp
->st_name
) == B_FALSE
)
394 const Elf64_Sym
*symp
= (Elf64_Sym
*)symbase
+ i
;
396 type
= ELF64_ST_TYPE(symp
->st_info
);
397 if (ctf_sym_valid(strbase
, type
, symp
->st_shndx
,
398 symp
->st_value
, symp
->st_name
) == B_FALSE
)
402 while (dsd
!= NULL
&& i
> dsd
->dts_symidx
)
403 dsd
= ctf_list_next(dsd
);
404 if (type
== STT_OBJECT
) {
405 objsize
+= sizeof (uint16_t);
407 /* Every function has a uint16_t info no matter what */
408 if (dsd
== NULL
|| i
< dsd
->dts_symidx
) {
409 funcsize
+= sizeof (uint16_t);
411 funcsize
+= sizeof (uint16_t) *
412 (dsd
->dts_nargs
+ 2);
418 * The objtoff and funcoffset must be 2-byte aligned. We're guaranteed
419 * that this is always true for the objtoff because labels are always 8
420 * bytes large. Similarly, because objects are always two bytes of data,
421 * this will always be true for funcoff.
423 hdr
.cth_objtoff
= hdr
.cth_lbloff
+ labelsize
;
424 hdr
.cth_funcoff
= hdr
.cth_objtoff
+ objsize
;
427 * The type offset must be 4 byte aligned.
429 hdr
.cth_typeoff
= hdr
.cth_funcoff
+ funcsize
;
430 if (hdr
.cth_typeoff
& 3)
431 hdr
.cth_typeoff
+= 4 - (hdr
.cth_typeoff
& 3);
432 ASSERT((hdr
.cth_typeoff
& 3) == 0);
435 * Fill in the string table offset and size, compute the size of the
436 * entire CTF buffer we need, and then allocate a new buffer and
437 * bcopy the finished header to the start of the buffer.
439 hdr
.cth_stroff
= hdr
.cth_typeoff
+ size
;
440 hdr
.cth_strlen
= fp
->ctf_dtstrlen
+ plen
;
441 size
= sizeof (ctf_header_t
) + hdr
.cth_stroff
+ hdr
.cth_strlen
;
442 ctf_dprintf("lbloff: %d\nobjtoff: %d\nfuncoff: %d\n"
443 "typeoff: %d\nstroff: %d\nstrlen: %d\n",
444 hdr
.cth_lbloff
, hdr
.cth_objtoff
, hdr
.cth_funcoff
,
445 hdr
.cth_typeoff
, hdr
.cth_stroff
, hdr
.cth_strlen
);
447 if ((buf
= ctf_data_alloc(size
)) == MAP_FAILED
)
448 return (ctf_set_errno(fp
, EAGAIN
));
450 bcopy(&hdr
, buf
, sizeof (ctf_header_t
));
452 label
= (ctf_lblent_t
*)((uintptr_t)buf
+ sizeof (ctf_header_t
));
453 t
= (uchar_t
*)buf
+ sizeof (ctf_header_t
) + hdr
.cth_typeoff
;
454 s
= s0
= (uchar_t
*)buf
+ sizeof (ctf_header_t
) + hdr
.cth_stroff
;
455 obj
= (uint16_t *)((uintptr_t)buf
+ sizeof (ctf_header_t
) +
457 func
= (uint16_t *)((uintptr_t)buf
+ sizeof (ctf_header_t
) +
460 bcopy(_CTF_STRTAB_TEMPLATE
, s
, sizeof (_CTF_STRTAB_TEMPLATE
));
461 s
+= sizeof (_CTF_STRTAB_TEMPLATE
);
464 * We have an actual parent name and we're a child container, therefore
465 * we should make sure to note our parent's name here.
468 VERIFY(s
+ plen
- s0
<= hdr
.cth_strlen
);
469 bcopy(fp
->ctf_parname
, s
, plen
);
470 bhdr
->cth_parname
= s
- s0
;
475 * First pass over the labels and copy them out.
477 for (dld
= ctf_list_next(&fp
->ctf_dldefs
); dld
!= NULL
;
478 dld
= ctf_list_next(dld
), label
++) {
479 size_t len
= strlen(dld
->dld_name
) + 1;
481 VERIFY(s
+ len
- s0
<= hdr
.cth_strlen
);
482 bcopy(dld
->dld_name
, s
, len
);
483 label
->ctl_typeidx
= dld
->dld_type
;
484 label
->ctl_label
= s
- s0
;
487 if (plabel
!= NULL
&& strcmp(plabel
, dld
->dld_name
) == 0)
488 bhdr
->cth_parlabel
= label
->ctl_label
;
492 * We now take a final lap through the dynamic type definition list and
493 * copy the appropriate type records and strings to the output buffer.
495 for (dtd
= ctf_list_next(&fp
->ctf_dtdefs
);
496 dtd
!= NULL
; dtd
= ctf_list_next(dtd
)) {
498 uint_t kind
= CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
);
499 uint_t vlen
= CTF_INFO_VLEN(dtd
->dtd_data
.ctt_info
);
505 if (dtd
->dtd_name
!= NULL
) {
506 dtd
->dtd_data
.ctt_name
= (uint_t
)(s
- s0
);
507 len
= strlen(dtd
->dtd_name
) + 1;
508 VERIFY(s
+ len
- s0
<= hdr
.cth_strlen
);
509 bcopy(dtd
->dtd_name
, s
, len
);
512 dtd
->dtd_data
.ctt_name
= 0;
514 if (dtd
->dtd_data
.ctt_size
!= CTF_LSIZE_SENT
)
515 len
= sizeof (ctf_stype_t
);
517 len
= sizeof (ctf_type_t
);
519 bcopy(&dtd
->dtd_data
, t
, len
);
525 if (kind
== CTF_K_INTEGER
) {
526 encoding
= CTF_INT_DATA(
527 dtd
->dtd_u
.dtu_enc
.cte_format
,
528 dtd
->dtd_u
.dtu_enc
.cte_offset
,
529 dtd
->dtd_u
.dtu_enc
.cte_bits
);
531 encoding
= CTF_FP_DATA(
532 dtd
->dtd_u
.dtu_enc
.cte_format
,
533 dtd
->dtd_u
.dtu_enc
.cte_offset
,
534 dtd
->dtd_u
.dtu_enc
.cte_bits
);
536 bcopy(&encoding
, t
, sizeof (encoding
));
537 t
+= sizeof (encoding
);
541 cta
.cta_contents
= (ushort_t
)
542 dtd
->dtd_u
.dtu_arr
.ctr_contents
;
543 cta
.cta_index
= (ushort_t
)
544 dtd
->dtd_u
.dtu_arr
.ctr_index
;
545 cta
.cta_nelems
= dtd
->dtd_u
.dtu_arr
.ctr_nelems
;
546 bcopy(&cta
, t
, sizeof (cta
));
550 case CTF_K_FUNCTION
: {
551 ushort_t
*argv
= (ushort_t
*)(uintptr_t)t
;
554 for (argc
= 0; argc
< vlen
; argc
++)
555 *argv
++ = (ushort_t
)dtd
->dtd_u
.dtu_argv
[argc
];
558 *argv
++ = 0; /* pad to 4-byte boundary */
566 if (dtd
->dtd_data
.ctt_size
< CTF_LSTRUCT_THRESH
)
567 t
= ctf_copy_smembers(dtd
, (uint_t
)(s
- s0
), t
);
569 t
= ctf_copy_lmembers(dtd
, (uint_t
)(s
- s0
), t
);
570 s
= ctf_copy_membnames(dtd
, s
);
574 t
= ctf_copy_emembers(dtd
, (uint_t
)(s
- s0
), t
);
575 s
= ctf_copy_membnames(dtd
, s
);
581 * Now we fill in our dynamic data and function sections. We use the
582 * same criteria as above, but also consult the dsd list.
584 dsd
= ctf_list_next(&fp
->ctf_dsdefs
);
585 for (i
= 0; i
< fp
->ctf_nsyms
; i
++) {
587 if (fp
->ctf_symtab
.cts_entsize
== sizeof (Elf32_Sym
)) {
588 const Elf32_Sym
*symp
= (Elf32_Sym
*)symbase
+ i
;
589 type
= ELF32_ST_TYPE(symp
->st_info
);
591 if (ctf_sym_valid(strbase
, type
, symp
->st_shndx
,
592 symp
->st_value
, symp
->st_name
) == B_FALSE
)
595 const Elf64_Sym
*symp
= (Elf64_Sym
*)symbase
+ i
;
596 type
= ELF64_ST_TYPE(symp
->st_info
);
597 if (ctf_sym_valid(strbase
, type
, symp
->st_shndx
,
598 symp
->st_value
, symp
->st_name
) == B_FALSE
)
602 while (dsd
!= NULL
&& i
> dsd
->dts_symidx
) {
603 dsd
= ctf_list_next(dsd
);
605 if (type
== STT_OBJECT
) {
606 if (dsd
== NULL
|| i
< dsd
->dts_symidx
) {
612 VERIFY((uintptr_t)obj
<= (uintptr_t)func
);
614 if (dsd
== NULL
|| i
< dsd
->dts_symidx
) {
615 ushort_t data
= CTF_TYPE_INFO(CTF_K_UNKNOWN
,
621 ushort_t data
= CTF_TYPE_INFO(CTF_K_FUNCTION
, 0,
626 *func
= dsd
->dts_tid
;
628 for (j
= 0; j
< dsd
->dts_nargs
; j
++)
629 func
[j
] = dsd
->dts_argc
[j
];
630 func
+= dsd
->dts_nargs
;
636 * Finally, we are ready to ctf_bufopen() the new container. If this
637 * is successful, we then switch nfp and fp and free the old container.
639 ctf_data_protect(buf
, size
);
640 cts
.cts_name
= _CTF_SECTION
;
641 cts
.cts_type
= SHT_PROGBITS
;
648 if (fp
->ctf_nsyms
== 0) {
652 symp
= &fp
->ctf_symtab
;
653 strp
= &fp
->ctf_strtab
;
656 if ((nfp
= ctf_bufopen(&cts
, symp
, strp
, &err
)) == NULL
) {
657 ctf_data_free(buf
, size
);
658 return (ctf_set_errno(fp
, err
));
661 (void) ctf_setmodel(nfp
, ctf_getmodel(fp
));
662 (void) ctf_import(nfp
, fp
->ctf_parent
);
664 nfp
->ctf_refcnt
= fp
->ctf_refcnt
;
665 nfp
->ctf_flags
|= fp
->ctf_flags
& ~LCTF_DIRTY
;
666 nfp
->ctf_dthash
= fp
->ctf_dthash
;
667 nfp
->ctf_dthashlen
= fp
->ctf_dthashlen
;
668 nfp
->ctf_dtdefs
= fp
->ctf_dtdefs
;
669 nfp
->ctf_dsdefs
= fp
->ctf_dsdefs
;
670 nfp
->ctf_dldefs
= fp
->ctf_dldefs
;
671 nfp
->ctf_dtstrlen
= fp
->ctf_dtstrlen
;
672 nfp
->ctf_dtnextid
= fp
->ctf_dtnextid
;
673 nfp
->ctf_dtoldid
= fp
->ctf_dtnextid
- 1;
674 nfp
->ctf_specific
= fp
->ctf_specific
;
676 fp
->ctf_dthash
= NULL
;
677 fp
->ctf_dthashlen
= 0;
678 bzero(&fp
->ctf_dtdefs
, sizeof (ctf_list_t
));
679 bzero(&fp
->ctf_dsdefs
, sizeof (ctf_list_t
));
680 bzero(&fp
->ctf_dldefs
, sizeof (ctf_list_t
));
683 * Because the various containers share the data sections, we don't want
684 * to have ctf_close free it all. However, the name of the section is in
685 * fact unique to the ctf_sect_t. Thus we save the names of the symbol
686 * and string sections around the bzero() and restore them afterwards,
687 * ensuring that we don't result in a memory leak.
689 sname
= fp
->ctf_symtab
.cts_name
;
690 bzero(&fp
->ctf_symtab
, sizeof (ctf_sect_t
));
691 fp
->ctf_symtab
.cts_name
= sname
;
693 sname
= fp
->ctf_strtab
.cts_name
;
694 bzero(&fp
->ctf_strtab
, sizeof (ctf_sect_t
));
695 fp
->ctf_strtab
.cts_name
= sname
;
697 bcopy(fp
, &ofp
, sizeof (ctf_file_t
));
698 bcopy(nfp
, fp
, sizeof (ctf_file_t
));
699 bcopy(&ofp
, nfp
, sizeof (ctf_file_t
));
702 * Initialize the ctf_lookup_by_name top-level dictionary. We keep an
703 * array of type name prefixes and the corresponding ctf_hash to use.
704 * NOTE: This code must be kept in sync with the code in ctf_bufopen().
706 fp
->ctf_lookups
[0].ctl_hash
= &fp
->ctf_structs
;
707 fp
->ctf_lookups
[1].ctl_hash
= &fp
->ctf_unions
;
708 fp
->ctf_lookups
[2].ctl_hash
= &fp
->ctf_enums
;
709 fp
->ctf_lookups
[3].ctl_hash
= &fp
->ctf_names
;
711 nfp
->ctf_refcnt
= 1; /* force nfp to be freed */
718 ctf_dtd_insert(ctf_file_t
*fp
, ctf_dtdef_t
*dtd
)
720 ulong_t h
= dtd
->dtd_type
& (fp
->ctf_dthashlen
- 1);
722 dtd
->dtd_hash
= fp
->ctf_dthash
[h
];
723 fp
->ctf_dthash
[h
] = dtd
;
724 ctf_list_append(&fp
->ctf_dtdefs
, dtd
);
728 ctf_dtd_delete(ctf_file_t
*fp
, ctf_dtdef_t
*dtd
)
730 ulong_t h
= dtd
->dtd_type
& (fp
->ctf_dthashlen
- 1);
731 ctf_dtdef_t
*p
, **q
= &fp
->ctf_dthash
[h
];
732 ctf_dmdef_t
*dmd
, *nmd
;
736 for (p
= *q
; p
!= NULL
; p
= p
->dtd_hash
) {
746 kind
= CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
);
751 for (dmd
= ctf_list_next(&dtd
->dtd_u
.dtu_members
);
752 dmd
!= NULL
; dmd
= nmd
) {
753 if (dmd
->dmd_name
!= NULL
) {
754 len
= strlen(dmd
->dmd_name
) + 1;
755 ctf_free(dmd
->dmd_name
, len
);
756 fp
->ctf_dtstrlen
-= len
;
758 if (kind
!= CTF_K_ENUM
)
759 ctf_ref_dec(fp
, dmd
->dmd_type
);
760 nmd
= ctf_list_next(dmd
);
761 ctf_free(dmd
, sizeof (ctf_dmdef_t
));
765 ctf_ref_dec(fp
, dtd
->dtd_data
.ctt_type
);
766 for (i
= 0; i
< CTF_INFO_VLEN(dtd
->dtd_data
.ctt_info
); i
++)
767 if (dtd
->dtd_u
.dtu_argv
[i
] != 0)
768 ctf_ref_dec(fp
, dtd
->dtd_u
.dtu_argv
[i
]);
769 ctf_free(dtd
->dtd_u
.dtu_argv
, sizeof (ctf_id_t
) *
770 CTF_INFO_VLEN(dtd
->dtd_data
.ctt_info
));
773 ctf_ref_dec(fp
, dtd
->dtd_u
.dtu_arr
.ctr_contents
);
774 ctf_ref_dec(fp
, dtd
->dtd_u
.dtu_arr
.ctr_index
);
777 ctf_ref_dec(fp
, dtd
->dtd_data
.ctt_type
);
783 ctf_ref_dec(fp
, dtd
->dtd_data
.ctt_type
);
788 len
= strlen(dtd
->dtd_name
) + 1;
789 ctf_free(dtd
->dtd_name
, len
);
790 fp
->ctf_dtstrlen
-= len
;
793 ctf_list_delete(&fp
->ctf_dtdefs
, dtd
);
794 ctf_free(dtd
, sizeof (ctf_dtdef_t
));
798 ctf_dtd_lookup(ctf_file_t
*fp
, ctf_id_t type
)
800 ulong_t h
= type
& (fp
->ctf_dthashlen
- 1);
803 if (fp
->ctf_dthash
== NULL
)
806 for (dtd
= fp
->ctf_dthash
[h
]; dtd
!= NULL
; dtd
= dtd
->dtd_hash
) {
807 if (dtd
->dtd_type
== type
)
815 ctf_dsd_lookup(ctf_file_t
*fp
, ulong_t idx
)
819 for (dsd
= ctf_list_next(&fp
->ctf_dsdefs
); dsd
!= NULL
;
820 dsd
= ctf_list_next(dsd
)) {
821 if (dsd
->dts_symidx
== idx
)
829 * We order the ctf_dsdef_t by symbol index to make things better for updates.
832 ctf_dsd_insert(ctf_file_t
*fp
, ctf_dsdef_t
*dsd
)
836 for (i
= ctf_list_next(&fp
->ctf_dsdefs
); i
!= NULL
;
837 i
= ctf_list_next(i
)) {
838 if (i
->dts_symidx
> dsd
->dts_symidx
)
843 ctf_list_append(&fp
->ctf_dsdefs
, dsd
);
847 ctf_list_insert_before(&fp
->ctf_dsdefs
, i
, dsd
);
852 ctf_dsd_delete(ctf_file_t
*fp
, ctf_dsdef_t
*dsd
)
854 if (dsd
->dts_nargs
> 0)
855 ctf_free(dsd
->dts_argc
,
856 sizeof (ctf_id_t
) * dsd
->dts_nargs
);
857 ctf_list_delete(&fp
->ctf_dsdefs
, dsd
);
858 ctf_free(dsd
, sizeof (ctf_dsdef_t
));
862 ctf_dld_lookup(ctf_file_t
*fp
, const char *name
)
866 for (dld
= ctf_list_next(&fp
->ctf_dldefs
); dld
!= NULL
;
867 dld
= ctf_list_next(dld
)) {
868 if (strcmp(name
, dld
->dld_name
) == 0)
876 ctf_dld_insert(ctf_file_t
*fp
, ctf_dldef_t
*dld
, uint_t pos
)
881 ctf_list_prepend(&fp
->ctf_dldefs
, dld
);
885 for (l
= ctf_list_next(&fp
->ctf_dldefs
); pos
!= 0 && dld
!= NULL
;
886 l
= ctf_list_next(l
), pos
--)
890 ctf_list_append(&fp
->ctf_dldefs
, dld
);
892 ctf_list_insert_before(&fp
->ctf_dsdefs
, l
, dld
);
896 ctf_dld_delete(ctf_file_t
*fp
, ctf_dldef_t
*dld
)
898 ctf_list_delete(&fp
->ctf_dldefs
, dld
);
900 if (dld
->dld_name
!= NULL
) {
901 size_t len
= strlen(dld
->dld_name
) + 1;
902 ctf_free(dld
->dld_name
, len
);
903 fp
->ctf_dtstrlen
-= len
;
906 ctf_free(dld
, sizeof (ctf_dldef_t
));
910 * Discard all of the dynamic type definitions that have been added to the
911 * container since the last call to ctf_update(). We locate such types by
912 * scanning the list and deleting elements that have type IDs greater than
913 * ctf_dtoldid, which is set by ctf_update(), above. Note that to work properly
914 * with our reference counting schemes, we must delete the dynamic list in
918 ctf_discard(ctf_file_t
*fp
)
920 ctf_dtdef_t
*dtd
, *ntd
;
922 if (!(fp
->ctf_flags
& LCTF_RDWR
))
923 return (ctf_set_errno(fp
, ECTF_RDONLY
));
925 if (!(fp
->ctf_flags
& LCTF_DIRTY
))
926 return (0); /* no update required */
928 for (dtd
= ctf_list_prev(&fp
->ctf_dtdefs
); dtd
!= NULL
; dtd
= ntd
) {
929 ntd
= ctf_list_prev(dtd
);
930 if (dtd
->dtd_type
<= fp
->ctf_dtoldid
)
931 continue; /* skip types that have been committed */
933 ctf_dtd_delete(fp
, dtd
);
936 fp
->ctf_dtnextid
= fp
->ctf_dtoldid
+ 1;
937 fp
->ctf_flags
&= ~LCTF_DIRTY
;
943 ctf_add_generic(ctf_file_t
*fp
, uint_t flag
, const char *name
, ctf_dtdef_t
**rp
)
949 if (flag
!= CTF_ADD_NONROOT
&& flag
!= CTF_ADD_ROOT
)
950 return (ctf_set_errno(fp
, EINVAL
));
952 if (!(fp
->ctf_flags
& LCTF_RDWR
))
953 return (ctf_set_errno(fp
, ECTF_RDONLY
));
955 if (CTF_INDEX_TO_TYPE(fp
->ctf_dtnextid
, 1) > CTF_MAX_TYPE
)
956 return (ctf_set_errno(fp
, ECTF_FULL
));
958 if ((dtd
= ctf_alloc(sizeof (ctf_dtdef_t
))) == NULL
)
959 return (ctf_set_errno(fp
, EAGAIN
));
961 if (name
!= NULL
&& (s
= ctf_strdup(name
)) == NULL
) {
962 ctf_free(dtd
, sizeof (ctf_dtdef_t
));
963 return (ctf_set_errno(fp
, EAGAIN
));
966 type
= fp
->ctf_dtnextid
++;
967 type
= CTF_INDEX_TO_TYPE(type
, (fp
->ctf_flags
& LCTF_CHILD
));
969 bzero(dtd
, sizeof (ctf_dtdef_t
));
971 dtd
->dtd_type
= type
;
974 fp
->ctf_dtstrlen
+= strlen(s
) + 1;
976 ctf_dtd_insert(fp
, dtd
);
977 fp
->ctf_flags
|= LCTF_DIRTY
;
984 ctf_add_encoded(ctf_file_t
*fp
, uint_t flag
,
985 const char *name
, const ctf_encoding_t
*ep
, uint_t kind
)
991 return (ctf_set_errno(fp
, EINVAL
));
993 if ((type
= ctf_add_generic(fp
, flag
, name
, &dtd
)) == CTF_ERR
)
994 return (CTF_ERR
); /* errno is set for us */
996 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(kind
, flag
, 0);
999 * If the type's size is not an even number of bytes, then we should
1000 * round up the type size to the nearest byte.
1002 dtd
->dtd_data
.ctt_size
= ep
->cte_bits
/ NBBY
;
1003 if ((ep
->cte_bits
% NBBY
) != 0)
1004 dtd
->dtd_data
.ctt_size
++;
1005 dtd
->dtd_u
.dtu_enc
= *ep
;
1011 ctf_add_reftype(ctf_file_t
*fp
, uint_t flag
,
1012 const char *name
, ctf_id_t ref
, uint_t kind
)
1017 if (ref
== CTF_ERR
|| ref
< 0 || ref
> CTF_MAX_TYPE
)
1018 return (ctf_set_errno(fp
, EINVAL
));
1020 if ((type
= ctf_add_generic(fp
, flag
, name
, &dtd
)) == CTF_ERR
)
1021 return (CTF_ERR
); /* errno is set for us */
1023 ctf_ref_inc(fp
, ref
);
1025 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(kind
, flag
, 0);
1026 dtd
->dtd_data
.ctt_type
= (ushort_t
)ref
;
1032 ctf_add_integer(ctf_file_t
*fp
, uint_t flag
,
1033 const char *name
, const ctf_encoding_t
*ep
)
1035 return (ctf_add_encoded(fp
, flag
, name
, ep
, CTF_K_INTEGER
));
1039 ctf_add_float(ctf_file_t
*fp
, uint_t flag
,
1040 const char *name
, const ctf_encoding_t
*ep
)
1042 return (ctf_add_encoded(fp
, flag
, name
, ep
, CTF_K_FLOAT
));
1046 ctf_add_pointer(ctf_file_t
*fp
, uint_t flag
, const char *name
, ctf_id_t ref
)
1048 return (ctf_add_reftype(fp
, flag
, name
, ref
, CTF_K_POINTER
));
1052 ctf_add_array(ctf_file_t
*fp
, uint_t flag
, const ctf_arinfo_t
*arp
)
1059 return (ctf_set_errno(fp
, EINVAL
));
1062 if (ctf_lookup_by_id(&fpd
, arp
->ctr_contents
) == NULL
&&
1063 ctf_dtd_lookup(fp
, arp
->ctr_contents
) == NULL
) {
1064 ctf_dprintf("bad contents for array: %d\n",
1065 (int)arp
->ctr_contents
);
1066 return (ctf_set_errno(fp
, ECTF_BADID
));
1070 if (ctf_lookup_by_id(&fpd
, arp
->ctr_index
) == NULL
&&
1071 ctf_dtd_lookup(fp
, arp
->ctr_index
) == NULL
) {
1072 ctf_dprintf("bad index for array: %d\n", (int)arp
->ctr_index
);
1073 return (ctf_set_errno(fp
, ECTF_BADID
));
1076 if ((type
= ctf_add_generic(fp
, flag
, NULL
, &dtd
)) == CTF_ERR
)
1077 return (CTF_ERR
); /* errno is set for us */
1079 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(CTF_K_ARRAY
, flag
, 0);
1080 dtd
->dtd_data
.ctt_size
= 0;
1081 dtd
->dtd_u
.dtu_arr
= *arp
;
1082 ctf_ref_inc(fp
, arp
->ctr_contents
);
1083 ctf_ref_inc(fp
, arp
->ctr_index
);
1089 ctf_set_array(ctf_file_t
*fp
, ctf_id_t type
, const ctf_arinfo_t
*arp
)
1092 ctf_dtdef_t
*dtd
= ctf_dtd_lookup(fp
, type
);
1094 if (!(fp
->ctf_flags
& LCTF_RDWR
))
1095 return (ctf_set_errno(fp
, ECTF_RDONLY
));
1097 if (dtd
== NULL
|| CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
) != CTF_K_ARRAY
)
1098 return (ctf_set_errno(fp
, ECTF_BADID
));
1101 if (ctf_lookup_by_id(&fpd
, arp
->ctr_contents
) == NULL
&&
1102 ctf_dtd_lookup(fp
, arp
->ctr_contents
) == NULL
)
1103 return (ctf_set_errno(fp
, ECTF_BADID
));
1106 if (ctf_lookup_by_id(&fpd
, arp
->ctr_index
) == NULL
&&
1107 ctf_dtd_lookup(fp
, arp
->ctr_index
) == NULL
)
1108 return (ctf_set_errno(fp
, ECTF_BADID
));
1110 ctf_ref_dec(fp
, dtd
->dtd_u
.dtu_arr
.ctr_contents
);
1111 ctf_ref_dec(fp
, dtd
->dtd_u
.dtu_arr
.ctr_index
);
1112 fp
->ctf_flags
|= LCTF_DIRTY
;
1113 dtd
->dtd_u
.dtu_arr
= *arp
;
1114 ctf_ref_inc(fp
, arp
->ctr_contents
);
1115 ctf_ref_inc(fp
, arp
->ctr_index
);
1121 ctf_add_funcptr(ctf_file_t
*fp
, uint_t flag
,
1122 const ctf_funcinfo_t
*ctc
, const ctf_id_t
*argv
)
1128 ctf_id_t
*vdat
= NULL
;
1131 if (ctc
== NULL
|| (ctc
->ctc_flags
& ~CTF_FUNC_VARARG
) != 0 ||
1132 (ctc
->ctc_argc
!= 0 && argv
== NULL
))
1133 return (ctf_set_errno(fp
, EINVAL
));
1135 vlen
= ctc
->ctc_argc
;
1136 if (ctc
->ctc_flags
& CTF_FUNC_VARARG
)
1137 vlen
++; /* add trailing zero to indicate varargs (see below) */
1139 if (vlen
> CTF_MAX_VLEN
)
1140 return (ctf_set_errno(fp
, EOVERFLOW
));
1143 if (ctf_lookup_by_id(&fpd
, ctc
->ctc_return
) == NULL
&&
1144 ctf_dtd_lookup(fp
, ctc
->ctc_return
) == NULL
)
1145 return (ctf_set_errno(fp
, ECTF_BADID
));
1147 for (i
= 0; i
< ctc
->ctc_argc
; i
++) {
1149 if (ctf_lookup_by_id(&fpd
, argv
[i
]) == NULL
&&
1150 ctf_dtd_lookup(fp
, argv
[i
]) == NULL
)
1151 return (ctf_set_errno(fp
, ECTF_BADID
));
1154 if (vlen
!= 0 && (vdat
= ctf_alloc(sizeof (ctf_id_t
) * vlen
)) == NULL
)
1155 return (ctf_set_errno(fp
, EAGAIN
));
1157 if ((type
= ctf_add_generic(fp
, flag
, NULL
, &dtd
)) == CTF_ERR
) {
1158 ctf_free(vdat
, sizeof (ctf_id_t
) * vlen
);
1159 return (CTF_ERR
); /* errno is set for us */
1162 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(CTF_K_FUNCTION
, flag
, vlen
);
1163 dtd
->dtd_data
.ctt_type
= (ushort_t
)ctc
->ctc_return
;
1165 ctf_ref_inc(fp
, ctc
->ctc_return
);
1166 for (i
= 0; i
< ctc
->ctc_argc
; i
++)
1167 ctf_ref_inc(fp
, argv
[i
]);
1169 bcopy(argv
, vdat
, sizeof (ctf_id_t
) * ctc
->ctc_argc
);
1170 if (ctc
->ctc_flags
& CTF_FUNC_VARARG
)
1171 vdat
[vlen
- 1] = 0; /* add trailing zero to indicate varargs */
1172 dtd
->dtd_u
.dtu_argv
= vdat
;
1178 ctf_add_struct(ctf_file_t
*fp
, uint_t flag
, const char *name
)
1180 ctf_hash_t
*hp
= &fp
->ctf_structs
;
1181 ctf_helem_t
*hep
= NULL
;
1182 ctf_dtdef_t
*dtd
= NULL
;
1183 ctf_id_t type
= CTF_ERR
;
1186 hep
= ctf_hash_lookup(hp
, fp
, name
, strlen(name
));
1188 if (hep
!= NULL
&& ctf_type_kind(fp
, hep
->h_type
) == CTF_K_FORWARD
) {
1190 dtd
= ctf_dtd_lookup(fp
, type
);
1191 if (CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
) != CTF_K_FORWARD
)
1196 type
= ctf_add_generic(fp
, flag
, name
, &dtd
);
1197 if (type
== CTF_ERR
)
1198 return (CTF_ERR
); /* errno is set for us */
1201 VERIFY(type
!= CTF_ERR
);
1202 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(CTF_K_STRUCT
, flag
, 0);
1203 dtd
->dtd_data
.ctt_size
= 0;
1206 * Always dirty in case we modified a forward.
1208 fp
->ctf_flags
|= LCTF_DIRTY
;
1214 ctf_add_union(ctf_file_t
*fp
, uint_t flag
, const char *name
)
1216 ctf_hash_t
*hp
= &fp
->ctf_unions
;
1217 ctf_helem_t
*hep
= NULL
;
1218 ctf_dtdef_t
*dtd
= NULL
;
1219 ctf_id_t type
= CTF_ERR
;
1222 hep
= ctf_hash_lookup(hp
, fp
, name
, strlen(name
));
1224 if (hep
!= NULL
&& ctf_type_kind(fp
, hep
->h_type
) == CTF_K_FORWARD
) {
1226 dtd
= ctf_dtd_lookup(fp
, type
);
1227 if (CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
) != CTF_K_FORWARD
)
1232 type
= ctf_add_generic(fp
, flag
, name
, &dtd
);
1233 if (type
== CTF_ERR
)
1234 return (CTF_ERR
); /* errno is set for us */
1237 VERIFY(type
!= CTF_ERR
);
1238 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(CTF_K_UNION
, flag
, 0);
1239 dtd
->dtd_data
.ctt_size
= 0;
1242 * Always dirty in case we modified a forward.
1244 fp
->ctf_flags
|= LCTF_DIRTY
;
1250 ctf_add_enum(ctf_file_t
*fp
, uint_t flag
, const char *name
)
1252 ctf_hash_t
*hp
= &fp
->ctf_enums
;
1253 ctf_helem_t
*hep
= NULL
;
1254 ctf_dtdef_t
*dtd
= NULL
;
1255 ctf_id_t type
= CTF_ERR
;
1258 hep
= ctf_hash_lookup(hp
, fp
, name
, strlen(name
));
1260 if (hep
!= NULL
&& ctf_type_kind(fp
, hep
->h_type
) == CTF_K_FORWARD
) {
1262 dtd
= ctf_dtd_lookup(fp
, type
);
1263 if (CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
) != CTF_K_FORWARD
)
1268 type
= ctf_add_generic(fp
, flag
, name
, &dtd
);
1269 if (type
== CTF_ERR
)
1270 return (CTF_ERR
); /* errno is set for us */
1273 VERIFY(type
!= CTF_ERR
);
1274 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(CTF_K_ENUM
, flag
, 0);
1275 dtd
->dtd_data
.ctt_size
= fp
->ctf_dmodel
->ctd_int
;
1278 * Always dirty in case we modified a forward.
1280 fp
->ctf_flags
|= LCTF_DIRTY
;
1286 ctf_add_forward(ctf_file_t
*fp
, uint_t flag
, const char *name
, uint_t kind
)
1295 hp
= &fp
->ctf_structs
;
1298 hp
= &fp
->ctf_unions
;
1301 hp
= &fp
->ctf_enums
;
1304 return (ctf_set_errno(fp
, ECTF_NOTSUE
));
1308 * If the type is already defined or exists as a forward tag, just
1309 * return the ctf_id_t of the existing definition.
1311 if (name
!= NULL
&& (hep
= ctf_hash_lookup(hp
,
1312 fp
, name
, strlen(name
))) != NULL
)
1313 return (hep
->h_type
);
1315 if ((type
= ctf_add_generic(fp
, flag
, name
, &dtd
)) == CTF_ERR
)
1316 return (CTF_ERR
); /* errno is set for us */
1318 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(CTF_K_FORWARD
, flag
, 0);
1319 dtd
->dtd_data
.ctt_type
= kind
;
1325 ctf_add_typedef(ctf_file_t
*fp
, uint_t flag
, const char *name
, ctf_id_t ref
)
1332 if (ref
== CTF_ERR
|| (ctf_lookup_by_id(&fpd
, ref
) == NULL
&&
1333 ctf_dtd_lookup(fp
, ref
) == NULL
))
1334 return (ctf_set_errno(fp
, EINVAL
));
1336 if ((type
= ctf_add_generic(fp
, flag
, name
, &dtd
)) == CTF_ERR
)
1337 return (CTF_ERR
); /* errno is set for us */
1339 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(CTF_K_TYPEDEF
, flag
, 0);
1340 dtd
->dtd_data
.ctt_type
= (ushort_t
)ref
;
1341 ctf_ref_inc(fp
, ref
);
1347 ctf_add_volatile(ctf_file_t
*fp
, uint_t flag
, const char *name
, ctf_id_t ref
)
1349 return (ctf_add_reftype(fp
, flag
, name
, ref
, CTF_K_VOLATILE
));
1353 ctf_add_const(ctf_file_t
*fp
, uint_t flag
, const char *name
, ctf_id_t ref
)
1355 return (ctf_add_reftype(fp
, flag
, name
, ref
, CTF_K_CONST
));
1359 ctf_add_restrict(ctf_file_t
*fp
, uint_t flag
, const char *name
, ctf_id_t ref
)
1361 return (ctf_add_reftype(fp
, flag
, name
, ref
, CTF_K_RESTRICT
));
1365 ctf_add_enumerator(ctf_file_t
*fp
, ctf_id_t enid
, const char *name
, int value
)
1367 ctf_dtdef_t
*dtd
= ctf_dtd_lookup(fp
, enid
);
1370 uint_t kind
, vlen
, root
;
1374 return (ctf_set_errno(fp
, EINVAL
));
1376 if (!(fp
->ctf_flags
& LCTF_RDWR
))
1377 return (ctf_set_errno(fp
, ECTF_RDONLY
));
1380 return (ctf_set_errno(fp
, ECTF_BADID
));
1382 kind
= CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
);
1383 root
= CTF_INFO_ISROOT(dtd
->dtd_data
.ctt_info
);
1384 vlen
= CTF_INFO_VLEN(dtd
->dtd_data
.ctt_info
);
1386 if (kind
!= CTF_K_ENUM
)
1387 return (ctf_set_errno(fp
, ECTF_NOTENUM
));
1389 if (vlen
== CTF_MAX_VLEN
)
1390 return (ctf_set_errno(fp
, ECTF_DTFULL
));
1392 for (dmd
= ctf_list_next(&dtd
->dtd_u
.dtu_members
);
1393 dmd
!= NULL
; dmd
= ctf_list_next(dmd
)) {
1394 if (strcmp(dmd
->dmd_name
, name
) == 0) {
1395 ctf_dprintf("encountered dupliacte member %s\n", name
);
1396 return (ctf_set_errno(fp
, ECTF_DUPMEMBER
));
1400 if ((dmd
= ctf_alloc(sizeof (ctf_dmdef_t
))) == NULL
)
1401 return (ctf_set_errno(fp
, EAGAIN
));
1403 if ((s
= ctf_strdup(name
)) == NULL
) {
1404 ctf_free(dmd
, sizeof (ctf_dmdef_t
));
1405 return (ctf_set_errno(fp
, EAGAIN
));
1409 dmd
->dmd_type
= CTF_ERR
;
1410 dmd
->dmd_offset
= 0;
1411 dmd
->dmd_value
= value
;
1413 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(kind
, root
, vlen
+ 1);
1414 ctf_list_append(&dtd
->dtd_u
.dtu_members
, dmd
);
1416 fp
->ctf_dtstrlen
+= strlen(s
) + 1;
1417 fp
->ctf_flags
|= LCTF_DIRTY
;
1423 ctf_add_member(ctf_file_t
*fp
, ctf_id_t souid
, const char *name
, ctf_id_t type
,
1426 ctf_dtdef_t
*dtd
= ctf_dtd_lookup(fp
, souid
);
1430 ssize_t msize
, malign
, ssize
;
1431 uint_t kind
, vlen
, root
;
1435 if (!(fp
->ctf_flags
& LCTF_RDWR
))
1436 return (ctf_set_errno(fp
, ECTF_RDONLY
));
1439 return (ctf_set_errno(fp
, ECTF_BADID
));
1441 kind
= CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
);
1442 root
= CTF_INFO_ISROOT(dtd
->dtd_data
.ctt_info
);
1443 vlen
= CTF_INFO_VLEN(dtd
->dtd_data
.ctt_info
);
1445 if (kind
!= CTF_K_STRUCT
&& kind
!= CTF_K_UNION
)
1446 return (ctf_set_errno(fp
, ECTF_NOTSOU
));
1448 if (vlen
== CTF_MAX_VLEN
)
1449 return (ctf_set_errno(fp
, ECTF_DTFULL
));
1452 * Structures may have members which are anonymous. If they have two of
1453 * these, then the duplicte member detection would find it due to the
1454 * string of "", so we skip it.
1456 if (name
!= NULL
&& *name
!= '\0') {
1457 for (dmd
= ctf_list_next(&dtd
->dtd_u
.dtu_members
);
1458 dmd
!= NULL
; dmd
= ctf_list_next(dmd
)) {
1459 if (dmd
->dmd_name
!= NULL
&&
1460 strcmp(dmd
->dmd_name
, name
) == 0) {
1461 return (ctf_set_errno(fp
, ECTF_DUPMEMBER
));
1466 if ((msize
= ctf_type_size(fp
, type
)) == CTF_ERR
||
1467 (malign
= ctf_type_align(fp
, type
)) == CTF_ERR
||
1468 (mkind
= ctf_type_kind(fp
, type
)) == CTF_ERR
)
1469 return (CTF_ERR
); /* errno is set for us */
1472 * ctf_type_size returns sizes in bytes. However, for bitfields, that
1473 * means that it may misrepresent and actually rounds it up to a power
1474 * of two and store that in bytes. So instead we have to get the
1475 * Integers encoding and rely on that.
1477 if (mkind
== CTF_K_INTEGER
) {
1480 if (ctf_type_encoding(fp
, type
, &e
) == CTF_ERR
)
1481 return (CTF_ERR
); /* errno is set for us */
1482 mbitsz
= e
.cte_bits
;
1483 } else if (mkind
== CTF_K_FORWARD
) {
1485 * This is a rather rare case. In general one cannot add a
1486 * forward to a structure. However, the CTF tools traditionally
1487 * tried to add a forward to the struct cpu as the last member.
1488 * Therefore, if we find one here, we're going to verify the
1489 * size and make sure it's zero. It's certainly odd, but that's
1492 * Further, if it's not an absolute position being specified,
1493 * then we refuse to add it.
1495 if (offset
== ULONG_MAX
)
1496 return (ctf_set_errno(fp
, EINVAL
));
1503 if ((dmd
= ctf_alloc(sizeof (ctf_dmdef_t
))) == NULL
)
1504 return (ctf_set_errno(fp
, EAGAIN
));
1506 if (name
!= NULL
&& (s
= ctf_strdup(name
)) == NULL
) {
1507 ctf_free(dmd
, sizeof (ctf_dmdef_t
));
1508 return (ctf_set_errno(fp
, EAGAIN
));
1512 dmd
->dmd_type
= type
;
1513 dmd
->dmd_value
= -1;
1515 if (kind
== CTF_K_STRUCT
&& vlen
!= 0) {
1516 ctf_dmdef_t
*lmd
= ctf_list_prev(&dtd
->dtd_u
.dtu_members
);
1517 ctf_id_t ltype
= ctf_type_resolve(fp
, lmd
->dmd_type
);
1520 if (offset
== ULONG_MAX
) {
1521 ctf_encoding_t linfo
;
1524 off
= lmd
->dmd_offset
;
1525 if (ctf_type_encoding(fp
, ltype
, &linfo
) != CTF_ERR
)
1526 off
+= linfo
.cte_bits
;
1527 else if ((lsize
= ctf_type_size(fp
, ltype
)) != CTF_ERR
)
1528 off
+= lsize
* NBBY
;
1531 * Round up the offset of the end of the last member to
1532 * the next byte boundary, convert 'off' to bytes, and
1533 * then round it up again to the next multiple of the
1534 * alignment required by the new member. Finally,
1535 * convert back to bits and store the result in
1536 * dmd_offset. Technically we could do more efficient
1537 * packing if the new member is a bit-field, but we're
1538 * the "compiler" and ANSI says we can do as we choose.
1540 off
= roundup(off
, NBBY
) / NBBY
;
1541 off
= roundup(off
, MAX(malign
, 1));
1542 dmd
->dmd_offset
= off
* NBBY
;
1543 ssize
= off
+ msize
;
1545 dmd
->dmd_offset
= offset
;
1546 ssize
= (offset
+ mbitsz
) / NBBY
;
1549 dmd
->dmd_offset
= 0;
1550 ssize
= ctf_get_ctt_size(fp
, &dtd
->dtd_data
, NULL
, NULL
);
1551 ssize
= MAX(ssize
, msize
);
1554 if (ssize
> CTF_MAX_SIZE
) {
1555 dtd
->dtd_data
.ctt_size
= CTF_LSIZE_SENT
;
1556 dtd
->dtd_data
.ctt_lsizehi
= CTF_SIZE_TO_LSIZE_HI(ssize
);
1557 dtd
->dtd_data
.ctt_lsizelo
= CTF_SIZE_TO_LSIZE_LO(ssize
);
1559 dtd
->dtd_data
.ctt_size
= (ushort_t
)ssize
;
1561 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(kind
, root
, vlen
+ 1);
1562 ctf_list_append(&dtd
->dtd_u
.dtu_members
, dmd
);
1565 fp
->ctf_dtstrlen
+= strlen(s
) + 1;
1567 ctf_ref_inc(fp
, type
);
1568 fp
->ctf_flags
|= LCTF_DIRTY
;
1573 * This removes a type from the dynamic section. This will fail if the type is
1574 * referenced by another type. Note that the CTF ID is never reused currently by
1575 * CTF. Note that if this container is a parent container then we just outright
1576 * refuse to remove the type. There currently is no notion of searching for the
1577 * ctf_dtdef_t in parent containers. If there is, then this constraint could
1578 * become finer grained.
1581 ctf_delete_type(ctf_file_t
*fp
, ctf_id_t type
)
1584 ctf_dtdef_t
*dtd
= ctf_dtd_lookup(fp
, type
);
1586 if (!(fp
->ctf_flags
& LCTF_RDWR
))
1587 return (ctf_set_errno(fp
, ECTF_RDONLY
));
1590 * We want to give as useful an errno as possible. That means that we
1591 * want to distinguish between a type which does not exist and one for
1592 * which the type is not dynamic.
1595 if (ctf_lookup_by_id(&fpd
, type
) == NULL
&&
1596 ctf_dtd_lookup(fp
, type
) == NULL
)
1597 return (CTF_ERR
); /* errno is set for us */
1600 return (ctf_set_errno(fp
, ECTF_NOTDYN
));
1602 if (dtd
->dtd_ref
!= 0 || fp
->ctf_refcnt
> 1)
1603 return (ctf_set_errno(fp
, ECTF_REFERENCED
));
1605 ctf_dtd_delete(fp
, dtd
);
1606 fp
->ctf_flags
|= LCTF_DIRTY
;
1611 enumcmp(const char *name
, int value
, void *arg
)
1613 ctf_bundle_t
*ctb
= arg
;
1616 return (ctf_enum_value(ctb
->ctb_file
, ctb
->ctb_type
,
1617 name
, &bvalue
) == CTF_ERR
|| value
!= bvalue
);
1621 enumadd(const char *name
, int value
, void *arg
)
1623 ctf_bundle_t
*ctb
= arg
;
1625 return (ctf_add_enumerator(ctb
->ctb_file
, ctb
->ctb_type
,
1626 name
, value
) == CTF_ERR
);
1631 membcmp(const char *name
, ctf_id_t type
, ulong_t offset
, void *arg
)
1633 ctf_bundle_t
*ctb
= arg
;
1636 return (ctf_member_info(ctb
->ctb_file
, ctb
->ctb_type
,
1637 name
, &ctm
) == CTF_ERR
|| ctm
.ctm_offset
!= offset
);
1641 membadd(const char *name
, ctf_id_t type
, ulong_t offset
, void *arg
)
1643 ctf_bundle_t
*ctb
= arg
;
1647 if ((dmd
= ctf_alloc(sizeof (ctf_dmdef_t
))) == NULL
)
1648 return (ctf_set_errno(ctb
->ctb_file
, EAGAIN
));
1650 if (name
!= NULL
&& (s
= ctf_strdup(name
)) == NULL
) {
1651 ctf_free(dmd
, sizeof (ctf_dmdef_t
));
1652 return (ctf_set_errno(ctb
->ctb_file
, EAGAIN
));
1656 * For now, dmd_type is copied as the src_fp's type; it is reset to an
1657 * equivalent dst_fp type by a final loop in ctf_add_type(), below.
1660 dmd
->dmd_type
= type
;
1661 dmd
->dmd_offset
= offset
;
1662 dmd
->dmd_value
= -1;
1664 ctf_list_append(&ctb
->ctb_dtd
->dtd_u
.dtu_members
, dmd
);
1667 ctb
->ctb_file
->ctf_dtstrlen
+= strlen(s
) + 1;
1669 ctb
->ctb_file
->ctf_flags
|= LCTF_DIRTY
;
1674 * The ctf_add_type routine is used to copy a type from a source CTF container
1675 * to a dynamic destination container. This routine operates recursively by
1676 * following the source type's links and embedded member types. If the
1677 * destination container already contains a named type which has the same
1678 * attributes, then we succeed and return this type but no changes occur.
1681 ctf_add_type(ctf_file_t
*dst_fp
, ctf_file_t
*src_fp
, ctf_id_t src_type
)
1683 ctf_id_t dst_type
= CTF_ERR
;
1684 uint_t dst_kind
= CTF_K_UNKNOWN
;
1686 const ctf_type_t
*tp
;
1688 uint_t kind
, flag
, vlen
;
1690 ctf_bundle_t src
, dst
;
1691 ctf_encoding_t src_en
, dst_en
;
1692 ctf_arinfo_t src_ar
, dst_ar
;
1701 if (dst_fp
== src_fp
)
1704 if (!(dst_fp
->ctf_flags
& LCTF_RDWR
))
1705 return (ctf_set_errno(dst_fp
, ECTF_RDONLY
));
1707 if ((tp
= ctf_lookup_by_id(&src_fp
, src_type
)) == NULL
)
1708 return (ctf_set_errno(dst_fp
, ctf_errno(src_fp
)));
1710 name
= ctf_strptr(src_fp
, tp
->ctt_name
);
1711 kind
= LCTF_INFO_KIND(src_fp
, tp
->ctt_info
);
1712 flag
= LCTF_INFO_ROOT(src_fp
, tp
->ctt_info
);
1713 vlen
= LCTF_INFO_VLEN(src_fp
, tp
->ctt_info
);
1717 hp
= &dst_fp
->ctf_structs
;
1720 hp
= &dst_fp
->ctf_unions
;
1723 hp
= &dst_fp
->ctf_enums
;
1726 hp
= &dst_fp
->ctf_names
;
1731 * If the source type has a name and is a root type (visible at the
1732 * top-level scope), lookup the name in the destination container and
1733 * verify that it is of the same kind before we do anything else.
1735 if ((flag
& CTF_ADD_ROOT
) && name
[0] != '\0' &&
1736 (hep
= ctf_hash_lookup(hp
, dst_fp
, name
, strlen(name
))) != NULL
) {
1737 dst_type
= (ctf_id_t
)hep
->h_type
;
1738 dst_kind
= ctf_type_kind(dst_fp
, dst_type
);
1742 * If an identically named dst_type exists, fail with ECTF_CONFLICT
1743 * unless dst_type is a forward declaration and src_type is a struct,
1744 * union, or enum (i.e. the definition of the previous forward decl).
1746 if (dst_type
!= CTF_ERR
&& dst_kind
!= kind
&& (
1747 dst_kind
!= CTF_K_FORWARD
|| (kind
!= CTF_K_ENUM
&&
1748 kind
!= CTF_K_STRUCT
&& kind
!= CTF_K_UNION
)))
1749 return (ctf_set_errno(dst_fp
, ECTF_CONFLICT
));
1752 * If the non-empty name was not found in the appropriate hash, search
1753 * the list of pending dynamic definitions that are not yet committed.
1754 * If a matching name and kind are found, assume this is the type that
1755 * we are looking for. This is necessary to permit ctf_add_type() to
1756 * operate recursively on entities such as a struct that contains a
1757 * pointer member that refers to the same struct type.
1759 if (dst_type
== CTF_ERR
&& name
[0] != '\0') {
1760 for (dtd
= ctf_list_prev(&dst_fp
->ctf_dtdefs
); dtd
!= NULL
&&
1761 dtd
->dtd_type
> dst_fp
->ctf_dtoldid
;
1762 dtd
= ctf_list_prev(dtd
)) {
1763 if (CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
) == kind
&&
1764 dtd
->dtd_name
!= NULL
&&
1765 strcmp(dtd
->dtd_name
, name
) == 0)
1766 return (dtd
->dtd_type
);
1770 src
.ctb_file
= src_fp
;
1771 src
.ctb_type
= src_type
;
1774 dst
.ctb_file
= dst_fp
;
1775 dst
.ctb_type
= dst_type
;
1779 * Now perform kind-specific processing. If dst_type is CTF_ERR, then
1780 * we add a new type with the same properties as src_type to dst_fp.
1781 * If dst_type is not CTF_ERR, then we verify that dst_type has the
1782 * same attributes as src_type. We recurse for embedded references.
1787 if (ctf_type_encoding(src_fp
, src_type
, &src_en
) != 0)
1788 return (ctf_set_errno(dst_fp
, ctf_errno(src_fp
)));
1790 if (dst_type
!= CTF_ERR
) {
1791 if (ctf_type_encoding(dst_fp
, dst_type
, &dst_en
) != 0)
1792 return (CTF_ERR
); /* errno is set for us */
1794 if (bcmp(&src_en
, &dst_en
, sizeof (ctf_encoding_t
)))
1795 return (ctf_set_errno(dst_fp
, ECTF_CONFLICT
));
1797 } else if (kind
== CTF_K_INTEGER
) {
1798 dst_type
= ctf_add_integer(dst_fp
, flag
, name
, &src_en
);
1800 dst_type
= ctf_add_float(dst_fp
, flag
, name
, &src_en
);
1804 case CTF_K_VOLATILE
:
1806 case CTF_K_RESTRICT
:
1807 src_type
= ctf_type_reference(src_fp
, src_type
);
1808 src_type
= ctf_add_type(dst_fp
, src_fp
, src_type
);
1810 if (src_type
== CTF_ERR
)
1811 return (CTF_ERR
); /* errno is set for us */
1813 dst_type
= ctf_add_reftype(dst_fp
, flag
, NULL
, src_type
, kind
);
1817 if (ctf_array_info(src_fp
, src_type
, &src_ar
) == CTF_ERR
)
1818 return (ctf_set_errno(dst_fp
, ctf_errno(src_fp
)));
1820 src_ar
.ctr_contents
=
1821 ctf_add_type(dst_fp
, src_fp
, src_ar
.ctr_contents
);
1823 ctf_add_type(dst_fp
, src_fp
, src_ar
.ctr_index
);
1824 src_ar
.ctr_nelems
= src_ar
.ctr_nelems
;
1826 if (src_ar
.ctr_contents
== CTF_ERR
||
1827 src_ar
.ctr_index
== CTF_ERR
)
1828 return (CTF_ERR
); /* errno is set for us */
1830 if (dst_type
!= CTF_ERR
) {
1831 if (ctf_array_info(dst_fp
, dst_type
, &dst_ar
) != 0)
1832 return (CTF_ERR
); /* errno is set for us */
1834 if (bcmp(&src_ar
, &dst_ar
, sizeof (ctf_arinfo_t
)))
1835 return (ctf_set_errno(dst_fp
, ECTF_CONFLICT
));
1837 dst_type
= ctf_add_array(dst_fp
, flag
, &src_ar
);
1840 case CTF_K_FUNCTION
:
1841 ctc
.ctc_return
= ctf_add_type(dst_fp
, src_fp
, tp
->ctt_type
);
1845 if (ctc
.ctc_return
== CTF_ERR
)
1846 return (CTF_ERR
); /* errno is set for us */
1848 dst_type
= ctf_add_funcptr(dst_fp
, flag
, &ctc
, NULL
);
1857 * Technically to match a struct or union we need to check both
1858 * ways (src members vs. dst, dst members vs. src) but we make
1859 * this more optimal by only checking src vs. dst and comparing
1860 * the total size of the structure (which we must do anyway)
1861 * which covers the possibility of dst members not in src.
1862 * This optimization can be defeated for unions, but is so
1863 * pathological as to render it irrelevant for our purposes.
1865 if (dst_type
!= CTF_ERR
&& dst_kind
!= CTF_K_FORWARD
) {
1866 if (ctf_type_size(src_fp
, src_type
) !=
1867 ctf_type_size(dst_fp
, dst_type
))
1868 return (ctf_set_errno(dst_fp
, ECTF_CONFLICT
));
1870 if (ctf_member_iter(src_fp
, src_type
, membcmp
, &dst
))
1871 return (ctf_set_errno(dst_fp
, ECTF_CONFLICT
));
1877 * Unlike the other cases, copying structs and unions is done
1878 * manually so as to avoid repeated lookups in ctf_add_member
1879 * and to ensure the exact same member offsets as in src_type.
1881 dst_type
= ctf_add_generic(dst_fp
, flag
, name
, &dtd
);
1882 if (dst_type
== CTF_ERR
)
1883 return (CTF_ERR
); /* errno is set for us */
1885 dst
.ctb_type
= dst_type
;
1888 if (ctf_member_iter(src_fp
, src_type
, membadd
, &dst
) != 0)
1889 errs
++; /* increment errs and fail at bottom of case */
1891 if ((size
= ctf_type_size(src_fp
, src_type
)) > CTF_MAX_SIZE
) {
1892 dtd
->dtd_data
.ctt_size
= CTF_LSIZE_SENT
;
1893 dtd
->dtd_data
.ctt_lsizehi
= CTF_SIZE_TO_LSIZE_HI(size
);
1894 dtd
->dtd_data
.ctt_lsizelo
= CTF_SIZE_TO_LSIZE_LO(size
);
1896 dtd
->dtd_data
.ctt_size
= (ushort_t
)size
;
1898 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(kind
, flag
, vlen
);
1901 * Make a final pass through the members changing each dmd_type
1902 * (a src_fp type) to an equivalent type in dst_fp. We pass
1903 * through all members, leaving any that fail set to CTF_ERR.
1905 for (dmd
= ctf_list_next(&dtd
->dtd_u
.dtu_members
);
1906 dmd
!= NULL
; dmd
= ctf_list_next(dmd
)) {
1907 if ((dmd
->dmd_type
= ctf_add_type(dst_fp
, src_fp
,
1908 dmd
->dmd_type
)) == CTF_ERR
)
1913 return (CTF_ERR
); /* errno is set for us */
1916 * Now that we know that we can't fail, we go through and bump
1917 * all the reference counts on the member types.
1919 for (dmd
= ctf_list_next(&dtd
->dtd_u
.dtu_members
);
1920 dmd
!= NULL
; dmd
= ctf_list_next(dmd
))
1921 ctf_ref_inc(dst_fp
, dmd
->dmd_type
);
1926 if (dst_type
!= CTF_ERR
&& dst_kind
!= CTF_K_FORWARD
) {
1927 if (ctf_enum_iter(src_fp
, src_type
, enumcmp
, &dst
) ||
1928 ctf_enum_iter(dst_fp
, dst_type
, enumcmp
, &src
))
1929 return (ctf_set_errno(dst_fp
, ECTF_CONFLICT
));
1931 dst_type
= ctf_add_enum(dst_fp
, flag
, name
);
1932 if ((dst
.ctb_type
= dst_type
) == CTF_ERR
||
1933 ctf_enum_iter(src_fp
, src_type
, enumadd
, &dst
))
1934 return (CTF_ERR
); /* errno is set for us */
1939 if (dst_type
== CTF_ERR
) {
1940 dst_type
= ctf_add_forward(dst_fp
,
1941 flag
, name
, CTF_K_STRUCT
); /* assume STRUCT */
1946 src_type
= ctf_type_reference(src_fp
, src_type
);
1947 src_type
= ctf_add_type(dst_fp
, src_fp
, src_type
);
1949 if (src_type
== CTF_ERR
)
1950 return (CTF_ERR
); /* errno is set for us */
1953 * If dst_type is not CTF_ERR at this point, we should check if
1954 * ctf_type_reference(dst_fp, dst_type) != src_type and if so
1955 * fail with ECTF_CONFLICT. However, this causes problems with
1956 * <sys/types.h> typedefs that vary based on things like if
1957 * _ILP32x then pid_t is int otherwise long. We therefore omit
1958 * this check and assume that if the identically named typedef
1959 * already exists in dst_fp, it is correct or equivalent.
1961 if (dst_type
== CTF_ERR
) {
1962 dst_type
= ctf_add_typedef(dst_fp
, flag
,
1968 return (ctf_set_errno(dst_fp
, ECTF_CORRUPT
));
1975 ctf_add_function(ctf_file_t
*fp
, ulong_t idx
, const ctf_funcinfo_t
*fip
,
1976 const ctf_id_t
*argc
)
1981 uintptr_t symbase
= (uintptr_t)fp
->ctf_symtab
.cts_data
;
1983 if (!(fp
->ctf_flags
& LCTF_RDWR
))
1984 return (ctf_set_errno(fp
, ECTF_RDONLY
));
1986 if (ctf_dsd_lookup(fp
, idx
) != NULL
)
1987 return (ctf_set_errno(fp
, ECTF_CONFLICT
));
1990 return (ctf_set_errno(fp
, ECTF_STRTAB
));
1992 if (idx
> fp
->ctf_nsyms
)
1993 return (ctf_set_errno(fp
, ECTF_NOTDATA
));
1995 if (fp
->ctf_symtab
.cts_entsize
== sizeof (Elf32_Sym
)) {
1996 const Elf32_Sym
*symp
= (Elf32_Sym
*)symbase
+ idx
;
1997 if (ELF32_ST_TYPE(symp
->st_info
) != STT_FUNC
)
1998 return (ctf_set_errno(fp
, ECTF_NOTFUNC
));
2000 const Elf64_Sym
*symp
= (Elf64_Sym
*)symbase
+ idx
;
2001 if (ELF64_ST_TYPE(symp
->st_info
) != STT_FUNC
)
2002 return (ctf_set_errno(fp
, ECTF_NOTFUNC
));
2006 if (ctf_lookup_by_id(&afp
, fip
->ctc_return
) == NULL
)
2007 return (CTF_ERR
); /* errno is set for us */
2009 for (i
= 0; i
< fip
->ctc_argc
; i
++) {
2011 if (ctf_lookup_by_id(&afp
, argc
[i
]) == NULL
)
2012 return (CTF_ERR
); /* errno is set for us */
2015 dsd
= ctf_alloc(sizeof (ctf_dsdef_t
));
2017 return (ctf_set_errno(fp
, ENOMEM
));
2018 dsd
->dts_nargs
= fip
->ctc_argc
;
2019 if (fip
->ctc_flags
& CTF_FUNC_VARARG
)
2021 if (dsd
->dts_nargs
!= 0) {
2022 dsd
->dts_argc
= ctf_alloc(sizeof (ctf_id_t
) * dsd
->dts_nargs
);
2023 if (dsd
->dts_argc
== NULL
) {
2024 ctf_free(dsd
, sizeof (ctf_dsdef_t
));
2025 return (ctf_set_errno(fp
, ENOMEM
));
2027 bcopy(argc
, dsd
->dts_argc
, sizeof (ctf_id_t
) * fip
->ctc_argc
);
2028 if (fip
->ctc_flags
& CTF_FUNC_VARARG
)
2029 dsd
->dts_argc
[fip
->ctc_argc
] = 0;
2031 dsd
->dts_symidx
= idx
;
2032 dsd
->dts_tid
= fip
->ctc_return
;
2034 ctf_dsd_insert(fp
, dsd
);
2035 fp
->ctf_flags
|= LCTF_DIRTY
;
2041 ctf_add_object(ctf_file_t
*fp
, ulong_t idx
, ctf_id_t type
)
2045 uintptr_t symbase
= (uintptr_t)fp
->ctf_symtab
.cts_data
;
2047 if (!(fp
->ctf_flags
& LCTF_RDWR
))
2048 return (ctf_set_errno(fp
, ECTF_RDONLY
));
2050 if (!(fp
->ctf_flags
& LCTF_RDWR
))
2051 return (ctf_set_errno(fp
, ECTF_RDONLY
));
2053 if (ctf_dsd_lookup(fp
, idx
) != NULL
)
2054 return (ctf_set_errno(fp
, ECTF_CONFLICT
));
2057 return (ctf_set_errno(fp
, ECTF_STRTAB
));
2059 if (idx
> fp
->ctf_nsyms
)
2060 return (ctf_set_errno(fp
, ECTF_NOTDATA
));
2062 if (fp
->ctf_symtab
.cts_entsize
== sizeof (Elf32_Sym
)) {
2063 const Elf32_Sym
*symp
= (Elf32_Sym
*)symbase
+ idx
;
2064 if (ELF32_ST_TYPE(symp
->st_info
) != STT_OBJECT
)
2065 return (ctf_set_errno(fp
, ECTF_NOTDATA
));
2067 const Elf64_Sym
*symp
= (Elf64_Sym
*)symbase
+ idx
;
2068 if (ELF64_ST_TYPE(symp
->st_info
) != STT_OBJECT
)
2069 return (ctf_set_errno(fp
, ECTF_NOTDATA
));
2073 if (ctf_lookup_by_id(&afp
, type
) == NULL
)
2074 return (CTF_ERR
); /* errno is set for us */
2076 dsd
= ctf_alloc(sizeof (ctf_dsdef_t
));
2078 return (ctf_set_errno(fp
, ENOMEM
));
2079 dsd
->dts_symidx
= idx
;
2080 dsd
->dts_tid
= type
;
2081 dsd
->dts_argc
= NULL
;
2083 ctf_dsd_insert(fp
, dsd
);
2084 fp
->ctf_flags
|= LCTF_DIRTY
;
2090 ctf_dataptr(ctf_file_t
*fp
, const void **addrp
, size_t *sizep
)
2093 *addrp
= fp
->ctf_base
;
2095 *sizep
= fp
->ctf_size
;
2099 ctf_add_label(ctf_file_t
*fp
, const char *name
, ctf_id_t type
, uint_t position
)
2105 return (ctf_set_errno(fp
, EINVAL
));
2107 if (!(fp
->ctf_flags
& LCTF_RDWR
))
2108 return (ctf_set_errno(fp
, ECTF_RDONLY
));
2111 if (type
!= 0 && ctf_lookup_by_id(&fpd
, type
) == NULL
)
2112 return (CTF_ERR
); /* errno is set for us */
2114 if (type
!= 0 && (fp
->ctf_flags
& LCTF_CHILD
) &&
2115 CTF_TYPE_ISPARENT(type
))
2116 return (ctf_set_errno(fp
, ECTF_NOPARENT
));
2118 if (ctf_dld_lookup(fp
, name
) != NULL
)
2119 return (ctf_set_errno(fp
, ECTF_LABELEXISTS
));
2121 if ((dld
= ctf_alloc(sizeof (ctf_dldef_t
))) == NULL
)
2122 return (ctf_set_errno(fp
, EAGAIN
));
2124 if ((dld
->dld_name
= ctf_strdup(name
)) == NULL
) {
2125 ctf_free(dld
, sizeof (ctf_dldef_t
));
2126 return (ctf_set_errno(fp
, EAGAIN
));
2129 dld
->dld_type
= type
;
2130 fp
->ctf_dtstrlen
+= strlen(name
) + 1;
2131 ctf_dld_insert(fp
, dld
, position
);
2132 fp
->ctf_flags
|= LCTF_DIRTY
;
2138 * Update the size of a structure or union. Note that we don't allow this to
2139 * shrink the size of a struct or union, only to increase it. This is useful for
2140 * cases when you have a structure whose actual size is larger than the sum of
2141 * its members due to padding for natuaral alignment.
2144 ctf_set_size(ctf_file_t
*fp
, ctf_id_t id
, const ulong_t newsz
)
2146 ctf_dtdef_t
*dtd
= ctf_dtd_lookup(fp
, id
);
2150 if (!(fp
->ctf_flags
& LCTF_RDWR
))
2151 return (ctf_set_errno(fp
, ECTF_RDONLY
));
2154 return (ctf_set_errno(fp
, ECTF_BADID
));
2156 kind
= CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
);
2158 if (kind
!= CTF_K_STRUCT
&& kind
!= CTF_K_UNION
)
2159 return (ctf_set_errno(fp
, ECTF_NOTSOU
));
2161 if ((oldsz
= dtd
->dtd_data
.ctt_size
) == CTF_LSIZE_SENT
)
2162 oldsz
= CTF_TYPE_LSIZE(&dtd
->dtd_data
);
2165 return (ctf_set_errno(fp
, EINVAL
));
2167 if (newsz
> CTF_MAX_SIZE
) {
2168 dtd
->dtd_data
.ctt_size
= CTF_LSIZE_SENT
;
2169 dtd
->dtd_data
.ctt_lsizehi
= CTF_SIZE_TO_LSIZE_HI(newsz
);
2170 dtd
->dtd_data
.ctt_lsizelo
= CTF_SIZE_TO_LSIZE_LO(newsz
);
2172 dtd
->dtd_data
.ctt_size
= (ushort_t
)newsz
;
2175 fp
->ctf_flags
|= LCTF_DIRTY
;
2180 ctf_set_root(ctf_file_t
*fp
, ctf_id_t id
, const boolean_t vis
)
2182 ctf_dtdef_t
*dtd
= ctf_dtd_lookup(fp
, id
);
2185 if (!(fp
->ctf_flags
& LCTF_RDWR
))
2186 return (ctf_set_errno(fp
, ECTF_RDONLY
));
2189 return (ctf_set_errno(fp
, ECTF_BADID
));
2191 kind
= CTF_INFO_KIND(dtd
->dtd_data
.ctt_info
);
2192 vlen
= CTF_INFO_VLEN(dtd
->dtd_data
.ctt_info
);
2194 dtd
->dtd_data
.ctt_info
= CTF_TYPE_INFO(kind
, vis
, vlen
);