copy_to_user.S 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * User memory copying routines for the Hexagon Kernel
  3. *
  4. * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 and
  8. * only version 2 as published by the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  18. * 02110-1301, USA.
  19. */
  20. /* The right way to do this involves valignb
  21. * The easy way to do this is only speed up src/dest similar alignment.
  22. */
  23. /*
  24. * Copy to/from user are the same, except that for packets with a load and
  25. * a store, I don't know how to tell which kind of exception we got.
  26. * Therefore, we duplicate the function, and handle faulting addresses
  27. * differently for each function
  28. */
  29. /*
  30. * copy to user: stores can fault
  31. */
  32. #define src_sav r13
  33. #define dst_sav r12
  34. #define src_dst_sav r13:12
  35. #define d_dbuf r15:14
  36. #define w_dbuf r15
  37. #define dst r0
  38. #define src r1
  39. #define bytes r2
  40. #define loopcount r5
  41. #define FUNCNAME __copy_to_user_hexagon
  42. #include "copy_user_template.S"
  43. /* STORE FAULTS from COPY_TO_USER */
  44. .falign
  45. 1109:
  46. 2109:
  47. 4109:
  48. /* Alignment loop. r2 has been updated. Return it. */
  49. {
  50. r0 = r2
  51. jumpr r31
  52. }
  53. /* Normal copy loops. Use dst-dst_sav to compute distance */
  54. /* dst holds best write, no need to unwind any loops */
  55. /* X - (A - B) == X + B - A */
  56. .falign
  57. 8189:
  58. 8199:
  59. 4189:
  60. 4199:
  61. 2189:
  62. 2199:
  63. 1189:
  64. 1199:
  65. {
  66. r2 += sub(dst_sav,dst)
  67. }
  68. {
  69. r0 = r2
  70. jumpr r31
  71. }
  72. /* COPY TO USER: only stores can fail */
  73. .section __ex_table,"a"
  74. .long 1100b,1109b
  75. .long 2100b,2109b
  76. .long 4100b,4109b
  77. .long 8180b,8189b
  78. .long 8190b,8199b
  79. .long 4180b,4189b
  80. .long 4190b,4199b
  81. .long 2180b,2189b
  82. .long 2190b,2199b
  83. .long 1180b,1189b
  84. .long 1190b,1199b
  85. .previous