1ca125277SArnaldo Carvalho de Melo // SPDX-License-Identifier: GPL-2.0 2ca125277SArnaldo Carvalho de Melo #include <inttypes.h> 3ca125277SArnaldo Carvalho de Melo #include <stdio.h> 4ca125277SArnaldo Carvalho de Melo #include <stdbool.h> 5ca125277SArnaldo Carvalho de Melo #include <linux/kernel.h> 6ca125277SArnaldo Carvalho de Melo #include <linux/types.h> 7ca125277SArnaldo Carvalho de Melo #include <linux/perf_event.h> 8ca125277SArnaldo Carvalho de Melo #include "util/evsel_fprintf.h" 9ca125277SArnaldo Carvalho de Melo 10ca125277SArnaldo Carvalho de Melo struct bit_names { 11ca125277SArnaldo Carvalho de Melo int bit; 12ca125277SArnaldo Carvalho de Melo const char *name; 13ca125277SArnaldo Carvalho de Melo }; 14ca125277SArnaldo Carvalho de Melo 15ca125277SArnaldo Carvalho de Melo static void __p_bits(char *buf, size_t size, u64 value, struct bit_names *bits) 16ca125277SArnaldo Carvalho de Melo { 17ca125277SArnaldo Carvalho de Melo bool first_bit = true; 18ca125277SArnaldo Carvalho de Melo int i = 0; 19ca125277SArnaldo Carvalho de Melo 20ca125277SArnaldo Carvalho de Melo do { 21ca125277SArnaldo Carvalho de Melo if (value & bits[i].bit) { 22ca125277SArnaldo Carvalho de Melo buf += scnprintf(buf, size, "%s%s", first_bit ? "" : "|", bits[i].name); 23ca125277SArnaldo Carvalho de Melo first_bit = false; 24ca125277SArnaldo Carvalho de Melo } 25ca125277SArnaldo Carvalho de Melo } while (bits[++i].name != NULL); 26ca125277SArnaldo Carvalho de Melo } 27ca125277SArnaldo Carvalho de Melo 28ca125277SArnaldo Carvalho de Melo static void __p_sample_type(char *buf, size_t size, u64 value) 29ca125277SArnaldo Carvalho de Melo { 30ca125277SArnaldo Carvalho de Melo #define bit_name(n) { PERF_SAMPLE_##n, #n } 31ca125277SArnaldo Carvalho de Melo struct bit_names bits[] = { 32ca125277SArnaldo Carvalho de Melo bit_name(IP), bit_name(TID), bit_name(TIME), bit_name(ADDR), 33ca125277SArnaldo Carvalho de Melo bit_name(READ), bit_name(CALLCHAIN), bit_name(ID), bit_name(CPU), 34ca125277SArnaldo Carvalho de Melo bit_name(PERIOD), bit_name(STREAM_ID), bit_name(RAW), 35ca125277SArnaldo Carvalho de Melo bit_name(BRANCH_STACK), bit_name(REGS_USER), bit_name(STACK_USER), 36ca125277SArnaldo Carvalho de Melo bit_name(IDENTIFIER), bit_name(REGS_INTR), bit_name(DATA_SRC), 3798dcf14dSAdrian Hunter bit_name(WEIGHT), bit_name(PHYS_ADDR), bit_name(AUX), 38c1de7f3dSKan Liang bit_name(CGROUP), bit_name(DATA_PAGE_SIZE), bit_name(CODE_PAGE_SIZE), 39ea8d0ed6SKan Liang bit_name(WEIGHT_STRUCT), 40ca125277SArnaldo Carvalho de Melo { .name = NULL, } 41ca125277SArnaldo Carvalho de Melo }; 42ca125277SArnaldo Carvalho de Melo #undef bit_name 43ca125277SArnaldo Carvalho de Melo __p_bits(buf, size, value, bits); 44ca125277SArnaldo Carvalho de Melo } 45ca125277SArnaldo Carvalho de Melo 46ca125277SArnaldo Carvalho de Melo static void __p_branch_sample_type(char *buf, size_t size, u64 value) 47ca125277SArnaldo Carvalho de Melo { 48ca125277SArnaldo Carvalho de Melo #define bit_name(n) { PERF_SAMPLE_BRANCH_##n, #n } 49ca125277SArnaldo Carvalho de Melo struct bit_names bits[] = { 50ca125277SArnaldo Carvalho de Melo bit_name(USER), bit_name(KERNEL), bit_name(HV), bit_name(ANY), 51ca125277SArnaldo Carvalho de Melo bit_name(ANY_CALL), bit_name(ANY_RETURN), bit_name(IND_CALL), 52ca125277SArnaldo Carvalho de Melo bit_name(ABORT_TX), bit_name(IN_TX), bit_name(NO_TX), 53ca125277SArnaldo Carvalho de Melo bit_name(COND), bit_name(CALL_STACK), bit_name(IND_JUMP), 54ca125277SArnaldo Carvalho de Melo bit_name(CALL), bit_name(NO_FLAGS), bit_name(NO_CYCLES), 55bcb96ce6SAnshuman Khandual bit_name(TYPE_SAVE), bit_name(HW_INDEX), bit_name(PRIV_SAVE), 56ca125277SArnaldo Carvalho de Melo { .name = NULL, } 57ca125277SArnaldo Carvalho de Melo }; 58ca125277SArnaldo Carvalho de Melo #undef bit_name 59ca125277SArnaldo Carvalho de Melo __p_bits(buf, size, value, bits); 60ca125277SArnaldo Carvalho de Melo } 61ca125277SArnaldo Carvalho de Melo 62ca125277SArnaldo Carvalho de Melo static void __p_read_format(char *buf, size_t size, u64 value) 63ca125277SArnaldo Carvalho de Melo { 64ca125277SArnaldo Carvalho de Melo #define bit_name(n) { PERF_FORMAT_##n, #n } 65ca125277SArnaldo Carvalho de Melo struct bit_names bits[] = { 66ca125277SArnaldo Carvalho de Melo bit_name(TOTAL_TIME_ENABLED), bit_name(TOTAL_TIME_RUNNING), 67a8d68cc4SNamhyung Kim bit_name(ID), bit_name(GROUP), bit_name(LOST), 68ca125277SArnaldo Carvalho de Melo { .name = NULL, } 69ca125277SArnaldo Carvalho de Melo }; 70ca125277SArnaldo Carvalho de Melo #undef bit_name 71ca125277SArnaldo Carvalho de Melo __p_bits(buf, size, value, bits); 72ca125277SArnaldo Carvalho de Melo } 73ca125277SArnaldo Carvalho de Melo 74ca125277SArnaldo Carvalho de Melo #define BUF_SIZE 1024 75ca125277SArnaldo Carvalho de Melo 76ca125277SArnaldo Carvalho de Melo #define p_hex(val) snprintf(buf, BUF_SIZE, "%#"PRIx64, (uint64_t)(val)) 77ca125277SArnaldo Carvalho de Melo #define p_unsigned(val) snprintf(buf, BUF_SIZE, "%"PRIu64, (uint64_t)(val)) 78ca125277SArnaldo Carvalho de Melo #define p_signed(val) snprintf(buf, BUF_SIZE, "%"PRId64, (int64_t)(val)) 79ca125277SArnaldo Carvalho de Melo #define p_sample_type(val) __p_sample_type(buf, BUF_SIZE, val) 80ca125277SArnaldo Carvalho de Melo #define p_branch_sample_type(val) __p_branch_sample_type(buf, BUF_SIZE, val) 81ca125277SArnaldo Carvalho de Melo #define p_read_format(val) __p_read_format(buf, BUF_SIZE, val) 82ca125277SArnaldo Carvalho de Melo 83*5492e725SYang Jihong #define PRINT_ATTRn(_n, _f, _p, _a) \ 84ca125277SArnaldo Carvalho de Melo do { \ 85*5492e725SYang Jihong if (_a || attr->_f) { \ 86ca125277SArnaldo Carvalho de Melo _p(attr->_f); \ 87ca125277SArnaldo Carvalho de Melo ret += attr__fprintf(fp, _n, buf, priv);\ 88ca125277SArnaldo Carvalho de Melo } \ 89ca125277SArnaldo Carvalho de Melo } while (0) 90ca125277SArnaldo Carvalho de Melo 91*5492e725SYang Jihong #define PRINT_ATTRf(_f, _p) PRINT_ATTRn(#_f, _f, _p, false) 92ca125277SArnaldo Carvalho de Melo 93ca125277SArnaldo Carvalho de Melo int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr, 94ca125277SArnaldo Carvalho de Melo attr__fprintf_f attr__fprintf, void *priv) 95ca125277SArnaldo Carvalho de Melo { 96ca125277SArnaldo Carvalho de Melo char buf[BUF_SIZE]; 97ca125277SArnaldo Carvalho de Melo int ret = 0; 98ca125277SArnaldo Carvalho de Melo 99ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(type, p_unsigned); 100ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(size, p_unsigned); 101ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(config, p_hex); 102*5492e725SYang Jihong PRINT_ATTRn("{ sample_period, sample_freq }", sample_period, p_unsigned, false); 103ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(sample_type, p_sample_type); 104ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(read_format, p_read_format); 105ca125277SArnaldo Carvalho de Melo 106ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(disabled, p_unsigned); 107ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(inherit, p_unsigned); 108ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(pinned, p_unsigned); 109ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(exclusive, p_unsigned); 110ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(exclude_user, p_unsigned); 111ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(exclude_kernel, p_unsigned); 112ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(exclude_hv, p_unsigned); 113ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(exclude_idle, p_unsigned); 114ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(mmap, p_unsigned); 115ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(comm, p_unsigned); 116ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(freq, p_unsigned); 117ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(inherit_stat, p_unsigned); 118ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(enable_on_exec, p_unsigned); 119ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(task, p_unsigned); 120ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(watermark, p_unsigned); 121ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(precise_ip, p_unsigned); 122ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(mmap_data, p_unsigned); 123ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(sample_id_all, p_unsigned); 124ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(exclude_host, p_unsigned); 125ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(exclude_guest, p_unsigned); 126ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(exclude_callchain_kernel, p_unsigned); 127ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(exclude_callchain_user, p_unsigned); 128ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(mmap2, p_unsigned); 129ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(comm_exec, p_unsigned); 130ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(use_clockid, p_unsigned); 131ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(context_switch, p_unsigned); 132ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(write_backward, p_unsigned); 133ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(namespaces, p_unsigned); 134ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(ksymbol, p_unsigned); 135ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(bpf_event, p_unsigned); 136ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(aux_output, p_unsigned); 137ba78c1c5SNamhyung Kim PRINT_ATTRf(cgroup, p_unsigned); 138e29386c8SJiri Olsa PRINT_ATTRf(text_poke, p_unsigned); 139e29386c8SJiri Olsa PRINT_ATTRf(build_id, p_unsigned); 140eb34363aSAdrian Hunter PRINT_ATTRf(inherit_thread, p_unsigned); 141eb34363aSAdrian Hunter PRINT_ATTRf(remove_on_exec, p_unsigned); 142eb34363aSAdrian Hunter PRINT_ATTRf(sigtrap, p_unsigned); 143ca125277SArnaldo Carvalho de Melo 144*5492e725SYang Jihong PRINT_ATTRn("{ wakeup_events, wakeup_watermark }", wakeup_events, p_unsigned, false); 145ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(bp_type, p_unsigned); 146*5492e725SYang Jihong PRINT_ATTRn("{ bp_addr, config1 }", bp_addr, p_hex, false); 147*5492e725SYang Jihong PRINT_ATTRn("{ bp_len, config2 }", bp_len, p_hex, false); 148ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(branch_sample_type, p_branch_sample_type); 149ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(sample_regs_user, p_hex); 150ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(sample_stack_user, p_unsigned); 151ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(clockid, p_signed); 152ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(sample_regs_intr, p_hex); 153ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(aux_watermark, p_unsigned); 154ca125277SArnaldo Carvalho de Melo PRINT_ATTRf(sample_max_stack, p_unsigned); 15598dcf14dSAdrian Hunter PRINT_ATTRf(aux_sample_size, p_unsigned); 156eb34363aSAdrian Hunter PRINT_ATTRf(sig_data, p_unsigned); 157ca125277SArnaldo Carvalho de Melo 158ca125277SArnaldo Carvalho de Melo return ret; 159ca125277SArnaldo Carvalho de Melo } 160