162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2015, Michael Neuling, IBM Corp. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Edited: Rashmica Gupta, Nov 2015 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This test does a fork syscall inside a transaction. Basic sniff test 862306a36Sopenharmony_ci * to see if we can enter the kernel during a transaction. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <errno.h> 1262306a36Sopenharmony_ci#include <inttypes.h> 1362306a36Sopenharmony_ci#include <pthread.h> 1462306a36Sopenharmony_ci#include <stdio.h> 1562306a36Sopenharmony_ci#include <stdlib.h> 1662306a36Sopenharmony_ci#include <unistd.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "utils.h" 1962306a36Sopenharmony_ci#include "tm.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciint test_fork(void) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci SKIP_IF(!have_htm()); 2462306a36Sopenharmony_ci SKIP_IF(htm_is_synthetic()); 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci asm __volatile__( 2762306a36Sopenharmony_ci "tbegin.;" 2862306a36Sopenharmony_ci "blt 1f; " 2962306a36Sopenharmony_ci "li 0, 2;" /* fork syscall */ 3062306a36Sopenharmony_ci "sc ;" 3162306a36Sopenharmony_ci "tend.;" 3262306a36Sopenharmony_ci "1: ;" 3362306a36Sopenharmony_ci : : : "memory", "r0"); 3462306a36Sopenharmony_ci /* If we reach here, we've passed. Otherwise we've probably crashed 3562306a36Sopenharmony_ci * the kernel */ 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci return 0; 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciint main(int argc, char *argv[]) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci return test_harness(test_fork, "tm_fork"); 4362306a36Sopenharmony_ci} 44