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

tm-exec.c (1211B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Copyright 2016, Cyril Bur, IBM Corp.
      4 *
      5 * Syscalls can be performed provided the transactions are suspended.
      6 * The exec() class of syscall is unique as a new process is loaded.
      7 *
      8 * It makes little sense for after an exec() call for the previously
      9 * suspended transaction to still exist.
     10 */
     11
     12#define _GNU_SOURCE
     13#include <errno.h>
     14#include <inttypes.h>
     15#include <libgen.h>
     16#include <pthread.h>
     17#include <stdio.h>
     18#include <stdlib.h>
     19#include <string.h>
     20#include <unistd.h>
     21
     22#include "utils.h"
     23#include "tm.h"
     24
     25static char *path;
     26
     27static int test_exec(void)
     28{
     29	SKIP_IF(!have_htm());
     30	SKIP_IF(htm_is_synthetic());
     31
     32	asm __volatile__(
     33		"tbegin.;"
     34		"blt    1f; "
     35		"tsuspend.;"
     36		"1: ;"
     37		: : : "memory");
     38
     39	execl(path, "tm-exec", "--child", NULL);
     40
     41	/* Shouldn't get here */
     42	perror("execl() failed");
     43	return 1;
     44}
     45
     46static int after_exec(void)
     47{
     48	asm __volatile__(
     49		"tbegin.;"
     50		"blt    1f;"
     51		"tsuspend.;"
     52		"1: ;"
     53		: : : "memory");
     54
     55	FAIL_IF(failure_is_nesting());
     56	return 0;
     57}
     58
     59int main(int argc, char *argv[])
     60{
     61	path = argv[0];
     62
     63	if (argc > 1 && strcmp(argv[1], "--child") == 0)
     64		return after_exec();
     65
     66	return test_harness(test_exec, "tm_exec");
     67}