From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933512AbcCIRjP (ORCPT ); Wed, 9 Mar 2016 12:39:15 -0500 Received: from torg.zytor.com ([198.137.202.12]:46268 "EHLO mail.zytor.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753273AbcCIRjI (ORCPT ); Wed, 9 Mar 2016 12:39:08 -0500 User-Agent: K-9 Mail for Android In-Reply-To: <20160309172225.GN12913@kvack.org> References: <20160309172225.GN12913@kvack.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Subject: Re: [PATCH] x86_32: add support for 64 bit __get_user() From: "H. Peter Anvin" Date: Wed, 09 Mar 2016 09:36:30 -0800 To: Benjamin LaHaise , Ingo Molnar , Russell King CC: Thomas Gleixner , x86@kernel.org, linux-kernel@vger.kernel.org Message-ID: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On March 9, 2016 9:22:25 AM PST, Benjamin LaHaise 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 > >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.