On March 9, 2016 9:22:25 AM PST, Benjamin LaHaise <b...@kvack.org> wrote: >The existing __get_user() implementation does not support fetching >64 bit values on 32 bit x86. Implement this in a way that does not >generate any incorrect warnings as cautioned by Russell King. Test >code available at http://www.kvack.org/~bcrl/x86_32-get_user.tar . > >Signed-off-by: Benjamin LaHaise <b...@kvack.org> > >diff --git a/arch/x86/include/asm/uaccess.h >b/arch/x86/include/asm/uaccess.h >index a4a30e4..2d0607a 100644 >--- a/arch/x86/include/asm/uaccess.h >+++ b/arch/x86/include/asm/uaccess.h >@@ -333,7 +333,23 @@ do { > \ > } while (0) > > #ifdef CONFIG_X86_32 >-#define __get_user_asm_u64(x, ptr, retval, errret) (x) = >__get_user_bad() >+#define __get_user_asm_u64(x, addr, err, errret) \ >+ asm volatile(ASM_STAC "\n" \ >+ "1: movl %2,%%eax\n" \ >+ "2: movl %3,%%edx\n" \ >+ "3: " ASM_CLAC "\n" \ >+ ".section .fixup,\"ax\"\n" \ >+ "4: mov %4,%0\n" \ >+ " xorl %%eax,%%eax\n" \ >+ " xorl %%edx,%%edx\n" \ >+ " jmp 3b\n" \ >+ ".previous\n" \ >+ _ASM_EXTABLE(1b, 4b) \ >+ _ASM_EXTABLE(2b, 4b) \ >+ : "=r" (err), "=A"(x) \ >+ : "m" (__m(addr)), "m" __m(((u32 *)(addr)) + 1), \ >+ "i" (errret), "0" (err)) >+ > #define __get_user_asm_ex_u64(x, ptr) (x) = __get_user_bad() > #else > #define __get_user_asm_u64(x, ptr, retval, errret) \ >@@ -420,11 +436,20 @@ do { > \ > #define __get_user_nocheck(x, ptr, size) \ > ({ \ > int __gu_err; \ >- unsigned long __gu_val; \ >- __uaccess_begin(); \ >- __get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \ >- __uaccess_end(); \ >- (x) = (__force __typeof__(*(ptr)))__gu_val; \ >+ if (size == 8) { \ >+ unsigned long __gu_val[2]; \ >+ __gu_err = 0; \ >+ __uaccess_begin(); \ >+ __get_user_asm_u64(__gu_val, ptr, __gu_err, -EFAULT); \ >+ __uaccess_end(); \ >+ (x) = *(__force __typeof__((ptr)))__gu_val; \ >+ } else { \ >+ unsigned long __gu_val; \ >+ __uaccess_begin(); \ >+ __get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \ >+ __uaccess_end(); \ >+ (x) = (__force __typeof__(*(ptr)))__gu_val; \ >+ } \ > __builtin_expect(__gu_err, 0); \ > }) >
Weird. I could swear we had already fixed this a few years ago. -- Sent from my Android device with K-9 Mail. Please excuse brevity and formatting.