1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (c) 2020 Facebook */ 3#include <linux/bpf.h> 4#include <bpf/bpf_helpers.h> 5#include <bpf/bpf_core_read.h> 6 7#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) 8struct seq_file; 9struct bpf_iter_meta { 10 struct seq_file *seq; 11 __u64 session_id; 12 __u64 seq_num; 13}; 14 15struct bpf_map { 16 __u32 id; 17 char name[16]; 18 __u32 max_entries; 19}; 20 21struct bpf_iter__bpf_map { 22 struct bpf_iter_meta *meta; 23 struct bpf_map *map; 24}; 25 26struct btf_type { 27 __u32 name_off; 28}; 29 30struct btf_header { 31 __u32 str_len; 32}; 33 34struct btf { 35 const char *strings; 36 struct btf_type **types; 37 struct btf_header hdr; 38}; 39 40struct bpf_prog_aux { 41 __u32 id; 42 char name[16]; 43 const char *attach_func_name; 44 struct bpf_prog *dst_prog; 45 struct bpf_func_info *func_info; 46 struct btf *btf; 47}; 48 49struct bpf_prog { 50 struct bpf_prog_aux *aux; 51}; 52 53struct bpf_iter__bpf_prog { 54 struct bpf_iter_meta *meta; 55 struct bpf_prog *prog; 56}; 57#pragma clang attribute pop 58 59static const char *get_name(struct btf *btf, long btf_id, const char *fallback) 60{ 61 struct btf_type **types, *t; 62 unsigned int name_off; 63 const char *str; 64 65 if (!btf) 66 return fallback; 67 str = btf->strings; 68 types = btf->types; 69 bpf_probe_read_kernel(&t, sizeof(t), types + btf_id); 70 name_off = BPF_CORE_READ(t, name_off); 71 if (name_off >= btf->hdr.str_len) 72 return fallback; 73 return str + name_off; 74} 75 76__s64 bpf_map_sum_elem_count(struct bpf_map *map) __ksym; 77 78SEC("iter/bpf_map") 79int dump_bpf_map(struct bpf_iter__bpf_map *ctx) 80{ 81 struct seq_file *seq = ctx->meta->seq; 82 __u64 seq_num = ctx->meta->seq_num; 83 struct bpf_map *map = ctx->map; 84 85 if (!map) 86 return 0; 87 88 if (seq_num == 0) 89 BPF_SEQ_PRINTF(seq, " id name max_entries cur_entries\n"); 90 91 BPF_SEQ_PRINTF(seq, "%4u %-16s %10d %10lld\n", 92 map->id, map->name, map->max_entries, 93 bpf_map_sum_elem_count(map)); 94 95 return 0; 96} 97 98SEC("iter/bpf_prog") 99int dump_bpf_prog(struct bpf_iter__bpf_prog *ctx) 100{ 101 struct seq_file *seq = ctx->meta->seq; 102 __u64 seq_num = ctx->meta->seq_num; 103 struct bpf_prog *prog = ctx->prog; 104 struct bpf_prog_aux *aux; 105 106 if (!prog) 107 return 0; 108 109 aux = prog->aux; 110 if (seq_num == 0) 111 BPF_SEQ_PRINTF(seq, " id name attached\n"); 112 113 BPF_SEQ_PRINTF(seq, "%4u %-16s %s %s\n", aux->id, 114 get_name(aux->btf, aux->func_info[0].type_id, aux->name), 115 aux->attach_func_name, aux->dst_prog->aux->name); 116 return 0; 117} 118char LICENSE[] SEC("license") = "GPL"; 119