Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  perf_event_attr_fprintf.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/perf_event.h>
#include "util/evsel_fprintf.h"
#include "util/pmu.h"
#include "util/pmus.h"
#include "trace-event.h"

struct bit_names {
 int bit;
 const char *name;
};

static void __p_bits(char *buf, size_t size, u64 value, struct bit_names *bits)
{
 bool first_bit = true;
 int i = 0;

 do {
  if (value & bits[i].bit) {
   buf += scnprintf(buf, size, "%s%s", first_bit ? "" : "|", bits[i].name);
   first_bit = false;
  }
 } while (bits[++i].name != NULL);
}

static void __p_sample_type(char *buf, size_t size, u64 value)
{
#define bit_name(n) { PERF_SAMPLE_##n, #n }
 struct bit_names bits[] = {
  bit_name(IP), bit_name(TID), bit_name(TIME), bit_name(ADDR),
  bit_name(READ), bit_name(CALLCHAIN), bit_name(ID), bit_name(CPU),
  bit_name(PERIOD), bit_name(STREAM_ID), bit_name(RAW),
  bit_name(BRANCH_STACK), bit_name(REGS_USER), bit_name(STACK_USER),
  bit_name(IDENTIFIER), bit_name(REGS_INTR), bit_name(DATA_SRC),
  bit_name(WEIGHT), bit_name(PHYS_ADDR), bit_name(AUX),
  bit_name(CGROUP), bit_name(DATA_PAGE_SIZE), bit_name(CODE_PAGE_SIZE),
  bit_name(WEIGHT_STRUCT),
  { .name = NULL, }
 };
#undef bit_name
 __p_bits(buf, size, value, bits);
}

static void __p_branch_sample_type(char *buf, size_t size, u64 value)
{
#define bit_name(n) { PERF_SAMPLE_BRANCH_##n, #n }
 struct bit_names bits[] = {
  bit_name(USER), bit_name(KERNEL), bit_name(HV), bit_name(ANY),
  bit_name(ANY_CALL), bit_name(ANY_RETURN), bit_name(IND_CALL),
  bit_name(ABORT_TX), bit_name(IN_TX), bit_name(NO_TX),
  bit_name(COND), bit_name(CALL_STACK), bit_name(IND_JUMP),
  bit_name(CALL), bit_name(NO_FLAGS), bit_name(NO_CYCLES),
  bit_name(TYPE_SAVE), bit_name(HW_INDEX), bit_name(PRIV_SAVE),
  bit_name(COUNTERS),
  { .name = NULL, }
 };
#undef bit_name
 __p_bits(buf, size, value, bits);
}

static void __p_read_format(char *buf, size_t size, u64 value)
{
#define bit_name(n) { PERF_FORMAT_##n, #n }
 struct bit_names bits[] = {
  bit_name(TOTAL_TIME_ENABLED), bit_name(TOTAL_TIME_RUNNING),
  bit_name(ID), bit_name(GROUP), bit_name(LOST),
  { .name = NULL, }
 };
#undef bit_name
 __p_bits(buf, size, value, bits);
}

#define ENUM_ID_TO_STR_CASE(x) case x: return (#x);
static const char *stringify_perf_type_id(struct perf_pmu *pmu, u32 type)
{
 switch (type) {
 ENUM_ID_TO_STR_CASE(PERF_TYPE_HARDWARE)
 ENUM_ID_TO_STR_CASE(PERF_TYPE_SOFTWARE)
 ENUM_ID_TO_STR_CASE(PERF_TYPE_TRACEPOINT)
 ENUM_ID_TO_STR_CASE(PERF_TYPE_HW_CACHE)
 ENUM_ID_TO_STR_CASE(PERF_TYPE_BREAKPOINT)
 case PERF_TYPE_RAW:
  return pmu ? pmu->name : "PERF_TYPE_RAW";
 default:
  return pmu ? pmu->name : NULL;
 }
}

static const char *stringify_perf_hw_id(u64 value)
{
 switch (value & PERF_HW_EVENT_MASK) {
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CPU_CYCLES)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_INSTRUCTIONS)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_REFERENCES)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_MISSES)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_BRANCH_INSTRUCTIONS)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_BRANCH_MISSES)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_BUS_CYCLES)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_STALLED_CYCLES_FRONTEND)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_STALLED_CYCLES_BACKEND)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_REF_CPU_CYCLES)
 default:
  return NULL;
 }
}

static const char *stringify_perf_hw_cache_id(u64 value)
{
 switch (value) {
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_L1D)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_L1I)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_LL)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_DTLB)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_ITLB)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_BPU)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_NODE)
 default:
  return NULL;
 }
}

static const char *stringify_perf_hw_cache_op_id(u64 value)
{
 switch (value) {
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_OP_READ)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_OP_WRITE)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_OP_PREFETCH)
 default:
  return NULL;
 }
}

static const char *stringify_perf_hw_cache_op_result_id(u64 value)
{
 switch (value) {
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_RESULT_ACCESS)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_HW_CACHE_RESULT_MISS)
 default:
  return NULL;
 }
}

