migrate_64.S 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * Copyright 2011 Tilera Corporation. All Rights Reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation, version 2.
  7. *
  8. * This program is distributed in the hope that it will be useful, but
  9. * WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
  11. * NON INFRINGEMENT. See the GNU General Public License for
  12. * more details.
  13. *
  14. * This routine is a helper for migrating the home of a set of pages to
  15. * a new cpu. See the documentation in homecache.c for more information.
  16. */
  17. #include <linux/linkage.h>
  18. #include <linux/threads.h>
  19. #include <asm/page.h>
  20. #include <asm/thread_info.h>
  21. #include <asm/types.h>
  22. #include <asm/asm-offsets.h>
  23. #include <hv/hypervisor.h>
  24. .text
  25. /*
  26. * First, some definitions that apply to all the code in the file.
  27. */
  28. /* Locals (caller-save) */
  29. #define r_tmp r10
  30. #define r_save_sp r11
  31. /* What we save where in the stack frame; must include all callee-saves. */
  32. #define FRAME_SP 8
  33. #define FRAME_R30 16
  34. #define FRAME_R31 24
  35. #define FRAME_R32 32
  36. #define FRAME_SIZE 40
  37. /*
  38. * On entry:
  39. *
  40. * r0 the new context PA to install (moved to r_context)
  41. * r1 PTE to use for context access (moved to r_access)
  42. * r2 ASID to use for new context (moved to r_asid)
  43. * r3 pointer to cpumask with just this cpu set in it (r_my_cpumask)
  44. */
  45. /* Arguments (caller-save) */
  46. #define r_context_in r0
  47. #define r_access_in r1
  48. #define r_asid_in r2
  49. #define r_my_cpumask r3
  50. /* Locals (callee-save); must not be more than FRAME_xxx above. */
  51. #define r_context r30
  52. #define r_access r31
  53. #define r_asid r32
  54. /*
  55. * Caller-save locals and frame constants are the same as
  56. * for homecache_migrate_stack_and_flush.
  57. */
  58. STD_ENTRY(flush_and_install_context)
  59. /*
  60. * Create a stack frame; we can't touch it once we flush the
  61. * cache until we install the new page table and flush the TLB.
  62. */
  63. {
  64. move r_save_sp, sp
  65. st sp, lr
  66. addi sp, sp, -FRAME_SIZE
  67. }
  68. addi r_tmp, sp, FRAME_SP
  69. {
  70. st r_tmp, r_save_sp
  71. addi r_tmp, sp, FRAME_R30
  72. }
  73. {
  74. st r_tmp, r30
  75. addi r_tmp, sp, FRAME_R31
  76. }
  77. {
  78. st r_tmp, r31
  79. addi r_tmp, sp, FRAME_R32
  80. }
  81. st r_tmp, r32
  82. /* Move some arguments to callee-save registers. */
  83. {
  84. move r_context, r_context_in
  85. move r_access, r_access_in
  86. }
  87. move r_asid, r_asid_in
  88. /* First, flush our L2 cache. */
  89. {
  90. move r0, zero /* cache_pa */
  91. moveli r1, hw2_last(HV_FLUSH_EVICT_L2) /* cache_control */
  92. }
  93. {
  94. shl16insli r1, r1, hw1(HV_FLUSH_EVICT_L2)
  95. move r2, r_my_cpumask /* cache_cpumask */
  96. }
  97. {
  98. shl16insli r1, r1, hw0(HV_FLUSH_EVICT_L2)
  99. move r3, zero /* tlb_va */
  100. }
  101. {
  102. move r4, zero /* tlb_length */
  103. move r5, zero /* tlb_pgsize */
  104. }
  105. {
  106. move r6, zero /* tlb_cpumask */
  107. move r7, zero /* asids */
  108. }
  109. {
  110. move r8, zero /* asidcount */
  111. jal _hv_flush_remote
  112. }
  113. bnez r0, 1f
  114. /* Now install the new page table. */
  115. {
  116. move r0, r_context
  117. move r1, r_access
  118. }
  119. {
  120. move r2, r_asid
  121. moveli r3, HV_CTX_DIRECTIO | CTX_PAGE_FLAG
  122. }
  123. jal _hv_install_context
  124. bnez r0, 1f
  125. /* Finally, flush the TLB. */
  126. {
  127. movei r0, 0 /* preserve_global */
  128. jal hv_flush_all
  129. }
  130. 1: /* Restore the callee-saved registers and return. */
  131. addli lr, sp, FRAME_SIZE
  132. {
  133. ld lr, lr
  134. addli r_tmp, sp, FRAME_R30
  135. }
  136. {
  137. ld r30, r_tmp
  138. addli r_tmp, sp, FRAME_R31
  139. }
  140. {
  141. ld r31, r_tmp
  142. addli r_tmp, sp, FRAME_R32
  143. }
  144. {
  145. ld r32, r_tmp
  146. addi sp, sp, FRAME_SIZE
  147. }
  148. jrp lr
  149. STD_ENDPROC(flush_and_install_context)