itlb_base.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: itlb_base.S,v 1.11 2001/08/17 04:55:09 kanoj Exp $
  2.  * itlb_base.S: Front end to ITLB miss replacement strategy.
  3.  *              This is included directly into the trap table.
  4.  *
  5.  * Copyright (C) 1996,1998 David S. Miller (davem@redhat.com)
  6.  * Copyright (C) 1997,1998 Jakub Jelinek   (jj@ultra.linux.cz)
  7.  */
  8. #if PAGE_SHIFT == 13
  9. /*
  10.  * To compute vpte offset, we need to do ((addr >> 13) << 3),
  11.  * which can be optimized to (addr >> 10) if bits 10/11/12 can
  12.  * be guaranteed to be 0 ... mmu_context.h does guarantee this
  13.  * by only using 10 bits in the hwcontext value.
  14.  */
  15. #define CREATE_VPTE_OFFSET1(r1, r2) 
  16. srax r1, 10, r2
  17. #define CREATE_VPTE_OFFSET2(r1, r2)
  18. #define CREATE_VPTE_NOP nop
  19. #else /* PAGE_SHIFT */
  20. #define CREATE_VPTE_OFFSET1(r1, r2) 
  21. srax r1, PAGE_SHIFT, r2
  22. #define CREATE_VPTE_OFFSET2(r1, r2) 
  23. sllx r2, 3, r2
  24. #define CREATE_VPTE_NOP
  25. #endif /* PAGE_SHIFT */
  26. /* Ways we can get here:
  27.  *
  28.  * 1) Nucleus instruction misses from module code.
  29.  * 2) All user instruction misses.
  30.  *
  31.  * All real page faults merge their code paths to the
  32.  * sparc64_realfault_common label below.
  33.  */
  34. /* ITLB ** ICACHE line 1: Quick user TLB misses */
  35. ldxa [%g1 + %g1] ASI_IMMU, %g4 ! Get TAG_ACCESS
  36. CREATE_VPTE_OFFSET1(%g4, %g6) ! Create VPTE offset
  37. CREATE_VPTE_OFFSET2(%g4, %g6) ! Create VPTE offset
  38. ldxa [%g3 + %g6] ASI_P, %g5 ! Load VPTE
  39. 1: brgez,pn %g5, 3f ! Not valid, branch out
  40.  nop ! Delay-slot
  41. 2: stxa %g5, [%g0] ASI_ITLB_DATA_IN ! Load PTE into TLB
  42. retry ! Trap return
  43. 3: rdpr %pstate, %g4 ! Move into alternate globals
  44. /* ITLB ** ICACHE line 2: Real faults */
  45. wrpr %g4, PSTATE_AG|PSTATE_MG, %pstate
  46. rdpr %tpc, %g5 ! And load faulting VA
  47. mov FAULT_CODE_ITLB, %g4 ! It was read from ITLB
  48. sparc64_realfault_common: ! Called by TL0 dtlb_miss too
  49. stb %g4, [%g6 + AOFF_task_thread + AOFF_thread_fault_code]
  50. stx %g5, [%g6 + AOFF_task_thread + AOFF_thread_fault_address]
  51. ba,pt %xcc, etrap ! Save state
  52. 1:  rd %pc, %g7 ! ...
  53. nop
  54. /* ITLB ** ICACHE line 3: Finish faults + window fixups */
  55. call do_sparc64_fault ! Call fault handler
  56.  add %sp, STACK_BIAS + REGWIN_SZ, %o0! Compute pt_regs arg
  57. ba,pt %xcc, rtrap_clr_l6 ! Restore cpu state
  58.  nop
  59. winfix_trampoline:
  60. rdpr %tpc, %g3 ! Prepare winfixup TNPC
  61. or %g3, 0x7c, %g3 ! Compute offset to branch
  62. wrpr %g3, %tnpc ! Write it into TNPC
  63. done ! Do it to it
  64. /* ITLB ** ICACHE line 4: Unused... */
  65. nop
  66. nop
  67. nop
  68. nop
  69. nop
  70. nop
  71. nop
  72. CREATE_VPTE_NOP
  73. #undef CREATE_VPTE_OFFSET1
  74. #undef CREATE_VPTE_OFFSET2
  75. #undef CREATE_VPTE_NOP