mips_excpt_gcc.S 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * Copyright (c) 2006-2019, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2016-09-07 Urey first version
  9. */
  10. #ifndef __ASSEMBLY__
  11. #define __ASSEMBLY__
  12. #endif
  13. #include "../common/mips.h"
  14. #define _EXC_STKSIZE 20*1024
  15. ;/*********************************************************************************************************
  16. ; PTE BASE 相关定义
  17. ;*********************************************************************************************************/
  18. #define PTE_BASE_OFFSET 23
  19. #define PTE_BASE_SIZE 9
  20. #define MIPS32_BADVPN2_SHIFT 2
  21. .section ".text", "ax"
  22. .set noreorder
  23. LEAF(mips_tlb_refill_handlerx)
  24. .set push
  25. .set noat
  26. .set noreorder
  27. .set volatile
  28. ;/*
  29. ; * K1 = CP0_CTXT
  30. ; * K0 = K1
  31. ; */
  32. mfc0 k1 , CP0_CONTEXT ;/* K1 等于 Context 寄存器 */
  33. ehb
  34. move k0 , k1 ;/* K0 等于 Context 寄存器 */
  35. ;/*
  36. ; * K1 <<= PTE_BASE_SIZE
  37. ; * K1 >>= PTE_BASE_SIZE
  38. ; * K1 >>= 4
  39. ; * K1 >>= MIPS32_BADVPN2_SHIFT
  40. ; * K1 <<= 3
  41. ; */
  42. sll k1 , PTE_BASE_SIZE
  43. srl k1 , (PTE_BASE_SIZE + 4 + MIPS32_BADVPN2_SHIFT) ;/* K1 为 BAD VPN2 */
  44. sll k1 , (4 - 1)
  45. ;/*
  46. ; * K0 >>= PTE_BASE_OFFSET
  47. ; * K0 <<= PTE_BASE_OFFSET
  48. ; */
  49. srl k0 , PTE_BASE_OFFSET
  50. sll k0 , PTE_BASE_OFFSET ;/* K0 为 PTE BASE */
  51. ;/*
  52. ; * K1 = K1 | K0
  53. ; */
  54. or k1 , k1 , k0 ;/* 合成 */
  55. ;/*
  56. ; * K0 = *K1
  57. ; * K1 = *(K1 + 4)
  58. ; */
  59. lw k0 , 0(k1)
  60. lw k1 , 4(k1)
  61. ;/*
  62. ; * CP0_TLBLO0 = K0
  63. ; * CP0_TLBLO1 = K1
  64. ; */
  65. mtc0 k0 , CP0_ENTRYLO0 ;/* EntryLo0 */
  66. mtc0 k1 , CP0_ENTRYLO1 ;/* EntryLo1 */
  67. ehb
  68. tlbwr ;/* TLB 随机替换 */
  69. eret ;/* 异常返回 */
  70. .set pop
  71. END(mips_tlb_refill_handlerx)