__clear_user.S 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * __clear_user_page, __clear_user, clear_page implementation of SuperH
  4. *
  5. * Copyright (C) 2001 Kaz Kojima
  6. * Copyright (C) 2001, 2002 Niibe Yutaka
  7. * Copyright (C) 2006 Paul Mundt
  8. */
  9. #include <linux/linkage.h>
  10. #include <asm/page.h>
  11. ENTRY(__clear_user)
  12. !
  13. mov #0, r0
  14. mov #0xffffffe0, r1
  15. !
  16. ! r4..(r4+31)&~32 -------- not aligned [ Area 0 ]
  17. ! (r4+31)&~32..(r4+r5)&~32 -------- aligned [ Area 1 ]
  18. ! (r4+r5)&~32..r4+r5 -------- not aligned [ Area 2 ]
  19. !
  20. ! Clear area 0
  21. mov r4, r2
  22. !
  23. tst r1, r5 ! length < 32
  24. bt .Larea2 ! skip to remainder
  25. !
  26. add #31, r2
  27. and r1, r2
  28. cmp/eq r4, r2
  29. bt .Larea1
  30. mov r2, r3
  31. sub r4, r3
  32. mov r3, r7
  33. mov r4, r2
  34. !
  35. .L0: dt r3
  36. 0: mov.b r0, @r2
  37. bf/s .L0
  38. add #1, r2
  39. !
  40. sub r7, r5
  41. mov r2, r4
  42. .Larea1:
  43. mov r4, r3
  44. add r5, r3
  45. and r1, r3
  46. cmp/hi r2, r3
  47. bf .Larea2
  48. !
  49. ! Clear area 1
  50. #if defined(CONFIG_CPU_SH4)
  51. 1: movca.l r0, @r2
  52. #else
  53. 1: mov.l r0, @r2
  54. #endif
  55. add #4, r2
  56. 2: mov.l r0, @r2
  57. add #4, r2
  58. 3: mov.l r0, @r2
  59. add #4, r2
  60. 4: mov.l r0, @r2
  61. add #4, r2
  62. 5: mov.l r0, @r2
  63. add #4, r2
  64. 6: mov.l r0, @r2
  65. add #4, r2
  66. 7: mov.l r0, @r2
  67. add #4, r2
  68. 8: mov.l r0, @r2
  69. add #4, r2
  70. cmp/hi r2, r3
  71. bt/s 1b
  72. nop
  73. !
  74. ! Clear area 2
  75. .Larea2:
  76. mov r4, r3
  77. add r5, r3
  78. cmp/hs r3, r2
  79. bt/s .Ldone
  80. sub r2, r3
  81. .L2: dt r3
  82. 9: mov.b r0, @r2
  83. bf/s .L2
  84. add #1, r2
  85. !
  86. .Ldone: rts
  87. mov #0, r0 ! return 0 as normal return
  88. ! return the number of bytes remained
  89. .Lbad_clear_user:
  90. mov r4, r0
  91. add r5, r0
  92. rts
  93. sub r2, r0
  94. .section __ex_table,"a"
  95. .align 2
  96. .long 0b, .Lbad_clear_user
  97. .long 1b, .Lbad_clear_user
  98. .long 2b, .Lbad_clear_user
  99. .long 3b, .Lbad_clear_user
  100. .long 4b, .Lbad_clear_user
  101. .long 5b, .Lbad_clear_user
  102. .long 6b, .Lbad_clear_user
  103. .long 7b, .Lbad_clear_user
  104. .long 8b, .Lbad_clear_user
  105. .long 9b, .Lbad_clear_user
  106. .previous