[v5,0/5] Add an internal wrapper for clone, clone2 and clone3

Message ID 20210522035018.2652112-1-hjl.tools@gmail.com
Headers
Series Add an internal wrapper for clone, clone2 and clone3 |

Message

H.J. Lu May 22, 2021, 3:50 a.m. UTC
  The clone3 system call provides a superset of the functionality of clone
and clone2.  It also provides a number of API improve ments, including
the ability to specify the size of the child's stack area which can be
used by kernel to compute the shadow stack size when allocating the
shadow stack.  Add:

extern int __clone_internal (struct clone_args *__cl_args,
			     int (*__func) (void *__arg), void *__arg);

to provide an abstract interface for clone, clone2 and clone3.

1. Add cast_to_pointer to cast an integer to void * pointer.
2. Simplify stack management for thread creation by passing both stack
base and size to create_thread.
3. Consolidate clone vs clone2 differences into a single file.
4. Use only __clone_internal to clone a thread.
5. Call __clone3 if HAVE_CLONE3_WAPPER is defined.  If __clone3 returns
-1 with ENOSYS, fall back to clone or clone2.
6. Add the clone3 wrapper for x86-64.  Enable the public clone3 wrapper
in the future after it has been added to all targets.

Tested with build-many-glibcs.py.

H.J. Lu (5):
  Add cast_to_pointer to cast an integer to void * pointer
  Add an internal wrapper for clone, clone2 and clone3
  nptl: Always pass stack size to create_thread
  x86-64: Add the clone3 wrapper
  Add static tests for __clone_internal

 include/clone_internal.h                      |  16 ++
 include/libc-pointer-arith.h                  |   3 +
 nptl/allocatestack.c                          |  59 +-------
 nptl/createthread.c                           |   3 +-
 nptl/pthread_create.c                         |  17 ++-
 sysdeps/unix/sysv/linux/Makefile              |  10 +-
 sysdeps/unix/sysv/linux/clone-internal.c      |  91 ++++++++++++
 sysdeps/unix/sysv/linux/clone3.c              |   1 +
 sysdeps/unix/sysv/linux/clone3.h              |  60 ++++++++
 sysdeps/unix/sysv/linux/createthread.c        |  25 ++--
 sysdeps/unix/sysv/linux/spawni.c              |  26 ++--
 .../sysv/linux/tst-align-clone-internal.c     |  86 +++++++++++
 sysdeps/unix/sysv/linux/tst-clone2-internal.c | 137 ++++++++++++++++++
 sysdeps/unix/sysv/linux/tst-clone3-internal.c |  99 +++++++++++++
 .../unix/sysv/linux/tst-getpid1-internal.c    | 132 +++++++++++++++++
 sysdeps/unix/sysv/linux/x86_64/clone3.S       |  92 ++++++++++++
 sysdeps/unix/sysv/linux/x86_64/sysdep.h       |   2 +
 17 files changed, 768 insertions(+), 91 deletions(-)
 create mode 100644 include/clone_internal.h
 create mode 100644 sysdeps/unix/sysv/linux/clone-internal.c
 create mode 100644 sysdeps/unix/sysv/linux/clone3.c
 create mode 100644 sysdeps/unix/sysv/linux/clone3.h
 create mode 100644 sysdeps/unix/sysv/linux/tst-align-clone-internal.c
 create mode 100644 sysdeps/unix/sysv/linux/tst-clone2-internal.c
 create mode 100644 sysdeps/unix/sysv/linux/tst-clone3-internal.c
 create mode 100644 sysdeps/unix/sysv/linux/tst-getpid1-internal.c
 create mode 100644 sysdeps/unix/sysv/linux/x86_64/clone3.S