18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2016, Cyril Bur, IBM Corp. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Syscalls can be performed provided the transactions are suspended. 68c2ecf20Sopenharmony_ci * The exec() class of syscall is unique as a new process is loaded. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * It makes little sense for after an exec() call for the previously 98c2ecf20Sopenharmony_ci * suspended transaction to still exist. 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#define _GNU_SOURCE 138c2ecf20Sopenharmony_ci#include <errno.h> 148c2ecf20Sopenharmony_ci#include <inttypes.h> 158c2ecf20Sopenharmony_ci#include <libgen.h> 168c2ecf20Sopenharmony_ci#include <pthread.h> 178c2ecf20Sopenharmony_ci#include <stdio.h> 188c2ecf20Sopenharmony_ci#include <stdlib.h> 198c2ecf20Sopenharmony_ci#include <string.h> 208c2ecf20Sopenharmony_ci#include <unistd.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#include "utils.h" 238c2ecf20Sopenharmony_ci#include "tm.h" 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistatic char *path; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic int test_exec(void) 288c2ecf20Sopenharmony_ci{ 298c2ecf20Sopenharmony_ci SKIP_IF(!have_htm()); 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci asm __volatile__( 328c2ecf20Sopenharmony_ci "tbegin.;" 338c2ecf20Sopenharmony_ci "blt 1f; " 348c2ecf20Sopenharmony_ci "tsuspend.;" 358c2ecf20Sopenharmony_ci "1: ;" 368c2ecf20Sopenharmony_ci : : : "memory"); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci execl(path, "tm-exec", "--child", NULL); 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci /* Shouldn't get here */ 418c2ecf20Sopenharmony_ci perror("execl() failed"); 428c2ecf20Sopenharmony_ci return 1; 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic int after_exec(void) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci asm __volatile__( 488c2ecf20Sopenharmony_ci "tbegin.;" 498c2ecf20Sopenharmony_ci "blt 1f;" 508c2ecf20Sopenharmony_ci "tsuspend.;" 518c2ecf20Sopenharmony_ci "1: ;" 528c2ecf20Sopenharmony_ci : : : "memory"); 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci FAIL_IF(failure_is_nesting()); 558c2ecf20Sopenharmony_ci return 0; 568c2ecf20Sopenharmony_ci} 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ciint main(int argc, char *argv[]) 598c2ecf20Sopenharmony_ci{ 608c2ecf20Sopenharmony_ci path = argv[0]; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci if (argc > 1 && strcmp(argv[1], "--child") == 0) 638c2ecf20Sopenharmony_ci return after_exec(); 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci return test_harness(test_exec, "tm_exec"); 668c2ecf20Sopenharmony_ci} 67