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