vmlinux.lds.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifdef CONFIG_HOTPLUG_CPU
  3. #define ARM_CPU_DISCARD(x)
  4. #define ARM_CPU_KEEP(x) x
  5. #else
  6. #define ARM_CPU_DISCARD(x) x
  7. #define ARM_CPU_KEEP(x)
  8. #endif
  9. #if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
  10. defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL)
  11. #define ARM_EXIT_KEEP(x) x
  12. #define ARM_EXIT_DISCARD(x)
  13. #else
  14. #define ARM_EXIT_KEEP(x)
  15. #define ARM_EXIT_DISCARD(x) x
  16. #endif
  17. #ifdef CONFIG_MMU
  18. #define ARM_MMU_KEEP(x) x
  19. #define ARM_MMU_DISCARD(x)
  20. #else
  21. #define ARM_MMU_KEEP(x)
  22. #define ARM_MMU_DISCARD(x) x
  23. #endif
  24. #define PROC_INFO \
  25. . = ALIGN(4); \
  26. __proc_info_begin = .; \
  27. *(.proc.info.init) \
  28. __proc_info_end = .;
  29. #define HYPERVISOR_TEXT \
  30. __hyp_text_start = .; \
  31. *(.hyp.text) \
  32. __hyp_text_end = .;
  33. #define IDMAP_TEXT \
  34. ALIGN_FUNCTION(); \
  35. __idmap_text_start = .; \
  36. *(.idmap.text) \
  37. __idmap_text_end = .; \
  38. . = ALIGN(PAGE_SIZE); \
  39. __hyp_idmap_text_start = .; \
  40. *(.hyp.idmap.text) \
  41. __hyp_idmap_text_end = .;
  42. #define ARM_DISCARD \
  43. *(.ARM.exidx.exit.text) \
  44. *(.ARM.extab.exit.text) \
  45. *(.ARM.exidx.text.exit) \
  46. *(.ARM.extab.text.exit) \
  47. ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) \
  48. ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) \
  49. ARM_EXIT_DISCARD(EXIT_TEXT) \
  50. ARM_EXIT_DISCARD(EXIT_DATA) \
  51. EXIT_CALL \
  52. ARM_MMU_DISCARD(*(.text.fixup)) \
  53. ARM_MMU_DISCARD(*(__ex_table)) \
  54. *(.discard) \
  55. *(.discard.*)
  56. #define ARM_TEXT \
  57. IDMAP_TEXT \
  58. __entry_text_start = .; \
  59. *(.entry.text) \
  60. __entry_text_end = .; \
  61. IRQENTRY_TEXT \
  62. SOFTIRQENTRY_TEXT \
  63. TEXT_TEXT \
  64. SCHED_TEXT \
  65. CPUIDLE_TEXT \
  66. LOCK_TEXT \
  67. HYPERVISOR_TEXT \
  68. KPROBES_TEXT \
  69. *(.gnu.warning) \
  70. *(.glue_7) \
  71. *(.glue_7t) \
  72. . = ALIGN(4); \
  73. *(.got) /* Global offset table */ \
  74. ARM_CPU_KEEP(PROC_INFO)
  75. /* Stack unwinding tables */
  76. #define ARM_UNWIND_SECTIONS \
  77. . = ALIGN(8); \
  78. .ARM.unwind_idx : { \
  79. __start_unwind_idx = .; \
  80. *(.ARM.exidx*) \
  81. __stop_unwind_idx = .; \
  82. } \
  83. .ARM.unwind_tab : { \
  84. __start_unwind_tab = .; \
  85. *(.ARM.extab*) \
  86. __stop_unwind_tab = .; \
  87. }
  88. /*
  89. * The vectors and stubs are relocatable code, and the
  90. * only thing that matters is their relative offsets
  91. */
  92. #define ARM_VECTORS \
  93. __vectors_start = .; \
  94. .vectors 0xffff0000 : AT(__vectors_start) { \
  95. *(.vectors) \
  96. } \
  97. . = __vectors_start + SIZEOF(.vectors); \
  98. __vectors_end = .; \
  99. \
  100. __stubs_start = .; \
  101. .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) { \
  102. *(.stubs) \
  103. } \
  104. . = __stubs_start + SIZEOF(.stubs); \
  105. __stubs_end = .; \
  106. \
  107. PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
  108. #define ARM_TCM \
  109. __itcm_start = ALIGN(4); \
  110. .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \
  111. __sitcm_text = .; \
  112. *(.tcm.text) \
  113. *(.tcm.rodata) \
  114. . = ALIGN(4); \
  115. __eitcm_text = .; \
  116. } \
  117. . = __itcm_start + SIZEOF(.text_itcm); \
  118. \
  119. __dtcm_start = .; \
  120. .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \
  121. __sdtcm_data = .; \
  122. *(.tcm.data) \
  123. . = ALIGN(4); \
  124. __edtcm_data = .; \
  125. } \
  126. . = __dtcm_start + SIZEOF(.data_dtcm);