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