vmlinux-xip.lds.S 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2012 Regents of the University of California
  4. * Copyright (C) 2017 SiFive
  5. * Copyright (C) 2020 Vitaly Wool, Konsulko AB
  6. */
  7. #include <asm/pgtable.h>
  8. #define LOAD_OFFSET KERNEL_LINK_ADDR
  9. /* No __ro_after_init data in the .rodata section - which will always be ro */
  10. #define RO_AFTER_INIT_DATA
  11. #include <asm/vmlinux.lds.h>
  12. #include <asm/page.h>
  13. #include <asm/cache.h>
  14. #include <asm/thread_info.h>
  15. OUTPUT_ARCH(riscv)
  16. ENTRY(_start)
  17. jiffies = jiffies_64;
  18. SECTIONS
  19. {
  20. /* Beginning of code and text segment */
  21. . = LOAD_OFFSET;
  22. _xiprom = .;
  23. _start = .;
  24. HEAD_TEXT_SECTION
  25. INIT_TEXT_SECTION(PAGE_SIZE)
  26. /* we have to discard exit text and such at runtime, not link time */
  27. .exit.text :
  28. {
  29. EXIT_TEXT
  30. }
  31. .text : {
  32. _text = .;
  33. _stext = .;
  34. TEXT_TEXT
  35. SCHED_TEXT
  36. CPUIDLE_TEXT
  37. LOCK_TEXT
  38. KPROBES_TEXT
  39. ENTRY_TEXT
  40. IRQENTRY_TEXT
  41. SOFTIRQENTRY_TEXT
  42. _etext = .;
  43. }
  44. RO_DATA(L1_CACHE_BYTES)
  45. .srodata : {
  46. *(.srodata*)
  47. }
  48. .init.rodata : {
  49. INIT_SETUP(16)
  50. INIT_CALLS
  51. CON_INITCALL
  52. INIT_RAM_FS
  53. }
  54. _exiprom = .; /* End of XIP ROM area */
  55. /*
  56. * From this point, stuff is considered writable and will be copied to RAM
  57. */
  58. __data_loc = ALIGN(PAGE_SIZE); /* location in file */
  59. . = KERNEL_LINK_ADDR + XIP_OFFSET; /* location in memory */
  60. #undef LOAD_OFFSET
  61. #define LOAD_OFFSET (KERNEL_LINK_ADDR + XIP_OFFSET - (__data_loc & XIP_OFFSET_MASK))
  62. _sdata = .; /* Start of data section */
  63. _data = .;
  64. RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
  65. _edata = .;
  66. __start_ro_after_init = .;
  67. .data.ro_after_init : AT(ADDR(.data.ro_after_init) - LOAD_OFFSET) {
  68. *(.data..ro_after_init)
  69. }
  70. __end_ro_after_init = .;
  71. . = ALIGN(PAGE_SIZE);
  72. __init_begin = .;
  73. .init.data : {
  74. INIT_DATA
  75. }
  76. .exit.data : {
  77. EXIT_DATA
  78. }
  79. . = ALIGN(8);
  80. __soc_early_init_table : {
  81. __soc_early_init_table_start = .;
  82. KEEP(*(__soc_early_init_table))
  83. __soc_early_init_table_end = .;
  84. }
  85. __soc_builtin_dtb_table : {
  86. __soc_builtin_dtb_table_start = .;
  87. KEEP(*(__soc_builtin_dtb_table))
  88. __soc_builtin_dtb_table_end = .;
  89. }
  90. . = ALIGN(8);
  91. .alternative : {
  92. __alt_start = .;
  93. *(.alternative)
  94. __alt_end = .;
  95. }
  96. __init_end = .;
  97. . = ALIGN(16);
  98. .xip.traps : {
  99. __xip_traps_start = .;
  100. *(.xip.traps)
  101. __xip_traps_end = .;
  102. }
  103. . = ALIGN(PAGE_SIZE);
  104. .sdata : {
  105. __global_pointer$ = . + 0x800;
  106. *(.sdata*)
  107. *(.sbss*)
  108. }
  109. BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0)
  110. PERCPU_SECTION(L1_CACHE_BYTES)
  111. .rel.dyn : AT(ADDR(.rel.dyn) - LOAD_OFFSET) {
  112. *(.rel.dyn*)
  113. }
  114. /*
  115. * End of copied data. We need a dummy section to get its LMA.
  116. * Also located before final ALIGN() as trailing padding is not stored
  117. * in the resulting binary file and useless to copy.
  118. */
  119. .data.endmark : AT(ADDR(.data.endmark) - LOAD_OFFSET) { }
  120. _edata_loc = LOADADDR(.data.endmark);
  121. . = ALIGN(PAGE_SIZE);
  122. _end = .;
  123. STABS_DEBUG
  124. DWARF_DEBUG
  125. DISCARDS
  126. }