xref: /aosp_15_r20/external/bcc/src/cc/bcc_btf.h (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /*
2*387f9dfdSAndroid Build Coastguard Worker  * Copyright (c) 2019 Facebook, Inc.
3*387f9dfdSAndroid Build Coastguard Worker  *
4*387f9dfdSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*387f9dfdSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*387f9dfdSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*387f9dfdSAndroid Build Coastguard Worker  *
8*387f9dfdSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
9*387f9dfdSAndroid Build Coastguard Worker  *
10*387f9dfdSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*387f9dfdSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*387f9dfdSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*387f9dfdSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*387f9dfdSAndroid Build Coastguard Worker  * limitations under the License.
15*387f9dfdSAndroid Build Coastguard Worker  */
16*387f9dfdSAndroid Build Coastguard Worker 
17*387f9dfdSAndroid Build Coastguard Worker #ifndef BCC_BTF_H
18*387f9dfdSAndroid Build Coastguard Worker #define BCC_BTF_H
19*387f9dfdSAndroid Build Coastguard Worker 
20*387f9dfdSAndroid Build Coastguard Worker #include <stdbool.h>
21*387f9dfdSAndroid Build Coastguard Worker #include <stdint.h>
22*387f9dfdSAndroid Build Coastguard Worker #include <string>
23*387f9dfdSAndroid Build Coastguard Worker #include <map>
24*387f9dfdSAndroid Build Coastguard Worker #include <vector>
25*387f9dfdSAndroid Build Coastguard Worker 
26*387f9dfdSAndroid Build Coastguard Worker #include "bpf_module.h"
27*387f9dfdSAndroid Build Coastguard Worker 
28*387f9dfdSAndroid Build Coastguard Worker struct btf;
29*387f9dfdSAndroid Build Coastguard Worker struct btf_type;
30*387f9dfdSAndroid Build Coastguard Worker 
31*387f9dfdSAndroid Build Coastguard Worker namespace btf_ext_vendored {
32*387f9dfdSAndroid Build Coastguard Worker 
33*387f9dfdSAndroid Build Coastguard Worker /*
34*387f9dfdSAndroid Build Coastguard Worker  * The .BTF.ext ELF section layout defined as
35*387f9dfdSAndroid Build Coastguard Worker  *   struct btf_ext_header
36*387f9dfdSAndroid Build Coastguard Worker  *   func_info subsection
37*387f9dfdSAndroid Build Coastguard Worker  *
38*387f9dfdSAndroid Build Coastguard Worker  * The func_info subsection layout:
39*387f9dfdSAndroid Build Coastguard Worker  *   record size for struct bpf_func_info in the func_info subsection
40*387f9dfdSAndroid Build Coastguard Worker  *   struct btf_sec_func_info for section #1
41*387f9dfdSAndroid Build Coastguard Worker  *   a list of bpf_func_info records for section #1
42*387f9dfdSAndroid Build Coastguard Worker  *     where struct bpf_func_info mimics one in include/uapi/linux/bpf.h
43*387f9dfdSAndroid Build Coastguard Worker  *     but may not be identical
44*387f9dfdSAndroid Build Coastguard Worker  *   struct btf_sec_func_info for section #2
45*387f9dfdSAndroid Build Coastguard Worker  *   a list of bpf_func_info records for section #2
46*387f9dfdSAndroid Build Coastguard Worker  *   ......
47*387f9dfdSAndroid Build Coastguard Worker  *
48*387f9dfdSAndroid Build Coastguard Worker  * Note that the bpf_func_info record size in .BTF.ext may not
49*387f9dfdSAndroid Build Coastguard Worker  * be the same as the one defined in include/uapi/linux/bpf.h.
50*387f9dfdSAndroid Build Coastguard Worker  * The loader should ensure that record_size meets minimum
51*387f9dfdSAndroid Build Coastguard Worker  * requirement and pass the record as is to the kernel. The
52*387f9dfdSAndroid Build Coastguard Worker  * kernel will handle the func_info properly based on its contents.
53*387f9dfdSAndroid Build Coastguard Worker  */
54*387f9dfdSAndroid Build Coastguard Worker struct btf_ext_header {
55*387f9dfdSAndroid Build Coastguard Worker         uint16_t magic;
56*387f9dfdSAndroid Build Coastguard Worker         uint8_t version;
57*387f9dfdSAndroid Build Coastguard Worker         uint8_t flags;
58*387f9dfdSAndroid Build Coastguard Worker         uint32_t hdr_len;
59*387f9dfdSAndroid Build Coastguard Worker 
60*387f9dfdSAndroid Build Coastguard Worker         /* All offsets are in bytes relative to the end of this header */
61*387f9dfdSAndroid Build Coastguard Worker         uint32_t func_info_off;
62*387f9dfdSAndroid Build Coastguard Worker         uint32_t func_info_len;
63*387f9dfdSAndroid Build Coastguard Worker         uint32_t line_info_off;
64*387f9dfdSAndroid Build Coastguard Worker         uint32_t line_info_len;
65*387f9dfdSAndroid Build Coastguard Worker 
66*387f9dfdSAndroid Build Coastguard Worker         /* optional part of .BTF.ext header */
67*387f9dfdSAndroid Build Coastguard Worker         uint32_t core_relo_off;
68*387f9dfdSAndroid Build Coastguard Worker         uint32_t core_relo_len;
69*387f9dfdSAndroid Build Coastguard Worker };
70*387f9dfdSAndroid Build Coastguard Worker 
71*387f9dfdSAndroid Build Coastguard Worker struct btf_ext_info {
72*387f9dfdSAndroid Build Coastguard Worker         /*
73*387f9dfdSAndroid Build Coastguard Worker          * info points to the individual info section (e.g. func_info and
74*387f9dfdSAndroid Build Coastguard Worker          * line_info) from the .BTF.ext. It does not include the __u32 rec_size.
75*387f9dfdSAndroid Build Coastguard Worker          */
76*387f9dfdSAndroid Build Coastguard Worker         void *info;
77*387f9dfdSAndroid Build Coastguard Worker         uint32_t rec_size;
78*387f9dfdSAndroid Build Coastguard Worker         uint32_t len;
79*387f9dfdSAndroid Build Coastguard Worker };
80*387f9dfdSAndroid Build Coastguard Worker 
81*387f9dfdSAndroid Build Coastguard Worker struct btf_ext {
82*387f9dfdSAndroid Build Coastguard Worker         union {
83*387f9dfdSAndroid Build Coastguard Worker                 struct btf_ext_header *hdr;
84*387f9dfdSAndroid Build Coastguard Worker                 void *data;
85*387f9dfdSAndroid Build Coastguard Worker         };
86*387f9dfdSAndroid Build Coastguard Worker         struct btf_ext_info func_info;
87*387f9dfdSAndroid Build Coastguard Worker         struct btf_ext_info line_info;
88*387f9dfdSAndroid Build Coastguard Worker         struct btf_ext_info core_relo_info;
89*387f9dfdSAndroid Build Coastguard Worker         uint32_t data_size;
90*387f9dfdSAndroid Build Coastguard Worker };
91*387f9dfdSAndroid Build Coastguard Worker 
92*387f9dfdSAndroid Build Coastguard Worker struct btf_ext_info_sec {
93*387f9dfdSAndroid Build Coastguard Worker         uint32_t   sec_name_off;
94*387f9dfdSAndroid Build Coastguard Worker         uint32_t   num_info;
95*387f9dfdSAndroid Build Coastguard Worker         /* Followed by num_info * record_size number of bytes */
96*387f9dfdSAndroid Build Coastguard Worker         uint8_t    data[];
97*387f9dfdSAndroid Build Coastguard Worker };
98*387f9dfdSAndroid Build Coastguard Worker 
99*387f9dfdSAndroid Build Coastguard Worker struct btf_ext *btf_ext__new(const uint8_t *data, uint32_t size);
100*387f9dfdSAndroid Build Coastguard Worker void btf_ext__free(struct btf_ext *btf_ext);
101*387f9dfdSAndroid Build Coastguard Worker int btf_ext__reloc_func_info(const struct btf *btf,
102*387f9dfdSAndroid Build Coastguard Worker                              const struct btf_ext *btf_ext,
103*387f9dfdSAndroid Build Coastguard Worker                              const char *sec_name, uint32_t insns_cnt,
104*387f9dfdSAndroid Build Coastguard Worker                              void **func_info, uint32_t *cnt);
105*387f9dfdSAndroid Build Coastguard Worker int btf_ext__reloc_line_info(const struct btf *btf,
106*387f9dfdSAndroid Build Coastguard Worker                              const struct btf_ext *btf_ext,
107*387f9dfdSAndroid Build Coastguard Worker                              const char *sec_name, uint32_t insns_cnt,
108*387f9dfdSAndroid Build Coastguard Worker                              void **line_info, uint32_t *cnt);
109*387f9dfdSAndroid Build Coastguard Worker 
110*387f9dfdSAndroid Build Coastguard Worker } // namespace btf_ext_vendored
111*387f9dfdSAndroid Build Coastguard Worker 
112*387f9dfdSAndroid Build Coastguard Worker namespace ebpf {
113*387f9dfdSAndroid Build Coastguard Worker 
114*387f9dfdSAndroid Build Coastguard Worker class BTFStringTable {
115*387f9dfdSAndroid Build Coastguard Worker  private:
116*387f9dfdSAndroid Build Coastguard Worker   uint32_t Size;
117*387f9dfdSAndroid Build Coastguard Worker   uint32_t OrigTblLen;
118*387f9dfdSAndroid Build Coastguard Worker   std::map<uint32_t, uint32_t> OffsetToIdMap;
119*387f9dfdSAndroid Build Coastguard Worker   std::vector<std::string> Table;
120*387f9dfdSAndroid Build Coastguard Worker 
121*387f9dfdSAndroid Build Coastguard Worker  public:
BTFStringTable(uint32_t TblLen)122*387f9dfdSAndroid Build Coastguard Worker   BTFStringTable(uint32_t TblLen): Size(0), OrigTblLen(TblLen) {}
getSize()123*387f9dfdSAndroid Build Coastguard Worker   uint32_t getSize() { return Size; }
getTable()124*387f9dfdSAndroid Build Coastguard Worker   std::vector<std::string> &getTable() { return Table; }
125*387f9dfdSAndroid Build Coastguard Worker   int32_t addString(std::string Str);
126*387f9dfdSAndroid Build Coastguard Worker };
127*387f9dfdSAndroid Build Coastguard Worker 
128*387f9dfdSAndroid Build Coastguard Worker class BTF {
129*387f9dfdSAndroid Build Coastguard Worker  public:
130*387f9dfdSAndroid Build Coastguard Worker   BTF(bool debug, sec_map_def &sections);
131*387f9dfdSAndroid Build Coastguard Worker   ~BTF();
132*387f9dfdSAndroid Build Coastguard Worker   int load(uint8_t *btf_sec, uintptr_t btf_sec_size,
133*387f9dfdSAndroid Build Coastguard Worker            uint8_t *btf_ext_sec, uintptr_t btf_ext_sec_size,
134*387f9dfdSAndroid Build Coastguard Worker            std::map<std::string, std::string> &remapped_sources);
135*387f9dfdSAndroid Build Coastguard Worker   int get_fd();
136*387f9dfdSAndroid Build Coastguard Worker   int get_btf_info(const char *fname,
137*387f9dfdSAndroid Build Coastguard Worker                    void **func_info, unsigned *func_info_cnt,
138*387f9dfdSAndroid Build Coastguard Worker                    unsigned *finfo_rec_size,
139*387f9dfdSAndroid Build Coastguard Worker                    void **line_info, unsigned *line_info_cnt,
140*387f9dfdSAndroid Build Coastguard Worker                    unsigned *linfo_rec_size);
141*387f9dfdSAndroid Build Coastguard Worker   int get_map_tids(std::string map_name,
142*387f9dfdSAndroid Build Coastguard Worker                    unsigned expected_ksize, unsigned expected_vsize,
143*387f9dfdSAndroid Build Coastguard Worker                    unsigned *key_tid, unsigned *value_tid);
144*387f9dfdSAndroid Build Coastguard Worker 
145*387f9dfdSAndroid Build Coastguard Worker  private:
146*387f9dfdSAndroid Build Coastguard Worker   void fixup_btf(uint8_t *type_sec, uintptr_t type_sec_size, char *strings);
147*387f9dfdSAndroid Build Coastguard Worker   void adjust(uint8_t *btf_sec, uintptr_t btf_sec_size,
148*387f9dfdSAndroid Build Coastguard Worker               uint8_t *btf_ext_sec, uintptr_t btf_ext_sec_size,
149*387f9dfdSAndroid Build Coastguard Worker               std::map<std::string, std::string> &remapped_sources,
150*387f9dfdSAndroid Build Coastguard Worker               uint8_t **new_btf_sec, uintptr_t *new_btf_sec_size);
151*387f9dfdSAndroid Build Coastguard Worker   void warning(const char *format, ...);
152*387f9dfdSAndroid Build Coastguard Worker 
153*387f9dfdSAndroid Build Coastguard Worker  private:
154*387f9dfdSAndroid Build Coastguard Worker   bool debug_;
155*387f9dfdSAndroid Build Coastguard Worker   struct btf *btf_;
156*387f9dfdSAndroid Build Coastguard Worker   struct btf_ext_vendored::btf_ext *btf_ext_;
157*387f9dfdSAndroid Build Coastguard Worker   sec_map_def &sections_;
158*387f9dfdSAndroid Build Coastguard Worker };
159*387f9dfdSAndroid Build Coastguard Worker 
160*387f9dfdSAndroid Build Coastguard Worker } // namespace ebpf
161*387f9dfdSAndroid Build Coastguard Worker 
162*387f9dfdSAndroid Build Coastguard Worker #endif
163