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

maps.c (3289B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <linux/compiler.h>
      3#include <linux/kernel.h>
      4#include "tests.h"
      5#include "map.h"
      6#include "maps.h"
      7#include "dso.h"
      8#include "debug.h"
      9
     10struct map_def {
     11	const char *name;
     12	u64 start;
     13	u64 end;
     14};
     15
     16static int check_maps(struct map_def *merged, unsigned int size, struct maps *maps)
     17{
     18	struct map *map;
     19	unsigned int i = 0;
     20
     21	maps__for_each_entry(maps, map) {
     22		if (i > 0)
     23			TEST_ASSERT_VAL("less maps expected", (map && i < size) || (!map && i == size));
     24
     25		TEST_ASSERT_VAL("wrong map start",  map->start == merged[i].start);
     26		TEST_ASSERT_VAL("wrong map end",    map->end == merged[i].end);
     27		TEST_ASSERT_VAL("wrong map name",  !strcmp(map->dso->name, merged[i].name));
     28		TEST_ASSERT_VAL("wrong map refcnt", refcount_read(&map->refcnt) == 1);
     29
     30		i++;
     31	}
     32
     33	return TEST_OK;
     34}
     35
     36static int test__maps__merge_in(struct test_suite *t __maybe_unused, int subtest __maybe_unused)
     37{
     38	unsigned int i;
     39	struct map_def bpf_progs[] = {
     40		{ "bpf_prog_1", 200, 300 },
     41		{ "bpf_prog_2", 500, 600 },
     42		{ "bpf_prog_3", 800, 900 },
     43	};
     44	struct map_def merged12[] = {
     45		{ "kcore1",     100,  200 },
     46		{ "bpf_prog_1", 200,  300 },
     47		{ "kcore1",     300,  500 },
     48		{ "bpf_prog_2", 500,  600 },
     49		{ "kcore1",     600,  800 },
     50		{ "bpf_prog_3", 800,  900 },
     51		{ "kcore1",     900, 1000 },
     52	};
     53	struct map_def merged3[] = {
     54		{ "kcore1",      100,  200 },
     55		{ "bpf_prog_1",  200,  300 },
     56		{ "kcore1",      300,  500 },
     57		{ "bpf_prog_2",  500,  600 },
     58		{ "kcore1",      600,  800 },
     59		{ "bpf_prog_3",  800,  900 },
     60		{ "kcore1",      900, 1000 },
     61		{ "kcore3",     1000, 1100 },
     62	};
     63	struct map *map_kcore1, *map_kcore2, *map_kcore3;
     64	int ret;
     65	struct maps *maps = maps__new(NULL);
     66
     67	TEST_ASSERT_VAL("failed to create maps", maps);
     68
     69	for (i = 0; i < ARRAY_SIZE(bpf_progs); i++) {
     70		struct map *map;
     71
     72		map = dso__new_map(bpf_progs[i].name);
     73		TEST_ASSERT_VAL("failed to create map", map);
     74
     75		map->start = bpf_progs[i].start;
     76		map->end   = bpf_progs[i].end;
     77		maps__insert(maps, map);
     78		map__put(map);
     79	}
     80
     81	map_kcore1 = dso__new_map("kcore1");
     82	TEST_ASSERT_VAL("failed to create map", map_kcore1);
     83
     84	map_kcore2 = dso__new_map("kcore2");
     85	TEST_ASSERT_VAL("failed to create map", map_kcore2);
     86
     87	map_kcore3 = dso__new_map("kcore3");
     88	TEST_ASSERT_VAL("failed to create map", map_kcore3);
     89
     90	/* kcore1 map overlaps over all bpf maps */
     91	map_kcore1->start = 100;
     92	map_kcore1->end   = 1000;
     93
     94	/* kcore2 map hides behind bpf_prog_2 */
     95	map_kcore2->start = 550;
     96	map_kcore2->end   = 570;
     97
     98	/* kcore3 map hides behind bpf_prog_3, kcore1 and adds new map */
     99	map_kcore3->start = 880;
    100	map_kcore3->end   = 1100;
    101
    102	ret = maps__merge_in(maps, map_kcore1);
    103	TEST_ASSERT_VAL("failed to merge map", !ret);
    104
    105	ret = check_maps(merged12, ARRAY_SIZE(merged12), maps);
    106	TEST_ASSERT_VAL("merge check failed", !ret);
    107
    108	ret = maps__merge_in(maps, map_kcore2);
    109	TEST_ASSERT_VAL("failed to merge map", !ret);
    110
    111	ret = check_maps(merged12, ARRAY_SIZE(merged12), maps);
    112	TEST_ASSERT_VAL("merge check failed", !ret);
    113
    114	ret = maps__merge_in(maps, map_kcore3);
    115	TEST_ASSERT_VAL("failed to merge map", !ret);
    116
    117	ret = check_maps(merged3, ARRAY_SIZE(merged3), maps);
    118	TEST_ASSERT_VAL("merge check failed", !ret);
    119
    120	maps__delete(maps);
    121	return TEST_OK;
    122}
    123
    124DEFINE_SUITE("maps__merge_in", maps__merge_in);