cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

multi_ebb_procs_test.c (1888B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright 2014, Michael Ellerman, IBM Corp.
      4 */
      5
      6#include <stdbool.h>
      7#include <stdio.h>
      8#include <stdlib.h>
      9#include <signal.h>
     10
     11#include "ebb.h"
     12
     13
     14/*
     15 * Test running multiple EBB using processes at once on a single CPU. They
     16 * should all run happily without interfering with each other.
     17 */
     18
     19static bool child_should_exit;
     20
     21static void sigint_handler(int signal)
     22{
     23	child_should_exit = true;
     24}
     25
     26struct sigaction sigint_action = {
     27	.sa_handler = sigint_handler,
     28};
     29
     30static int cycles_child(void)
     31{
     32	struct event event;
     33
     34	if (sigaction(SIGINT, &sigint_action, NULL)) {
     35		perror("sigaction");
     36		return 1;
     37	}
     38
     39	event_init_named(&event, 0x1001e, "cycles");
     40	event_leader_ebb_init(&event);
     41
     42	event.attr.exclude_kernel = 1;
     43	event.attr.exclude_hv = 1;
     44	event.attr.exclude_idle = 1;
     45
     46	FAIL_IF(event_open(&event));
     47
     48	ebb_enable_pmc_counting(1);
     49	setup_ebb_handler(standard_ebb_callee);
     50	ebb_global_enable();
     51
     52	FAIL_IF(ebb_event_enable(&event));
     53
     54	mtspr(SPRN_PMC1, pmc_sample_period(sample_period));
     55
     56	while (!child_should_exit) {
     57		FAIL_IF(core_busy_loop());
     58		FAIL_IF(ebb_check_mmcr0());
     59	}
     60
     61	ebb_global_disable();
     62	ebb_freeze_pmcs();
     63
     64	dump_summary_ebb_state();
     65
     66	event_close(&event);
     67
     68	FAIL_IF(ebb_state.stats.ebb_count == 0);
     69
     70	return 0;
     71}
     72
     73#define NR_CHILDREN	4
     74
     75int multi_ebb_procs(void)
     76{
     77	pid_t pids[NR_CHILDREN];
     78	int cpu, rc, i;
     79
     80	SKIP_IF(!ebb_is_supported());
     81
     82	cpu = pick_online_cpu();
     83	FAIL_IF(cpu < 0);
     84	FAIL_IF(bind_to_cpu(cpu));
     85
     86	for (i = 0; i < NR_CHILDREN; i++) {
     87		pids[i] = fork();
     88		if (pids[i] == 0)
     89			exit(cycles_child());
     90	}
     91
     92	/* Have them all run for "a while" */
     93	sleep(10);
     94
     95	rc = 0;
     96	for (i = 0; i < NR_CHILDREN; i++) {
     97		/* Tell them to stop */
     98		kill(pids[i], SIGINT);
     99		/* And wait */
    100		rc |= wait_for_child(pids[i]);
    101	}
    102
    103	return rc;
    104}
    105
    106int main(void)
    107{
    108	return test_harness(multi_ebb_procs, "multi_ebb_procs");
    109}