1. 程式人生 > >bl cache_on跳轉的返回

bl cache_on跳轉的返回

bl	cache_on                              	@ bl跳轉會將返回地址(下一條指令的地址)儲存到lr
轉載地址:https://blog.csdn.net/coldsnow33/article/details/37727331
  1. cache_on: mov r3, #8 @ cache_on function //偏移為8,對應cache_on

  2. b call_cache_fn @ b跳轉不會將返回地址儲存到lr

  1. call_cache_fn: adr r12, proc_types

  2. #ifdef CONFIG_CPU_CP15

  3. mrc p15, 0, r9, c0, c0 @ get processor ID

  4. #else

  5. ldr r9, =CONFIG_PROCESSOR_ID

  6. #endif

  7. 1: ldr r1, [r12, #0] @ get value

  8. ldr r2, [r12, #4] @ get mask

  9. eor r1, r1, r9 @ (real ^ match)

  10. tst r1, r2 @ & mask

  11. ARM( addeq pc, r12, r3 ) @ call cache function

  12. THUMB( addeq r12, r3 )

  13. THUMB( moveq pc, r12 ) @ call cache function//match到ID後就跳轉到對應架構的cache_on了

  14. add r12, r12, #PROC_ENTRY_SIZE @ 沒有match到ID,PROC_ENTRY_SIZE為4*5,每條指令4byte,proc_types表中每個架構對應5個條目

  15. b 1b @ 再跳轉回tag1時, r12儲存了下一個架構的條目,繼續match

  1. .align 2

  2. .type proc_types,#object

  3. proc_types:

  4. .word 0x41000000 @ old ARM ID

  5. .word 0xff00f000

  6. mov pc, lr

  7. THUMB( nop )

  8. mov pc, lr

  9. THUMB( nop )

  10. mov pc, lr

  11. THUMB( nop )

  12. .word 0x41007000 @ ARM7/710

  13. .word 0xfff8fe00

  14. mov pc, lr

  15. THUMB( nop )

  16. mov pc, lr

  17. THUMB( nop )

  18. mov pc, lr

  19. THUMB( nop )

  20. .word 0x41807200 @ ARM720T (writethrough)

  21. .word 0xffffff00

  22. W(b) __armv4_mmu_cache_on

  23. W(b) __armv4_mmu_cache_off

  24. mov pc, lr

  25. THUMB( nop )

  26. .word 0x41007400 @ ARM74x

  27. .word 0xff00ff00

  28. W(b) __armv3_mpu_cache_on

  29. W(b) __armv3_mpu_cache_off

  30. W(b) __armv3_mpu_cache_flush

  31. .word 0x41009400 @ ARM94x

  32. .word 0xff00ff00

  33. W(b) __armv4_mpu_cache_on

  34. W(b) __armv4_mpu_cache_off

  35. W(b) __armv4_mpu_cache_flush

  36. .word 0x41069260 @ ARM926EJ-S (v5TEJ)

  37. .word 0xff0ffff0

  38. W(b) __arm926ejs_mmu_cache_on

  39. W(b) __armv4_mmu_cache_off

  40. W(b) __armv5tej_mmu_cache_flush

  41. .word 0x00007000 @ ARM7 IDs

  42. .word 0x0000f000

  43. mov pc, lr

  44. THUMB( nop )

  45. mov pc, lr

  46. THUMB( nop )

  47. mov pc, lr

  48. THUMB( nop )

  49. @ Everything from here on will be the new ID system.

  50. .word 0x4401a100 @ sa110 / sa1100

  51. .word 0xffffffe0

  52. W(b) __armv4_mmu_cache_on

  53. W(b) __armv4_mmu_cache_off

  54. W(b) __armv4_mmu_cache_flush

  55. .word 0x6901b110 @ sa1110

  56. .word 0xfffffff0

  57. W(b) __armv4_mmu_cache_on

  58. W(b) __armv4_mmu_cache_off

  59. W(b) __armv4_mmu_cache_flush

  60. .word 0x56056900

  61. .word 0xffffff00 @ PXA9xx

  62. W(b) __armv4_mmu_cache_on

  63. W(b) __armv4_mmu_cache_off

  64. W(b) __armv4_mmu_cache_flush

  65. .word 0x56158000 @ PXA168

  66. .word 0xfffff000

  67. W(b) __armv4_mmu_cache_on

  68. W(b) __armv4_mmu_cache_off

  69. W(b) __armv5tej_mmu_cache_flush

  70. .word 0x56050000 @ Feroceon

  71. .word 0xff0f0000

  72. W(b) __armv4_mmu_cache_on

  73. W(b) __armv4_mmu_cache_off

  74. W(b) __armv5tej_mmu_cache_flush

  75. #ifdef CONFIG_CPU_FEROCEON_OLD_ID

  76. /* this conflicts with the standard ARMv5TE entry */

  77. .long 0x41009260 @ Old Feroceon

  78. .long 0xff00fff0

  79. b __armv4_mmu_cache_on

  80. b __armv4_mmu_cache_off

  81. b __armv5tej_mmu_cache_flush

  82. #endif

  83. .word 0x66015261 @ FA526

  84. .word 0xff01fff1

  85. W(b) __fa526_cache_on

  86. W(b) __armv4_mmu_cache_off

  87. W(b) __fa526_cache_flush

  88. @ These match on the architecture ID

  89. .word 0x00020000 @ ARMv4T

  90. .word 0x000f0000

  91. W(b) __armv4_mmu_cache_on

  92. W(b) __armv4_mmu_cache_off

  93. W(b) __armv4_mmu_cache_flush

  94. .word 0x00050000 @ ARMv5TE

  95. .word 0x000f0000

  96. W(b) __armv4_mmu_cache_on

  97. W(b) __armv4_mmu_cache_off

  98. W(b) __armv4_mmu_cache_flush

  99. .word 0x00060000 @ ARMv5TEJ

  100. .word 0x000f0000

  101. W(b) __armv4_mmu_cache_on

  102. W(b) __armv4_mmu_cache_off

  103. W(b) __armv5tej_mmu_cache_flush

  104. .word 0x0007b000 @ ARMv6

  105. .word 0x000ff000

  106. W(b) __armv6_mmu_cache_on

  107. W(b) __armv4_mmu_cache_off

  108. W(b) __armv6_mmu_cache_flush

  109. .word 0x000f0000 @ new CPU Id

  110. .word 0x000f0000

  111. W(b) __armv7_mmu_cache_on

  112. W(b) __armv7_mmu_cache_off

  113. W(b) __armv7_mmu_cache_flush

  114. .word 0 @ unrecognised type

  115. .word 0

  116. mov pc, lr

  117. THUMB( nop )

  118. mov pc, lr

  119. THUMB( nop )

  120. mov pc, lr

  121. THUMB( nop )

  122. .size proc_types, . - proc_types

如果ID沒有match,就會查到表中的最後一個條目,mov pc, lr,跳回去。

  1. armv7_mmu_cache_on:

  2. mov r12, lr @ lr儲存的是bl cache_on的下一條指令,下面還有tag的跳轉,會重寫lr,需要儲存lr到其他暫存器#ifdef CONFIG_MMU

  3. mrc p15, 0, r11, c0, c1, 4 @ read ID_MMFR0

  4. tst r11, #0xf @ VMSA

  5. movne r6, #CB_BITS | 0x02 @ !XN

  6. blne __setup_mmu @ bl跳轉會儲存返回地址到lr

  7. mov r0, #0

  8. mcr p15, 0, r0, c7, c10, 4 @ drain write buffer

  9. tst r11, #0xf @ VMSA

  10. mcrne p15, 0, r0, c8, c7, 0 @ flush I,D TLBs

  11. #endif

  12. mrc p15, 0, r0, c1, c0, 0 @ read control reg

  13. bic r0, r0, #1 << 28 @ clear SCTLR.TRE

  14. orr r0, r0, #0x5000 @ I-cache enable, RR cache replacement

  15. orr r0, r0, #0x003c @ write buffer

  16. bic r0, r0, #2 @ A (no unaligned access fault)

  17. orr r0, r0, #1 << 22 @ U (v6 unaligned access model)

  18. @ (needed for ARM1176)

  19. #ifdef CONFIG_MMU

  20. ARM_BE8( orr r0, r0, #1 << 25 ) @ big-endian page tables

  21. mrcne p15, 0, r6, c2, c0, 2 @ read ttb control reg

  22. orrne r0, r0, #1 @ MMU enabled

  23. movne r1, #0xfffffffd @ domain 0 = client

  24. bic r6, r6, #1 << 31 @ 32-bit translation system

  25. bic r6, r6, #3 << 0 @ use only ttbr0

  26. mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer

  27. mcrne p15, 0, r1, c3, c0, 0 @ load domain access control

  28. mcrne p15, 0, r6, c2, c0, 2 @ load ttb control

  29. #endif

  30. mcr p15, 0, r0, c7, c5, 4 @ ISB

  31. mcr p15, 0, r0, c1, c0, 0 @ load control register

  32. mrc p15, 0, r0, c1, c0, 0 @ and read it back

  33. mov r0, #0

  34. mcr p15, 0, r0, c7, c5, 4 @ ISB

  35. mov pc, r12 @ 返回到bl cache_on的下一條指令