strncpy_from_user.S 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /*
  2. * Based on arch/arm/lib/strncpy_from_user.S
  3. *
  4. * Copyright (C) 1995-2000 Russell King
  5. * Copyright (C) 2012 ARM Ltd.
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include <linux/linkage.h>
  20. #include <asm/assembler.h>
  21. #include <asm/errno.h>
  22. .text
  23. .align 5
  24. /*
  25. * Copy a string from user space to kernel space.
  26. * x0 = dst, x1 = src, x2 = byte length
  27. * returns the number of characters copied (strlen of copied string),
  28. * -EFAULT on exception, or "len" if we fill the whole buffer
  29. */
  30. ENTRY(__strncpy_from_user)
  31. mov x4, x1
  32. 1: subs x2, x2, #1
  33. bmi 2f
  34. USER(9f, ldrb w3, [x1], #1 )
  35. strb w3, [x0], #1
  36. cbnz w3, 1b
  37. sub x1, x1, #1 // take NUL character out of count
  38. 2: sub x0, x1, x4
  39. ret
  40. ENDPROC(__strncpy_from_user)
  41. .section .fixup,"ax"
  42. .align 0
  43. 9: strb wzr, [x0] // null terminate
  44. mov x0, #-EFAULT
  45. ret
  46. .previous