Le 19/08/2022 à 05:37, 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.
> 
> 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 <rmcl...@linux.ibm.com>
> ---
> V1 -> V2: All syscall handlers wrapped by this macro.
> V2 -> V3: Move creation of do_ppc64_personality helper to prior patch.
> ---
>   arch/powerpc/include/asm/syscalls.h          | 18 +++---
>   arch/powerpc/kernel/sys_ppc32.c              | 52 ++++++++++--------
>   arch/powerpc/kernel/syscalls.c               | 16 ++++--
>   arch/powerpc/kernel/syscalls/syscall.tbl     | 22 ++++----
>   .../arch/powerpc/entry/syscalls/syscall.tbl  | 22 ++++----
>   5 files changed, 71 insertions(+), 59 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/syscalls.h 
> b/arch/powerpc/include/asm/syscalls.h
> index 739498c358a1..0af7c2d8b2c9 100644
> --- a/arch/powerpc/include/asm/syscalls.h
> +++ b/arch/powerpc/include/asm/syscalls.h
> @@ -11,15 +11,15 @@
>   struct rtas_args;
>   
>   long sys_mmap(unsigned long addr, size_t len,
> -           unsigned long prot, unsigned long flags,
> -           unsigned long fd, off_t offset);
> +             unsigned long prot, unsigned long flags,
> +             unsigned long fd, off_t offset);

You broke parenthesis alignment.
Second/third lines have to be aligned to start of parenthesis on first line.

>   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);
> +             unsigned long prot, unsigned long flags,
> +             unsigned long fd, unsigned long pgoff);
> +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 f4edcc9489fb..60cb5b4413b0 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,55 @@ 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);
>   }
>   
> -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 9f29e451e2de..e89a2176b2a3 100644
> --- a/arch/powerpc/kernel/syscalls.c
> +++ b/arch/powerpc/kernel/syscalls.c
> @@ -76,14 +76,22 @@ 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);
> +}

Add a blank line here.

> +#ifdef CONFIG_COMPAT
> +COMPAT_SYSCALL_DEFINE1(ppc64_personality, unsigned long, personality)
>   {
>       return do_ppc64_personality(personality);
>   }
> -#endif
> +#endif /* CONFIG_COMPAT */
> +#endif /* CONFIG_PPC64 */
>   
> -long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low,
> -                   u32 len_high, u32 len_low)
> +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

Reply via email to