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 §ions); 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 §ions_; 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