/* * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include <asm-generic/vmlinux.lds.h> #include <asm/cache.h> #include <asm/page.h> #include <asm/thread_info.h> OUTPUT_ARCH(arc) ENTRY(_stext) #ifdef CONFIG_CPU_BIG_ENDIAN jiffies = jiffies_64 + 4; #else jiffies = jiffies_64; #endif SECTIONS { /* * ICCM starts at 0x8000_0000. So if kernel is relocated to some other * address, make sure peripheral at 0x8z doesn't clash with ICCM * Essentially vector is also in ICCM. */ . = CONFIG_LINUX_LINK_BASE; _int_vec_base_lds = .; .vector : { *(.vector) . = ALIGN(PAGE_SIZE); } #ifdef CONFIG_ARC_HAS_ICCM .text.arcfp : { *(.text.arcfp) . = ALIGN(CONFIG_ARC_ICCM_SZ * 1024); } #endif /* * The reason for having a seperate subsection .init.ramfs is to * prevent objump from including it in kernel dumps * * Reason for having .init.ramfs above .init is to make sure that the * binary blob is tucked away to one side, reducing the displacement * between .init.text and .text, avoiding any possible relocation * errors because of calls from .init.text to .text * Yes such calls do exist. e.g. * decompress_inflate.c:gunzip( ) -> zlib_inflate_workspace( ) */ __init_begin = .; .init.ramfs : { INIT_RAM_FS } . = ALIGN(PAGE_SIZE); _stext = .; HEAD_TEXT_SECTION INIT_TEXT_SECTION(L1_CACHE_BYTES) /* INIT_DATA_SECTION open-coded: special INIT_RAM_FS handling */ .init.data : { INIT_DATA INIT_SETUP(L1_CACHE_BYTES) INIT_CALLS CON_INITCALL SECURITY_INITCALL } .init.arch.info : { __arch_info_begin = .; *(.arch.info.init) __arch_info_end = .; } PERCPU_SECTION(L1_CACHE_BYTES) /* * .exit.text is discard at runtime, not link time, to deal with * references from .debug_frame * It will be init freed, being inside [__init_start : __init_end] */ .exit.text : { EXIT_TEXT } .exit.data : { EXIT_DATA } . = ALIGN(PAGE_SIZE); __init_end = .; .text : { _text = .; TEXT_TEXT SCHED_TEXT LOCK_TEXT KPROBES_TEXT *(.fixup) *(.gnu.warning) } EXCEPTION_TABLE(L1_CACHE_BYTES) _etext = .; _sdata = .; RO_DATA_SECTION(PAGE_SIZE) /* * 1. this is .data essentially * 2. THREAD_SIZE for init.task, must be kernel-stk sz aligned */ RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE) _edata = .; BSS_SECTION(4, 4, 4) #ifdef CONFIG_ARC_DW2_UNWIND . = ALIGN(PAGE_SIZE); .debug_frame : { __start_unwind = .; *(.debug_frame) __end_unwind = .; } /* * gcc 4.8 generates this for -fasynchonous-unwind-tables, * while we still use the .debug_frame based unwinder */ /DISCARD/ : { *(.eh_frame) } #else /DISCARD/ : { *(.debug_frame) } #endif NOTES . = ALIGN(PAGE_SIZE); _end = . ; STABS_DEBUG DISCARDS .arcextmap 0 : { *(.gnu.linkonce.arcextmap.*) *(.arcextmap.*) } #ifndef CONFIG_DEBUG_INFO /* open-coded because we need .debug_frame seperately for unwinding */ /DISCARD/ : { *(.debug_aranges) } /DISCARD/ : { *(.debug_pubnames) } /DISCARD/ : { *(.debug_info) } /DISCARD/ : { *(.debug_abbrev) } /DISCARD/ : { *(.debug_line) } /DISCARD/ : { *(.debug_str) } /DISCARD/ : { *(.debug_loc) } /DISCARD/ : { *(.debug_macinfo) } /DISCARD/ : { *(.debug_ranges) } #endif #ifdef CONFIG_ARC_HAS_DCCM . = CONFIG_ARC_DCCM_BASE; __arc_dccm_base = .; .data.arcfp : { *(.data.arcfp) } . = ALIGN(CONFIG_ARC_DCCM_SZ * 1024); #endif }