brintos

brintos / linux-shallow public Read only

0
0
Text · 1.2 KiB · c59919d Raw
68 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*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 previously9 * suspended transaction to still exist.10 */11 12#define _GNU_SOURCE13#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}68