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) 2004, 2007-2010, 2011-2012 Sy << 4 */ << 5 3 6 #include <asm-generic/vmlinux.lds.h> 4 #include <asm-generic/vmlinux.lds.h> 7 #include <asm/cache.h> !! 5 8 #include <asm/page.h> 6 #include <asm/page.h> 9 #include <asm/thread_info.h> 7 #include <asm/thread_info.h> 10 8 11 OUTPUT_ARCH(arc) !! 9 #ifdef CONFIG_SPARC32 12 ENTRY(res_service) !! 10 #define INITIAL_ADDRESS 0x10000 + SIZEOF_HEADERS >> 11 #define TEXTSTART 0xf0004000 >> 12 >> 13 #define SMP_CACHE_BYTES_SHIFT 5 >> 14 >> 15 #else >> 16 #define SMP_CACHE_BYTES_SHIFT 6 >> 17 #define INITIAL_ADDRESS 0x4000 >> 18 #define TEXTSTART 0x0000000000404000 >> 19 >> 20 #endif >> 21 >> 22 #define SMP_CACHE_BYTES (1 << SMP_CACHE_BYTES_SHIFT) 13 23 14 #ifdef CONFIG_CPU_BIG_ENDIAN !! 24 #ifdef CONFIG_SPARC32 >> 25 OUTPUT_FORMAT("elf32-sparc", "elf32-sparc", "elf32-sparc") >> 26 OUTPUT_ARCH(sparc) >> 27 ENTRY(_start) 15 jiffies = jiffies_64 + 4; 28 jiffies = jiffies_64 + 4; 16 #else 29 #else >> 30 /* sparc64 */ >> 31 OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc") >> 32 OUTPUT_ARCH(sparc:v9a) >> 33 ENTRY(_start) 17 jiffies = jiffies_64; 34 jiffies = jiffies_64; 18 #endif 35 #endif 19 36 >> 37 #ifdef CONFIG_SPARC64 >> 38 ASSERT((swapper_tsb == 0x0000000000408000), "Error: sparc64 early assembler too large") >> 39 #endif >> 40 20 SECTIONS 41 SECTIONS 21 { 42 { 22 /* !! 43 #ifdef CONFIG_SPARC64 23 * ICCM starts at 0x8000_0000. So if k !! 44 swapper_pg_dir = 0x0000000000402000; 24 * address, make sure peripheral at 0x << 25 * Essentially vector is also in ICCM. << 26 */ << 27 << 28 . = CONFIG_LINUX_LINK_BASE; << 29 << 30 _int_vec_base_lds = .; << 31 .vector : { << 32 *(.vector) << 33 . = ALIGN(PAGE_SIZE); << 34 } << 35 << 36 #ifdef CONFIG_ARC_HAS_ICCM << 37 .text.arcfp : { << 38 *(.text.arcfp) << 39 . = ALIGN(CONFIG_ARC_ICCM_SZ * << 40 } << 41 #endif 45 #endif 42 !! 46 . = INITIAL_ADDRESS; 43 /* !! 47 .text TEXTSTART : 44 * The reason for having a separate su !! 48 { 45 * prevent objdump from including it i << 46 * << 47 * Reason for having .init.ramfs above << 48 * binary blob is tucked away to one s << 49 * between .init.text and .text, avoid << 50 * errors because of calls from .init. << 51 * Yes such calls do exist. e.g. << 52 * decompress_inflate.c:gunzip( ) << 53 */ << 54 << 55 __init_begin = .; << 56 << 57 .init.ramfs : { INIT_RAM_FS } << 58 << 59 . = ALIGN(PAGE_SIZE); << 60 << 61 HEAD_TEXT_SECTION << 62 INIT_TEXT_SECTION(L1_CACHE_BYTES) << 63 << 64 /* INIT_DATA_SECTION open-coded: speci << 65 .init.data : { << 66 INIT_DATA << 67 INIT_SETUP(L1_CACHE_BYTES) << 68 INIT_CALLS << 69 CON_INITCALL << 70 } << 71 << 72 .init.arch.info : { << 73 __arch_info_begin = .; << 74 *(.arch.info.init) << 75 __arch_info_end = .; << 76 } << 77 << 78 PERCPU_SECTION(L1_CACHE_BYTES) << 79 << 80 . = ALIGN(PAGE_SIZE); << 81 __init_end = .; << 82 << 83 .text : { << 84 _text = .; 49 _text = .; 85 _stext = .; !! 50 HEAD_TEXT 86 TEXT_TEXT 51 TEXT_TEXT 87 SCHED_TEXT 52 SCHED_TEXT 88 LOCK_TEXT 53 LOCK_TEXT 89 KPROBES_TEXT 54 KPROBES_TEXT 90 IRQENTRY_TEXT 55 IRQENTRY_TEXT 91 SOFTIRQENTRY_TEXT 56 SOFTIRQENTRY_TEXT 92 *(.fixup) << 93 *(.gnu.warning) 57 *(.gnu.warning) 94 } !! 58 } = 0 95 EXCEPTION_TABLE(L1_CACHE_BYTES) << 96 _etext = .; 59 _etext = .; 97 60 98 _sdata = .; << 99 RO_DATA(PAGE_SIZE) 61 RO_DATA(PAGE_SIZE) 100 62 101 /* !! 63 /* Start of data section */ 102 * 1. this is .data essentially !! 64 _sdata = .; 103 * 2. THREAD_SIZE for init.task, must !! 65 104 */ !! 66 .data1 : { 105 RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THR !! 67 *(.data1) >> 68 } >> 69 RW_DATA(SMP_CACHE_BYTES, 0, THREAD_SIZE) 106 70 >> 71 /* End of data section */ 107 _edata = .; 72 _edata = .; 108 73 109 BSS_SECTION(4, 4, 4) !! 74 .fixup : { >> 75 __start___fixup = .; >> 76 *(.fixup) >> 77 __stop___fixup = .; >> 78 } >> 79 EXCEPTION_TABLE(16) 110 80 111 #ifdef CONFIG_ARC_DW2_UNWIND << 112 . = ALIGN(PAGE_SIZE); 81 . = ALIGN(PAGE_SIZE); 113 .eh_frame : { !! 82 __init_begin = ALIGN(PAGE_SIZE); 114 __start_unwind = .; !! 83 INIT_TEXT_SECTION(PAGE_SIZE) 115 *(.eh_frame) !! 84 __init_text_end = .; 116 __end_unwind = .; !! 85 INIT_DATA_SECTION(16) >> 86 >> 87 . = ALIGN(4); >> 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 = .; 117 } 170 } 118 #else !! 171 PERCPU_SECTION(SMP_CACHE_BYTES) 119 /DISCARD/ : { *(.eh_frame) } << 120 #endif << 121 172 122 . = ALIGN(PAGE_SIZE); 173 . = ALIGN(PAGE_SIZE); >> 174 .exit.text : { >> 175 EXIT_TEXT >> 176 } >> 177 >> 178 .exit.data : { >> 179 EXIT_DATA >> 180 } >> 181 >> 182 . = ALIGN(PAGE_SIZE); >> 183 __init_end = .; >> 184 BSS_SECTION(0, 0, 0) 123 _end = . ; 185 _end = . ; 124 186 125 STABS_DEBUG 187 STABS_DEBUG >> 188 DWARF_DEBUG 126 ELF_DETAILS 189 ELF_DETAILS 127 DISCARDS << 128 190 129 .arcextmap 0 : { !! 191 DISCARDS 130 *(.gnu.linkonce.arcextmap.*) << 131 *(.arcextmap.*) << 132 } << 133 << 134 #ifndef CONFIG_DEBUG_INFO << 135 /DISCARD/ : { *(.debug_frame) } << 136 /DISCARD/ : { *(.debug_aranges) } << 137 /DISCARD/ : { *(.debug_pubnames) } << 138 /DISCARD/ : { *(.debug_info) } << 139 /DISCARD/ : { *(.debug_abbrev) } << 140 /DISCARD/ : { *(.debug_line) } << 141 /DISCARD/ : { *(.debug_str) } << 142 /DISCARD/ : { *(.debug_loc) } << 143 /DISCARD/ : { *(.debug_macinfo) } << 144 /DISCARD/ : { *(.debug_ranges) } << 145 #endif << 146 << 147 #ifdef CONFIG_ARC_HAS_DCCM << 148 . = CONFIG_ARC_DCCM_BASE; << 149 __arc_dccm_base = .; << 150 .data.arcfp : { << 151 *(.data.arcfp) << 152 } << 153 . = ALIGN(CONFIG_ARC_DCCM_SZ * 1024); << 154 #endif << 155 } 192 }
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.