static const char *stringify_perf_sw_id(u64 value)
{
 switch (value) {
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_CPU_CLOCK)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_TASK_CLOCK)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_PAGE_FAULTS)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_CONTEXT_SWITCHES)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_CPU_MIGRATIONS)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_PAGE_FAULTS_MIN)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_PAGE_FAULTS_MAJ)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_ALIGNMENT_FAULTS)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_EMULATION_FAULTS)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_DUMMY)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_BPF_OUTPUT)
 ENUM_ID_TO_STR_CASE(PERF_COUNT_SW_CGROUP_SWITCHES)
 default:
  return NULL;
 }
}
#undef ENUM_ID_TO_STR_CASE

static void print_id_unsigned(char *buf, size_t size, u64 value, const char *s)
{
 if (s == NULL)
  snprintf(buf, size, "%"PRIu64, value);
 else
  snprintf(buf, size, "%"PRIu64" (%s)", value, s);
}

static void print_id_hex(char *buf, size_t size, u64 value, const char *s)
{
 if (s == NULL)
  snprintf(buf, size, "%#"PRIx64, value);
 else
  snprintf(buf, size, "%#"PRIx64" (%s)", value, s);
}

static void __p_type_id(char *buf, size_t size, struct perf_pmu *pmu, u32 type)
{
 print_id_unsigned(buf, size, type, stringify_perf_type_id(pmu, type));
}

static void __p_config_hw_id(char *buf, size_t size, struct perf_pmu *pmu, u64 config)
{
 const char *name = stringify_perf_hw_id(config);

 if (name == NULL) {
  if (pmu == NULL) {
   snprintf(buf, size, "%#"PRIx64, config);
  } else {
   snprintf(buf, size, "%#"PRIx64" (%s/config=%#"PRIx64"/)", config, pmu->name,
     config);
  }
 } else {
  if (pmu == NULL)
   snprintf(buf, size, "%#"PRIx64" (%s)", config, name);
  else
   snprintf(buf, size, "%#"PRIx64" (%s/%s/)", config, pmu->name, name);
 }
}

static void __p_config_sw_id(char *buf, size_t size, u64 id)
{
 print_id_hex(buf, size, id, stringify_perf_sw_id(id));
}

static void __p_config_hw_cache_id(char *buf, size_t size, struct perf_pmu *pmu, u64 config)
{
 const char *hw_cache_str = stringify_perf_hw_cache_id(config & 0xff);
 const char *hw_cache_op_str =
  stringify_perf_hw_cache_op_id((config & 0xff00) >> 8);
 const char *hw_cache_op_result_str =
  stringify_perf_hw_cache_op_result_id((config & 0xff0000) >> 16);

 if (hw_cache_str == NULL || hw_cache_op_str == NULL || hw_cache_op_result_str == NULL) {
  if (pmu == NULL) {
   snprintf(buf, size, "%#"PRIx64, config);
  } else {
   snprintf(buf, size, "%#"PRIx64" (%s/config=%#"PRIx64"/)", config, pmu->name,
     config);
  }
 } else {
  if (pmu == NULL) {
   snprintf(buf, size, "%#"PRIx64" (%s | %s | %s)", config,
     hw_cache_op_result_str, hw_cache_op_str, hw_cache_str);
  } else {
   snprintf(buf, size, "%#"PRIx64" (%s/%s | %s | %s/)", config, pmu->name,
     hw_cache_op_result_str, hw_cache_op_str, hw_cache_str);
  }
 }
}

static void __p_config_tracepoint_id(char *buf, size_t size, u64 id)
{
 char *str = tracepoint_id_to_name(id);

 print_id_hex(buf, size, id, str);
 free(str);
}

static void __p_config_id(struct perf_pmu *pmu, char *buf, size_t size, u32 type, u64 config)
{
 switch (type) {
 case PERF_TYPE_HARDWARE:
  return __p_config_hw_id(buf, size, pmu, config);
 case PERF_TYPE_SOFTWARE:
  return __p_config_sw_id(buf, size, config);
 case PERF_TYPE_HW_CACHE:
  return __p_config_hw_cache_id(buf, size, pmu, config);
 case PERF_TYPE_TRACEPOINT:
  return __p_config_tracepoint_id(buf, size, config);
 case PERF_TYPE_RAW:
 case PERF_TYPE_BREAKPOINT:
 default:
  return print_id_hex(buf, size, config, perf_pmu__name_from_config(pmu, config));
 }
}

#define BUF_SIZE  1024

#define p_hex(val)  snprintf(buf, BUF_SIZE, "%#"PRIx64, (uint64_t)(val))
#define p_unsigned(val)  snprintf(buf, BUF_SIZE, "%"PRIu64, (uint64_t)(val))
#define p_signed(val)  snprintf(buf, BUF_SIZE, "%"PRId64, (int64_t)(val))
#define p_sample_type(val) __p_sample_type(buf, BUF_SIZE, val)
#define p_branch_sample_type(val) __p_branch_sample_type(buf, BUF_SIZE, val)
#define p_read_format(val) __p_read_format(buf, BUF_SIZE, val)
#define p_type_id(val)  __p_type_id(buf, BUF_SIZE, pmu, val)
#define p_config_id(val) __p_config_id(pmu, buf, BUF_SIZE, attr->type, val)

