1/* 2 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 */ 8 9#include <asm-generic/vmlinux.lds.h> 10#include <asm/cache.h> 11#include <asm/page.h> 12#include <asm/thread_info.h> 13 14OUTPUT_ARCH(arc) 15ENTRY(_stext) 16 17#ifdef CONFIG_CPU_BIG_ENDIAN 18jiffies = jiffies_64 + 4; 19#else 20jiffies = jiffies_64; 21#endif 22 23SECTIONS 24{ 25 /* 26 * ICCM starts at 0x8000_0000. So if kernel is relocated to some other 27 * address, make sure peripheral at 0x8z doesn't clash with ICCM 28 * Essentially vector is also in ICCM. 29 */ 30 31 . = CONFIG_LINUX_LINK_BASE; 32 33 _int_vec_base_lds = .; 34 .vector : { 35 *(.vector) 36 . = ALIGN(PAGE_SIZE); 37 } 38 39#ifdef CONFIG_ARC_HAS_ICCM 40 .text.arcfp : { 41 *(.text.arcfp) 42 . = ALIGN(CONFIG_ARC_ICCM_SZ * 1024); 43 } 44#endif 45 46 /* 47 * The reason for having a seperate subsection .init.ramfs is to 48 * prevent objump from including it in kernel dumps 49 * 50 * Reason for having .init.ramfs above .init is to make sure that the 51 * binary blob is tucked away to one side, reducing the displacement 52 * between .init.text and .text, avoiding any possible relocation 53 * errors because of calls from .init.text to .text 54 * Yes such calls do exist. e.g. 55 * decompress_inflate.c:gunzip( ) -> zlib_inflate_workspace( ) 56 */ 57 58 __init_begin = .; 59 60 .init.ramfs : { INIT_RAM_FS } 61 62 . = ALIGN(PAGE_SIZE); 63 _stext = .; 64 65 HEAD_TEXT_SECTION 66 INIT_TEXT_SECTION(L1_CACHE_BYTES) 67 68 /* INIT_DATA_SECTION open-coded: special INIT_RAM_FS handling */ 69 .init.data : { 70 INIT_DATA 71 INIT_SETUP(L1_CACHE_BYTES) 72 INIT_CALLS 73 CON_INITCALL 74 SECURITY_INITCALL 75 } 76 77 .init.arch.info : { 78 __arch_info_begin = .; 79 *(.arch.info.init) 80 __arch_info_end = .; 81 } 82 83 PERCPU_SECTION(L1_CACHE_BYTES) 84 85 /* 86 * .exit.text is discard at runtime, not link time, to deal with 87 * references from .debug_frame 88 * It will be init freed, being inside [__init_start : __init_end] 89 */ 90 .exit.text : { EXIT_TEXT } 91 .exit.data : { EXIT_DATA } 92 93 . = ALIGN(PAGE_SIZE); 94 __init_end = .; 95 96 .text : { 97 _text = .; 98 TEXT_TEXT 99 SCHED_TEXT 100 LOCK_TEXT 101 KPROBES_TEXT 102 *(.fixup) 103 *(.gnu.warning) 104 } 105 EXCEPTION_TABLE(L1_CACHE_BYTES) 106 _etext = .; 107 108 _sdata = .; 109 RO_DATA_SECTION(PAGE_SIZE) 110 111 /* 112 * 1. this is .data essentially 113 * 2. THREAD_SIZE for init.task, must be kernel-stk sz aligned 114 */ 115 RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE) 116 117 _edata = .; 118 119 BSS_SECTION(0, 0, 0) 120 121#ifdef CONFIG_ARC_DW2_UNWIND 122 . = ALIGN(PAGE_SIZE); 123 .debug_frame : { 124 __start_unwind = .; 125 *(.debug_frame) 126 __end_unwind = .; 127 } 128 /* 129 * gcc 4.8 generates this for -fasynchonous-unwind-tables, 130 * while we still use the .debug_frame based unwinder 131 */ 132 /DISCARD/ : { *(.eh_frame) } 133#else 134 /DISCARD/ : { *(.debug_frame) } 135#endif 136 137 NOTES 138 139 . = ALIGN(PAGE_SIZE); 140 _end = . ; 141 142 STABS_DEBUG 143 DISCARDS 144 145 .arcextmap 0 : { 146 *(.gnu.linkonce.arcextmap.*) 147 *(.arcextmap.*) 148 } 149 150#ifndef CONFIG_DEBUG_INFO 151 /* open-coded because we need .debug_frame seperately for unwinding */ 152 /DISCARD/ : { *(.debug_aranges) } 153 /DISCARD/ : { *(.debug_pubnames) } 154 /DISCARD/ : { *(.debug_info) } 155 /DISCARD/ : { *(.debug_abbrev) } 156 /DISCARD/ : { *(.debug_line) } 157 /DISCARD/ : { *(.debug_str) } 158 /DISCARD/ : { *(.debug_loc) } 159 /DISCARD/ : { *(.debug_macinfo) } 160 /DISCARD/ : { *(.debug_ranges) } 161#endif 162 163#ifdef CONFIG_ARC_HAS_DCCM 164 . = CONFIG_ARC_DCCM_BASE; 165 __arc_dccm_base = .; 166 .data.arcfp : { 167 *(.data.arcfp) 168 } 169 . = ALIGN(CONFIG_ARC_DCCM_SZ * 1024); 170#endif 171} 172