7f69c899d23196d978cc274c4390b6e40419cdd7
[ambi/valgrind.git] / none / tests / s390x / test_clone.c
1 #include <sys/syscall.h>
2 #include <linux/wait.h>
3 #include <sched.h>
4 #include "test.h"
5
6 char stack[4096];
7
8 void saynum(int num)
9 {
10    char *nums="012345679";
11    say(nums+num,1);
12 }
13
14 void test_thread(void *arg)
15 {
16    mysleep(0,50000);
17    SAY("thread_start");
18    mysleep(0,50000);
19    SAY("thread_end");
20    EXIT(1);
21 }
22
23 void test_child(void)
24 {
25    mysleep(0,50000);
26    SAY("child_start");
27    mysleep(0,50000);
28    SAY("child_end");
29    EXIT(1);
30 }
31
32
33 void forkish(void)
34 {
35    int pid;
36    int status;
37
38    asm volatile( "lghi 2, 0\n"
39                  "lgr  3, 0\n"
40                  "svc  120\n"      // CLONE
41                  "lr   %0, 2\n"
42                  :"=d" (pid)
43                  :: "2", "3", "cc");
44    if (!pid)
45       test_child();
46    SAY("MAIN_proc");
47    asm volatile( "lr 2, %2\n"
48                  "lgr 3,%1\n"
49                  "lgr 4,%3\n"
50                  "lghi 5,0\n"
51                  "svc 114\n"       // WAIT4
52                  : "=m" (status)
53                  : "d" (&status), "d" (pid), "d" (__WALL)
54                  : "2","3","4","5", "cc");
55    say("wait returned:",14);
56    saynum(status >> 8);
57    say("\n",1);
58    SAY("MAIN_proc_end");
59 }
60
61 void threadish(void)
62 {
63    register long ret   asm("2") = (unsigned long) stack+4096-160;
64    register long flags asm("3") = CLONE_THREAD | CLONE_SIGHAND |
65                                   CLONE_PARENT | CLONE_VM |
66                                   CLONE_FILES  | CLONE_FS |
67                                   CLONE_PTRACE;
68
69    asm volatile( "svc 120\n"
70                  :"+d"(ret)
71                  : "d"(flags)
72                  : "cc", "memory");
73    if (!ret)
74       test_thread(0);
75    SAY("MAIN_thread");
76    mysleep(0,10000);
77    SAY("MAIN_thread_end");
78 }
79
80 int main(void)
81 {
82    forkish();
83    threadish();
84    EXIT(1);
85 }