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

cpu_mask.c (1876B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <test_progs.h>
      3#include <bpf/btf.h>
      4#include "bpf/libbpf_internal.h"
      5
      6static int duration = 0;
      7
      8static void validate_mask(int case_nr, const char *exp, bool *mask, int n)
      9{
     10	int i;
     11
     12	for (i = 0; exp[i]; i++) {
     13		if (exp[i] == '1') {
     14			if (CHECK(i + 1 > n, "mask_short",
     15				  "case #%d: mask too short, got n=%d, need at least %d\n",
     16				  case_nr, n, i + 1))
     17				return;
     18			CHECK(!mask[i], "cpu_not_set",
     19			      "case #%d: mask differs, expected cpu#%d SET\n",
     20			      case_nr, i);
     21		} else {
     22			CHECK(i < n && mask[i], "cpu_set",
     23			      "case #%d: mask differs, expected cpu#%d UNSET\n",
     24			      case_nr, i);
     25		}
     26	}
     27	CHECK(i < n, "mask_long",
     28	      "case #%d: mask too long, got n=%d, expected at most %d\n",
     29	      case_nr, n, i);
     30}
     31
     32static struct {
     33	const char *cpu_mask;
     34	const char *expect;
     35	bool fails;
     36} test_cases[] = {
     37	{ "0\n", "1", false },
     38	{ "0,2\n", "101", false },
     39	{ "0-2\n", "111", false },
     40	{ "0-2,3-4\n", "11111", false },
     41	{ "0", "1", false },
     42	{ "0-2", "111", false },
     43	{ "0,2", "101", false },
     44	{ "0,1-3", "1111", false },
     45	{ "0,1,2,3", "1111", false },
     46	{ "0,2-3,5", "101101", false },
     47	{ "3-3", "0001", false },
     48	{ "2-4,6,9-10", "00111010011", false },
     49	/* failure cases */
     50	{ "", "", true },
     51	{ "0-", "", true },
     52	{ "0 ", "", true },
     53	{ "0_1", "", true },
     54	{ "1-0", "", true },
     55	{ "-1", "", true },
     56};
     57
     58void test_cpu_mask()
     59{
     60	int i, err, n;
     61	bool *mask;
     62
     63	for (i = 0; i < ARRAY_SIZE(test_cases); i++) {
     64		mask = NULL;
     65		err = parse_cpu_mask_str(test_cases[i].cpu_mask, &mask, &n);
     66		if (test_cases[i].fails) {
     67			CHECK(!err, "should_fail",
     68			      "case #%d: parsing should fail!\n", i + 1);
     69		} else {
     70			if (CHECK(err, "parse_err",
     71				  "case #%d: cpu mask parsing failed: %d\n",
     72				  i + 1, err))
     73				continue;
     74			validate_mask(i + 1, test_cases[i].expect, mask, n);
     75		}
     76		free(mask);
     77	}
     78}