cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

spintest_user.c (2112B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <stdio.h>
      3#include <unistd.h>
      4#include <string.h>
      5#include <assert.h>
      6#include <bpf/libbpf.h>
      7#include <bpf/bpf.h>
      8#include "trace_helpers.h"
      9
     10int main(int ac, char **argv)
     11{
     12	char filename[256], symbol[256];
     13	struct bpf_object *obj = NULL;
     14	struct bpf_link *links[20];
     15	long key, next_key, value;
     16	struct bpf_program *prog;
     17	int map_fd, i, j = 0;
     18	const char *section;
     19	struct ksym *sym;
     20
     21	if (load_kallsyms()) {
     22		printf("failed to process /proc/kallsyms\n");
     23		return 2;
     24	}
     25
     26	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
     27	obj = bpf_object__open_file(filename, NULL);
     28	if (libbpf_get_error(obj)) {
     29		fprintf(stderr, "ERROR: opening BPF object file failed\n");
     30		obj = NULL;
     31		goto cleanup;
     32	}
     33
     34	/* load BPF program */
     35	if (bpf_object__load(obj)) {
     36		fprintf(stderr, "ERROR: loading BPF object file failed\n");
     37		goto cleanup;
     38	}
     39
     40	map_fd = bpf_object__find_map_fd_by_name(obj, "my_map");
     41	if (map_fd < 0) {
     42		fprintf(stderr, "ERROR: finding a map in obj file failed\n");
     43		goto cleanup;
     44	}
     45
     46	bpf_object__for_each_program(prog, obj) {
     47		section = bpf_program__section_name(prog);
     48		if (sscanf(section, "kprobe/%s", symbol) != 1)
     49			continue;
     50
     51		/* Attach prog only when symbol exists */
     52		if (ksym_get_addr(symbol)) {
     53			links[j] = bpf_program__attach(prog);
     54			if (libbpf_get_error(links[j])) {
     55				fprintf(stderr, "bpf_program__attach failed\n");
     56				links[j] = NULL;
     57				goto cleanup;
     58			}
     59			j++;
     60		}
     61	}
     62
     63	for (i = 0; i < 5; i++) {
     64		key = 0;
     65		printf("kprobing funcs:");
     66		while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) {
     67			bpf_map_lookup_elem(map_fd, &next_key, &value);
     68			assert(next_key == value);
     69			sym = ksym_search(value);
     70			key = next_key;
     71			if (!sym) {
     72				printf("ksym not found. Is kallsyms loaded?\n");
     73				continue;
     74			}
     75
     76			printf(" %s", sym->name);
     77		}
     78		if (key)
     79			printf("\n");
     80		key = 0;
     81		while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0)
     82			bpf_map_delete_elem(map_fd, &next_key);
     83		sleep(1);
     84	}
     85
     86cleanup:
     87	for (j--; j >= 0; j--)
     88		bpf_link__destroy(links[j]);
     89
     90	bpf_object__close(obj);
     91	return 0;
     92}