1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _XOPEN_SOURCE 600
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _BSD_SOURCE
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define _GNU_SOURCE
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sched.h>
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h>
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "tests/sys_mman.h"
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/syscall.h>
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/wait.h>
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h>
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "valgrind.h"
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define STACK_SIZE 8192
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef CLONE_THREAD
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLONE_THREAD	0x00010000	/* Same thread group? */
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int thread_main(void *arg)
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char buffer[1024];
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   memset( buffer, 1, sizeof( buffer ) );
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sleep(2); /* ppc64-linux hack */
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return memchr( buffer, 1, sizeof( buffer ) ) == NULL;
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char **argv)
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   void *stack;
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int stackid __attribute__((unused));
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pid_t pid;
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* "2*" is a ppc64-linux hack */
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ( ( stack = mmap( NULL, 2* STACK_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 ) ) == MAP_FAILED )
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror( "mmap" );
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit( 1 );
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stackid = VALGRIND_STACK_REGISTER( stack, stack + STACK_SIZE );
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ( ( pid = clone( thread_main, stack + STACK_SIZE, CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|SIGCHLD, NULL ) ) == -1 )
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror( "clone" );
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit( 1 );
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sleep( 1 );
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   exit( 0 );
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
58