1*2ac05f8fSAthira Rajeev // SPDX-License-Identifier: GPL-2.0-only 2*2ac05f8fSAthira Rajeev /* 3*2ac05f8fSAthira Rajeev * Copyright 2022, Athira Rajeev, IBM Corp. 4*2ac05f8fSAthira Rajeev */ 5*2ac05f8fSAthira Rajeev 6*2ac05f8fSAthira Rajeev #include <stdio.h> 7*2ac05f8fSAthira Rajeev #include <stdlib.h> 8*2ac05f8fSAthira Rajeev 9*2ac05f8fSAthira Rajeev #include "../event.h" 10*2ac05f8fSAthira Rajeev #include "misc.h" 11*2ac05f8fSAthira Rajeev #include "utils.h" 12*2ac05f8fSAthira Rajeev 13*2ac05f8fSAthira Rajeev /* 14*2ac05f8fSAthira Rajeev * A perf sampling test for making sure 15*2ac05f8fSAthira Rajeev * enabling branch stack doesn't crash in any 16*2ac05f8fSAthira Rajeev * environment, say: 17*2ac05f8fSAthira Rajeev * - With generic compat PMU 18*2ac05f8fSAthira Rajeev * - without any PMU registered 19*2ac05f8fSAthira Rajeev * - With platform specific PMU 20*2ac05f8fSAthira Rajeev * A fix for bhrb sampling crash was added in kernel 21*2ac05f8fSAthira Rajeev * via commit: b460b512417a ("powerpc/perf: Fix crashes 22*2ac05f8fSAthira Rajeev * with generic_compat_pmu & BHRB") 23*2ac05f8fSAthira Rajeev * 24*2ac05f8fSAthira Rajeev * This testcase exercises this code by doing branch 25*2ac05f8fSAthira Rajeev * stack enable for software event. s/w event is used 26*2ac05f8fSAthira Rajeev * since software event will work even in platform 27*2ac05f8fSAthira Rajeev * without PMU. 28*2ac05f8fSAthira Rajeev */ bhrb_no_crash_wo_pmu_test(void)29*2ac05f8fSAthira Rajeevstatic int bhrb_no_crash_wo_pmu_test(void) 30*2ac05f8fSAthira Rajeev { 31*2ac05f8fSAthira Rajeev struct event event; 32*2ac05f8fSAthira Rajeev 33*2ac05f8fSAthira Rajeev /* 34*2ac05f8fSAthira Rajeev * Init the event for the sampling test. 35*2ac05f8fSAthira Rajeev * This uses software event which works on 36*2ac05f8fSAthira Rajeev * any platform. 37*2ac05f8fSAthira Rajeev */ 38*2ac05f8fSAthira Rajeev event_init_opts(&event, 0, PERF_TYPE_SOFTWARE, "cycles"); 39*2ac05f8fSAthira Rajeev 40*2ac05f8fSAthira Rajeev event.attr.sample_period = 1000; 41*2ac05f8fSAthira Rajeev event.attr.sample_type = PERF_SAMPLE_BRANCH_STACK; 42*2ac05f8fSAthira Rajeev event.attr.disabled = 1; 43*2ac05f8fSAthira Rajeev 44*2ac05f8fSAthira Rajeev /* 45*2ac05f8fSAthira Rajeev * Return code of event_open is not 46*2ac05f8fSAthira Rajeev * considered since test just expects no crash from 47*2ac05f8fSAthira Rajeev * using PERF_SAMPLE_BRANCH_STACK. Also for environment 48*2ac05f8fSAthira Rajeev * like generic compat PMU, branch stack is unsupported. 49*2ac05f8fSAthira Rajeev */ 50*2ac05f8fSAthira Rajeev event_open(&event); 51*2ac05f8fSAthira Rajeev 52*2ac05f8fSAthira Rajeev event_close(&event); 53*2ac05f8fSAthira Rajeev return 0; 54*2ac05f8fSAthira Rajeev } 55*2ac05f8fSAthira Rajeev main(void)56*2ac05f8fSAthira Rajeevint main(void) 57*2ac05f8fSAthira Rajeev { 58*2ac05f8fSAthira Rajeev return test_harness(bhrb_no_crash_wo_pmu_test, "bhrb_no_crash_wo_pmu_test"); 59*2ac05f8fSAthira Rajeev } 60