1*faa64ddcSKajol Jain // SPDX-License-Identifier: GPL-2.0-only 2*faa64ddcSKajol Jain /* 3*faa64ddcSKajol Jain * Copyright 2022, Kajol Jain, IBM Corp. 4*faa64ddcSKajol Jain */ 5*faa64ddcSKajol Jain 6*faa64ddcSKajol Jain #include <stdio.h> 7*faa64ddcSKajol Jain #include <stdlib.h> 8*faa64ddcSKajol Jain 9*faa64ddcSKajol Jain #include "../event.h" 10*faa64ddcSKajol Jain #include "misc.h" 11*faa64ddcSKajol Jain #include "utils.h" 12*faa64ddcSKajol Jain 13*faa64ddcSKajol Jain extern void thirty_two_instruction_loop(int loops); 14*faa64ddcSKajol Jain 15*faa64ddcSKajol Jain /* Instructions */ 16*faa64ddcSKajol Jain #define EventCode 0x500fa 17*faa64ddcSKajol Jain 18*faa64ddcSKajol Jain /* ifm field for any branch mode */ 19*faa64ddcSKajol Jain #define IFM_ANY_BRANCH 0x0 20*faa64ddcSKajol Jain 21*faa64ddcSKajol Jain /* 22*faa64ddcSKajol Jain * A perf sampling test for mmcra 23*faa64ddcSKajol Jain * field: ifm for bhrb any call. 24*faa64ddcSKajol Jain */ mmcra_bhrb_any_test(void)25*faa64ddcSKajol Jainstatic int mmcra_bhrb_any_test(void) 26*faa64ddcSKajol Jain { 27*faa64ddcSKajol Jain struct event event; 28*faa64ddcSKajol Jain u64 *intr_regs; 29*faa64ddcSKajol Jain 30*faa64ddcSKajol Jain /* Check for platform support for the test */ 31*faa64ddcSKajol Jain SKIP_IF(check_pvr_for_sampling_tests()); 32*faa64ddcSKajol Jain 33*faa64ddcSKajol Jain /* Init the event for the sampling test */ 34*faa64ddcSKajol Jain event_init_sampling(&event, EventCode); 35*faa64ddcSKajol Jain event.attr.sample_regs_intr = platform_extended_mask; 36*faa64ddcSKajol Jain event.attr.sample_type |= PERF_SAMPLE_BRANCH_STACK; 37*faa64ddcSKajol Jain event.attr.branch_sample_type = PERF_SAMPLE_BRANCH_ANY; 38*faa64ddcSKajol Jain event.attr.exclude_kernel = 1; 39*faa64ddcSKajol Jain 40*faa64ddcSKajol Jain FAIL_IF(event_open(&event)); 41*faa64ddcSKajol Jain event.mmap_buffer = event_sample_buf_mmap(event.fd, 1); 42*faa64ddcSKajol Jain 43*faa64ddcSKajol Jain FAIL_IF(event_enable(&event)); 44*faa64ddcSKajol Jain 45*faa64ddcSKajol Jain /* workload to make the event overflow */ 46*faa64ddcSKajol Jain thirty_two_instruction_loop(10000); 47*faa64ddcSKajol Jain 48*faa64ddcSKajol Jain FAIL_IF(event_disable(&event)); 49*faa64ddcSKajol Jain 50*faa64ddcSKajol Jain intr_regs = get_intr_regs(&event, event.mmap_buffer); 51*faa64ddcSKajol Jain 52*faa64ddcSKajol Jain /* Check for intr_regs */ 53*faa64ddcSKajol Jain FAIL_IF(!intr_regs); 54*faa64ddcSKajol Jain 55*faa64ddcSKajol Jain /* Verify that ifm bit is set properly in MMCRA */ 56*faa64ddcSKajol Jain FAIL_IF(get_mmcra_ifm(get_reg_value(intr_regs, "MMCRA"), 5) != IFM_ANY_BRANCH); 57*faa64ddcSKajol Jain 58*faa64ddcSKajol Jain event_close(&event); 59*faa64ddcSKajol Jain return 0; 60*faa64ddcSKajol Jain } 61*faa64ddcSKajol Jain main(void)62*faa64ddcSKajol Jainint main(void) 63*faa64ddcSKajol Jain { 64*faa64ddcSKajol Jain return test_harness(mmcra_bhrb_any_test, "mmcra_bhrb_any_test"); 65*faa64ddcSKajol Jain } 66