forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.2 KiB
67 lines
1.2 KiB
// 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"); |
|
}
|
|
|