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 <vgu...@synopsys.com>
> 
> 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@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc

Reply via email to