| 
									
										
										
										
											2013-01-18 15:12:20 +05:30
										 |  |  | /* | 
					
						
							|  |  |  |  * 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 | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-18 15:12:25 +05:30
										 |  |  | 	/* | 
					
						
							|  |  |  | 	 * 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. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-18 15:12:20 +05:30
										 |  |  | 	. = CONFIG_LINUX_LINK_BASE;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_int_vec_base_lds = .;
 | 
					
						
							|  |  |  | 	.vector : { | 
					
						
							|  |  |  | 		*(.vector) | 
					
						
							|  |  |  | 		. = ALIGN(PAGE_SIZE);
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-18 15:12:25 +05:30
										 |  |  | #ifdef CONFIG_ARC_HAS_ICCM | 
					
						
							|  |  |  | 	.text.arcfp : { | 
					
						
							|  |  |  | 		*(.text.arcfp) | 
					
						
							|  |  |  | 		. = ALIGN(CONFIG_ARC_ICCM_SZ * 1024);
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-18 15:12:20 +05:30
										 |  |  | 	/* | 
					
						
							|  |  |  | 	 * 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 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-18 15:12:26 +05:30
										 |  |  | 	.init.arch.info : { | 
					
						
							|  |  |  | 		__arch_info_begin = .;
 | 
					
						
							|  |  |  | 		*(.arch.info.init) | 
					
						
							|  |  |  | 		__arch_info_end = .;
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-18 15:12:20 +05:30
										 |  |  | 	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(0, 0, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-22 17:03:19 +05:30
										 |  |  | #ifdef CONFIG_ARC_DW2_UNWIND | 
					
						
							|  |  |  | 	. = ALIGN(PAGE_SIZE);
 | 
					
						
							|  |  |  | 	.debug_frame  : { | 
					
						
							|  |  |  | 		__start_unwind = .;
 | 
					
						
							|  |  |  | 		*(.debug_frame) | 
					
						
							|  |  |  | 		__end_unwind = .;
 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-05-25 14:03:25 +05:30
										 |  |  | 	/* | 
					
						
							|  |  |  | 	 * gcc 4.8 generates this for -fasynchonous-unwind-tables, | 
					
						
							|  |  |  | 	 * while we still use the .debug_frame based unwinder | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	/DISCARD/ : {	*(.eh_frame) } | 
					
						
							| 
									
										
										
										
											2013-01-22 17:03:19 +05:30
										 |  |  | #else | 
					
						
							|  |  |  | 	/DISCARD/ : {	*(.debug_frame) } | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-18 15:12:20 +05:30
										 |  |  | 	NOTES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	. = ALIGN(PAGE_SIZE);
 | 
					
						
							|  |  |  | 	_end = . ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	STABS_DEBUG | 
					
						
							|  |  |  | 	DISCARDS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.arcextmap 0 : { | 
					
						
							|  |  |  | 		*(.gnu.linkonce.arcextmap.*) | 
					
						
							|  |  |  | 		*(.arcextmap.*) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-22 17:03:19 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-25 14:03:25 +05:30
										 |  |  | #ifndef CONFIG_DEBUG_INFO | 
					
						
							| 
									
										
										
										
											2013-01-22 17:03:19 +05:30
										 |  |  | 	/* open-coded because we need .debug_frame seperately for unwinding */ | 
					
						
							| 
									
										
										
										
											2013-05-25 14:03:25 +05:30
										 |  |  | 	/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 | 
					
						
							| 
									
										
										
										
											2013-01-22 17:03:19 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-18 15:12:25 +05:30
										 |  |  | #ifdef CONFIG_ARC_HAS_DCCM | 
					
						
							|  |  |  | 	. = CONFIG_ARC_DCCM_BASE;
 | 
					
						
							|  |  |  | 	__arc_dccm_base = .;
 | 
					
						
							|  |  |  | 	.data.arcfp : { | 
					
						
							|  |  |  | 		*(.data.arcfp) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	. = ALIGN(CONFIG_ARC_DCCM_SZ * 1024);
 | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2013-01-18 15:12:20 +05:30
										 |  |  | } |