162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <stdio.h>
362306a36Sopenharmony_ci#include <unistd.h>
462306a36Sopenharmony_ci#include <string.h>
562306a36Sopenharmony_ci#include <assert.h>
662306a36Sopenharmony_ci#include <bpf/libbpf.h>
762306a36Sopenharmony_ci#include <bpf/bpf.h>
862306a36Sopenharmony_ci#include "trace_helpers.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciint main(int ac, char **argv)
1162306a36Sopenharmony_ci{
1262306a36Sopenharmony_ci	struct bpf_object *obj = NULL;
1362306a36Sopenharmony_ci	struct bpf_link *links[20];
1462306a36Sopenharmony_ci	long key, next_key, value;
1562306a36Sopenharmony_ci	struct bpf_program *prog;
1662306a36Sopenharmony_ci	int map_fd, i, j = 0;
1762306a36Sopenharmony_ci	char filename[256];
1862306a36Sopenharmony_ci	struct ksym *sym;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	if (load_kallsyms()) {
2162306a36Sopenharmony_ci		printf("failed to process /proc/kallsyms\n");
2262306a36Sopenharmony_ci		return 2;
2362306a36Sopenharmony_ci	}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	snprintf(filename, sizeof(filename), "%s.bpf.o", argv[0]);
2662306a36Sopenharmony_ci	obj = bpf_object__open_file(filename, NULL);
2762306a36Sopenharmony_ci	if (libbpf_get_error(obj)) {
2862306a36Sopenharmony_ci		fprintf(stderr, "ERROR: opening BPF object file failed\n");
2962306a36Sopenharmony_ci		obj = NULL;
3062306a36Sopenharmony_ci		goto cleanup;
3162306a36Sopenharmony_ci	}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	/* load BPF program */
3462306a36Sopenharmony_ci	if (bpf_object__load(obj)) {
3562306a36Sopenharmony_ci		fprintf(stderr, "ERROR: loading BPF object file failed\n");
3662306a36Sopenharmony_ci		goto cleanup;
3762306a36Sopenharmony_ci	}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	map_fd = bpf_object__find_map_fd_by_name(obj, "my_map");
4062306a36Sopenharmony_ci	if (map_fd < 0) {
4162306a36Sopenharmony_ci		fprintf(stderr, "ERROR: finding a map in obj file failed\n");
4262306a36Sopenharmony_ci		goto cleanup;
4362306a36Sopenharmony_ci	}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	bpf_object__for_each_program(prog, obj) {
4662306a36Sopenharmony_ci		links[j] = bpf_program__attach(prog);
4762306a36Sopenharmony_ci		if (libbpf_get_error(links[j])) {
4862306a36Sopenharmony_ci			fprintf(stderr, "bpf_program__attach failed\n");
4962306a36Sopenharmony_ci			links[j] = NULL;
5062306a36Sopenharmony_ci			goto cleanup;
5162306a36Sopenharmony_ci		}
5262306a36Sopenharmony_ci		j++;
5362306a36Sopenharmony_ci	}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	for (i = 0; i < 5; i++) {
5662306a36Sopenharmony_ci		key = 0;
5762306a36Sopenharmony_ci		printf("kprobing funcs:");
5862306a36Sopenharmony_ci		while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) {
5962306a36Sopenharmony_ci			bpf_map_lookup_elem(map_fd, &next_key, &value);
6062306a36Sopenharmony_ci			assert(next_key == value);
6162306a36Sopenharmony_ci			sym = ksym_search(value);
6262306a36Sopenharmony_ci			key = next_key;
6362306a36Sopenharmony_ci			if (!sym) {
6462306a36Sopenharmony_ci				printf("ksym not found. Is kallsyms loaded?\n");
6562306a36Sopenharmony_ci				continue;
6662306a36Sopenharmony_ci			}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci			printf(" %s", sym->name);
6962306a36Sopenharmony_ci		}
7062306a36Sopenharmony_ci		if (key)
7162306a36Sopenharmony_ci			printf("\n");
7262306a36Sopenharmony_ci		key = 0;
7362306a36Sopenharmony_ci		while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0)
7462306a36Sopenharmony_ci			bpf_map_delete_elem(map_fd, &next_key);
7562306a36Sopenharmony_ci		sleep(1);
7662306a36Sopenharmony_ci	}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cicleanup:
7962306a36Sopenharmony_ci	for (j--; j >= 0; j--)
8062306a36Sopenharmony_ci		bpf_link__destroy(links[j]);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	bpf_object__close(obj);
8362306a36Sopenharmony_ci	return 0;
8462306a36Sopenharmony_ci}
85