#define PRINT_ATTRn(_n, _f, _p, _a)   \
do {       \
 if (_a || attr->_f) {    \
  _p(attr->_f);    \
  ret += attr__fprintf(fp, _n, buf, priv);\
 }      \
while (0)

#define PRINT_ATTRf(_f, _p) PRINT_ATTRn(#_f, _f, _p, false)

int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
        attr__fprintf_f attr__fprintf, void *priv)
{
 struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type);
 char buf[BUF_SIZE];
 int ret = 0;

 if (!pmu && (attr->type == PERF_TYPE_HARDWARE || attr->type == PERF_TYPE_HW_CACHE)) {
  u32 extended_type = attr->config >> PERF_PMU_TYPE_SHIFT;

  if (extended_type)
   pmu = perf_pmus__find_by_type(extended_type);
 }

 PRINT_ATTRn("type", type, p_type_id, true);
 PRINT_ATTRf(size, p_unsigned);
 PRINT_ATTRn("config", config, p_config_id, true);
 PRINT_ATTRn("{ sample_period, sample_freq }", sample_period, p_unsigned, false);
 PRINT_ATTRf(sample_type, p_sample_type);
 PRINT_ATTRf(read_format, p_read_format);

 PRINT_ATTRf(disabled, p_unsigned);
 PRINT_ATTRf(inherit, p_unsigned);
 PRINT_ATTRf(pinned, p_unsigned);
 PRINT_ATTRf(exclusive, p_unsigned);
 PRINT_ATTRf(exclude_user, p_unsigned);
 PRINT_ATTRf(exclude_kernel, p_unsigned);
 PRINT_ATTRf(exclude_hv, p_unsigned);
 PRINT_ATTRf(exclude_idle, p_unsigned);
 PRINT_ATTRf(mmap, p_unsigned);
 PRINT_ATTRf(comm, p_unsigned);
 PRINT_ATTRf(freq, p_unsigned);
 PRINT_ATTRf(inherit_stat, p_unsigned);
 PRINT_ATTRf(enable_on_exec, p_unsigned);
 PRINT_ATTRf(task, p_unsigned);
 PRINT_ATTRf(watermark, p_unsigned);
 PRINT_ATTRf(precise_ip, p_unsigned);
 PRINT_ATTRf(mmap_data, p_unsigned);
 PRINT_ATTRf(sample_id_all, p_unsigned);
 PRINT_ATTRf(exclude_host, p_unsigned);
 PRINT_ATTRf(exclude_guest, p_unsigned);
 PRINT_ATTRf(exclude_callchain_kernel, p_unsigned);
 PRINT_ATTRf(exclude_callchain_user, p_unsigned);
 PRINT_ATTRf(mmap2, p_unsigned);
 PRINT_ATTRf(comm_exec, p_unsigned);
 PRINT_ATTRf(use_clockid, p_unsigned);
 PRINT_ATTRf(context_switch, p_unsigned);
 PRINT_ATTRf(write_backward, p_unsigned);
 PRINT_ATTRf(namespaces, p_unsigned);
 PRINT_ATTRf(ksymbol, p_unsigned);
 PRINT_ATTRf(bpf_event, p_unsigned);
 PRINT_ATTRf(aux_output, p_unsigned);
 PRINT_ATTRf(cgroup, p_unsigned);
 PRINT_ATTRf(text_poke, p_unsigned);
 PRINT_ATTRf(build_id, p_unsigned);
 PRINT_ATTRf(inherit_thread, p_unsigned);
 PRINT_ATTRf(remove_on_exec, p_unsigned);
 PRINT_ATTRf(sigtrap, p_unsigned);

 PRINT_ATTRn("{ wakeup_events, wakeup_watermark }", wakeup_events, p_unsigned, false);
 PRINT_ATTRf(bp_type, p_unsigned);
 PRINT_ATTRn("{ bp_addr, config1 }", bp_addr, p_hex, false);
 PRINT_ATTRn("{ bp_len, config2 }", bp_len, p_hex, false);
 PRINT_ATTRf(branch_sample_type, p_branch_sample_type);
 PRINT_ATTRf(sample_regs_user, p_hex);
 PRINT_ATTRf(sample_stack_user, p_unsigned);
 PRINT_ATTRf(clockid, p_signed);
 PRINT_ATTRf(sample_regs_intr, p_hex);
 PRINT_ATTRf(aux_watermark, p_unsigned);
 PRINT_ATTRf(sample_max_stack, p_unsigned);
 PRINT_ATTRf(aux_sample_size, p_unsigned);
 PRINT_ATTRf(sig_data, p_unsigned);
 PRINT_ATTRf(aux_start_paused, p_unsigned);
 PRINT_ATTRf(aux_pause, p_unsigned);
 PRINT_ATTRf(aux_resume, p_unsigned);

 return ret;
}

Messung V0.5
C=97 H=92 G=94

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge