nohash_low.S 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * This file contains low-level assembler routines for managing
  4. * the PowerPC 603 tlb invalidation.
  5. */
  6. #include <asm/page.h>
  7. #include <asm/ppc_asm.h>
  8. #include <asm/asm-offsets.h>
  9. /*
  10. * Flush an entry from the TLB
  11. */
  12. #ifdef CONFIG_SMP
  13. _GLOBAL(_tlbie)
  14. lwz r8,TASK_CPU(r2)
  15. oris r8,r8,11
  16. mfmsr r10
  17. rlwinm r0,r10,0,17,15 /* clear bit 16 (MSR_EE) */
  18. rlwinm r0,r0,0,28,26 /* clear DR */
  19. mtmsr r0
  20. isync
  21. lis r9,mmu_hash_lock@h
  22. ori r9,r9,mmu_hash_lock@l
  23. tophys(r9,r9)
  24. 10: lwarx r7,0,r9
  25. cmpwi 0,r7,0
  26. bne- 10b
  27. stwcx. r8,0,r9
  28. bne- 10b
  29. eieio
  30. tlbie r3
  31. sync
  32. TLBSYNC
  33. li r0,0
  34. stw r0,0(r9) /* clear mmu_hash_lock */
  35. mtmsr r10
  36. isync
  37. blr
  38. _ASM_NOKPROBE_SYMBOL(_tlbie)
  39. #endif /* CONFIG_SMP */
  40. /*
  41. * Flush the entire TLB. 603/603e only
  42. */
  43. _GLOBAL(_tlbia)
  44. #if defined(CONFIG_SMP)
  45. lwz r8,TASK_CPU(r2)
  46. oris r8,r8,10
  47. mfmsr r10
  48. rlwinm r0,r10,0,17,15 /* clear bit 16 (MSR_EE) */
  49. rlwinm r0,r0,0,28,26 /* clear DR */
  50. mtmsr r0
  51. isync
  52. lis r9,mmu_hash_lock@h
  53. ori r9,r9,mmu_hash_lock@l
  54. tophys(r9,r9)
  55. 10: lwarx r7,0,r9
  56. cmpwi 0,r7,0
  57. bne- 10b
  58. stwcx. r8,0,r9
  59. bne- 10b
  60. #endif /* CONFIG_SMP */
  61. li r5, 32
  62. lis r4, KERNELBASE@h
  63. mtctr r5
  64. sync
  65. 0: tlbie r4
  66. addi r4, r4, 0x1000
  67. bdnz 0b
  68. sync
  69. #ifdef CONFIG_SMP
  70. TLBSYNC
  71. li r0,0
  72. stw r0,0(r9) /* clear mmu_hash_lock */
  73. mtmsr r10
  74. isync
  75. #endif /* CONFIG_SMP */
  76. blr
  77. _ASM_NOKPROBE_SYMBOL(_tlbia)