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

membarrier_test_multi_thread.c (1707B)


      1// SPDX-License-Identifier: GPL-2.0
      2#define _GNU_SOURCE
      3#include <linux/membarrier.h>
      4#include <syscall.h>
      5#include <stdio.h>
      6#include <errno.h>
      7#include <string.h>
      8#include <pthread.h>
      9
     10#include "membarrier_test_impl.h"
     11
     12static int thread_ready, thread_quit;
     13static pthread_mutex_t test_membarrier_thread_mutex =
     14	PTHREAD_MUTEX_INITIALIZER;
     15static pthread_cond_t test_membarrier_thread_cond =
     16	PTHREAD_COND_INITIALIZER;
     17
     18void *test_membarrier_thread(void *arg)
     19{
     20	pthread_mutex_lock(&test_membarrier_thread_mutex);
     21	thread_ready = 1;
     22	pthread_cond_broadcast(&test_membarrier_thread_cond);
     23	pthread_mutex_unlock(&test_membarrier_thread_mutex);
     24
     25	pthread_mutex_lock(&test_membarrier_thread_mutex);
     26	while (!thread_quit)
     27		pthread_cond_wait(&test_membarrier_thread_cond,
     28				  &test_membarrier_thread_mutex);
     29	pthread_mutex_unlock(&test_membarrier_thread_mutex);
     30
     31	return NULL;
     32}
     33
     34static int test_mt_membarrier(void)
     35{
     36	int i;
     37	pthread_t test_thread;
     38
     39	pthread_create(&test_thread, NULL,
     40		       test_membarrier_thread, NULL);
     41
     42	pthread_mutex_lock(&test_membarrier_thread_mutex);
     43	while (!thread_ready)
     44		pthread_cond_wait(&test_membarrier_thread_cond,
     45				  &test_membarrier_thread_mutex);
     46	pthread_mutex_unlock(&test_membarrier_thread_mutex);
     47
     48	test_membarrier_fail();
     49
     50	test_membarrier_success();
     51
     52	pthread_mutex_lock(&test_membarrier_thread_mutex);
     53	thread_quit = 1;
     54	pthread_cond_broadcast(&test_membarrier_thread_cond);
     55	pthread_mutex_unlock(&test_membarrier_thread_mutex);
     56
     57	pthread_join(test_thread, NULL);
     58
     59	return 0;
     60}
     61
     62int main(int argc, char **argv)
     63{
     64	ksft_print_header();
     65	ksft_set_plan(13);
     66
     67	test_membarrier_query();
     68
     69	/* Multi-threaded */
     70	test_mt_membarrier();
     71
     72	return ksft_exit_pass();
     73}