strncpy_from_user.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: strncpy_from_user.S,v 1.6 1999/05/25 16:53:05 jj Exp $
  2.  * strncpy_from_user.S: Sparc64 strncpy from userspace.
  3.  *
  4.  *  Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
  5.  */
  6. #include <asm/asi.h>
  7. #include <asm/errno.h>
  8. .data
  9. .align 8
  10. 0: .xword 0x0101010101010101
  11. .text
  12. .align 4
  13. /* Must return:
  14.  *
  15.  * -EFAULT for an exception
  16.  * count if we hit the buffer limit
  17.  * bytes copied if we hit a null byte
  18.  * (without the null byte)
  19.  *
  20.  * This implementation assumes:
  21.  * %o1 is 8 aligned => !(%o2 & 7)
  22.  * %o0 is 8 aligned (if not, it will be slooooow, but will work)
  23.  *
  24.  * This is optimized for the common case:
  25.  * in my stats, 90% of src are 8 aligned (even on sparc32)
  26.  * and average length is 18 or so.
  27.  */
  28. .globl __strncpy_from_user
  29. __strncpy_from_user:
  30. /* %o0=dest, %o1=src, %o2=count */
  31. sethi %hi(0b), %o5 ! IEU0 Group
  32. andcc %o1, 7, %g0 ! IEU1
  33. bne,pn %icc, 30f ! CTI
  34.  ldx [%o5 + %lo(0b)], %o4 ! Load Group
  35. add %o0, %o2, %g3 ! IEU0
  36. 60: ldxa [%o1] %asi, %g1 ! Load Group
  37. brlez,pn %o2, 10f ! CTI
  38.  sllx %o4, 7, %o5 ! IEU0 Group
  39. mov %o0, %o3 ! IEU1
  40. 1: sub %g1, %o4, %g2 ! IEU0 Group
  41. stx %g1, [%o0] ! Store
  42. add %o0, 8, %o0 ! IEU1
  43. andcc %g2, %o5, %g0 ! IEU1 Group
  44. bne,pn %xcc, 5f ! CTI
  45.  add %o1, 8, %o1 ! IEU0
  46. cmp %o0, %g3 ! IEU1 Group
  47. bl,a,pt %xcc, 1b ! CTI
  48. 61:  ldxa [%o1] %asi, %g1 ! Load
  49. 10: retl ! CTI Group
  50.  mov %o2, %o0 ! IEU0
  51. 5: srlx %g2, 32, %g7 ! IEU0 Group
  52. sethi %hi(0xff00), %g5 ! IEU1
  53. andcc %g7, %o5, %g0 ! IEU1 Group
  54. be,pn %icc, 2f ! CTI
  55.  or %g5, %lo(0xff00), %g5 ! IEU0
  56. srlx %g1, 48, %g7 ! IEU0 Group
  57. andcc %g7, %g5, %g0 ! IEU1 Group
  58. be,pn %icc, 50f ! CTI
  59.  andcc %g7, 0xff, %g0 ! IEU1 Group
  60. be,pn %icc, 51f ! CTI
  61.  srlx %g1, 32, %g7 ! IEU0
  62. andcc %g7, %g5, %g0 ! IEU1 Group
  63. be,pn %icc, 52f ! CTI
  64.  andcc %g7, 0xff, %g0 ! IEU1 Group
  65. be,pn %icc, 53f ! CTI
  66. 2:  andcc %g2, %o5, %g0 ! IEU1 Group
  67. be,pn %icc, 2f ! CTI
  68.  srl %g1, 16, %g7 ! IEU0
  69. andcc %g7, %g5, %g0 ! IEU1 Group
  70. be,pn %icc, 54f ! CTI
  71.  andcc %g7, 0xff, %g0 ! IEU1 Group
  72. be,pn %icc, 55f ! CTI
  73.  andcc %g1, %g5, %g0 ! IEU1 Group
  74. be,pn %icc, 56f ! CTI
  75.  andcc %g1, 0xff, %g0 ! IEU1 Group
  76. be,a,pn %icc, 57f ! CTI
  77.  sub %o0, %o3, %o0 ! IEU0
  78. 2: cmp %o0, %g3 ! IEU1 Group
  79. bl,a,pt %xcc, 1b ! CTI
  80. 62:  ldxa [%o1] %asi, %g1 ! Load
  81. retl ! CTI Group
  82.  mov %o2, %o0 ! IEU0
  83. 50: sub %o0, %o3, %o0
  84. retl
  85.  sub %o0, 8, %o0
  86. 51: sub %o0, %o3, %o0
  87. retl
  88.  sub %o0, 7, %o0
  89. 52: sub %o0, %o3, %o0
  90. retl
  91.  sub %o0, 6, %o0
  92. 53: sub %o0, %o3, %o0
  93. retl
  94.  sub %o0, 5, %o0
  95. 54: sub %o0, %o3, %o0
  96. retl
  97.  sub %o0, 4, %o0
  98. 55: sub %o0, %o3, %o0
  99. retl
  100.  sub %o0, 3, %o0
  101. 56: sub %o0, %o3, %o0
  102. retl
  103.  sub %o0, 2, %o0
  104. 57: retl
  105.  sub %o0, 1, %o0
  106. 30: brlez,pn %o2, 3f
  107.  sub %g0, %o2, %o3
  108. add %o0, %o2, %o0
  109. 63: lduba [%o1] %asi, %o4
  110. 1: add %o1, 1, %o1
  111. brz,pn %o4, 2f
  112.  stb %o4, [%o0 + %o3]
  113. addcc %o3, 1, %o3
  114. bne,pt %xcc, 1b
  115. 64:  lduba [%o1] %asi, %o4
  116. 3: retl
  117.  mov %o2, %o0
  118. 2: retl
  119.  add %o2, %o3, %o0
  120. .section .fixup,#alloc,#execinstr
  121. .align 4
  122. 4: retl
  123.  mov -EFAULT, %o0
  124. .section __ex_table,#alloc
  125. .align 4
  126. .word 60b, 4b
  127. .word 61b, 4b
  128. .word 62b, 4b
  129. .word 63b, 4b
  130. .word 64b, 4b