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 31 asm __volatile__( 32 "tbegin.;" 33 "blt 1f; " 34 "tsuspend.;" 35 "1: ;" 36 : : : "memory"); 37 38 execl(path, "tm-exec", "--child", NULL); 39 40 /* Shouldn't get here */ 41 perror("execl() failed"); 42 return 1; 43} 44 45static int after_exec(void) 46{ 47 asm __volatile__( 48 "tbegin.;" 49 "blt 1f;" 50 "tsuspend.;" 51 "1: ;" 52 : : : "memory"); 53 54 FAIL_IF(failure_is_nesting()); 55 return 0; 56} 57 58int main(int argc, char *argv[]) 59{ 60 path = argv[0]; 61 62 if (argc > 1 && strcmp(argv[1], "--child") == 0) 63 return after_exec(); 64 65 return test_harness(test_exec, "tm_exec"); 66} 67