summarylogtreecommitdiffstats
path: root/0007-Linux-Refactor-test-for-32bit-compat.patch
diff options
context:
space:
mode:
Diffstat (limited to '0007-Linux-Refactor-test-for-32bit-compat.patch')
-rw-r--r--0007-Linux-Refactor-test-for-32bit-compat.patch212
1 files changed, 212 insertions, 0 deletions
diff --git a/0007-Linux-Refactor-test-for-32bit-compat.patch b/0007-Linux-Refactor-test-for-32bit-compat.patch
new file mode 100644
index 000000000000..89137c7c8d06
--- /dev/null
+++ b/0007-Linux-Refactor-test-for-32bit-compat.patch
@@ -0,0 +1,212 @@
+From 7efd65a984e5b50904e556992f533c460d9fcf9e Mon Sep 17 00:00:00 2001
+From: Cheyenne Wills <cwills@sinenomine.net>
+Date: Fri, 29 Jan 2021 11:32:36 -0700
+Subject: [PATCH 7/8] Linux: Refactor test for 32bit compat
+
+Refactor the preprocessor checks for determining the method to test for
+32bit compatibility (64bit kernel performing work for a 32bit task) into
+a common inline function, 'afs_in_compat_syscall' that is defined in
+LINUX/osi_machdep.h. Update osi_ioctl.c and afs_syscall.c to use
+afs_in_compat_syscall.
+
+Add include afs/sysincludes into osi_machdep.h to ensure linux/compat.h
+is pulled for the functions called in afs_in_compat_syscall.
+
+Reviewed-on: https://gerrit.openafs.org/14500
+Tested-by: BuildBot <buildbot@rampaginggeek.com>
+Reviewed-by: Andrew Deason <adeason@sinenomine.net>
+Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
+(cherry picked from commit 32cc6b0796495e596262d84c428172a511f757c4)
+
+Change-Id: I746e5777737d49381c4a74627b79d2a61cbd4f8e
+Reviewed-on: https://gerrit.openafs.org/14510
+Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
+Reviewed-by: Andrew Deason <adeason@sinenomine.net>
+Tested-by: BuildBot <buildbot@rampaginggeek.com>
+Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
+---
+ src/afs/LINUX/osi_ioctl.c | 14 ++------
+ src/afs/LINUX/osi_machdep.h | 40 +++++++++++++++++++++
+ src/afs/afs_syscall.c | 70 +++----------------------------------
+ 3 files changed, 47 insertions(+), 77 deletions(-)
+
+diff --git a/src/afs/LINUX/osi_ioctl.c b/src/afs/LINUX/osi_ioctl.c
+index 9ba076a1b..7d355674d 100644
+--- a/src/afs/LINUX/osi_ioctl.c
++++ b/src/afs/LINUX/osi_ioctl.c
+@@ -43,21 +43,13 @@ afs_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
+ {
+
+ struct afsprocdata sysargs;
+-#ifdef NEED_IOCTL32
+- struct afsprocdata32 sysargs32;
+-#endif
+
+ if (cmd != VIOC_SYSCALL && cmd != VIOC_SYSCALL32) return -EINVAL;
+
+ #ifdef NEED_IOCTL32
+-# if defined(AFS_S390X_LINUX26_ENV)
+- if (test_thread_flag(TIF_31BIT))
+-# elif defined(AFS_AMD64_LINUX20_ENV)
+- if (test_thread_flag(TIF_IA32))
+-# else
+- if (test_thread_flag(TIF_32BIT))
+-# endif /* AFS_S390X_LINUX26_ENV */
+- {
++ if (afs_in_compat_syscall()) {
++ struct afsprocdata32 sysargs32;
++
+ if (copy_from_user(&sysargs32, (void *)arg,
+ sizeof(struct afsprocdata32)))
+ return -EFAULT;
+diff --git a/src/afs/LINUX/osi_machdep.h b/src/afs/LINUX/osi_machdep.h
+index 784829627..9ecdaf0bf 100644
+--- a/src/afs/LINUX/osi_machdep.h
++++ b/src/afs/LINUX/osi_machdep.h
+@@ -76,6 +76,8 @@
+ #include "h/cred.h"
+ #endif
+
++#include "afs/sysincludes.h"
++
+ #if !defined(HAVE_LINUX_TIME_T)
+ typedef time64_t time_t;
+ #endif
+@@ -157,6 +159,44 @@ static inline long copyinstr(char *from, char *to, int count, int *length) {
+ }
+ #define copyout(F, T, C) (copy_to_user ((char*)(T), (char*)(F), (C)) > 0 ? EFAULT : 0)
+
++/*
++ * Test to see for 64/32bit compatibility mode
++ * Return non-zero if in a 64bit kernel and handing a 32bit syscall
++ */
++#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV)
++static inline int
++afs_in_compat_syscall(void)
++{
++# if defined(AFS_SPARC64_LINUX26_ENV)
++ return test_thread_flag(TIF_32BIT);
++# elif defined(AFS_SPARC64_LINUX24_ENV)
++ return (current->thread.flags & SPARC_FLAG_32BIT) != 0;
++# elif defined(AFS_SPARC64_LINUX20_ENV)
++ return (current->tss.flags & SPARC_FLAG_32BIT) != 0;
++# elif defined(AFS_AMD64_LINUX26_ENV)
++ return test_thread_flag(TIF_IA32);
++# elif defined(AFS_AMD64_LINUX20_ENV)
++ return (current->thread.flags & THREAD_IA32) != 0;
++# elif defined(AFS_PPC64_LINUX26_ENV)
++# if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
++ return (current->thread_info->flags & _TIF_32BIT) != 0;
++# else
++ return (task_thread_info(current)->flags & _TIF_32BIT) != 0;
++# endif
++# elif defined(AFS_PPC64_LINUX20_ENV)
++ return (current->thread.flags & PPC_FLAG_32BIT) != 0;
++# elif defined(AFS_S390X_LINUX26_ENV)
++ return test_thread_flag(TIF_31BIT);
++# elif defined(AFS_S390X_LINUX20_ENV)
++ return (current->thread.flags & S390_FLAG_31BIT) != 0;
++# elif defined(AFS_ARM64_LINUX26_ENV)
++ return is_compat_task();
++# else
++# error afs_in_compat_syscall not done for this linux
++# endif
++}
++#endif /* AFS_LINUX_64BIT_KERNEL */
++
+ /* kernel print statements */
+ #define printf(args...) printk(args)
+ #define uprintf(args...) printk(args)
+diff --git a/src/afs/afs_syscall.c b/src/afs/afs_syscall.c
+index ce6afdf9a..9414f38b8 100644
+--- a/src/afs/afs_syscall.c
++++ b/src/afs/afs_syscall.c
+@@ -114,40 +114,9 @@ copyin_afs_ioctl(caddr_t cmarg, struct afs_ioctl *dst)
+ #endif /* defined(AFS_SGI_ENV) && (_MIPS_SZLONG==64) */
+
+ #if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV)
+- struct afs_ioctl32 dst32;
+-
+-#ifdef AFS_SPARC64_LINUX26_ENV
+- if (test_thread_flag(TIF_32BIT))
+-#elif defined(AFS_SPARC64_LINUX24_ENV)
+- if (current->thread.flags & SPARC_FLAG_32BIT)
+-#elif defined(AFS_SPARC64_LINUX20_ENV)
+- if (current->tss.flags & SPARC_FLAG_32BIT)
+-
+-#elif defined(AFS_AMD64_LINUX26_ENV)
+- if (test_thread_flag(TIF_IA32))
+-#elif defined(AFS_AMD64_LINUX20_ENV)
+- if (current->thread.flags & THREAD_IA32)
+-
+-#elif defined(AFS_PPC64_LINUX26_ENV)
+-#if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
+- if (current->thread_info->flags & _TIF_32BIT)
+-#else
+- if (task_thread_info(current)->flags & _TIF_32BIT)
+-#endif
+-#elif defined(AFS_PPC64_LINUX20_ENV)
+- if (current->thread.flags & PPC_FLAG_32BIT)
+-
+-#elif defined(AFS_S390X_LINUX26_ENV)
+- if (test_thread_flag(TIF_31BIT))
+-#elif defined(AFS_S390X_LINUX20_ENV)
+- if (current->thread.flags & S390_FLAG_31BIT)
+-#elif defined(AFS_ARM64_LINUX26_ENV)
+- if (is_compat_task())
++ if (afs_in_compat_syscall()) {
++ struct afs_ioctl32 dst32;
+
+-#else
+-#error pioctl32 not done for this linux
+-#endif
+- {
+ AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code);
+ if (!code)
+ afs_ioctl32_to_afs_ioctl(&dst32, dst);
+@@ -391,40 +360,9 @@ copyin_iparam(caddr_t cmarg, struct iparam *dst)
+ #endif /* AFS_SUN5_64BIT_ENV */
+
+ #if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV)
+- struct iparam32 dst32;
+-
+-#ifdef AFS_SPARC64_LINUX26_ENV
+- if (test_thread_flag(TIF_32BIT))
+-#elif defined(AFS_SPARC64_LINUX24_ENV)
+- if (current->thread.flags & SPARC_FLAG_32BIT)
+-#elif defined(AFS_SPARC64_LINUX20_ENV)
+- if (current->tss.flags & SPARC_FLAG_32BIT)
+-
+-#elif defined(AFS_AMD64_LINUX26_ENV)
+- if (test_thread_flag(TIF_IA32))
+-#elif defined(AFS_AMD64_LINUX20_ENV)
+- if (current->thread.flags & THREAD_IA32)
+-
+-#elif defined(AFS_PPC64_LINUX26_ENV)
+-#if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
+- if (current->thread_info->flags & _TIF_32BIT)
+-#else
+- if (task_thread_info(current)->flags & _TIF_32BIT)
+-#endif
+-#elif defined(AFS_PPC64_LINUX20_ENV)
+- if (current->thread.flags & PPC_FLAG_32BIT)
+-
+-#elif defined(AFS_S390X_LINUX26_ENV)
+- if (test_thread_flag(TIF_31BIT))
+-#elif defined(AFS_S390X_LINUX20_ENV)
+- if (current->thread.flags & S390_FLAG_31BIT)
+-#elif defined(AFS_ARM64_LINUX26_ENV)
+- if (is_compat_task())
++ if (afs_in_compat_syscall()) {
++ struct iparam32 dst32;
+
+-#else
+-#error iparam32 not done for this linux platform
+-#endif
+- {
+ AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code);
+ if (!code)
+ iparam32_to_iparam(&dst32, dst);
+--
+2.30.1
+