18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * arm_spe_decoder.h: Arm Statistical Profiling Extensions support 48c2ecf20Sopenharmony_ci * Copyright (c) 2019-2020, Arm Ltd. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef INCLUDE__ARM_SPE_DECODER_H__ 88c2ecf20Sopenharmony_ci#define INCLUDE__ARM_SPE_DECODER_H__ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <stdbool.h> 118c2ecf20Sopenharmony_ci#include <stddef.h> 128c2ecf20Sopenharmony_ci#include <stdint.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include "arm-spe-pkt-decoder.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cienum arm_spe_events { 178c2ecf20Sopenharmony_ci EV_EXCEPTION_GEN = 0, 188c2ecf20Sopenharmony_ci EV_RETIRED = 1, 198c2ecf20Sopenharmony_ci EV_L1D_ACCESS = 2, 208c2ecf20Sopenharmony_ci EV_L1D_REFILL = 3, 218c2ecf20Sopenharmony_ci EV_TLB_ACCESS = 4, 228c2ecf20Sopenharmony_ci EV_TLB_WALK = 5, 238c2ecf20Sopenharmony_ci EV_NOT_TAKEN = 6, 248c2ecf20Sopenharmony_ci EV_MISPRED = 7, 258c2ecf20Sopenharmony_ci EV_LLC_ACCESS = 8, 268c2ecf20Sopenharmony_ci EV_LLC_MISS = 9, 278c2ecf20Sopenharmony_ci EV_REMOTE_ACCESS = 10, 288c2ecf20Sopenharmony_ci EV_ALIGNMENT = 11, 298c2ecf20Sopenharmony_ci EV_PARTIAL_PREDICATE = 17, 308c2ecf20Sopenharmony_ci EV_EMPTY_PREDICATE = 18, 318c2ecf20Sopenharmony_ci}; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_cienum arm_spe_sample_type { 348c2ecf20Sopenharmony_ci ARM_SPE_L1D_ACCESS = 1 << 0, 358c2ecf20Sopenharmony_ci ARM_SPE_L1D_MISS = 1 << 1, 368c2ecf20Sopenharmony_ci ARM_SPE_LLC_ACCESS = 1 << 2, 378c2ecf20Sopenharmony_ci ARM_SPE_LLC_MISS = 1 << 3, 388c2ecf20Sopenharmony_ci ARM_SPE_TLB_ACCESS = 1 << 4, 398c2ecf20Sopenharmony_ci ARM_SPE_TLB_MISS = 1 << 5, 408c2ecf20Sopenharmony_ci ARM_SPE_BRANCH_MISS = 1 << 6, 418c2ecf20Sopenharmony_ci ARM_SPE_REMOTE_ACCESS = 1 << 7, 428c2ecf20Sopenharmony_ci}; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistruct arm_spe_record { 458c2ecf20Sopenharmony_ci enum arm_spe_sample_type type; 468c2ecf20Sopenharmony_ci int err; 478c2ecf20Sopenharmony_ci u64 from_ip; 488c2ecf20Sopenharmony_ci u64 to_ip; 498c2ecf20Sopenharmony_ci u64 timestamp; 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistruct arm_spe_insn; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistruct arm_spe_buffer { 558c2ecf20Sopenharmony_ci const unsigned char *buf; 568c2ecf20Sopenharmony_ci size_t len; 578c2ecf20Sopenharmony_ci u64 offset; 588c2ecf20Sopenharmony_ci u64 trace_nr; 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cistruct arm_spe_params { 628c2ecf20Sopenharmony_ci int (*get_trace)(struct arm_spe_buffer *buffer, void *data); 638c2ecf20Sopenharmony_ci void *data; 648c2ecf20Sopenharmony_ci}; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_cistruct arm_spe_decoder { 678c2ecf20Sopenharmony_ci int (*get_trace)(struct arm_spe_buffer *buffer, void *data); 688c2ecf20Sopenharmony_ci void *data; 698c2ecf20Sopenharmony_ci struct arm_spe_record record; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci const unsigned char *buf; 728c2ecf20Sopenharmony_ci size_t len; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci struct arm_spe_pkt packet; 758c2ecf20Sopenharmony_ci}; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_cistruct arm_spe_decoder *arm_spe_decoder_new(struct arm_spe_params *params); 788c2ecf20Sopenharmony_civoid arm_spe_decoder_free(struct arm_spe_decoder *decoder); 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ciint arm_spe_decode(struct arm_spe_decoder *decoder); 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci#endif 83