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

dscr_sysfs_thread_test.c (1699B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * POWER Data Stream Control Register (DSCR) sysfs thread test
      4 *
      5 * This test updates the system wide DSCR default value through
      6 * sysfs interface which should then update all the CPU specific
      7 * DSCR default values which must also be then visible to threads
      8 * executing on individual CPUs on the system.
      9 *
     10 * Copyright 2015, Anshuman Khandual, IBM Corporation.
     11 */
     12#define _GNU_SOURCE
     13#include "dscr.h"
     14
     15static int test_thread_dscr(unsigned long val)
     16{
     17	unsigned long cur_dscr, cur_dscr_usr;
     18
     19	cur_dscr = get_dscr();
     20	cur_dscr_usr = get_dscr_usr();
     21
     22	if (val != cur_dscr) {
     23		printf("[cpu %d] Kernel DSCR should be %ld but is %ld\n",
     24					sched_getcpu(), val, cur_dscr);
     25		return 1;
     26	}
     27
     28	if (val != cur_dscr_usr) {
     29		printf("[cpu %d] User DSCR should be %ld but is %ld\n",
     30					sched_getcpu(), val, cur_dscr_usr);
     31		return 1;
     32	}
     33	return 0;
     34}
     35
     36static int check_cpu_dscr_thread(unsigned long val)
     37{
     38	cpu_set_t mask;
     39	int cpu;
     40
     41	for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {
     42		CPU_ZERO(&mask);
     43		CPU_SET(cpu, &mask);
     44		if (sched_setaffinity(0, sizeof(mask), &mask))
     45			continue;
     46
     47		if (test_thread_dscr(val))
     48			return 1;
     49	}
     50	return 0;
     51
     52}
     53
     54int dscr_sysfs_thread(void)
     55{
     56	unsigned long orig_dscr_default;
     57	int i, j;
     58
     59	SKIP_IF(!have_hwcap2(PPC_FEATURE2_DSCR));
     60
     61	orig_dscr_default = get_default_dscr();
     62	for (i = 0; i < COUNT; i++) {
     63		for (j = 0; j < DSCR_MAX; j++) {
     64			set_default_dscr(j);
     65			if (check_cpu_dscr_thread(j))
     66				goto fail;
     67		}
     68	}
     69	set_default_dscr(orig_dscr_default);
     70	return 0;
     71fail:
     72	set_default_dscr(orig_dscr_default);
     73	return 1;
     74}
     75
     76int main(int argc, char *argv[])
     77{
     78	return test_harness(dscr_sysfs_thread, "dscr_sysfs_thread_test");
     79}