Re: [PATCH v6 07/13] ARC: Linux Syscall Interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux