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}