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

test_current_task_under_cgroup_user.c (2457B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/* Copyright (c) 2016 Sargun Dhillon <sargun@sargun.me>
      3 */
      4
      5#define _GNU_SOURCE
      6#include <stdio.h>
      7#include <unistd.h>
      8#include <bpf/bpf.h>
      9#include <bpf/libbpf.h>
     10#include "cgroup_helpers.h"
     11
     12#define CGROUP_PATH		"/my-cgroup"
     13
     14int main(int argc, char **argv)
     15{
     16	pid_t remote_pid, local_pid = getpid();
     17	struct bpf_link *link = NULL;
     18	struct bpf_program *prog;
     19	int cg2, idx = 0, rc = 1;
     20	struct bpf_object *obj;
     21	char filename[256];
     22	int map_fd[2];
     23
     24	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
     25	obj = bpf_object__open_file(filename, NULL);
     26	if (libbpf_get_error(obj)) {
     27		fprintf(stderr, "ERROR: opening BPF object file failed\n");
     28		return 0;
     29	}
     30
     31	prog = bpf_object__find_program_by_name(obj, "bpf_prog1");
     32	if (!prog) {
     33		printf("finding a prog in obj file failed\n");
     34		goto cleanup;
     35	}
     36
     37	/* load BPF program */
     38	if (bpf_object__load(obj)) {
     39		fprintf(stderr, "ERROR: loading BPF object file failed\n");
     40		goto cleanup;
     41	}
     42
     43	map_fd[0] = bpf_object__find_map_fd_by_name(obj, "cgroup_map");
     44	map_fd[1] = bpf_object__find_map_fd_by_name(obj, "perf_map");
     45	if (map_fd[0] < 0 || map_fd[1] < 0) {
     46		fprintf(stderr, "ERROR: finding a map in obj file failed\n");
     47		goto cleanup;
     48	}
     49
     50	link = bpf_program__attach(prog);
     51	if (libbpf_get_error(link)) {
     52		fprintf(stderr, "ERROR: bpf_program__attach failed\n");
     53		link = NULL;
     54		goto cleanup;
     55	}
     56
     57	if (setup_cgroup_environment())
     58		goto err;
     59
     60	cg2 = create_and_get_cgroup(CGROUP_PATH);
     61
     62	if (cg2 < 0)
     63		goto err;
     64
     65	if (bpf_map_update_elem(map_fd[0], &idx, &cg2, BPF_ANY)) {
     66		log_err("Adding target cgroup to map");
     67		goto err;
     68	}
     69
     70	if (join_cgroup(CGROUP_PATH))
     71		goto err;
     72
     73	/*
     74	 * The installed helper program catched the sync call, and should
     75	 * write it to the map.
     76	 */
     77
     78	sync();
     79	bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid);
     80
     81	if (local_pid != remote_pid) {
     82		fprintf(stderr,
     83			"BPF Helper didn't write correct PID to map, but: %d\n",
     84			remote_pid);
     85		goto err;
     86	}
     87
     88	/* Verify the negative scenario; leave the cgroup */
     89	if (join_cgroup("/"))
     90		goto err;
     91
     92	remote_pid = 0;
     93	bpf_map_update_elem(map_fd[1], &idx, &remote_pid, BPF_ANY);
     94
     95	sync();
     96	bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid);
     97
     98	if (local_pid == remote_pid) {
     99		fprintf(stderr, "BPF cgroup negative test did not work\n");
    100		goto err;
    101	}
    102
    103	rc = 0;
    104
    105err:
    106	close(cg2);
    107	cleanup_cgroup_environment();
    108
    109cleanup:
    110	bpf_link__destroy(link);
    111	bpf_object__close(obj);
    112	return rc;
    113}