[IA64] strcpy returns NULL pointer and not destination pointer
authorChen, Kenneth W <kenneth.w.chen@intel.com>
Wed, 3 May 2006 18:53:43 +0000 (11:53 -0700)
committerTony Luck <tony.luck@intel.com>
Fri, 5 May 2006 18:34:55 +0000 (11:34 -0700)
Bob Picco noted that 6edfba1b33c701108717f4e036320fc39abe1912
dropped the -ffreestanding compiler flag from the top level
Makefile, which allows the compiler to substitute memcpy() in
places where strcpy() is used with a known size source string.
But the ia64 memcpy() returns 0 for success, and "bytes copied"
for failure.

Fix to return the address of the destination string (like
stdlibc version, and other architectures).  There are no
places where ia64 specific code makes use of the non-standard
return value.

Signed-off-by: Ken Chen <kenneth.w.chen@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
arch/ia64/lib/memcpy_mck.S

index 46c9331..9e534d5 100644 (file)
@@ -6,7 +6,9 @@
  *     in1:    source address
  *     in2:    number of bytes to copy
  * Output:
- *     0 if success, or number of byte NOT copied if error occurred.
+ *     for memcpy:    return dest
+ *     for copy_user: return 0 if success,
+ *                    or number of byte NOT copied if error occurred.
  *
  * Copyright (C) 2002 Intel Corp.
  * Copyright (C) 2002 Ken Chen <kenneth.w.chen@intel.com>
@@ -73,6 +75,7 @@ GLOBAL_ENTRY(memcpy)
        and     r28=0x7,in0
        and     r29=0x7,in1
        mov     f6=f0
+       mov     retval=in0
        br.cond.sptk .common_code
        ;;
 END(memcpy)
@@ -84,7 +87,7 @@ GLOBAL_ENTRY(__copy_user)
        mov     f6=f1
        mov     saved_in0=in0   // save dest pointer
        mov     saved_in1=in1   // save src pointer
-       mov     saved_in2=in2   // save len
+       mov     retval=r0       // initialize return value
        ;;
 .common_code:
        cmp.gt  p15,p0=8,in2    // check for small size
@@ -92,7 +95,7 @@ GLOBAL_ENTRY(__copy_user)
        cmp.ne  p14,p0=0,r29    // check src alignment
        add     src0=0,in1
        sub     r30=8,r28       // for .align_dest
-       mov     retval=r0       // initialize return value
+       mov     saved_in2=in2   // save len
        ;;
        add     dst0=0,in0
        add     dst1=1,in0      // dest odd index