From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by sourceware.org (Postfix) with ESMTPS id 6A1BF3857C5F for ; Thu, 20 May 2021 18:35:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 6A1BF3857C5F Received: by mail-pj1-x1031.google.com with SMTP id ot16so7665490pjb.3 for ; Thu, 20 May 2021 11:35:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=8esvRKujaUaPes4rxJnOomgX15JC8z6M0b93naaaHXg=; b=j9K2x5ulZ2DznNJ4rhBiQ4fDLjp+7YUtGxPO9CE+FhtKTzhRkZh34jpWEa5mzRQNOc oT6gGZ1gGrfl3ntp2Z2tdbfTYWxcN737xMumwnjgfzm6NKqQu16KQx3NVRL9/22dYqP9 MBZIsSXGbXS4K9UUFH4cxYwdE4sCK8smLw/RKrFaZaGrFyYh3QyNTe3v9/+gT0Q9yZKF x0RPplPpMFrQxKlzfo3a6EqCnk+3ZpbN+itCqfYFNbw1sAgnC3uAHE+4j1kWa71VPYEb xh589OWYvd1tGMQsc1Oa3Jp5xtKPmUjpYmt5MqiwU/4VfyOVbjK1gS/8GpfKMgslGeJ4 oUiw== X-Gm-Message-State: AOAM530rBa9se5Fp+GMpeI/8G/tF3o74Mp2eLXzka2pgYLTLGRR3nSOP P04lWrEg2Z9xf+qA+qivOv/V0mCQEtf48yuTjJw= X-Google-Smtp-Source: ABdhPJzLu8U1wLpwIcDSrEdNE/xPDTxtBgy7tiPyqi3OT+3lxOEPNfcXvlb7zX8sP/I/iyCy98GZagT4+oRRg+RvGko= X-Received: by 2002:a17:90b:10d:: with SMTP id p13mr6371227pjz.131.1621535736561; Thu, 20 May 2021 11:35:36 -0700 (PDT) MIME-Version: 1.0 References: <20210515123442.1432385-1-hjl.tools@gmail.com> <20210515123442.1432385-5-hjl.tools@gmail.com> In-Reply-To: <20210515123442.1432385-5-hjl.tools@gmail.com> From: Noah Goldstein Date: Thu, 20 May 2021 14:35:25 -0400 Message-ID: Subject: Re: [PATCH v5 4/5] x86-64: Add the clone3 wrapper To: "H.J. Lu" Cc: GNU C Library , Florian Weimer Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 May 2021 18:35:39 -0000 On Sat, May 15, 2021 at 9:23 AM H.J. Lu via Libc-alpha wrote: > > extern int clone3 (struct clone_args *__cl_args, > int (*__func) (void *__arg), void *__arg); > --- > sysdeps/unix/sysv/linux/x86_64/clone3.S | 92 +++++++++++++++++++++++++ > sysdeps/unix/sysv/linux/x86_64/sysdep.h | 2 + > 2 files changed, 94 insertions(+) > create mode 100644 sysdeps/unix/sysv/linux/x86_64/clone3.S > > diff --git a/sysdeps/unix/sysv/linux/x86_64/clone3.S b/sysdeps/unix/sysv/linux/x86_64/clone3.S > new file mode 100644 > index 0000000000..f7d4036a6a > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/x86_64/clone3.S > @@ -0,0 +1,92 @@ > +/* The clone3 syscall wrapper. Linux/x86-64 version. > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +/* clone3() is even more special than fork() as it mucks with stacks > + and invokes a function in the right context after its all over. */ > + > +#include > +#include > + > +/* The userland implementation is: > + int clone3 (struct clone_args *cl_args, int (*func)(void *arg), > + void *arg); > + the kernel entry is: > + int clone3 (struct clone_args *cl_args, size_t size); > + > + The parameters are passed in registers from userland: > + rdi: cl_args > + rsi: func > + rdx: arg > + > + The kernel expects: > + rax: system call number > + rdi: cl_args > + rsi: size */ > + > + .text > +ENTRY (__clone3) > + /* Sanity check arguments. */ > + movq $-EINVAL, %rax Can this be movl? > + testq %rdi, %rdi /* No NULL cl_args pointer. */ > + jz SYSCALL_ERROR_LABEL > + testq %rsi, %rsi /* No NULL function pointer. */ > + jz SYSCALL_ERROR_LABEL > + > + /* Save the function pointer in R8 which is preserved by the > + syscall. */ > + movq %rsi, %r8 > + > + /* Put sizeof (struct clone_args) in ESI. */ > + movl $CLONE_ARGS_SIZE , %esi > + > + /* Do the system call. */ > + movl $SYS_ify(clone3), %eax > + > + /* End FDE now, because in the child the unwind info will be > + wrong. */ > + cfi_endproc > + syscall > + > + test %RAX_LP, %RAX_LP > + jl SYSCALL_ERROR_LABEL > + jz L(thread_start) > + Is expectation to go to L(thread_start)? If so think jnz L(ret) and fallthrough is probably better. > + ret > + > +L(thread_start): > + cfi_startproc > + /* Clearing frame pointer is insufficient, use CFI. */ > + cfi_undefined (rip) > + /* Clear the frame pointer. The ABI suggests this be done, to mark > + the outermost frame obviously. */ > + xorl %ebp, %ebp > + > + /* Set up arguments for the function call. */ > + movq %rdx, %rdi /* Argument. */ > + call *%r8 /* Call function. */ > + /* Call exit with return value from function call. */ > + movq %rax, %rdi > + movl $SYS_ify(exit), %eax > + syscall > + cfi_endproc > + > + cfi_startproc > +PSEUDO_END (__clone3) > + > +libc_hidden_def (__clone3) > +weak_alias (__clone3, clone3) > diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h > index dbad2c788a..f26ffc68ae 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h > +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h > @@ -377,6 +377,8 @@ > # define HAVE_GETCPU_VSYSCALL "__vdso_getcpu" > # define HAVE_CLOCK_GETRES64_VSYSCALL "__vdso_clock_getres" > > +# define HAVE_CLONE3_WAPPER 1 > + > # define SINGLE_THREAD_BY_GLOBAL 1 > > #endif /* __ASSEMBLER__ */ > -- > 2.31.1 >