Path: blob/master/arch/blackfin/kernel/vmlinux.lds.S
10817 views
/*1* Copyright 2004-2009 Analog Devices Inc.2*3* Licensed under the GPL-2 or later4*/56#include <asm-generic/vmlinux.lds.h>7#include <asm/mem_map.h>8#include <asm/page.h>9#include <asm/thread_info.h>1011OUTPUT_FORMAT("elf32-bfin")12ENTRY(__start)13_jiffies = _jiffies_64;1415SECTIONS16{17#ifdef CONFIG_RAMKERNEL18. = CONFIG_BOOT_LOAD;19#else20. = CONFIG_ROM_BASE;21#endif2223/* Neither the text, ro_data or bss section need to be aligned24* So pack them back to back25*/26.text :27{28__text = .;29_text = .;30__stext = .;31TEXT_TEXT32#ifndef CONFIG_SCHEDULE_L133SCHED_TEXT34#endif35LOCK_TEXT36IRQENTRY_TEXT37KPROBES_TEXT38#ifdef CONFIG_ROMKERNEL39__sinittext = .;40INIT_TEXT41__einittext = .;42EXIT_TEXT43#endif44*(.text.*)45*(.fixup)4647#if !L1_CODE_LENGTH48*(.l1.text)49#endif50__etext = .;51}5253EXCEPTION_TABLE(4)54NOTES5556/* Just in case the first read only is a 32-bit access */57RO_DATA(4)58__rodata_end = .;5960#ifdef CONFIG_ROMKERNEL61. = CONFIG_BOOT_LOAD;62.bss : AT(__rodata_end)63#else64.bss :65#endif66{67. = ALIGN(4);68___bss_start = .;69*(.bss .bss.*)70*(COMMON)71#if !L1_DATA_A_LENGTH72*(.l1.bss)73#endif74#if !L1_DATA_B_LENGTH75*(.l1.bss.B)76#endif77. = ALIGN(4);78___bss_stop = .;79}8081#if defined(CONFIG_ROMKERNEL)82.data : AT(LOADADDR(.bss) + SIZEOF(.bss))83#else84.data :85#endif86{87__sdata = .;88/* This gets done first, so the glob doesn't suck it in */89CACHELINE_ALIGNED_DATA(32)9091#if !L1_DATA_A_LENGTH92. = ALIGN(32);93*(.data_l1.cacheline_aligned)94*(.l1.data)95#endif96#if !L1_DATA_B_LENGTH97*(.l1.data.B)98#endif99#if !L2_LENGTH100. = ALIGN(32);101*(.data_l2.cacheline_aligned)102*(.l2.data)103#endif104105DATA_DATA106CONSTRUCTORS107108INIT_TASK_DATA(THREAD_SIZE)109110__edata = .;111}112__data_lma = LOADADDR(.data);113__data_len = SIZEOF(.data);114115/* The init section should be last, so when we free it, it goes into116* the general memory pool, and (hopefully) will decrease fragmentation117* a tiny bit. The init section has a _requirement_ that it be118* PAGE_SIZE aligned119*/120. = ALIGN(PAGE_SIZE);121___init_begin = .;122123#ifdef CONFIG_RAMKERNEL124INIT_TEXT_SECTION(PAGE_SIZE)125126/* We have to discard exit text and such at runtime, not link time, to127* handle embedded cross-section references (alt instructions, bug128* table, eh_frame, etc...). We need all of our .text up front and129* .data after it for PCREL call issues.130*/131.exit.text :132{133EXIT_TEXT134}135136. = ALIGN(16);137INIT_DATA_SECTION(16)138PERCPU_SECTION(32)139140.exit.data :141{142EXIT_DATA143}144145.text_l1 L1_CODE_START : AT(LOADADDR(.exit.data) + SIZEOF(.exit.data))146#else147.init.data : AT(__data_lma + __data_len)148{149__sinitdata = .;150INIT_DATA151INIT_SETUP(16)152INIT_CALLS153CON_INITCALL154SECURITY_INITCALL155INIT_RAM_FS156157___per_cpu_load = .;158PERCPU_INPUT(32)159160EXIT_DATA161__einitdata = .;162}163__init_data_lma = LOADADDR(.init.data);164__init_data_len = SIZEOF(.init.data);165__init_data_end = .;166167.text_l1 L1_CODE_START : AT(__init_data_lma + __init_data_len)168#endif169{170. = ALIGN(4);171__stext_l1 = .;172*(.l1.text.head)173*(.l1.text)174#ifdef CONFIG_SCHEDULE_L1175SCHED_TEXT176#endif177. = ALIGN(4);178__etext_l1 = .;179}180__text_l1_lma = LOADADDR(.text_l1);181__text_l1_len = SIZEOF(.text_l1);182ASSERT (__text_l1_len <= L1_CODE_LENGTH, "L1 text overflow!")183184.data_l1 L1_DATA_A_START : AT(__text_l1_lma + __text_l1_len)185{186. = ALIGN(4);187__sdata_l1 = .;188*(.l1.data)189__edata_l1 = .;190191. = ALIGN(32);192*(.data_l1.cacheline_aligned)193194. = ALIGN(4);195__sbss_l1 = .;196*(.l1.bss)197. = ALIGN(4);198__ebss_l1 = .;199}200__data_l1_lma = LOADADDR(.data_l1);201__data_l1_len = SIZEOF(.data_l1);202ASSERT (__data_l1_len <= L1_DATA_A_LENGTH, "L1 data A overflow!")203204.data_b_l1 L1_DATA_B_START : AT(__data_l1_lma + __data_l1_len)205{206. = ALIGN(4);207__sdata_b_l1 = .;208*(.l1.data.B)209__edata_b_l1 = .;210211. = ALIGN(4);212__sbss_b_l1 = .;213*(.l1.bss.B)214. = ALIGN(4);215__ebss_b_l1 = .;216}217__data_b_l1_lma = LOADADDR(.data_b_l1);218__data_b_l1_len = SIZEOF(.data_b_l1);219ASSERT (__data_b_l1_len <= L1_DATA_B_LENGTH, "L1 data B overflow!")220221.text_data_l2 L2_START : AT(__data_b_l1_lma + __data_b_l1_len)222{223. = ALIGN(4);224__stext_l2 = .;225*(.l2.text)226. = ALIGN(4);227__etext_l2 = .;228229. = ALIGN(4);230__sdata_l2 = .;231*(.l2.data)232__edata_l2 = .;233234. = ALIGN(32);235*(.data_l2.cacheline_aligned)236237. = ALIGN(4);238__sbss_l2 = .;239*(.l2.bss)240. = ALIGN(4);241__ebss_l2 = .;242}243__l2_lma = LOADADDR(.text_data_l2);244__l2_len = SIZEOF(.text_data_l2);245ASSERT (__l2_len <= L2_LENGTH, "L2 overflow!")246247/* Force trailing alignment of our init section so that when we248* free our init memory, we don't leave behind a partial page.249*/250#ifdef CONFIG_RAMKERNEL251. = __l2_lma + __l2_len;252#else253. = __init_data_end;254#endif255. = ALIGN(PAGE_SIZE);256___init_end = .;257258__end =.;259260STABS_DEBUG261262DWARF_DEBUG263264DISCARDS265}266267268