68 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0-or-later
 | |
| /*
 | |
|  * Copyright 2016, Cyril Bur, IBM Corp.
 | |
|  *
 | |
|  * Syscalls can be performed provided the transactions are suspended.
 | |
|  * The exec() class of syscall is unique as a new process is loaded.
 | |
|  *
 | |
|  * It makes little sense for after an exec() call for the previously
 | |
|  * suspended transaction to still exist.
 | |
|  */
 | |
| 
 | |
| #define _GNU_SOURCE
 | |
| #include <errno.h>
 | |
| #include <inttypes.h>
 | |
| #include <libgen.h>
 | |
| #include <pthread.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| #include "utils.h"
 | |
| #include "tm.h"
 | |
| 
 | |
| static char *path;
 | |
| 
 | |
| static int test_exec(void)
 | |
| {
 | |
| 	SKIP_IF(!have_htm());
 | |
| 	SKIP_IF(htm_is_synthetic());
 | |
| 
 | |
| 	asm __volatile__(
 | |
| 		"tbegin.;"
 | |
| 		"blt    1f; "
 | |
| 		"tsuspend.;"
 | |
| 		"1: ;"
 | |
| 		: : : "memory");
 | |
| 
 | |
| 	execl(path, "tm-exec", "--child", NULL);
 | |
| 
 | |
| 	/* Shouldn't get here */
 | |
| 	perror("execl() failed");
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static int after_exec(void)
 | |
| {
 | |
| 	asm __volatile__(
 | |
| 		"tbegin.;"
 | |
| 		"blt    1f;"
 | |
| 		"tsuspend.;"
 | |
| 		"1: ;"
 | |
| 		: : : "memory");
 | |
| 
 | |
| 	FAIL_IF(failure_is_nesting());
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int main(int argc, char *argv[])
 | |
| {
 | |
| 	path = argv[0];
 | |
| 
 | |
| 	if (argc > 1 && strcmp(argv[1], "--child") == 0)
 | |
| 		return after_exec();
 | |
| 
 | |
| 	return test_harness(test_exec, "tm_exec");
 | |
| }
 |