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

topdown.c (1171B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <stdio.h>
      3#include "pmu.h"
      4#include "pmu-hybrid.h"
      5#include "topdown.h"
      6
      7int topdown_filter_events(const char **attr, char **str, bool use_group,
      8			  const char *pmu_name)
      9{
     10	int off = 0;
     11	int i;
     12	int len = 0;
     13	char *s;
     14	bool is_hybrid = perf_pmu__is_hybrid(pmu_name);
     15
     16	for (i = 0; attr[i]; i++) {
     17		if (pmu_have_event(pmu_name, attr[i])) {
     18			if (is_hybrid)
     19				len += strlen(attr[i]) + strlen(pmu_name) + 3;
     20			else
     21				len += strlen(attr[i]) + 1;
     22			attr[i - off] = attr[i];
     23		} else
     24			off++;
     25	}
     26	attr[i - off] = NULL;
     27
     28	*str = malloc(len + 1 + 2);
     29	if (!*str)
     30		return -1;
     31	s = *str;
     32	if (i - off == 0) {
     33		*s = 0;
     34		return 0;
     35	}
     36	if (use_group)
     37		*s++ = '{';
     38	for (i = 0; attr[i]; i++) {
     39		if (!is_hybrid)
     40			strcpy(s, attr[i]);
     41		else
     42			sprintf(s, "%s/%s/", pmu_name, attr[i]);
     43		s += strlen(s);
     44		*s++ = ',';
     45	}
     46	if (use_group) {
     47		s[-1] = '}';
     48		*s = 0;
     49	} else
     50		s[-1] = 0;
     51	return 0;
     52}
     53
     54__weak bool arch_topdown_check_group(bool *warn)
     55{
     56	*warn = false;
     57	return false;
     58}
     59
     60__weak void arch_topdown_group_warn(void)
     61{
     62}
     63
     64__weak bool arch_topdown_sample_read(struct evsel *leader __maybe_unused)
     65{
     66	return false;
     67}