[PATCH 15/23] powerpc: Adopt SYSCALL_DEFINE for arch-specific syscall handlers
Rohan McLure
rmclure at linux.ibm.com
Fri Sep 16 15:48:40 AEST 2022
> On 16 Sep 2022, at 3:32 pm, Rohan McLure <rmclure at linux.ibm.com> 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.
>
> 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.
>
> As an aside:
> 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 emitted, 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.
> V2 -> V3: Move creation of do_ppc64_personality helper to prior patch.
> V3 -> V4: Fix parenthesis alignment. Don't emit sys_*** symbols.
> V4 -> V5: Use 'aside' in the asm-generic rant in commit message.
> ---
> arch/powerpc/include/asm/syscalls.h | 10 ++---
> arch/powerpc/kernel/sys_ppc32.c | 38 +++++++++++-------
> 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(+), 45 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/syscalls.h b/arch/powerpc/include/asm/syscalls.h
> index 20cbd29b1228..525d2aa0c8ca 100644
> --- a/arch/powerpc/include/asm/syscalls.h
> +++ b/arch/powerpc/include/asm/syscalls.h
> @@ -28,10 +28,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,
> @@ -52,8 +52,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 776ae7565fc5..dcc3c9fd4cfd 100644
> --- a/arch/powerpc/kernel/sys_ppc32.c
> +++ b/arch/powerpc/kernel/sys_ppc32.c
> @@ -47,45 +47,55 @@
> #include <asm/syscalls.h>
> #include <asm/switch_to.h>
>
> -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));
> }
>
> -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 135a0b9108d5..3a35c690150b 100644
> --- a/arch/powerpc/kernel/syscalls.c
> +++ b/arch/powerpc/kernel/syscalls.c
> @@ -87,14 +87,23 @@ static 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, merge_64(offset_high, offset_low),
> merge_64(len_high, len_low), advice);
> diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
> index 64f27cbbdd2c..2bca64f96164 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 64f27cbbdd2c..2bca64f96164 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
>
Apologies. This is in fact V5. I can resend if anyone needs me to.
Rohan
More information about the Linuxppc-dev
mailing list