mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
s390: Add the clone3 wrapper
It follows the internal signature: extern int clone3 (struct clone_args *__cl_args, size_t __size, int (*__func) (void *__arg), void *__arg); Checked on s390x-linux-gnu and s390-linux-gnu.
This commit is contained in:
parent
6cf4ebe10c
commit
721f30116c
3 changed files with 157 additions and 0 deletions
78
sysdeps/unix/sysv/linux/s390/s390-32/clone3.S
Normal file
78
sysdeps/unix/sysv/linux/s390/s390-32/clone3.S
Normal file
|
@ -0,0 +1,78 @@
|
|||
/* The clone3 syscall wrapper. Linux/s390x version.
|
||||
Copyright (C) 2023 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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#define _ERRNO_H 1
|
||||
#include <bits/errno.h>
|
||||
|
||||
/* The userland implementation is:
|
||||
int clone3 (struct clone_args *cl_args, size_t size,
|
||||
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:
|
||||
r2: cl_args
|
||||
r3: size
|
||||
r4: func
|
||||
r5: arg */
|
||||
|
||||
.text
|
||||
ENTRY(__clone3)
|
||||
/* Sanity check args. */
|
||||
ltr %r2, %r2
|
||||
je error
|
||||
ltr %r4, %r4
|
||||
je error
|
||||
|
||||
/* Do the system call, the kernel expects:
|
||||
r1: system call number
|
||||
r2: cl_args
|
||||
r3: size */
|
||||
lhi %r1, SYS_ify(clone3)
|
||||
svc 0
|
||||
ltr %r2,%r2 /* check return code */
|
||||
jz thread_start
|
||||
jm SYSCALL_ERROR_LABEL
|
||||
br %r14
|
||||
error:
|
||||
lhi %r2,-EINVAL
|
||||
j SYSCALL_ERROR_LABEL
|
||||
PSEUDO_END (__clone3)
|
||||
|
||||
.align 16
|
||||
.type thread_start, %function
|
||||
thread_start:
|
||||
cfi_startproc
|
||||
/* Mark r14 as undefined in order to stop unwinding here. */
|
||||
cfi_undefined (r14)
|
||||
|
||||
/* func is in gpr 4, arg in gpr 5. */
|
||||
lr %r2, %r5
|
||||
ahi %r15, -96
|
||||
xc 0(4,%r15),0(%r15)
|
||||
basr %r14, %r4
|
||||
|
||||
DO_CALL (exit, 1)
|
||||
cfi_endproc
|
||||
ASM_SIZE_DIRECTIVE (thread_start)
|
||||
|
||||
libc_hidden_def (__clone3)
|
||||
weak_alias (__clone3, clone3)
|
78
sysdeps/unix/sysv/linux/s390/s390-64/clone3.S
Normal file
78
sysdeps/unix/sysv/linux/s390/s390-64/clone3.S
Normal file
|
@ -0,0 +1,78 @@
|
|||
/* The clone3 syscall wrapper. Linux/s390x version.
|
||||
Copyright (C) 2023 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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#define _ERRNO_H 1
|
||||
#include <bits/errno.h>
|
||||
|
||||
/* The userland implementation is:
|
||||
int clone3 (struct clone_args *cl_args, size_t size,
|
||||
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:
|
||||
r2: cl_args
|
||||
r3: size
|
||||
r4: func
|
||||
r5: arg */
|
||||
|
||||
.text
|
||||
ENTRY(__clone3)
|
||||
/* Sanity check args. */
|
||||
ltgr %r2, %r2
|
||||
je error
|
||||
ltgr %r4, %r4
|
||||
je error
|
||||
|
||||
/* Do the system call, the kernel expects:
|
||||
r1: system call number
|
||||
r2: cl_args
|
||||
r3: size */
|
||||
lghi %r1, SYS_ify(clone3)
|
||||
svc 0
|
||||
ltgr %r2,%r2 /* check return code */
|
||||
jz thread_start
|
||||
jgm SYSCALL_ERROR_LABEL
|
||||
br %r14
|
||||
error:
|
||||
lghi %r2,-EINVAL
|
||||
jg SYSCALL_ERROR_LABEL
|
||||
PSEUDO_END (__clone3)
|
||||
|
||||
.align 16
|
||||
.type thread_start, %function
|
||||
thread_start:
|
||||
cfi_startproc
|
||||
/* Mark r14 as undefined in order to stop unwinding here. */
|
||||
cfi_undefined (r14)
|
||||
|
||||
/* func is in gpr 4, arg in gpr 5. */
|
||||
lgr %r2, %r5
|
||||
aghi %r15, -160
|
||||
xc 0(8,%r15),0(%r15)
|
||||
basr %r14, %r4
|
||||
|
||||
DO_CALL (exit, 1)
|
||||
cfi_endproc
|
||||
ASM_SIZE_DIRECTIVE (thread_start)
|
||||
|
||||
libc_hidden_def (__clone3)
|
||||
weak_alias (__clone3, clone3)
|
|
@ -79,4 +79,5 @@
|
|||
#define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday"
|
||||
#define HAVE_GETCPU_VSYSCALL "__kernel_getcpu"
|
||||
|
||||
#define HAVE_CLONE3_WRAPPER 1
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue