mirror of
https://git.musl-libc.org/git/musl
synced 2025-03-17 08:02:53 +03:00
clone: make clone a wrapper around __clone
The architecture-specific assembly versions of clone did not set errno on failure, which is inconsistent with glibc. __clone still returns the error via its return value, and clone is now a wrapper that sets errno as needed. The public clone has also been moved to src/linux, as it's not directly related to the pthreads API. __clone is called by pthread_create, which does not report errors via errno. Though not strictly necessary, it's nice to avoid clobbering errno here.
This commit is contained in:
parent
7ee48f7b69
commit
fdf5f1b131
19
src/linux/clone.c
Normal file
19
src/linux/clone.c
Normal file
@ -0,0 +1,19 @@
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
#include "pthread_impl.h"
|
||||
#include "syscall.h"
|
||||
|
||||
int clone(int (*func)(void *), void *stack, int flags, void *arg, ...)
|
||||
{
|
||||
va_list ap;
|
||||
pid_t *ptid, *ctid;
|
||||
void *tls;
|
||||
|
||||
va_start(ap, arg);
|
||||
ptid = va_arg(ap, pid_t *);
|
||||
tls = va_arg(ap, void *);
|
||||
ctid = va_arg(ap, pid_t *);
|
||||
va_end(ap);
|
||||
|
||||
return __syscall_ret(__clone(func, stack, flags, arg, ptid, tls, ctid));
|
||||
}
|
@ -1,10 +1,7 @@
|
||||
.text
|
||||
.global __clone
|
||||
.weak clone
|
||||
.type __clone,%function
|
||||
.type clone,%function
|
||||
__clone:
|
||||
clone:
|
||||
stmfd sp!,{r4,r5,r6,r7}
|
||||
mov r7,#120
|
||||
mov r6,r3
|
||||
|
@ -1,10 +1,7 @@
|
||||
#include <errno.h>
|
||||
#include "libc.h"
|
||||
#include "pthread_impl.h"
|
||||
|
||||
int __clone(int (*func)(void *), void *stack, int flags, void *arg, ...)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
weak_alias(__clone, clone);
|
||||
|
@ -1,10 +1,7 @@
|
||||
.text
|
||||
.global __clone
|
||||
.weak clone
|
||||
.type __clone,@function
|
||||
.type clone,@function
|
||||
__clone:
|
||||
clone:
|
||||
push %ebp
|
||||
mov %esp,%ebp
|
||||
push %ebx
|
||||
|
@ -1,14 +1,11 @@
|
||||
.global __clone
|
||||
.weak clone
|
||||
.type __clone,@function
|
||||
.type clone,@function
|
||||
|
||||
# r5, r6, r7, r8, r9, r10, stack
|
||||
# fn, st, fl, ar, pt, tl, ct
|
||||
# fl, st, __, pt, ct, tl
|
||||
|
||||
__clone:
|
||||
clone:
|
||||
andi r6, r6, -16
|
||||
addi r6, r6, -16
|
||||
swi r5, r6, 0
|
||||
@ -23,7 +20,7 @@ clone:
|
||||
beqi r3, 1f
|
||||
rtsd r15, 8
|
||||
nop
|
||||
|
||||
|
||||
1: lwi r3, r1, 0
|
||||
lwi r5, r1, 4
|
||||
brald r15, r3
|
||||
|
@ -1,10 +1,7 @@
|
||||
.text
|
||||
.global __clone
|
||||
.weak clone
|
||||
.type __clone,@function
|
||||
.type clone,@function
|
||||
__clone:
|
||||
clone:
|
||||
xor %eax,%eax
|
||||
mov $56,%al
|
||||
mov %rdi,%r11
|
||||
|
Loading…
x
Reference in New Issue
Block a user