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

mmcr3_src_test.c (1537B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright 2022, Kajol Jain, IBM Corp.
      4 */
      5
      6#include <stdio.h>
      7#include <stdlib.h>
      8
      9#include "../event.h"
     10#include "misc.h"
     11#include "utils.h"
     12
     13extern void thirty_two_instruction_loop_with_ll_sc(u64 loops, u64 *ll_sc_target);
     14
     15/* The data cache was reloaded from local core's L3 due to a demand load */
     16#define EventCode 0x1340000001c040
     17
     18/*
     19 * A perf sampling test for mmcr3
     20 * fields.
     21 */
     22static int mmcr3_src(void)
     23{
     24	struct event event;
     25	u64 *intr_regs;
     26	u64 dummy;
     27
     28	/* Check for platform support for the test */
     29	SKIP_IF(check_pvr_for_sampling_tests());
     30	SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_1));
     31
     32	/* Init the event for the sampling test */
     33	event_init_sampling(&event, EventCode);
     34	event.attr.sample_regs_intr = platform_extended_mask;
     35	FAIL_IF(event_open(&event));
     36	event.mmap_buffer = event_sample_buf_mmap(event.fd, 1);
     37
     38	FAIL_IF(event_enable(&event));
     39
     40	/* workload to make event overflow */
     41	thirty_two_instruction_loop_with_ll_sc(1000000, &dummy);
     42
     43	FAIL_IF(event_disable(&event));
     44
     45	/* Check for sample count */
     46	FAIL_IF(!collect_samples(event.mmap_buffer));
     47
     48	intr_regs = get_intr_regs(&event, event.mmap_buffer);
     49
     50	/* Check for intr_regs */
     51	FAIL_IF(!intr_regs);
     52
     53	/*
     54	 * Verify that src field of MMCR3 match with
     55	 * corresponding event code field
     56	 */
     57	FAIL_IF(EV_CODE_EXTRACT(event.attr.config, mmcr3_src) !=
     58		get_mmcr3_src(get_reg_value(intr_regs, "MMCR3"), 1));
     59
     60	event_close(&event);
     61	return 0;
     62}
     63
     64int main(void)
     65{
     66	return test_harness(mmcr3_src, "mmcr3_src");
     67}