1 /* SPDX-License-Identifier: GPL-2.0-only */ !! 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* !! 2 /* ld script for sparc32/sparc64 kernel */ 3 * Copyright (C) 2012 Regents of the Universit << 4 * Copyright (C) 2017 SiFive << 5 */ << 6 3 7 #define RO_EXCEPTION_TABLE_ALIGN 4 !! 4 #include <asm-generic/vmlinux.lds.h> 8 #define RUNTIME_DISCARD_EXIT !! 5 >> 6 #include <asm/page.h> >> 7 #include <asm/thread_info.h> >> 8 >> 9 #ifdef CONFIG_SPARC32 >> 10 #define INITIAL_ADDRESS 0x10000 + SIZEOF_HEADERS >> 11 #define TEXTSTART 0xf0004000 >> 12 >> 13 #define SMP_CACHE_BYTES_SHIFT 5 9 14 10 #ifdef CONFIG_XIP_KERNEL << 11 #include "vmlinux-xip.lds.S" << 12 #else 15 #else >> 16 #define SMP_CACHE_BYTES_SHIFT 6 >> 17 #define INITIAL_ADDRESS 0x4000 >> 18 #define TEXTSTART 0x0000000000404000 13 19 14 #include <asm/pgtable.h> !! 20 #endif 15 #define LOAD_OFFSET KERNEL_LINK_ADDR << 16 21 17 #include <asm/vmlinux.lds.h> !! 22 #define SMP_CACHE_BYTES (1 << SMP_CACHE_BYTES_SHIFT) 18 #include <asm/page.h> << 19 #include <asm/cache.h> << 20 #include <asm/thread_info.h> << 21 #include <asm/set_memory.h> << 22 #include "image-vars.h" << 23 23 24 #include <linux/sizes.h> !! 24 #ifdef CONFIG_SPARC32 25 OUTPUT_ARCH(riscv) !! 25 OUTPUT_FORMAT("elf32-sparc", "elf32-sparc", "elf32-sparc") >> 26 OUTPUT_ARCH(sparc) >> 27 ENTRY(_start) >> 28 jiffies = jiffies_64 + 4; >> 29 #else >> 30 /* sparc64 */ >> 31 OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc") >> 32 OUTPUT_ARCH(sparc:v9a) 26 ENTRY(_start) 33 ENTRY(_start) 27 << 28 jiffies = jiffies_64; 34 jiffies = jiffies_64; >> 35 #endif >> 36 >> 37 #ifdef CONFIG_SPARC64 >> 38 ASSERT((swapper_tsb == 0x0000000000408000), "Error: sparc64 early assembler too large") >> 39 #endif 29 40 30 SECTIONS 41 SECTIONS 31 { 42 { 32 /* Beginning of code and text segment !! 43 #ifdef CONFIG_SPARC64 33 . = LOAD_OFFSET; !! 44 swapper_pg_dir = 0x0000000000402000; 34 _start = .; !! 45 #endif 35 HEAD_TEXT_SECTION !! 46 . = INITIAL_ADDRESS; 36 . = ALIGN(PAGE_SIZE); !! 47 .text TEXTSTART : 37 !! 48 { 38 .text : { << 39 _text = .; 49 _text = .; 40 _stext = .; !! 50 HEAD_TEXT 41 TEXT_TEXT 51 TEXT_TEXT 42 SCHED_TEXT 52 SCHED_TEXT 43 LOCK_TEXT 53 LOCK_TEXT 44 KPROBES_TEXT 54 KPROBES_TEXT 45 ENTRY_TEXT << 46 IRQENTRY_TEXT 55 IRQENTRY_TEXT 47 SOFTIRQENTRY_TEXT 56 SOFTIRQENTRY_TEXT 48 _etext = .; !! 57 *(.gnu.warning) >> 58 } = 0 >> 59 _etext = .; >> 60 >> 61 RO_DATA(PAGE_SIZE) >> 62 >> 63 /* Start of data section */ >> 64 _sdata = .; >> 65 >> 66 .data1 : { >> 67 *(.data1) 49 } 68 } >> 69 RW_DATA(SMP_CACHE_BYTES, 0, THREAD_SIZE) 50 70 51 . = ALIGN(SECTION_ALIGN); !! 71 /* End of data section */ 52 __init_begin = .; !! 72 _edata = .; 53 __init_text_begin = .; !! 73 54 .init.text : AT(ADDR(.init.text) - LOA !! 74 .fixup : { 55 _sinittext = .; !! 75 __start___fixup = .; 56 INIT_TEXT !! 76 *(.fixup) 57 _einittext = .; !! 77 __stop___fixup = .; 58 } << 59 << 60 . = ALIGN(8); << 61 __soc_early_init_table : { << 62 __soc_early_init_table_start = << 63 KEEP(*(__soc_early_init_table) << 64 __soc_early_init_table_end = . << 65 } << 66 __soc_builtin_dtb_table : { << 67 __soc_builtin_dtb_table_start << 68 KEEP(*(__soc_builtin_dtb_table << 69 __soc_builtin_dtb_table_end = << 70 } << 71 /* we have to discard exit text and su << 72 __exittext_begin = .; << 73 .exit.text : << 74 { << 75 EXIT_TEXT << 76 } 78 } 77 __exittext_end = .; !! 79 EXCEPTION_TABLE(16) 78 80 >> 81 . = ALIGN(PAGE_SIZE); >> 82 __init_begin = ALIGN(PAGE_SIZE); >> 83 INIT_TEXT_SECTION(PAGE_SIZE) 79 __init_text_end = .; 84 __init_text_end = .; 80 . = ALIGN(SECTION_ALIGN); << 81 #ifdef CONFIG_EFI << 82 . = ALIGN(PECOFF_SECTION_ALIGNMENT); << 83 __pecoff_text_end = .; << 84 #endif << 85 /* Start of init data section */ << 86 __init_data_begin = .; << 87 INIT_DATA_SECTION(16) 85 INIT_DATA_SECTION(16) 88 86 89 .init.pi : { !! 87 . = ALIGN(4); 90 KEEP(*(.init.pi*)) !! 88 .tsb_ldquad_phys_patch : { >> 89 __tsb_ldquad_phys_patch = .; >> 90 *(.tsb_ldquad_phys_patch) >> 91 __tsb_ldquad_phys_patch_end = .; >> 92 } >> 93 >> 94 .tsb_phys_patch : { >> 95 __tsb_phys_patch = .; >> 96 *(.tsb_phys_patch) >> 97 __tsb_phys_patch_end = .; >> 98 } >> 99 >> 100 .cpuid_patch : { >> 101 __cpuid_patch = .; >> 102 *(.cpuid_patch) >> 103 __cpuid_patch_end = .; >> 104 } >> 105 >> 106 .sun4v_1insn_patch : { >> 107 __sun4v_1insn_patch = .; >> 108 *(.sun4v_1insn_patch) >> 109 __sun4v_1insn_patch_end = .; >> 110 } >> 111 .sun4v_2insn_patch : { >> 112 __sun4v_2insn_patch = .; >> 113 *(.sun4v_2insn_patch) >> 114 __sun4v_2insn_patch_end = .; >> 115 } >> 116 .leon_1insn_patch : { >> 117 __leon_1insn_patch = .; >> 118 *(.leon_1insn_patch) >> 119 __leon_1insn_patch_end = .; >> 120 } >> 121 .swapper_tsb_phys_patch : { >> 122 __swapper_tsb_phys_patch = .; >> 123 *(.swapper_tsb_phys_patch) >> 124 __swapper_tsb_phys_patch_end = .; >> 125 } >> 126 .swapper_4m_tsb_phys_patch : { >> 127 __swapper_4m_tsb_phys_patch = .; >> 128 *(.swapper_4m_tsb_phys_patch) >> 129 __swapper_4m_tsb_phys_patch_end = .; >> 130 } >> 131 .popc_3insn_patch : { >> 132 __popc_3insn_patch = .; >> 133 *(.popc_3insn_patch) >> 134 __popc_3insn_patch_end = .; >> 135 } >> 136 .popc_6insn_patch : { >> 137 __popc_6insn_patch = .; >> 138 *(.popc_6insn_patch) >> 139 __popc_6insn_patch_end = .; >> 140 } >> 141 .pause_3insn_patch : { >> 142 __pause_3insn_patch = .; >> 143 *(.pause_3insn_patch) >> 144 __pause_3insn_patch_end = .; >> 145 } >> 146 .sun_m7_1insn_patch : { >> 147 __sun_m7_1insn_patch = .; >> 148 *(.sun_m7_1insn_patch) >> 149 __sun_m7_1insn_patch_end = .; >> 150 } >> 151 .sun_m7_2insn_patch : { >> 152 __sun_m7_2insn_patch = .; >> 153 *(.sun_m7_2insn_patch) >> 154 __sun_m7_2insn_patch_end = .; >> 155 } >> 156 .get_tick_patch : { >> 157 __get_tick_patch = .; >> 158 *(.get_tick_patch) >> 159 __get_tick_patch_end = .; >> 160 } >> 161 .pud_huge_patch : { >> 162 __pud_huge_patch = .; >> 163 *(.pud_huge_patch) >> 164 __pud_huge_patch_end = .; >> 165 } >> 166 .fast_win_ctrl_1insn_patch : { >> 167 __fast_win_ctrl_1insn_patch = .; >> 168 *(.fast_win_ctrl_1insn_patch) >> 169 __fast_win_ctrl_1insn_patch_end = .; 91 } 170 } >> 171 PERCPU_SECTION(SMP_CACHE_BYTES) 92 172 93 .init.bss : { !! 173 . = ALIGN(PAGE_SIZE); 94 KEEP(*(.init.bss*)) /* fro !! 174 .exit.text : { 95 } !! 175 EXIT_TEXT 96 .exit.data : << 97 { << 98 EXIT_DATA << 99 } << 100 PERCPU_SECTION(L1_CACHE_BYTES) << 101 << 102 .rel.dyn : { << 103 *(.rel.dyn*) << 104 } 176 } 105 177 106 .rela.dyn : ALIGN(8) { !! 178 .exit.data : { 107 __rela_dyn_start = .; !! 179 EXIT_DATA 108 *(.rela .rela*) << 109 __rela_dyn_end = .; << 110 } 180 } 111 181 112 __init_data_end = .; !! 182 . = ALIGN(PAGE_SIZE); 113 << 114 . = ALIGN(8); << 115 .alternative : { << 116 __alt_start = .; << 117 KEEP(*(.alternative)) << 118 __alt_end = .; << 119 } << 120 __init_end = .; 183 __init_end = .; 121 !! 184 BSS_SECTION(0, 0, 0) 122 /* Start of data section */ !! 185 _end = . ; 123 _sdata = .; << 124 RO_DATA(SECTION_ALIGN) << 125 .srodata : { << 126 *(.srodata*) << 127 } << 128 << 129 . = ALIGN(SECTION_ALIGN); << 130 _data = .; << 131 << 132 RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THR << 133 .sdata : { << 134 __global_pointer$ = . + 0x800; << 135 *(.sdata*) << 136 } << 137 << 138 .got : { *(.got*) } << 139 << 140 #ifdef CONFIG_RELOCATABLE << 141 .data.rel : { *(.data.rel*) } << 142 .plt : { *(.plt) } << 143 .dynamic : { *(.dynamic) } << 144 .dynsym : { *(.dynsym) } << 145 .dynstr : { *(.dynstr) } << 146 .hash : { *(.hash) } << 147 .gnu.hash : { *(.gnu.hash) } << 148 #endif << 149 << 150 #ifdef CONFIG_EFI << 151 .pecoff_edata_padding : { BYTE(0); . = << 152 __pecoff_data_raw_size = ABSOLUTE(. - << 153 __pecoff_data_raw_end = ABSOLUTE(.); << 154 #endif << 155 << 156 /* End of data section */ << 157 _edata = .; << 158 << 159 BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0) << 160 << 161 #ifdef CONFIG_EFI << 162 . = ALIGN(PECOFF_SECTION_ALIGNMENT); << 163 __pecoff_data_virt_size = ABSOLUTE(. - << 164 __pecoff_data_virt_end = ABSOLUTE(.); << 165 #endif << 166 _end = .; << 167 186 168 STABS_DEBUG 187 STABS_DEBUG 169 DWARF_DEBUG 188 DWARF_DEBUG 170 ELF_DETAILS 189 ELF_DETAILS 171 .riscv.attributes 0 : { *(.riscv.attri << 172 190 173 DISCARDS 191 DISCARDS 174 } 192 } 175 #endif /* CONFIG_XIP_KERNEL */ <<
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.