[PATCH v4 07/20] powerpc: Adopt SYSCALL_DEFINE for arch-specific syscall handlers

Nicholas Piggin npiggin at gmail.com
Mon Sep 12 20:04:54 AEST 2022


On Wed Aug 24, 2022 at 12:05 PM AEST, Rohan McLure wrote:
> 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.

And what about sys_fallocate, where did that go?

>
> 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.

Actually I don't have a concern about this patch, I thoughtthere was
something odd going on with ppc64_personality but I misread, it all
looks pretty good.

>
> 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.

I'm on the fence about including this in changelog. arm developers
might not see it, for example. Putting it in include/linux/compat.h
as a comment  might be better.

If you keep it in the changelog, maybe preface with something like
aside, side note, in future or something so that's clear it's not part
of the current patch.

Thanks,
Nick

>
> Signed-off-by: Rohan McLure <rmclure at linux.ibm.com>
> ---
> V1 -> V2: All syscall handlers wrapped by this macro.
> V2 -> V3: Move creation of do_ppc64_personality helper to prior patch.
> V3 -> V4: Fix parenthesis alignment. Don't emit sys_*** symbols.
> ---
>  arch/powerpc/include/asm/syscalls.h          | 10 ++--
>  arch/powerpc/kernel/sys_ppc32.c              | 45 ++++++++++--------
>  arch/powerpc/kernel/syscalls.c               | 17 +++++--
>  arch/powerpc/kernel/syscalls/syscall.tbl     | 22 ++++-----
>  .../arch/powerpc/entry/syscalls/syscall.tbl  | 22 ++++-----
>  5 files changed, 64 insertions(+), 52 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/syscalls.h b/arch/powerpc/include/asm/syscalls.h
> index 739498c358a1..3e3aff0835a6 100644
> --- a/arch/powerpc/include/asm/syscalls.h
> +++ b/arch/powerpc/include/asm/syscalls.h
> @@ -16,10 +16,10 @@ long sys_mmap(unsigned long addr, size_t len,
>  long sys_mmap2(unsigned long addr, size_t len,
>  	       unsigned long prot, unsigned long flags,
>  	       unsigned long fd, unsigned long pgoff);
> -long ppc64_personality(unsigned long personality);
> +long sys_ppc64_personality(unsigned long personality);
>  long sys_rtas(struct rtas_args __user *uargs);
> -long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low,
> -		      u32 len_high, u32 len_low);
> +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,
> @@ -40,8 +40,8 @@ int compat_sys_truncate64(const char __user *path, u32 reg4,
>  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 bc6491ed6454..dd9039671227 100644
> --- a/arch/powerpc/kernel/sys_ppc32.c
> +++ b/arch/powerpc/kernel/sys_ppc32.c
> @@ -59,52 +59,55 @@
>  #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);
>  }
>  
> -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));
>  }
>  
> -long compat_sys_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));
> -}
> -
> -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);
>  }
>  
> -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 32fadf3c2cd3..2d4c62e5bac7 100644
> --- a/arch/powerpc/kernel/syscalls.c
> +++ b/arch/powerpc/kernel/syscalls.c
> @@ -87,14 +87,23 @@ static inline long do_ppc64_personality(unsigned long personality)
>  		ret = (ret & ~PER_MASK) | PER_LINUX;
>  	return ret;
>  }
> -long ppc64_personality(unsigned long personality)
> +
> +SYSCALL_DEFINE1(ppc64_personality, unsigned long, personality)
>  {
>  	return do_ppc64_personality(personality);
>  }
> -#endif
>  
> -long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low,
> -		      u32 len_high, u32 len_low)
> +#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 4cbbb810ae10..b4c970c9c6b1 100644
> --- a/arch/powerpc/kernel/syscalls/syscall.tbl
> +++ b/arch/powerpc/kernel/syscalls/syscall.tbl
> @@ -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
> +191	common	readahead			sys_readahead			compat_sys_ppc_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
> +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,7 +390,7 @@
>  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
> +308	common	sync_file_range2		sys_sync_file_range2		compat_sys_ppc_sync_file_range2
>  309	nospu	fallocate			sys_fallocate			compat_sys_fallocate
>  310	nospu	subpage_prot			sys_subpage_prot
>  311	32	timerfd_settime			sys_timerfd_settime32
> diff --git a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> index 4cbbb810ae10..b4c970c9c6b1 100644
> --- a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> +++ b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> @@ -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
> +191	common	readahead			sys_readahead			compat_sys_ppc_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
> +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,7 +390,7 @@
>  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
> +308	common	sync_file_range2		sys_sync_file_range2		compat_sys_ppc_sync_file_range2
>  309	nospu	fallocate			sys_fallocate			compat_sys_fallocate
>  310	nospu	subpage_prot			sys_subpage_prot
>  311	32	timerfd_settime			sys_timerfd_settime32
> -- 
> 2.34.1



More information about the Linuxppc-dev mailing list