strncpy_from_user.S 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Just like strncpy() except that if a fault occurs during copying,
  4. * -EFAULT is returned.
  5. *
  6. * Inputs:
  7. * in0: address of destination buffer
  8. * in1: address of string to be copied
  9. * in2: length of buffer in bytes
  10. * Outputs:
  11. * r8: -EFAULT in case of fault or number of bytes copied if no fault
  12. *
  13. * Copyright (C) 1998-2001 Hewlett-Packard Co
  14. * Copyright (C) 1998-2001 David Mosberger-Tang <davidm@hpl.hp.com>
  15. *
  16. * 00/03/06 D. Mosberger Fixed to return proper return value (bug found by
  17. * by Andreas Schwab <schwab@suse.de>).
  18. */
  19. #include <asm/asmmacro.h>
  20. #include <asm/export.h>
  21. GLOBAL_ENTRY(__strncpy_from_user)
  22. alloc r2=ar.pfs,3,0,0,0
  23. mov r8=0
  24. mov r9=in1
  25. ;;
  26. add r10=in1,in2
  27. cmp.eq p6,p0=r0,in2
  28. (p6) br.ret.spnt.many rp
  29. // XXX braindead copy loop---this needs to be optimized
  30. .Loop1:
  31. EX(.Lexit, ld1 r8=[in1],1)
  32. ;;
  33. EX(.Lexit, st1 [in0]=r8,1)
  34. cmp.ne p6,p7=r8,r0
  35. ;;
  36. (p6) cmp.ne.unc p8,p0=in1,r10
  37. (p8) br.cond.dpnt.few .Loop1
  38. ;;
  39. (p6) mov r8=in2 // buffer filled up---return buffer length
  40. (p7) sub r8=in1,r9,1 // return string length (excluding NUL character)
  41. [.Lexit:]
  42. br.ret.sptk.many rp
  43. END(__strncpy_from_user)
  44. EXPORT_SYMBOL(__strncpy_from_user)