On 5/29/20 9:49 AM, Adhemerval Zanella via Libc-alpha wrote: > > > On 22/04/2020 22:41, Vineet Gupta via Libc-alpha wrote: >> Signed-off-by: Vineet Gupta <vgupta@xxxxxxxxxxxx> > > As prior patches we do not use DCO, but rather copyright assignment. > >> diff --git a/sysdeps/unix/sysv/linux/arc/arch-syscall.h b/sysdeps/unix/sysv/linux/arc/arch-syscall.h >> new file mode 100644 >> index 000000000000..2b017eb5bbaa >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/arc/arch-syscall.h >> @@ -0,0 +1,303 @@ >> +/* AUTOGENERATED by update-syscall-lists.py. */ >> +#define __NR_accept 202 >> +#define __NR_accept4 242 >> +#define __NR_acct 89 >> +#define __NR_add_key 217 >> +#define __NR_vmsplice 75 >> +#define __NR_wait4 260 >> +#define __NR_waitid 95 >> +#define __NR_write 64 >> +#define __NR_writev 66 > > Ok, although I did not confered it was done with lastest Linux kernel > releases used by build-many-glibcs.py. You might double check it. I did use 5.6 kernel at the time, will double check though. Thx. >> diff --git a/sysdeps/unix/sysv/linux/arc/clone.S b/sysdeps/unix/sysv/linux/arc/clone.S >> + >> +/* int clone(int (*fn)(void *), void *child_stack, >> + int flags, void *arg, ... >> + < pid_t *ptid, struct user_desc *tls, pid_t *ctid > ); >> + >> + NOTE: I'm assuming that the last 3 args are NOT var-args and in case all >> + 3 are not relevant, caller will nevertheless pass those as NULL. > > Maybe we should update our clone prototype, although this might incur > in a ABI break. The assumption here should be ok, since all other > implementations do the same. > >> + >> + clone syscall in kernel (ABI: CONFIG_CLONE_BACKWARDS) >> + >> + int sys_clone(unsigned long int clone_flags, >> + unsigned long int newsp, >> + int __user *parent_tidptr, >> + void *tls, >> + int __user *child_tidptr). */ >> + >> +ENTRY (__clone) >> + cmp r0, 0 ; @fn can't be NULL >> + cmp.ne r1, 0 ; @child_stack can't be NULL >> + bz .L__sys_err >> + >> + ; save some of the orig args >> + ; r0 containg @fn will be clobbered AFTER syscall (with ret val) >> + ; rest are clobbered BEFORE syscall due to different arg ordering >> + mov r10, r0 ; @fn >> + mov r11, r3 ; @args >> + mov r12, r2 ; @clone_flags >> + mov r9, r5 ; @tls >> + >> + ; adjust libc args for syscall >> + >> + mov r0, r2 ; libc @flags is 1st syscall arg >> + mov r2, r4 ; libc @ptid >> + mov r3, r5 ; libc @tls >> + mov r4, r6 ; libc @ctid >> + mov r8, __NR_clone >> + ARC_TRAP_INSN >> + >> + cmp r0, 0 ; return code : 0 new process, !0 parent >> + blt .L__sys_err2 ; < 0 (signed) error >> + jnz [blink] ; Parent returns >> + >> + ; ----- child starts here --------- >> + >> + ; Setup TP register (only recent kernels v4.19+ do that) >> + and.f 0, r12, CLONE_SETTLS >> + mov.nz r25, r9 > > Do you still need to set it since the minimum supported kernel > for ARC is 5.1 ? Right we can drop this. > It should be safe for internal glibc usage, since for both pthread > and posix_spawn it blocks all signals including SIGCANCEL and SIGXID. > However this is still small race window if this is called directly > with pthread cancellation or g*uid in multithread. > >> + >> + ; child jumps off to @fn with @arg as argument, and returns here >> + jl.d [r10] >> + mov r0, r11 >> + >> + ; exit() with result from @fn (already in r0) >> + mov r8, __NR_exit >> + ARC_TRAP_INSN >> + ; In case it ever came back >> + flag 1 >> + >> +.L__sys_err: > > Can't you use L(...) macro as other architectures? OK will do. > >> diff --git a/sysdeps/unix/sysv/linux/arc/mmap_internal.h b/sysdeps/unix/sysv/linux/arc/mmap_internal.h >> new file mode 100644 >> index 000000000000..19aa078dd45e >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/arc/mmap_internal.h >> @@ -0,0 +1,27 @@ >> +/* mmap - map files or devices into memory. Linux/ARC version. >> + Copyright (C) 2017-2020 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/>. */ >> + >> +#ifndef MMAP_ARC_INTERNAL_H >> +#define MMAP_ARC_INTERNAL_H >> + >> +/* 8K is default but determine the shift dynamically with getpagesize. */ >> +#define MMAP2_PAGE_UNIT -1 >> + >> +#include_next <mmap_internal.h> >> + >> +#endif > > Ok. I would be interesting if kernel could consolidate de mmap > implementation to return EINVAL for invalid offsets. A lot of > architectures have its own implementation to handle. >> diff --git a/sysdeps/unix/sysv/linux/arc/pt-vfork.S b/sysdeps/unix/sysv/linux/arc/pt-vfork.S >> new file mode 100644 >> index 000000000000..1cc893170070 >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/arc/pt-vfork.S >> @@ -0,0 +1 @@ >> +/* Not needed. */ > > This file is not required since "nptl: Remove vfork IFUNC-based > forwarder from libpthread [BZ #20188]" (41d6f74e6cb6a9). Removed. >> diff --git a/sysdeps/unix/sysv/linux/arc/sigrestorer.S b/sysdeps/unix/sysv/linux/arc/sigrestorer.S >> + >> +#include <sys/syscall.h> >> +#include <sysdep.h> >> +#include <tcb-offsets.h> >> + >> +/* Note the NOP has to be outside body. */ >> + nop > > Wy exactly do you need it here? It has to do with how ARC gdb recognized sigrestorer. This acts a special marker used in conjunction with the syscall id. This goes back to days when cfi pseudo ops were not suppported in toolchain, but the gdb code lingered. > >> +ENTRY (__default_rt_sa_restorer) >> + mov r8, __NR_rt_sigreturn >> + ARC_TRAP_INSN >> + j_s [blink] > > Ok. >> diff --git a/sysdeps/unix/sysv/linux/arc/sysctl.mk b/sysdeps/unix/sysv/linux/arc/sysctl.mk >> new file mode 100644 >> index 000000000000..05a4e2f8c99b >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/arc/sysctl.mk >> @@ -0,0 +1 @@ >> +# ARC doesn't support sysctl. > > This file is not required since "Linux: Remove <sys/sysctl.h> > and the sysctl function" (076f09afbac1a). Removed. _______________________________________________ linux-snps-arc mailing list linux-snps-arc@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/linux-snps-arc