compat: make linux/compat.h available everywhere
authorArnd Bergmann <arnd@arndb.de>
Thu, 22 Jul 2021 14:28:58 +0000 (16:28 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 Jul 2021 13:20:24 +0000 (14:20 +0100)
Parts of linux/compat.h are under an #ifdef, but we end up
using more of those over time, moving things around bit by
bit.

To get it over with once and for all, make all of this file
uncondititonal now so it can be accessed everywhere. There
are only a few types left that are in asm/compat.h but not
yet in the asm-generic version, so add those in the process.

This requires providing a few more types in asm-generic/compat.h
that were not already there. The only tricky one is
compat_sigset_t, which needs a little help on 32-bit architectures
and for x86.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/arm64/include/asm/compat.h
arch/mips/include/asm/compat.h
arch/parisc/include/asm/compat.h
arch/powerpc/include/asm/compat.h
arch/s390/include/asm/compat.h
arch/sparc/include/asm/compat.h
arch/x86/include/asm/compat.h
arch/x86/include/asm/signal.h
include/asm-generic/compat.h
include/linux/compat.h

index 23a9fb7..79c1a75 100644 (file)
@@ -5,6 +5,9 @@
 #ifndef __ASM_COMPAT_H
 #define __ASM_COMPAT_H
 
+#define compat_mode_t compat_mode_t
+typedef u16            compat_mode_t;
+
 #include <asm-generic/compat.h>
 
 #ifdef CONFIG_COMPAT
@@ -27,13 +30,9 @@ typedef u16          __compat_uid_t;
 typedef u16            __compat_gid_t;
 typedef u16            __compat_uid16_t;
 typedef u16            __compat_gid16_t;
-typedef u32            __compat_uid32_t;
-typedef u32            __compat_gid32_t;
-typedef u16            compat_mode_t;
 typedef u32            compat_dev_t;
 typedef s32            compat_nlink_t;
 typedef u16            compat_ipc_pid_t;
-typedef u32            compat_caddr_t;
 typedef __kernel_fsid_t        compat_fsid_t;
 
 struct compat_stat {
@@ -103,13 +102,6 @@ struct compat_statfs {
 
 #define COMPAT_RLIM_INFINITY           0xffffffff
 
-typedef u32            compat_old_sigset_t;
-
-#define _COMPAT_NSIG           64
-#define _COMPAT_NSIG_BPW       32
-
-typedef u32            compat_sigset_word;
-
 #define COMPAT_OFF_T_MAX       0x7fffffff
 
 #define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current)))
index 6597571..53f015a 100644 (file)
@@ -9,20 +9,25 @@
 #include <asm/page.h>
 #include <asm/ptrace.h>
 
+typedef s32            __compat_uid_t;
+typedef s32            __compat_gid_t;
+typedef __compat_uid_t __compat_uid32_t;
+typedef __compat_gid_t __compat_gid32_t;
+#define __compat_uid32_t __compat_uid32_t
+#define __compat_gid32_t __compat_gid32_t
+
+#define _COMPAT_NSIG           128             /* Don't ask !$@#% ...  */
+#define _COMPAT_NSIG_BPW       32
+typedef u32            compat_sigset_word;
+
 #include <asm-generic/compat.h>
 
 #define COMPAT_USER_HZ         100
 #define COMPAT_UTS_MACHINE     "mips\0\0\0"
 
-typedef s32            __compat_uid_t;
-typedef s32            __compat_gid_t;
-typedef __compat_uid_t __compat_uid32_t;
-typedef __compat_gid_t __compat_gid32_t;
-typedef u32            compat_mode_t;
 typedef u32            compat_dev_t;
 typedef u32            compat_nlink_t;
 typedef s32            compat_ipc_pid_t;
-typedef s32            compat_caddr_t;
 typedef struct {
        s32     val[2];
 } compat_fsid_t;
@@ -89,13 +94,6 @@ struct compat_statfs {
 
 #define COMPAT_RLIM_INFINITY   0x7fffffffUL
 
-typedef u32            compat_old_sigset_t;    /* at least 32 bits */
-
-#define _COMPAT_NSIG           128             /* Don't ask !$@#% ...  */
-#define _COMPAT_NSIG_BPW       32
-
-typedef u32            compat_sigset_word;
-
 #define COMPAT_OFF_T_MAX       0x7fffffff
 
 static inline void __user *arch_compat_alloc_user_space(long len)
index 1a609d3..b5d90e8 100644 (file)
@@ -8,6 +8,9 @@
 #include <linux/sched.h>
 #include <linux/thread_info.h>
 
+#define compat_mode_t compat_mode_t
+typedef u16    compat_mode_t;
+
 #include <asm-generic/compat.h>
 
 #define COMPAT_USER_HZ                 100
 
 typedef u32    __compat_uid_t;
 typedef u32    __compat_gid_t;
-typedef u32    __compat_uid32_t;
-typedef u32    __compat_gid32_t;
-typedef u16    compat_mode_t;
 typedef u32    compat_dev_t;
 typedef u16    compat_nlink_t;
 typedef u16    compat_ipc_pid_t;
-typedef u32    compat_caddr_t;
 
 struct compat_stat {
        compat_dev_t            st_dev; /* dev_t is 32 bits on parisc */
@@ -96,13 +95,6 @@ struct compat_sigcontext {
 
 #define COMPAT_RLIM_INFINITY 0xffffffff
 
-typedef u32            compat_old_sigset_t;    /* at least 32 bits */
-
-#define _COMPAT_NSIG           64
-#define _COMPAT_NSIG_BPW       32
-
-typedef u32            compat_sigset_word;
-
 #define COMPAT_OFF_T_MAX       0x7fffffff
 
 struct compat_ipc64_perm {
index 9191fc2..e33dcf1 100644 (file)
 
 typedef u32            __compat_uid_t;
 typedef u32            __compat_gid_t;
-typedef u32            __compat_uid32_t;
-typedef u32            __compat_gid32_t;
-typedef u32            compat_mode_t;
 typedef u32            compat_dev_t;
 typedef s16            compat_nlink_t;
 typedef u16            compat_ipc_pid_t;
-typedef u32            compat_caddr_t;
 typedef __kernel_fsid_t        compat_fsid_t;
 
 struct compat_stat {
@@ -85,13 +81,6 @@ struct compat_statfs {
 
 #define COMPAT_RLIM_INFINITY           0xffffffff
 
-typedef u32            compat_old_sigset_t;
-
-#define _COMPAT_NSIG           64
-#define _COMPAT_NSIG_BPW       32
-
-typedef u32            compat_sigset_word;
-
 #define COMPAT_OFF_T_MAX       0x7fffffff
 
 static inline void __user *arch_compat_alloc_user_space(long len)
index ea5b9c3..8d49505 100644 (file)
@@ -9,6 +9,9 @@
 #include <linux/sched/task_stack.h>
 #include <linux/thread_info.h>
 
+#define compat_mode_t  compat_mode_t
+typedef u16            compat_mode_t;
+
 #include <asm-generic/compat.h>
 
 #define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p( \
 
 typedef u16            __compat_uid_t;
 typedef u16            __compat_gid_t;
-typedef u32            __compat_uid32_t;
-typedef u32            __compat_gid32_t;
-typedef u16            compat_mode_t;
 typedef u16            compat_dev_t;
 typedef u16            compat_nlink_t;
 typedef u16            compat_ipc_pid_t;
-typedef u32            compat_caddr_t;
 typedef __kernel_fsid_t        compat_fsid_t;
 
 typedef struct {
@@ -155,13 +154,6 @@ struct compat_statfs64 {
 
 #define COMPAT_RLIM_INFINITY           0xffffffff
 
-typedef u32            compat_old_sigset_t;    /* at least 32 bits */
-
-#define _COMPAT_NSIG           64
-#define _COMPAT_NSIG_BPW       32
-
-typedef u32            compat_sigset_word;
-
 #define COMPAT_OFF_T_MAX       0x7fffffff
 
 /*
index b85842c..8b63410 100644 (file)
@@ -6,6 +6,9 @@
  */
 #include <linux/types.h>
 
+#define compat_mode_t  compat_mode_t
+typedef u16            compat_mode_t;
+
 #include <asm-generic/compat.h>
 
 #define COMPAT_USER_HZ         100
 
 typedef u16            __compat_uid_t;
 typedef u16            __compat_gid_t;
-typedef u32            __compat_uid32_t;
-typedef u32            __compat_gid32_t;
-typedef u16            compat_mode_t;
 typedef u16            compat_dev_t;
 typedef s16            compat_nlink_t;
 typedef u16            compat_ipc_pid_t;
-typedef u32            compat_caddr_t;
 typedef __kernel_fsid_t        compat_fsid_t;
 
 struct compat_stat {
@@ -115,13 +114,6 @@ struct compat_statfs {
 
 #define COMPAT_RLIM_INFINITY 0x7fffffff
 
-typedef u32            compat_old_sigset_t;
-
-#define _COMPAT_NSIG           64
-#define _COMPAT_NSIG_BPW       32
-
-typedef u32            compat_sigset_word;
-
 #define COMPAT_OFF_T_MAX       0x7fffffff
 
 #ifdef CONFIG_COMPAT
index be09c7e..4ae01cd 100644 (file)
@@ -12,6 +12,9 @@
 #include <asm/user32.h>
 #include <asm/unistd.h>
 
+#define compat_mode_t  compat_mode_t
+typedef u16            compat_mode_t;
+
 #include <asm-generic/compat.h>
 
 #define COMPAT_USER_HZ         100
 
 typedef u16            __compat_uid_t;
 typedef u16            __compat_gid_t;
-typedef u32            __compat_uid32_t;
-typedef u32            __compat_gid32_t;
-typedef u16            compat_mode_t;
 typedef u16            compat_dev_t;
 typedef u16            compat_nlink_t;
 typedef u16            compat_ipc_pid_t;
-typedef u32            compat_caddr_t;
 typedef __kernel_fsid_t        compat_fsid_t;
 
 struct compat_stat {
@@ -92,13 +91,6 @@ struct compat_statfs {
 
 #define COMPAT_RLIM_INFINITY           0xffffffff
 
-typedef u32            compat_old_sigset_t;    /* at least 32 bits */
-
-#define _COMPAT_NSIG           64
-#define _COMPAT_NSIG_BPW       32
-
-typedef u32               compat_sigset_word;
-
 #define COMPAT_OFF_T_MAX       0x7fffffff
 
 struct compat_ipc64_perm {
index 6fd8410..2dfb5fe 100644 (file)
@@ -29,6 +29,7 @@ typedef struct {
 #define SA_X32_ABI     0x01000000u
 
 #ifndef CONFIG_COMPAT
+#define compat_sigset_t compat_sigset_t
 typedef sigset_t compat_sigset_t;
 #endif
 
index 30f7b18..d46c020 100644 (file)
@@ -20,7 +20,18 @@ typedef u16 compat_ushort_t;
 typedef u32 compat_uint_t;
 typedef u32 compat_ulong_t;
 typedef u32 compat_uptr_t;
+typedef u32 compat_caddr_t;
 typedef u32 compat_aio_context_t;
+typedef u32 compat_old_sigset_t;
+
+#ifndef __compat_uid32_t
+typedef u32 __compat_uid32_t;
+typedef u32 __compat_gid32_t;
+#endif
+
+#ifndef compat_mode_t
+typedef u32 compat_mode_t;
+#endif
 
 #ifdef CONFIG_COMPAT_FOR_U64_ALIGNMENT
 typedef s64 __attribute__((aligned(4))) compat_s64;
@@ -30,4 +41,10 @@ typedef s64 compat_s64;
 typedef u64 compat_u64;
 #endif
 
+#ifndef _COMPAT_NSIG
+typedef u32 compat_sigset_word;
+#define _COMPAT_NSIG _NSIG
+#define _COMPAT_NSIG_BPW 32
+#endif
+
 #endif
index c270124..8e0598c 100644 (file)
 #include <linux/unistd.h>
 
 #include <asm/compat.h>
-
-#ifdef CONFIG_COMPAT
 #include <asm/siginfo.h>
 #include <asm/signal.h>
-#endif
 
 #ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
 /*
@@ -95,8 +92,6 @@ struct compat_iovec {
        compat_size_t   iov_len;
 };
 
-#ifdef CONFIG_COMPAT
-
 #ifndef compat_user_stack_pointer
 #define compat_user_stack_pointer() current_user_stack_pointer()
 #endif
@@ -131,9 +126,11 @@ struct compat_tms {
 
 #define _COMPAT_NSIG_WORDS     (_COMPAT_NSIG / _COMPAT_NSIG_BPW)
 
+#ifndef compat_sigset_t
 typedef struct {
        compat_sigset_word      sig[_COMPAT_NSIG_WORDS];
 } compat_sigset_t;
+#endif
 
 int set_compat_user_sigmask(const compat_sigset_t __user *umask,
                            size_t sigsetsize);
@@ -384,6 +381,7 @@ struct compat_keyctl_kdf_params {
        __u32 __spare[8];
 };
 
+struct compat_stat;
 struct compat_statfs;
 struct compat_statfs64;
 struct compat_old_linux_dirent;
@@ -428,7 +426,7 @@ put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
                  unsigned int size)
 {
        /* size <= sizeof(compat_sigset_t) <= sizeof(sigset_t) */
-#ifdef __BIG_ENDIAN
+#if defined(__BIG_ENDIAN) && defined(CONFIG_64BIT)
        compat_sigset_t v;
        switch (_NSIG_WORDS) {
        case 4: v.sig[7] = (set->sig[3] >> 32); v.sig[6] = set->sig[3];
@@ -929,17 +927,6 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
 
 #endif /* CONFIG_ARCH_HAS_SYSCALL_WRAPPER */
 
-
-/*
- * For most but not all architectures, "am I in a compat syscall?" and
- * "am I a compat task?" are the same question.  For architectures on which
- * they aren't the same question, arch code can override in_compat_syscall.
- */
-
-#ifndef in_compat_syscall
-static inline bool in_compat_syscall(void) { return is_compat_task(); }
-#endif
-
 /**
  * ns_to_old_timeval32 - Compat version of ns_to_timeval
  * @nsec:      the nanoseconds value to be converted
@@ -969,6 +956,17 @@ int kcompat_sys_statfs64(const char __user * pathname, compat_size_t sz,
 int kcompat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
                          struct compat_statfs64 __user * buf);
 
+#ifdef CONFIG_COMPAT
+
+/*
+ * For most but not all architectures, "am I in a compat syscall?" and
+ * "am I a compat task?" are the same question.  For architectures on which
+ * they aren't the same question, arch code can override in_compat_syscall.
+ */
+#ifndef in_compat_syscall
+static inline bool in_compat_syscall(void) { return is_compat_task(); }
+#endif
+
 #else /* !CONFIG_COMPAT */
 
 #define is_compat_task() (0)