Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

parisc: Add 64bit get_user() and put_user() for 32bit kernel

Allow accessing 64-bit values in userspace from a 32-bit kernel.
The access is not atomic.

Signed-off-by: Helge Deller <deller@gmx.de>

+15 -1
+15 -1
arch/parisc/include/asm/uaccess.h
··· 40 40 #define get_user __get_user 41 41 42 42 #if !defined(CONFIG_64BIT) 43 - #define LDD_USER(ptr) BUILD_BUG() 43 + #define LDD_USER(ptr) __get_user_asm64(ptr) 44 44 #define STD_USER(x, ptr) __put_user_asm64(x, ptr) 45 45 #else 46 46 #define LDD_USER(ptr) __get_user_asm("ldd", ptr) ··· 113 113 : "=r"(__gu_val), "=r"(__gu_err) \ 114 114 : "r"(ptr), "1"(__gu_err) \ 115 115 : "r1"); 116 + 117 + #if !defined(CONFIG_64BIT) 118 + 119 + #define __get_user_asm64(ptr) \ 120 + __asm__("\n1:\tldw 0(%%sr2,%2),%0" \ 121 + "\n2:\tldw 4(%%sr2,%2),%R0\n\t" \ 122 + ASM_EXCEPTIONTABLE_ENTRY(1b, fixup_get_user_skip_2)\ 123 + ASM_EXCEPTIONTABLE_ENTRY(2b, fixup_get_user_skip_1)\ 124 + : "=r"(__gu_val), "=r"(__gu_err) \ 125 + : "r"(ptr), "1"(__gu_err) \ 126 + : "r1"); 127 + 128 + #endif /* !defined(CONFIG_64BIT) */ 129 + 116 130 117 131 #define __put_user(x, ptr) \ 118 132 ({ \