2008-03-04 19:37:02 +01:00
|
|
|
#ifndef _CTF_H
|
|
|
|
#define _CTF_H
|
2019-01-15 18:28:24 +01:00
|
|
|
/*
|
|
|
|
SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
|
|
|
|
Copyright (C) 2019 Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
|
|
*/
|
2008-03-04 19:37:02 +01:00
|
|
|
|
2008-09-25 21:01:26 +02:00
|
|
|
#include <stdint.h>
|
2008-03-04 19:37:02 +01:00
|
|
|
|
|
|
|
struct ctf_header {
|
2008-09-25 21:01:26 +02:00
|
|
|
uint16_t ctf_magic; /* Header magic value */
|
2008-03-04 19:37:02 +01:00
|
|
|
#define CTF_MAGIC 0xcff1
|
|
|
|
#define CTF_MAGIC_SWAP 0xf1cf
|
|
|
|
|
2008-09-25 21:01:26 +02:00
|
|
|
uint8_t ctf_version; /* Header version */
|
2008-03-04 19:37:02 +01:00
|
|
|
#define CTF_VERSION 2
|
|
|
|
|
2008-09-25 21:01:26 +02:00
|
|
|
uint8_t ctf_flags; /* Header flags */
|
2008-03-04 19:37:02 +01:00
|
|
|
#define CTF_FLAGS_COMPR 0x01
|
|
|
|
|
2008-09-25 21:01:26 +02:00
|
|
|
uint32_t ctf_parent_label; /* Label of parent CTF object */
|
|
|
|
uint32_t ctf_parent_name; /* Name of parent CTF object */
|
2008-03-04 19:37:02 +01:00
|
|
|
|
|
|
|
/* All offsets are in bytes are relative to the end of
|
|
|
|
* this header.
|
|
|
|
*/
|
2008-09-25 21:01:26 +02:00
|
|
|
uint32_t ctf_label_off; /* Offset of label section */
|
|
|
|
uint32_t ctf_object_off; /* Offset of data object section */
|
|
|
|
uint32_t ctf_func_off; /* Offset of function section */
|
|
|
|
uint32_t ctf_type_off; /* Offset of type section */
|
|
|
|
uint32_t ctf_str_off; /* Offset of string section */
|
|
|
|
uint32_t ctf_str_len; /* Length of string section */
|
2008-03-04 19:37:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#define CTF_REF_OFFSET(REF) ((REF) & 0x7fffffff)
|
|
|
|
#define CTF_REF_TBL_ID(REF) (((REF) >> 31) & 0x1)
|
|
|
|
#define CTF_STR_TBL_ID_0 0
|
|
|
|
#define CTF_STR_TBL_ID_1 1
|
|
|
|
|
|
|
|
#define CTF_REF_ENCODE(TBL, OFF) (((TBL) << 31) | (OFF))
|
|
|
|
|
|
|
|
struct ctf_label_ent {
|
2008-09-25 21:01:26 +02:00
|
|
|
uint32_t ctf_label_ref;
|
|
|
|
uint32_t ctf_type_index;
|
2008-03-04 19:37:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Types are encoded with ctf_short_type so long as the ctf_size
|
2008-09-25 21:01:26 +02:00
|
|
|
* field can be fully represented in a uint16_t. If not, then
|
2008-03-04 19:37:02 +01:00
|
|
|
* the ctf_size is given the value 0xffff and ctf_full_type is
|
|
|
|
* used.
|
|
|
|
*/
|
|
|
|
struct ctf_short_type {
|
2008-09-25 21:01:26 +02:00
|
|
|
uint32_t ctf_name;
|
|
|
|
uint16_t ctf_info;
|
2008-03-04 19:37:02 +01:00
|
|
|
union {
|
2008-09-25 21:01:26 +02:00
|
|
|
uint16_t ctf_size;
|
|
|
|
uint16_t ctf_type;
|
|
|
|
};
|
2008-03-04 19:37:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ctf_full_type {
|
|
|
|
struct ctf_short_type base;
|
2008-09-25 21:01:26 +02:00
|
|
|
uint32_t ctf_size_high;
|
|
|
|
uint32_t ctf_size_low;
|
2008-03-04 19:37:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#define CTF_GET_KIND(VAL) (((VAL) >> 11) & 0x1f)
|
|
|
|
#define CTF_GET_VLEN(VAL) ((VAL) & 0x3ff)
|
|
|
|
#define CTF_ISROOT(VAL) (((VAL) & 0x400) != 0)
|
|
|
|
|
|
|
|
#define CTF_INFO_ENCODE(KIND, VLEN, ISROOT) \
|
|
|
|
(((ISROOT) ? 0x400 : 0) | ((KIND) << 11) | (VLEN))
|
|
|
|
|
|
|
|
#define CTF_TYPE_KIND_UNKN 0 /* Unknown */
|
|
|
|
#define CTF_TYPE_KIND_INT 1 /* Integer */
|
|
|
|
#define CTF_TYPE_KIND_FLT 2 /* Float */
|
|
|
|
#define CTF_TYPE_KIND_PTR 3 /* Pointer */
|
|
|
|
#define CTF_TYPE_KIND_ARR 4 /* Array */
|
|
|
|
#define CTF_TYPE_KIND_FUNC 5 /* Function */
|
|
|
|
#define CTF_TYPE_KIND_STR 6 /* Struct */
|
|
|
|
#define CTF_TYPE_KIND_UNION 7 /* Union */
|
|
|
|
#define CTF_TYPE_KIND_ENUM 8 /* Enumeration */
|
|
|
|
#define CTF_TYPE_KIND_FWD 9 /* Forward */
|
|
|
|
#define CTF_TYPE_KIND_TYPDEF 10 /* Typedef */
|
|
|
|
#define CTF_TYPE_KIND_VOLATILE 11 /* Volatile */
|
|
|
|
#define CTF_TYPE_KIND_CONST 12 /* Const */
|
|
|
|
#define CTF_TYPE_KIND_RESTRICT 13 /* Restrict */
|
|
|
|
#define CTF_TYPE_KIND_MAX 31
|
|
|
|
|
|
|
|
#define CTF_TYPE_INT_ATTRS(VAL) ((VAL) >> 24)
|
|
|
|
#define CTF_TYPE_INT_OFFSET(VAL) (((VAL) >> 16) & 0xff)
|
|
|
|
#define CTF_TYPE_INT_BITS(VAL) ((VAL) & 0xffff)
|
|
|
|
|
|
|
|
#define CTF_TYPE_INT_ENCODE(ATTRS, OFF, BITS) \
|
|
|
|
(((ATTRS) << 24) | ((OFF) << 16) | (BITS))
|
|
|
|
|
|
|
|
/* Integer type attributes */
|
|
|
|
#define CTF_TYPE_INT_SIGNED 0x1
|
|
|
|
#define CTF_TYPE_INT_CHAR 0x2
|
|
|
|
#define CTF_TYPE_INT_BOOL 0x4
|
|
|
|
#define CTF_TYPE_INT_VARARGS 0x8
|
|
|
|
|
|
|
|
#define CTF_TYPE_FP_ATTRS(VAL) ((VAL) >> 24)
|
|
|
|
#define CTF_TYPE_FP_OFFSET(VAL) (((VAL) >> 16) & 0xff)
|
|
|
|
#define CTF_TYPE_FP_BITS(VAL) ((VAL) & 0xffff)
|
|
|
|
|
|
|
|
#define CTF_TYPE_FP_ENCODE(ATTRS, OFF, BITS) \
|
|
|
|
(((ATTRS) << 24) | ((OFF) << 16) | (BITS))
|
|
|
|
|
|
|
|
/* Possible values for the float type attribute field */
|
|
|
|
#define CTF_TYPE_FP_SINGLE 1
|
|
|
|
#define CTF_TYPE_FP_DOUBLE 2
|
|
|
|
#define CTF_TYPE_FP_CMPLX 3
|
|
|
|
#define CTF_TYPE_FP_CMPLX_DBL 4
|
|
|
|
#define CTF_TYPE_FP_CMPLX_LDBL 5
|
|
|
|
#define CTF_TYPE_FP_LDBL 6
|
|
|
|
#define CTF_TYPE_FP_INTVL 7
|
|
|
|
#define CTF_TYPE_FP_INTVL_DBL 8
|
|
|
|
#define CTF_TYPE_FP_INTVL_LDBL 9
|
|
|
|
#define CTF_TYPE_FP_IMGRY 10
|
|
|
|
#define CTF_TYPE_FP_IMGRY_DBL 11
|
|
|
|
#define CTF_TYPE_FP_IMGRY_LDBL 12
|
|
|
|
#define CTF_TYPE_FP_MAX 12
|
|
|
|
|
|
|
|
struct ctf_enum {
|
2008-09-25 21:01:26 +02:00
|
|
|
uint32_t ctf_enum_name;
|
|
|
|
uint32_t ctf_enum_val;
|
2008-03-04 19:37:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ctf_array {
|
2008-09-25 21:01:26 +02:00
|
|
|
uint16_t ctf_array_type;
|
|
|
|
uint16_t ctf_array_index_type;
|
|
|
|
uint32_t ctf_array_nelems;
|
2008-03-04 19:37:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Struct members are encoded with either ctf_short_member or
|
|
|
|
* ctf_full_member, depending upon the 'size' of the struct or
|
|
|
|
* union being defined. If it is less than CTF_SHORT_MEMBER_LIMIT
|
|
|
|
* then ctf_short_member objects are used to encode, else
|
|
|
|
* ctf_full_member is used.
|
|
|
|
*/
|
|
|
|
#define CTF_SHORT_MEMBER_LIMIT 8192
|
|
|
|
|
|
|
|
struct ctf_short_member {
|
2008-09-25 21:01:26 +02:00
|
|
|
uint32_t ctf_member_name;
|
|
|
|
uint16_t ctf_member_type;
|
|
|
|
uint16_t ctf_member_offset;
|
2008-03-04 19:37:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ctf_full_member {
|
2008-09-25 21:01:26 +02:00
|
|
|
uint32_t ctf_member_name;
|
|
|
|
uint16_t ctf_member_type;
|
|
|
|
uint16_t ctf_member_unused;
|
|
|
|
uint32_t ctf_member_offset_high;
|
|
|
|
uint32_t ctf_member_offset_low;
|
2008-03-04 19:37:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* _CTF_H */
|