|
@@ -0,0 +1,42 @@
|
|
|
+/*
|
|
|
+ * Copyright 2015, Michael Neuling, IBM Corp.
|
|
|
+ * Licensed under GPLv2.
|
|
|
+ *
|
|
|
+ * Edited: Rashmica Gupta, Nov 2015
|
|
|
+ *
|
|
|
+ * This test does a fork syscall inside a transaction. Basic sniff test
|
|
|
+ * to see if we can enter the kernel during a transaction.
|
|
|
+ */
|
|
|
+
|
|
|
+#include <errno.h>
|
|
|
+#include <inttypes.h>
|
|
|
+#include <pthread.h>
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include <unistd.h>
|
|
|
+
|
|
|
+#include "utils.h"
|
|
|
+#include "tm.h"
|
|
|
+
|
|
|
+int test_fork(void)
|
|
|
+{
|
|
|
+ SKIP_IF(!have_htm());
|
|
|
+
|
|
|
+ asm __volatile__(
|
|
|
+ "tbegin.;"
|
|
|
+ "blt 1f; "
|
|
|
+ "li 0, 2;" /* fork syscall */
|
|
|
+ "sc ;"
|
|
|
+ "tend.;"
|
|
|
+ "1: ;"
|
|
|
+ : : : "memory", "r0");
|
|
|
+ /* If we reach here, we've passed. Otherwise we've probably crashed
|
|
|
+ * the kernel */
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int main(int argc, char *argv[])
|
|
|
+{
|
|
|
+ return test_harness(test_fork, "tm_fork");
|
|
|
+}
|