strnlen_user.S 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*
  2. * Based on arch/arm/lib/strnlen_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. /* Prototype: unsigned long __strnlen_user(const char *str, long n)
  25. * Purpose : get length of a string in user memory
  26. * Params : str - address of string in user memory
  27. * Returns : length of string *including terminator*
  28. * or zero on exception, or n if too long
  29. */
  30. ENTRY(__strnlen_user)
  31. mov x2, x0
  32. 1: subs x1, x1, #1
  33. b.mi 2f
  34. USER(9f, ldrb w3, [x0], #1 )
  35. cbnz w3, 1b
  36. 2: sub x0, x0, x2
  37. ret
  38. ENDPROC(__strnlen_user)
  39. .section .fixup,"ax"
  40. .align 0
  41. 9: mov x0, #0
  42. ret
  43. .previous