[PATCH v2 01/14] powerpc: Adopt SYSCALL_DEFINE for arch-specific syscall handlers

Christophe Leroy christophe.leroy at csgroup.eu
Sat Aug 6 02:50:41 AEST 2022



Le 25/07/2022 à 08:24, Rohan McLure a écrit :
> Arch-specific implementations of syscall handlers are currently used
> over generic implementations for the following reasons:
> 
>   1. Semantics unique to powerpc
>   2. Compatibility syscalls require 'argument padding' to comply with
>      64-bit argument convention in ELF32 abi.
>   3. Parameter types or order is different in other architectures.
> 
> These syscall handlers have been defined prior to this patch series
> without invoking the SYSCALL_DEFINE or COMPAT_SYSCALL_DEFINE macros with
> custom input and output types. We remove every such direct definition in
> favour of the aforementioned macros.

I think this patch should be split in two patches. One where you just 
change to using SYSCALL_DEFINE and COMPAT_SYSCALL_DEFINE, and a second 
patch for everything else.

The first patch could then be linked to 
https://github.com/linuxppc/issues/issues/146

Or in the reverse order if it makes more sense maybe.

> 
> Also update syscalls.tbl in order to refer to the symbol names generated
> by each of these macros. Since ppc64_personality can be called by both
> 64 bit and 32 bit binaries through compatibility, we must generate both
> both compat_sys_ and sys_ symbols for this handler.
> 
> A number of architectures including arm and powerpc agree on an
> alternative argument order and numbering for most of these arch-specific
> handlers. A future patch series may allow for asm/unistd.h to signal
> through its defines that a generic implementation of these syscall
> handlers with the correct calling convention be omitted, through the
> __ARCH_WANT_COMPAT_SYS_... convention.
> 
> Signed-off-by: Rohan McLure <rmclure at linux.ibm.com>
> ---
> V1 -> V2: All syscall handlers wrapped by this macro.
> ---
>   arch/powerpc/include/asm/syscalls.h          | 14 ++---
>   arch/powerpc/kernel/sys_ppc32.c              | 50 +++++++++++-------
>   arch/powerpc/kernel/syscalls.c               | 25 ++++++---
>   arch/powerpc/kernel/syscalls/syscall.tbl     | 28 +++++-----
>   .../arch/powerpc/entry/syscalls/syscall.tbl  | 28 +++++-----
>   5 files changed, 85 insertions(+), 60 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/syscalls.h b/arch/powerpc/include/asm/syscalls.h
> index a2b13e55254f..025d4b877161 100644
> --- a/arch/powerpc/include/asm/syscalls.h
> +++ b/arch/powerpc/include/asm/syscalls.h
> @@ -16,12 +16,12 @@ asmlinkage long sys_mmap(unsigned long addr, size_t len,
>   asmlinkage long sys_mmap2(unsigned long addr, size_t len,
>   		unsigned long prot, unsigned long flags,
>   		unsigned long fd, unsigned long pgoff);
> -asmlinkage long ppc64_personality(unsigned long personality);
> +asmlinkage long sys_ppc64_personality(unsigned long personality);

Is that 'asmlinkage' still needed ? Not all syscalls have it seems, and 
as far as I can see that macro voids for powerpc.

>   asmlinkage long sys_rtas(struct rtas_args __user *uargs);
> -int ppc_select(int n, fd_set __user *inp, fd_set __user *outp,
> -	       fd_set __user *exp, struct __kernel_old_timeval __user *tvp);
> -long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low,
> -		      u32 len_high, u32 len_low);
> +int sys_ppc_select(int n, fd_set __user *inp, fd_set __user *outp,
> +		   fd_set __user *exp, struct __kernel_old_timeval __user *tvp);
> +long sys_ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low,
> +			  u32 len_high, u32 len_low);
>   
>   #ifdef CONFIG_COMPAT
>   unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
> @@ -44,8 +44,8 @@ long compat_sys_fallocate(int fd, int mode, u32 offset1, u32 offset2, u32 len1,
>   int compat_sys_ftruncate64(unsigned int fd, u32 reg4, unsigned long len1,
>   			   unsigned long len2);
>   
> -long ppc32_fadvise64(int fd, u32 unused, u32 offset1, u32 offset2,
> -		     size_t len, int advice);
> +long compat_sys_ppc32_fadvise64(int fd, u32 unused, u32 offset1, u32 offset2,
> +				size_t len, int advice);
>   
>   long compat_sys_sync_file_range2(int fd, unsigned int flags,
>   				 unsigned int offset1, unsigned int offset2,
> diff --git a/arch/powerpc/kernel/sys_ppc32.c b/arch/powerpc/kernel/sys_ppc32.c
> index 16ff0399a257..c3490adcb158 100644
> --- a/arch/powerpc/kernel/sys_ppc32.c
> +++ b/arch/powerpc/kernel/sys_ppc32.c
> @@ -48,9 +48,10 @@
>   #include <asm/syscalls.h>
>   #include <asm/switch_to.h>
>   
> -unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
> -			  unsigned long prot, unsigned long flags,
> -			  unsigned long fd, unsigned long pgoff)
> +COMPAT_SYSCALL_DEFINE6(mmap2,
> +		       unsigned long, addr, size_t, len,
> +		       unsigned long, prot, unsigned long, flags,
> +		       unsigned long, fd, unsigned long, pgoff)
>   {
>   	/* This should remain 12 even if PAGE_SIZE changes */
>   	return sys_mmap(addr, len, prot, flags, fd, pgoff << 12);
> @@ -68,52 +69,63 @@ unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
>   #define merge_64(high, low) ((u64)high << 32) | low
>   #endif
>   
> -compat_ssize_t compat_sys_pread64(unsigned int fd, char __user *ubuf, compat_size_t count,
> -			     u32 reg6, u32 pos1, u32 pos2)
> +COMPAT_SYSCALL_DEFINE6(ppc_pread64,
> +		       unsigned int, fd,
> +		       char __user *, ubuf, compat_size_t, count,
> +		       u32, reg6, u32, pos1, u32, pos2)
>   {
>   	return ksys_pread64(fd, ubuf, count, merge_64(pos1, pos2));
>   }
>   
> -compat_ssize_t compat_sys_pwrite64(unsigned int fd, const char __user *ubuf, compat_size_t count,
> -			      u32 reg6, u32 pos1, u32 pos2)
> +COMPAT_SYSCALL_DEFINE6(ppc_pwrite64,
> +		       unsigned int, fd,
> +		       const char __user *, ubuf, compat_size_t, count,
> +		       u32, reg6, u32, pos1, u32, pos2)
>   {
>   	return ksys_pwrite64(fd, ubuf, count, merge_64(pos1, pos2));
>   }
>   
> -compat_ssize_t compat_sys_readahead(int fd, u32 r4, u32 offset1, u32 offset2, u32 count)
> +COMPAT_SYSCALL_DEFINE5(ppc_readahead,
> +		       int, fd, u32, r4,
> +		       u32, offset1, u32, offset2, u32, count)
>   {
>   	return ksys_readahead(fd, merge_64(offset1, offset2), count);
>   }
>   
> -asmlinkage int compat_sys_truncate64(const char __user * path, u32 reg4,
> -				unsigned long len1, unsigned long len2)
> +COMPAT_SYSCALL_DEFINE4(ppc_truncate64,
> +		       const char __user *, path, u32, reg4,
> +		       unsigned long, len1, unsigned long, len2)
>   {
>   	return ksys_truncate(path, merge_64(len1, len2));
>   }
>   
> -asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offset1, u32 offset2,
> -				     u32 len1, u32 len2)
> +COMPAT_SYSCALL_DEFINE6(ppc_fallocate,
> +		       int, fd, int, mode, u32, offset1, u32, offset2,
> +		       u32, len1, u32, len2)
>   {
>   	return ksys_fallocate(fd, mode, ((loff_t)offset1 << 32) | offset2,
>   			     merge_64(len1, len2));
>   }
>   
> -asmlinkage int compat_sys_ftruncate64(unsigned int fd, u32 reg4, unsigned long len1,
> -				 unsigned long len2)
> +COMPAT_SYSCALL_DEFINE4(ppc_ftruncate64,
> +		       unsigned int, fd, u32, reg4, unsigned long, len1,
> +		       unsigned long, len2)
>   {
>   	return ksys_ftruncate(fd, merge_64(len1, len2));
>   }
>   
> -long ppc32_fadvise64(int fd, u32 unused, u32 offset1, u32 offset2,
> -		     size_t len, int advice)
> +COMPAT_SYSCALL_DEFINE6(ppc32_fadvise64,
> +		       int, fd, u32, unused, u32, offset1, u32, offset2,
> +		       size_t, len, int, advice)
>   {
>   	return ksys_fadvise64_64(fd, merge_64(offset1, offset2), len,
>   				 advice);
>   }
>   
> -asmlinkage long compat_sys_sync_file_range2(int fd, unsigned int flags,
> -				   unsigned offset1, unsigned offset2,
> -				   unsigned nbytes1, unsigned nbytes2)
> +COMPAT_SYSCALL_DEFINE6(ppc_sync_file_range2,
> +		       int, fd, unsigned int, flags,
> +		       unsigned int, offset1, unsigned int, offset2,
> +		       unsigned int, nbytes1, unsigned int, nbytes2)
>   {
>   	loff_t offset = merge_64(offset1, offset2);
>   	loff_t nbytes = merge_64(nbytes1, nbytes2);
> diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c
> index fc999140bc27..ca20083dd0ae 100644
> --- a/arch/powerpc/kernel/syscalls.c
> +++ b/arch/powerpc/kernel/syscalls.c
> @@ -70,8 +70,9 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, size_t, len,
>    * (a single ptr to them all args passed) then calls
>    * sys_select() with the appropriate args. -- Cort
>    */
> -int
> -ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct __kernel_old_timeval __user *tvp)
> +SYSCALL_DEFINE5(ppc_select, int, n, fd_set __user *, inp,
> +		fd_set __user *, outp, fd_set __user *, exp,
> +		struct __kernel_old_timeval __user *, tvp)
>   {
>   	if ((unsigned long)n >= 4096)
>   		return sys_old_select((void __user *)n);
> @@ -81,7 +82,7 @@ ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, s
>   #endif
>   
>   #ifdef CONFIG_PPC64
> -long ppc64_personality(unsigned long personality)
> +static inline long do_ppc64_personality(unsigned long personality)
>   {
>   	long ret;
>   
> @@ -93,10 +94,22 @@ long ppc64_personality(unsigned long personality)
>   		ret = (ret & ~PER_MASK) | PER_LINUX;
>   	return ret;
>   }
> -#endif
>   
> -long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low,
> -		      u32 len_high, u32 len_low)
> +SYSCALL_DEFINE1(ppc64_personality, unsigned long, personality)
> +{
> +	return do_ppc64_personality(personality);
> +}
> +#ifdef CONFIG_COMPAT
> +COMPAT_SYSCALL_DEFINE1(ppc64_personality, unsigned long, personality)
> +{
> +	return do_ppc64_personality(personality);
> +}
> +#endif /* CONFIG_COMPAT */
> +#endif /* CONFIG_PPC64 */
> +
> +SYSCALL_DEFINE6(ppc_fadvise64_64,
> +		int, fd, int, advice, u32, offset_high, u32, offset_low,
> +		u32, len_high, u32, len_low)
>   {
>   	return ksys_fadvise64_64(fd, (u64)offset_high << 32 | offset_low,
>   				 (u64)len_high << 32 | len_low, advice);
> diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
> index 2600b4237292..54bb5834785f 100644
> --- a/arch/powerpc/kernel/syscalls/syscall.tbl
> +++ b/arch/powerpc/kernel/syscalls/syscall.tbl
> @@ -110,7 +110,7 @@
>   79	common	settimeofday			sys_settimeofday		compat_sys_settimeofday
>   80	common	getgroups			sys_getgroups
>   81	common	setgroups			sys_setgroups
> -82	32	select				ppc_select			sys_ni_syscall
> +82	32	select				sys_ppc_select			sys_ni_syscall
>   82	64	select				sys_ni_syscall
>   82	spu	select				sys_ni_syscall
>   83	common	symlink				sys_symlink
> @@ -178,9 +178,9 @@
>   133	common	fchdir				sys_fchdir
>   134	common	bdflush				sys_ni_syscall
>   135	common	sysfs				sys_sysfs
> -136	32	personality			sys_personality			ppc64_personality
> -136	64	personality			ppc64_personality
> -136	spu	personality			ppc64_personality
> +136	32	personality			sys_personality			compat_sys_ppc64_personality
> +136	64	personality			sys_ppc64_personality
> +136	spu	personality			sys_ppc64_personality
>   137	common	afs_syscall			sys_ni_syscall
>   138	common	setfsuid			sys_setfsuid
>   139	common	setfsgid			sys_setfsgid
> @@ -228,8 +228,8 @@
>   176	64	rt_sigtimedwait			sys_rt_sigtimedwait
>   177	nospu 	rt_sigqueueinfo			sys_rt_sigqueueinfo		compat_sys_rt_sigqueueinfo
>   178	nospu 	rt_sigsuspend			sys_rt_sigsuspend		compat_sys_rt_sigsuspend
> -179	common	pread64				sys_pread64			compat_sys_pread64
> -180	common	pwrite64			sys_pwrite64			compat_sys_pwrite64
> +179	common	pread64				sys_pread64			compat_sys_ppc_pread64
> +180	common	pwrite64			sys_pwrite64			compat_sys_ppc_pwrite64
>   181	common	chown				sys_chown
>   182	common	getcwd				sys_getcwd
>   183	common	capget				sys_capget
> @@ -242,10 +242,10 @@
>   188	common 	putpmsg				sys_ni_syscall
>   189	nospu	vfork				sys_vfork
>   190	common	ugetrlimit			sys_getrlimit			compat_sys_getrlimit
> -191	common	readahead			sys_readahead			compat_sys_readahead
> -192	32	mmap2				sys_mmap2			compat_sys_mmap2
> -193	32	truncate64			sys_truncate64			compat_sys_truncate64
> -194	32	ftruncate64			sys_ftruncate64			compat_sys_ftruncate64
> +191	common	readahead			sys_readahead			compat_sys_ppc_readahead
> +192	32	mmap2				sys_mmap2			compat_sys_ppc_mmap2
> +193	32	truncate64			sys_truncate64			compat_sys_ppc_truncate64
> +194	32	ftruncate64			sys_ftruncate64			compat_sys_ppc_ftruncate64
>   195	32	stat64				sys_stat64
>   196	32	lstat64				sys_lstat64
>   197	32	fstat64				sys_fstat64
> @@ -288,7 +288,7 @@
>   230	common	io_submit			sys_io_submit			compat_sys_io_submit
>   231	common	io_cancel			sys_io_cancel
>   232	nospu	set_tid_address			sys_set_tid_address
> -233	common	fadvise64			sys_fadvise64			ppc32_fadvise64
> +233	common	fadvise64			sys_fadvise64			compat_sys_ppc32_fadvise64
>   234	nospu	exit_group			sys_exit_group
>   235	nospu	lookup_dcookie			sys_lookup_dcookie		compat_sys_lookup_dcookie
>   236	common	epoll_create			sys_epoll_create
> @@ -323,7 +323,7 @@
>   251	spu	utimes				sys_utimes
>   252	common	statfs64			sys_statfs64			compat_sys_statfs64
>   253	common	fstatfs64			sys_fstatfs64			compat_sys_fstatfs64
> -254	32	fadvise64_64			ppc_fadvise64_64
> +254	32	fadvise64_64			sys_ppc_fadvise64_64
>   254	spu	fadvise64_64			sys_ni_syscall
>   255	common	rtas				sys_rtas
>   256	32	sys_debug_setcontext		sys_debug_setcontext		sys_ni_syscall
> @@ -390,8 +390,8 @@
>   305	common	signalfd			sys_signalfd			compat_sys_signalfd
>   306	common	timerfd_create			sys_timerfd_create
>   307	common	eventfd				sys_eventfd
> -308	common	sync_file_range2		sys_sync_file_range2		compat_sys_sync_file_range2
> -309	nospu	fallocate			sys_fallocate			compat_sys_fallocate
> +308	common	sync_file_range2		sys_sync_file_range2		compat_sys_ppc_sync_file_range2
> +309	nospu	fallocate			sys_fallocate			compat_sys_ppc_fallocate
>   310	nospu	subpage_prot			sys_subpage_prot
>   311	32	timerfd_settime			sys_timerfd_settime32
>   311	64	timerfd_settime			sys_timerfd_settime
> diff --git a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> index 2600b4237292..54bb5834785f 100644
> --- a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> +++ b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> @@ -110,7 +110,7 @@
>   79	common	settimeofday			sys_settimeofday		compat_sys_settimeofday
>   80	common	getgroups			sys_getgroups
>   81	common	setgroups			sys_setgroups
> -82	32	select				ppc_select			sys_ni_syscall
> +82	32	select				sys_ppc_select			sys_ni_syscall
>   82	64	select				sys_ni_syscall
>   82	spu	select				sys_ni_syscall
>   83	common	symlink				sys_symlink
> @@ -178,9 +178,9 @@
>   133	common	fchdir				sys_fchdir
>   134	common	bdflush				sys_ni_syscall
>   135	common	sysfs				sys_sysfs
> -136	32	personality			sys_personality			ppc64_personality
> -136	64	personality			ppc64_personality
> -136	spu	personality			ppc64_personality
> +136	32	personality			sys_personality			compat_sys_ppc64_personality
> +136	64	personality			sys_ppc64_personality
> +136	spu	personality			sys_ppc64_personality
>   137	common	afs_syscall			sys_ni_syscall
>   138	common	setfsuid			sys_setfsuid
>   139	common	setfsgid			sys_setfsgid
> @@ -228,8 +228,8 @@
>   176	64	rt_sigtimedwait			sys_rt_sigtimedwait
>   177	nospu 	rt_sigqueueinfo			sys_rt_sigqueueinfo		compat_sys_rt_sigqueueinfo
>   178	nospu 	rt_sigsuspend			sys_rt_sigsuspend		compat_sys_rt_sigsuspend
> -179	common	pread64				sys_pread64			compat_sys_pread64
> -180	common	pwrite64			sys_pwrite64			compat_sys_pwrite64
> +179	common	pread64				sys_pread64			compat_sys_ppc_pread64
> +180	common	pwrite64			sys_pwrite64			compat_sys_ppc_pwrite64
>   181	common	chown				sys_chown
>   182	common	getcwd				sys_getcwd
>   183	common	capget				sys_capget
> @@ -242,10 +242,10 @@
>   188	common 	putpmsg				sys_ni_syscall
>   189	nospu	vfork				sys_vfork
>   190	common	ugetrlimit			sys_getrlimit			compat_sys_getrlimit
> -191	common	readahead			sys_readahead			compat_sys_readahead
> -192	32	mmap2				sys_mmap2			compat_sys_mmap2
> -193	32	truncate64			sys_truncate64			compat_sys_truncate64
> -194	32	ftruncate64			sys_ftruncate64			compat_sys_ftruncate64
> +191	common	readahead			sys_readahead			compat_sys_ppc_readahead
> +192	32	mmap2				sys_mmap2			compat_sys_ppc_mmap2
> +193	32	truncate64			sys_truncate64			compat_sys_ppc_truncate64
> +194	32	ftruncate64			sys_ftruncate64			compat_sys_ppc_ftruncate64
>   195	32	stat64				sys_stat64
>   196	32	lstat64				sys_lstat64
>   197	32	fstat64				sys_fstat64
> @@ -288,7 +288,7 @@
>   230	common	io_submit			sys_io_submit			compat_sys_io_submit
>   231	common	io_cancel			sys_io_cancel
>   232	nospu	set_tid_address			sys_set_tid_address
> -233	common	fadvise64			sys_fadvise64			ppc32_fadvise64
> +233	common	fadvise64			sys_fadvise64			compat_sys_ppc32_fadvise64
>   234	nospu	exit_group			sys_exit_group
>   235	nospu	lookup_dcookie			sys_lookup_dcookie		compat_sys_lookup_dcookie
>   236	common	epoll_create			sys_epoll_create
> @@ -323,7 +323,7 @@
>   251	spu	utimes				sys_utimes
>   252	common	statfs64			sys_statfs64			compat_sys_statfs64
>   253	common	fstatfs64			sys_fstatfs64			compat_sys_fstatfs64
> -254	32	fadvise64_64			ppc_fadvise64_64
> +254	32	fadvise64_64			sys_ppc_fadvise64_64
>   254	spu	fadvise64_64			sys_ni_syscall
>   255	common	rtas				sys_rtas
>   256	32	sys_debug_setcontext		sys_debug_setcontext		sys_ni_syscall
> @@ -390,8 +390,8 @@
>   305	common	signalfd			sys_signalfd			compat_sys_signalfd
>   306	common	timerfd_create			sys_timerfd_create
>   307	common	eventfd				sys_eventfd
> -308	common	sync_file_range2		sys_sync_file_range2		compat_sys_sync_file_range2
> -309	nospu	fallocate			sys_fallocate			compat_sys_fallocate
> +308	common	sync_file_range2		sys_sync_file_range2		compat_sys_ppc_sync_file_range2
> +309	nospu	fallocate			sys_fallocate			compat_sys_ppc_fallocate
>   310	nospu	subpage_prot			sys_subpage_prot
>   311	32	timerfd_settime			sys_timerfd_settime32
>   311	64	timerfd_settime			sys_timerfd_settime


More information about the Linuxppc-dev mailing list