copypage-feroceon.S 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * linux/arch/arm/lib/copypage-feroceon.S
  3. *
  4. * Copyright (C) 2008 Marvell Semiconductors
  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 as
  8. * published by the Free Software Foundation.
  9. *
  10. * This handles copy_user_page and clear_user_page on Feroceon
  11. * more optimally than the generic implementations.
  12. */
  13. #include <linux/linkage.h>
  14. #include <linux/init.h>
  15. #include <asm/asm-offsets.h>
  16. .text
  17. .align 5
  18. ENTRY(feroceon_copy_user_page)
  19. stmfd sp!, {r4-r9, lr}
  20. mov ip, #PAGE_SZ
  21. 1: mov lr, r1
  22. ldmia r1!, {r2 - r9}
  23. pld [lr, #32]
  24. pld [lr, #64]
  25. pld [lr, #96]
  26. pld [lr, #128]
  27. pld [lr, #160]
  28. pld [lr, #192]
  29. pld [lr, #224]
  30. stmia r0, {r2 - r9}
  31. ldmia r1!, {r2 - r9}
  32. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
  33. add r0, r0, #32
  34. stmia r0, {r2 - r9}
  35. ldmia r1!, {r2 - r9}
  36. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
  37. add r0, r0, #32
  38. stmia r0, {r2 - r9}
  39. ldmia r1!, {r2 - r9}
  40. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
  41. add r0, r0, #32
  42. stmia r0, {r2 - r9}
  43. ldmia r1!, {r2 - r9}
  44. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
  45. add r0, r0, #32
  46. stmia r0, {r2 - r9}
  47. ldmia r1!, {r2 - r9}
  48. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
  49. add r0, r0, #32
  50. stmia r0, {r2 - r9}
  51. ldmia r1!, {r2 - r9}
  52. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
  53. add r0, r0, #32
  54. stmia r0, {r2 - r9}
  55. ldmia r1!, {r2 - r9}
  56. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
  57. add r0, r0, #32
  58. stmia r0, {r2 - r9}
  59. subs ip, ip, #(32 * 8)
  60. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
  61. add r0, r0, #32
  62. bne 1b
  63. mcr p15, 0, ip, c7, c10, 4 @ drain WB
  64. ldmfd sp!, {r4-r9, pc}
  65. .align 5
  66. ENTRY(feroceon_clear_user_page)
  67. stmfd sp!, {r4-r7, lr}
  68. mov r1, #PAGE_SZ/32
  69. mov r2, #0
  70. mov r3, #0
  71. mov r4, #0
  72. mov r5, #0
  73. mov r6, #0
  74. mov r7, #0
  75. mov ip, #0
  76. mov lr, #0
  77. 1: stmia r0, {r2-r7, ip, lr}
  78. subs r1, r1, #1
  79. mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
  80. add r0, r0, #32
  81. bne 1b
  82. mcr p15, 0, r1, c7, c10, 4 @ drain WB
  83. ldmfd sp!, {r4-r7, pc}
  84. __INITDATA
  85. .type feroceon_user_fns, #object
  86. ENTRY(feroceon_user_fns)
  87. .long feroceon_clear_user_page
  88. .long feroceon_copy_user_page
  89. .size feroceon_user_fns, . - feroceon_user_fns