Lines Matching full:record
111 void (*ds_synth)(const struct arm_spe_record *record,
322 static struct simd_flags arm_spe__synth_simd_flags(const struct arm_spe_record *record) in arm_spe__synth_simd_flags() argument
326 if ((record->op & ARM_SPE_OP_LDST) && (record->op & ARM_SPE_OP_SVE_LDST)) in arm_spe__synth_simd_flags()
329 if ((record->op & ARM_SPE_OP_OTHER) && (record->op & ARM_SPE_OP_SVE_OTHER)) in arm_spe__synth_simd_flags()
332 if (record->type & ARM_SPE_SVE_PARTIAL_PRED) in arm_spe__synth_simd_flags()
335 if (record->type & ARM_SPE_SVE_EMPTY_PRED) in arm_spe__synth_simd_flags()
346 struct arm_spe_record *record = &speq->decoder->record; in arm_spe_prep_sample() local
349 sample->time = tsc_to_perf_time(record->timestamp, &spe->tc); in arm_spe_prep_sample()
351 sample->ip = record->from_ip; in arm_spe_prep_sample()
357 sample->simd_flags = arm_spe__synth_simd_flags(record); in arm_spe_prep_sample()
367 struct arm_spe_record *record = &speq->decoder->record; in arm_spe__prep_branch_stack() local
372 bool have_pbt = last_branch_sz >= (have_tgt + 1U) && record->prev_br_tgt; in arm_spe__prep_branch_stack()
384 bstack->entries[i].from = record->from_ip; in arm_spe__prep_branch_stack()
385 bstack->entries[i].to = record->to_ip; in arm_spe__prep_branch_stack()
390 if (record->op & ARM_SPE_OP_BR_CR_BL) { in arm_spe__prep_branch_stack()
391 if (record->op & ARM_SPE_OP_BR_COND) in arm_spe__prep_branch_stack()
399 } else if (record->op & ARM_SPE_OP_BR_CR_RET || in arm_spe__prep_branch_stack()
400 record->op & ARM_SPE_OP_BR_INDIRECT) { in arm_spe__prep_branch_stack()
401 if (record->op & ARM_SPE_OP_BR_COND) in arm_spe__prep_branch_stack()
405 } else if (record->op & ARM_SPE_OP_BR_CR_NON_BL_RET) { in arm_spe__prep_branch_stack()
406 if (record->op & ARM_SPE_OP_BR_COND) in arm_spe__prep_branch_stack()
411 if (record->op & ARM_SPE_OP_BR_COND) in arm_spe__prep_branch_stack()
417 if (record->type & ARM_SPE_BRANCH_MISS) { in arm_spe__prep_branch_stack()
425 if (record->type & ARM_SPE_BRANCH_NOT_TAKEN) in arm_spe__prep_branch_stack()
428 if (record->type & ARM_SPE_IN_TXN) in arm_spe__prep_branch_stack()
431 bs_flags->cycles = min(record->latency, 0xFFFFU); in arm_spe__prep_branch_stack()
438 bstack->entries[i].to = record->prev_br_tgt; in arm_spe__prep_branch_stack()
477 struct arm_spe_record *record = &speq->decoder->record; in arm_spe__synth_mem_sample() local
487 sample.addr = record->virt_addr; in arm_spe__synth_mem_sample()
488 sample.phys_addr = record->phys_addr; in arm_spe__synth_mem_sample()
490 sample.weight = record->latency; in arm_spe__synth_mem_sample()
501 struct arm_spe_record *record = &speq->decoder->record; in arm_spe__synth_branch_sample() local
511 sample.addr = record->to_ip; in arm_spe__synth_branch_sample()
512 sample.weight = record->latency; in arm_spe__synth_branch_sample()
525 struct arm_spe_record *record = &speq->decoder->record; in arm_spe__synth_instruction_sample() local
543 sample.addr = record->to_ip; in arm_spe__synth_instruction_sample()
544 sample.phys_addr = record->phys_addr; in arm_spe__synth_instruction_sample()
547 sample.weight = record->latency; in arm_spe__synth_instruction_sample()
576 const struct arm_spe_record *record = &speq->decoder->record; in arm_spe__sample_flags() local
579 if (record->op & ARM_SPE_OP_BRANCH_ERET) { in arm_spe__sample_flags()
582 if (record->type & ARM_SPE_BRANCH_MISS) in arm_spe__sample_flags()
585 if (record->type & ARM_SPE_BRANCH_NOT_TAKEN) in arm_spe__sample_flags()
588 if (record->type & ARM_SPE_IN_TXN) in arm_spe__sample_flags()
591 if (record->op & ARM_SPE_OP_BR_COND) in arm_spe__sample_flags()
594 if (record->op & ARM_SPE_OP_BR_CR_BL) in arm_spe__sample_flags()
596 else if (record->op & ARM_SPE_OP_BR_CR_RET) in arm_spe__sample_flags()
602 else if (record->op & ARM_SPE_OP_BR_INDIRECT) in arm_spe__sample_flags()
607 static void arm_spe__synth_data_source_common(const struct arm_spe_record *record, in arm_spe__synth_data_source_common() argument
622 if (record->op & ARM_SPE_OP_ST) { in arm_spe__synth_data_source_common()
629 switch (record->source) { in arm_spe__synth_data_source_common()
687 static void arm_spe__synth_data_source_ampereone(const struct arm_spe_record *record, in arm_spe__synth_data_source_ampereone() argument
692 switch (record->source) { in arm_spe__synth_data_source_ampereone()
713 record->source); in arm_spe__synth_data_source_ampereone()
717 common_record.op = record->op; in arm_spe__synth_data_source_ampereone()
726 static void arm_spe__synth_memory_level(const struct arm_spe_record *record, in arm_spe__synth_memory_level() argument
729 if (record->type & (ARM_SPE_LLC_ACCESS | ARM_SPE_LLC_MISS)) { in arm_spe__synth_memory_level()
732 if (record->type & ARM_SPE_LLC_MISS) in arm_spe__synth_memory_level()
736 } else if (record->type & (ARM_SPE_L1D_ACCESS | ARM_SPE_L1D_MISS)) { in arm_spe__synth_memory_level()
739 if (record->type & ARM_SPE_L1D_MISS) in arm_spe__synth_memory_level()
745 if (record->type & ARM_SPE_REMOTE_ACCESS) in arm_spe__synth_memory_level()
750 const struct arm_spe_record *record, in arm_spe__synth_ds() argument
762 pr_warning_once("Old SPE metadata, re-record to improve decode accuracy\n"); in arm_spe__synth_ds()
790 data_source_handles[i].ds_synth(record, data_src); in arm_spe__synth_ds()
799 const struct arm_spe_record *record) in arm_spe__synth_data_source() argument
804 if (!is_ldst_op(record->op)) in arm_spe__synth_data_source()
807 if (record->op & ARM_SPE_OP_LD) in arm_spe__synth_data_source()
809 else if (record->op & ARM_SPE_OP_ST) in arm_spe__synth_data_source()
814 if (!arm_spe__synth_ds(speq, record, &data_src)) in arm_spe__synth_data_source()
815 arm_spe__synth_memory_level(record, &data_src); in arm_spe__synth_data_source()
817 if (record->type & (ARM_SPE_TLB_ACCESS | ARM_SPE_TLB_MISS)) { in arm_spe__synth_data_source()
820 if (record->type & ARM_SPE_TLB_MISS) in arm_spe__synth_data_source()
831 const struct arm_spe_record *record = &speq->decoder->record; in arm_spe_sample() local
837 data_src = arm_spe__synth_data_source(speq, record); in arm_spe_sample()
840 if (record->type & ARM_SPE_L1D_MISS) { in arm_spe_sample()
847 if (record->type & ARM_SPE_L1D_ACCESS) { in arm_spe_sample()
856 if (record->type & ARM_SPE_LLC_MISS) { in arm_spe_sample()
863 if (record->type & ARM_SPE_LLC_ACCESS) { in arm_spe_sample()
872 if (record->type & ARM_SPE_TLB_MISS) { in arm_spe_sample()
879 if (record->type & ARM_SPE_TLB_ACCESS) { in arm_spe_sample()
891 if (spe->sample_branch && (record->op & ARM_SPE_OP_BRANCH_ERET)) { in arm_spe_sample()
898 (record->type & ARM_SPE_REMOTE_ACCESS)) { in arm_spe_sample()
906 * When data_src is zero it means the record is not a memory operation, in arm_spe_sample()
909 if (spe->sample_memory && is_ldst_op(record->op)) { in arm_spe_sample()
927 struct arm_spe_record *record; in arm_spe_run_decoder() local
936 * based the record to synthesize sample; but here the flow is in arm_spe_run_decoder()
942 * has decoded trace data and generated a record, but the record in arm_spe_run_decoder()
944 * to synthesize sample for the left record. in arm_spe_run_decoder()
945 * 2. After decoding trace data, it needs to compare the record in arm_spe_run_decoder()
946 * timestamp with the coming perf event, if the record timestamp in arm_spe_run_decoder()
948 * record into auxtrace heap, thus the record can be deferred to in arm_spe_run_decoder()
957 record = &speq->decoder->record; in arm_spe_run_decoder()
958 if (!spe->timeless_decoding && record->context_id != (u64)-1) { in arm_spe_run_decoder()
959 ret = arm_spe_set_tid(speq, record->context_id); in arm_spe_run_decoder()
983 record = &speq->decoder->record; in arm_spe_run_decoder()
985 /* Update timestamp for the last record */ in arm_spe_run_decoder()
986 if (record->timestamp > speq->timestamp) in arm_spe_run_decoder()
987 speq->timestamp = record->timestamp; in arm_spe_run_decoder()
1008 struct arm_spe_record *record; in arm_spe__setup_queue() local
1038 record = &speq->decoder->record; in arm_spe__setup_queue()
1040 speq->timestamp = record->timestamp; in arm_spe__setup_queue()