1133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner/* 2133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * Copyright (C) 2010 The Android Open Source Project 3133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * All rights reserved. 4133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * 5133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * Redistribution and use in source and binary forms, with or without 6133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * modification, are permitted provided that the following conditions 7133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * are met: 8133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * * Redistributions of source code must retain the above copyright 9133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * notice, this list of conditions and the following disclaimer. 10133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * * Redistributions in binary form must reproduce the above copyright 11133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * notice, this list of conditions and the following disclaimer in 12133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * the documentation and/or other materials provided with the 13133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * distribution. 14133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * 15133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner * SUCH DAMAGE. 27133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner */ 2884a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner/* Check that clone() is implemented and properly works 2984a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner */ 30133a37ede3e955093c6004d94496e2cdc2cc1264David 'Digit' Turner#define _GNU_SOURCE 1 3184a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <stdio.h> 3284a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <errno.h> 3384a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <sched.h> 3484a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <unistd.h> 3584a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <signal.h> 3684a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <stdlib.h> 3784a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <sys/ptrace.h> 3884a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <sys/wait.h> 3984a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <stdarg.h> 4084a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#include <string.h> 4184a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner 4284a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turnerstatic int 4384a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turnerclone_child (void *arg) 4484a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner{ 4584a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner errno = 0; 4684a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner ptrace (PTRACE_TRACEME, 0, 0, 0); 4784a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner if (errno != 0) 4884a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner perror ("ptrace"); 4984a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner if (kill (getpid (), SIGSTOP) < 0) 5084a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner perror ("kill"); 5184a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner return 0; 5284a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner} 5384a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner 5484a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#define PAGE_SIZE 4096 5584a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner#define STACK_SIZE (4 * PAGE_SIZE) 5684a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner 5784a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turnerchar clone_stack[STACK_SIZE] __attribute__ ((aligned (PAGE_SIZE))); 5884a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner 5984a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turnerint 6084a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turnermain () 6184a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner{ 6284a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner int pid,child; 6384a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner int status; 6484a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner 6584a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner pid = clone (clone_child, clone_stack + 3 * PAGE_SIZE, 6684a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner CLONE_VM | SIGCHLD, NULL); 6784a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner if (pid < 0) 6884a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner { 6984a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner perror ("clone"); 7084a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner exit (1); 7184a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner } 7284a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner printf ("child pid %d\n", pid); 7384a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner 7484a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner //sleep(20); 7584a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner child = waitpid (pid, &status, 0); 7684a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner printf("waitpid returned %d\n", child); 7784a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner if (child < 0) { 7884a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner perror ("waitpid"); 7984a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner return 1; 8084a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner } 8184a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner printf ("child %d, status 0x%x\n", child, status); 8284a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner return 0; 8384a66d0c8d79857586bad4e3d3010ee44f8f6971David 'Digit' Turner} 84