parisc: uaccess: fix compiler warnings caused by __put_user casting [Linux 3.9]

This Linux kernel change "parisc: uaccess: fix compiler warnings caused by __put_user casting" is included in the Linux 3.9 release. This change is authored by Will Deacon <will.deacon [at] arm.com> on Mon Apr 22 12:53:43 2013 +0000. The commit for this change in Linux stable tree is 0f28b62 (patch).

parisc: uaccess: fix compiler warnings caused by __put_user casting

When targetting 32-bit processors, __put_user emits a pair of stw
instructions for the 8-byte case. If the type of __val is a pointer, the
marshalling code casts it to the wider integer type of u64, resulting
in the following compiler warnings:

  kernel/signal.c: In function 'copy_siginfo_to_user':
  kernel/signal.c:2752:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
  kernel/signal.c:2752:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
  [...]

This patch fixes the warnings by removing the marshalling code and using
the correct output modifiers in the __put_{user,kernel}_asm64 macros
so that GCC will allocate the right registers without the need to
extract the two words explicitly.

Cc: Helge Deller <[email protected]>
Signed-off-by: Will Deacon <[email protected]>
Signed-off-by: Helge Deller <[email protected]>

There are 14 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 arch/parisc/include/asm/uaccess.h | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/arch/parisc/include/asm/uaccess.h b/arch/parisc/include/asm/uaccess.h
index 4ba2c93..e0a8235 100644
--- a/arch/parisc/include/asm/uaccess.h
+++ b/arch/parisc/include/asm/uaccess.h
@@ -181,30 +181,24 @@ struct exception_data {
 #if !defined(CONFIG_64BIT)

 #define __put_kernel_asm64(__val,ptr) do {         
-   u64 __val64 = (u64)(__val);             
-   u32 hi = (__val64) >> 32;               
-   u32 lo = (__val64) & 0xffffffff;            
    __asm__ __volatile__ (                  
        "n1:tstw %2,0(%1)"              
-       "n2:tstw %3,4(%1)nt"            
+       "n2:tstw %R2,4(%1)nt"           
        ASM_EXCEPTIONTABLE_ENTRY(1b,fixup_put_user_skip_2)
        ASM_EXCEPTIONTABLE_ENTRY(2b,fixup_put_user_skip_1)
        : "=r"(__pu_err)                            
-       : "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err) 
+       : "r"(ptr), "r"(__val), "0"(__pu_err) 
        : "r1");                    
 } while (0)

 #define __put_user_asm64(__val,ptr) do {               
-   u64 __val64 = (u64)(__val);             
-   u32 hi = (__val64) >> 32;               
-   u32 lo = (__val64) & 0xffffffff;            
    __asm__ __volatile__ (                  
        "n1:tstw %2,0(%%sr3,%1)"            
-       "n2:tstw %3,4(%%sr3,%1)nt"          
+       "n2:tstw %R2,4(%%sr3,%1)nt"         
        ASM_EXCEPTIONTABLE_ENTRY(1b,fixup_put_user_skip_2)
        ASM_EXCEPTIONTABLE_ENTRY(2b,fixup_put_user_skip_1)
        : "=r"(__pu_err)                            
-       : "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err) 
+       : "r"(ptr), "r"(__val), "0"(__pu_err) 
        : "r1");                    
 } while (0)

Leave a Reply

Your email address will not be published. Required fields are marked *