1c51e3a41SPaul Mackerras#ifdef CONFIG_PPC64 2e8222502SBenjamin Herrenschmidt#define PROVIDE32(x) PROVIDE(__unused__##x) 3c51e3a41SPaul Mackerras#else 4e8222502SBenjamin Herrenschmidt#define PROVIDE32(x) PROVIDE(x) 5c51e3a41SPaul Mackerras#endif 64846c5deSKumar Gala#include <asm/page.h> 714cf11afSPaul Mackerras#include <asm-generic/vmlinux.lds.h> 8bd67fcf9STony Breeds#include <asm/cache.h> 962bef288STim Abbott#include <asm/thread_info.h> 1014cf11afSPaul Mackerras 11e19e4ab4SMichael EllermanENTRY(_stext) 12e19e4ab4SMichael Ellerman 13c69cccc9SSegher BoessenkoolPHDRS { 14c69cccc9SSegher Boessenkool kernel PT_LOAD FLAGS(7); /* RWX */ 15c69cccc9SSegher Boessenkool notes PT_NOTE FLAGS(0); 16c69cccc9SSegher Boessenkool dummy PT_NOTE FLAGS(0); 17c69cccc9SSegher Boessenkool 18c69cccc9SSegher Boessenkool /* binutils < 2.18 has a bug that makes it misbehave when taking an 19c69cccc9SSegher Boessenkool ELF file with all segments at load address 0 as input. This 20c69cccc9SSegher Boessenkool happens when running "strip" on vmlinux, because of the AT() magic 21c69cccc9SSegher Boessenkool in this linker script. People using GCC >= 4.2 won't run into 22c69cccc9SSegher Boessenkool this problem, because the "build-id" support will put some data 23c69cccc9SSegher Boessenkool into the "notes" segment (at a non-zero load address). 24c69cccc9SSegher Boessenkool 25c69cccc9SSegher Boessenkool To work around this, we force some data into both the "dummy" 26c69cccc9SSegher Boessenkool segment and the kernel segment, so the dummy segment will get a 27c69cccc9SSegher Boessenkool non-zero load address. It's not enough to always create the 28c69cccc9SSegher Boessenkool "notes" segment, since if nothing gets assigned to it, its load 29c69cccc9SSegher Boessenkool address will be zero. */ 30c69cccc9SSegher Boessenkool} 31c69cccc9SSegher Boessenkool 32cabb5587SStephen Rothwell#ifdef CONFIG_PPC64 33cabb5587SStephen RothwellOUTPUT_ARCH(powerpc:common64) 34cabb5587SStephen Rothwelljiffies = jiffies_64; 35cabb5587SStephen Rothwell#else 3614cf11afSPaul MackerrasOUTPUT_ARCH(powerpc:common) 3714cf11afSPaul Mackerrasjiffies = jiffies_64 + 4; 38cabb5587SStephen Rothwell#endif 3914cf11afSPaul MackerrasSECTIONS 4014cf11afSPaul Mackerras{ 41e19e4ab4SMichael Ellerman . = KERNELBASE; 42cabb5587SStephen Rothwell 43e8222502SBenjamin Herrenschmidt/* 44e8222502SBenjamin Herrenschmidt * Text, read only data and other permanent read-only sections 45e8222502SBenjamin Herrenschmidt */ 46e8222502SBenjamin Herrenschmidt 47e8222502SBenjamin Herrenschmidt /* Text and gots */ 48366234f6SKumar Gala .text : AT(ADDR(.text) - LOAD_OFFSET) { 49748a7683SKumar Gala ALIGN_FUNCTION(); 50e7039845STim Abbott HEAD_TEXT 51fd593d12SEric W. Biederman _text = .; 5213beadd9STim Abbott /* careful! __ftr_alt_* sections need to be close to .text */ 5313beadd9STim Abbott *(.text .fixup __ftr_alt_* .ref.text) 5414cf11afSPaul Mackerras SCHED_TEXT 5514cf11afSPaul Mackerras LOCK_TEXT 56cabb5587SStephen Rothwell KPROBES_TEXT 576794c782SSteven Rostedt IRQENTRY_TEXT 58e8222502SBenjamin Herrenschmidt 59cabb5587SStephen Rothwell#ifdef CONFIG_PPC32 6014cf11afSPaul Mackerras *(.got1) 6114cf11afSPaul Mackerras __got2_start = .; 6214cf11afSPaul Mackerras *(.got2) 6314cf11afSPaul Mackerras __got2_end = .; 64e8222502SBenjamin Herrenschmidt#endif /* CONFIG_PPC32 */ 65e8222502SBenjamin Herrenschmidt 66303996daSStephen Rothwell } :kernel 67303996daSStephen Rothwell 68cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 69cabb5587SStephen Rothwell _etext = .; 70e8222502SBenjamin Herrenschmidt PROVIDE32 (etext = .); 7114cf11afSPaul Mackerras 72e8222502SBenjamin Herrenschmidt /* Read-only data */ 7314cf11afSPaul Mackerras RODATA 7414cf11afSPaul Mackerras 7562bef288STim Abbott EXCEPTION_TABLE(0) 7614cf11afSPaul Mackerras 77c69cccc9SSegher Boessenkool NOTES :kernel :notes 78c69cccc9SSegher Boessenkool 79c69cccc9SSegher Boessenkool /* The dummy segment contents for the bug workaround mentioned above 80c69cccc9SSegher Boessenkool near PHDRS. */ 8180c60bf9SSegher Boessenkool .dummy : AT(ADDR(.dummy) - LOAD_OFFSET) { 82e16459c6SMilton Miller LONG(0) 83e16459c6SMilton Miller LONG(0) 84e16459c6SMilton Miller LONG(0) 85c69cccc9SSegher Boessenkool } :kernel :dummy 868fb775eeSRoland McGrath 87e8222502SBenjamin Herrenschmidt/* 88e8222502SBenjamin Herrenschmidt * Init sections discarded at runtime 89e8222502SBenjamin Herrenschmidt */ 90cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 9114cf11afSPaul Mackerras __init_begin = .; 9262bef288STim Abbott INIT_TEXT_SECTION(PAGE_SIZE) :kernel 93e8222502SBenjamin Herrenschmidt 9414cf11afSPaul Mackerras /* .exit.text is discarded at runtime, not link time, 95e8222502SBenjamin Herrenschmidt * to deal with references from __bug_table 96e8222502SBenjamin Herrenschmidt */ 97366234f6SKumar Gala .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { 9801ba2bdcSSam Ravnborg EXIT_TEXT 9901ba2bdcSSam Ravnborg } 100e8222502SBenjamin Herrenschmidt 101366234f6SKumar Gala .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { 10201ba2bdcSSam Ravnborg INIT_DATA 10314cf11afSPaul Mackerras __vtop_table_begin = .; 10414cf11afSPaul Mackerras *(.vtop_fixup); 10514cf11afSPaul Mackerras __vtop_table_end = .; 10614cf11afSPaul Mackerras __ptov_table_begin = .; 10714cf11afSPaul Mackerras *(.ptov_fixup); 10814cf11afSPaul Mackerras __ptov_table_end = .; 10914cf11afSPaul Mackerras } 110cabb5587SStephen Rothwell 111366234f6SKumar Gala .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { 11262bef288STim Abbott INIT_SETUP(16) 113cabb5587SStephen Rothwell } 114cabb5587SStephen Rothwell 115366234f6SKumar Gala .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { 11662bef288STim Abbott INIT_CALLS 11714cf11afSPaul Mackerras } 11814cf11afSPaul Mackerras 119366234f6SKumar Gala .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { 12062bef288STim Abbott CON_INITCALL 121cabb5587SStephen Rothwell } 12214cf11afSPaul Mackerras 12314cf11afSPaul Mackerras SECURITY_INIT 12414cf11afSPaul Mackerras 125e8222502SBenjamin Herrenschmidt . = ALIGN(8); 126366234f6SKumar Gala __ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) { 12714cf11afSPaul Mackerras __start___ftr_fixup = .; 128e8222502SBenjamin Herrenschmidt *(__ftr_fixup) 12914cf11afSPaul Mackerras __stop___ftr_fixup = .; 130e8222502SBenjamin Herrenschmidt } 1312d1b2027SKumar Gala . = ALIGN(8); 1327c03d653SBenjamin Herrenschmidt __mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) { 1337c03d653SBenjamin Herrenschmidt __start___mmu_ftr_fixup = .; 1347c03d653SBenjamin Herrenschmidt *(__mmu_ftr_fixup) 1357c03d653SBenjamin Herrenschmidt __stop___mmu_ftr_fixup = .; 1367c03d653SBenjamin Herrenschmidt } 1377c03d653SBenjamin Herrenschmidt . = ALIGN(8); 1382d1b2027SKumar Gala __lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) { 1392d1b2027SKumar Gala __start___lwsync_fixup = .; 1402d1b2027SKumar Gala *(__lwsync_fixup) 1412d1b2027SKumar Gala __stop___lwsync_fixup = .; 1422d1b2027SKumar Gala } 1433f639ee8SStephen Rothwell#ifdef CONFIG_PPC64 1443f639ee8SStephen Rothwell . = ALIGN(8); 145366234f6SKumar Gala __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) { 1463f639ee8SStephen Rothwell __start___fw_ftr_fixup = .; 1473f639ee8SStephen Rothwell *(__fw_ftr_fixup) 1483f639ee8SStephen Rothwell __stop___fw_ftr_fixup = .; 1493f639ee8SStephen Rothwell } 1503f639ee8SStephen Rothwell#endif 151366234f6SKumar Gala .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { 15262bef288STim Abbott INIT_RAM_FS 153cabb5587SStephen Rothwell } 15462bef288STim Abbott 1550415b00dSTejun Heo PERCPU_SECTION(L1_CACHE_BYTES) 15614cf11afSPaul Mackerras 157e8222502SBenjamin Herrenschmidt . = ALIGN(8); 158366234f6SKumar Gala .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) { 159e8222502SBenjamin Herrenschmidt __machine_desc_start = . ; 160e8222502SBenjamin Herrenschmidt *(.machine.desc) 161e8222502SBenjamin Herrenschmidt __machine_desc_end = . ; 162e8222502SBenjamin Herrenschmidt } 1632a4b9c5aSPaul Mackerras#ifdef CONFIG_RELOCATABLE 164549e8152SPaul Mackerras . = ALIGN(8); 1659c5f7d39SSuzuki Poulose .dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET) 1669c5f7d39SSuzuki Poulose { 1679c5f7d39SSuzuki Poulose#ifdef CONFIG_RELOCATABLE_PPC32 1689c5f7d39SSuzuki Poulose __dynamic_symtab = .; 1699c5f7d39SSuzuki Poulose#endif 1709c5f7d39SSuzuki Poulose *(.dynsym) 1719c5f7d39SSuzuki Poulose } 172549e8152SPaul Mackerras .dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) } 173549e8152SPaul Mackerras .dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET) 174549e8152SPaul Mackerras { 175549e8152SPaul Mackerras __dynamic_start = .; 176549e8152SPaul Mackerras *(.dynamic) 177549e8152SPaul Mackerras } 178549e8152SPaul Mackerras .hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) } 179549e8152SPaul Mackerras .interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) } 180549e8152SPaul Mackerras .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET) 181549e8152SPaul Mackerras { 182549e8152SPaul Mackerras __rela_dyn_start = .; 183549e8152SPaul Mackerras *(.rela*) 184549e8152SPaul Mackerras } 1852a4b9c5aSPaul Mackerras#endif 186*4c812318SStephen Rothwell /* .exit.data is discarded at runtime, not link time, 187*4c812318SStephen Rothwell * to deal with references from .exit.text 188*4c812318SStephen Rothwell */ 189*4c812318SStephen Rothwell .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { 190*4c812318SStephen Rothwell EXIT_DATA 191*4c812318SStephen Rothwell } 192e8222502SBenjamin Herrenschmidt 193cabb5587SStephen Rothwell /* freed after init ends here */ 194cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 195e8222502SBenjamin Herrenschmidt __init_end = .; 196e8222502SBenjamin Herrenschmidt 197e8222502SBenjamin Herrenschmidt/* 198e8222502SBenjamin Herrenschmidt * And now the various read/write data 199e8222502SBenjamin Herrenschmidt */ 200e8222502SBenjamin Herrenschmidt 201e8222502SBenjamin Herrenschmidt . = ALIGN(PAGE_SIZE); 2024a288563SPaul Mackerras _sdata = .; 203cabb5587SStephen Rothwell 204e8222502SBenjamin Herrenschmidt#ifdef CONFIG_PPC32 205366234f6SKumar Gala .data : AT(ADDR(.data) - LOAD_OFFSET) { 206ca967258SSam Ravnborg DATA_DATA 207e8222502SBenjamin Herrenschmidt *(.sdata) 208e8222502SBenjamin Herrenschmidt *(.got.plt) *(.got) 209cabb5587SStephen Rothwell } 210e8222502SBenjamin Herrenschmidt#else 211366234f6SKumar Gala .data : AT(ADDR(.data) - LOAD_OFFSET) { 2123ae0aa9fSMathieu Desnoyers DATA_DATA 2133ae0aa9fSMathieu Desnoyers *(.data.rel*) 2143ae0aa9fSMathieu Desnoyers *(.toc1) 215cabb5587SStephen Rothwell *(.branch_lt) 216cabb5587SStephen Rothwell } 217cabb5587SStephen Rothwell 218366234f6SKumar Gala .opd : AT(ADDR(.opd) - LOAD_OFFSET) { 219cabb5587SStephen Rothwell *(.opd) 220cabb5587SStephen Rothwell } 221cabb5587SStephen Rothwell 2225e95235cSAnton Blanchard . = ALIGN(256); 223366234f6SKumar Gala .got : AT(ADDR(.got) - LOAD_OFFSET) { 224cabb5587SStephen Rothwell __toc_start = .; 2255ac47f7aSAnton Blanchard#ifndef CONFIG_RELOCATABLE 2265ac47f7aSAnton Blanchard __prom_init_toc_start = .; 2275ac47f7aSAnton Blanchard arch/powerpc/kernel/prom_init.o*(.toc .got) 2285ac47f7aSAnton Blanchard __prom_init_toc_end = .; 2295ac47f7aSAnton Blanchard#endif 230cabb5587SStephen Rothwell *(.got) 231cabb5587SStephen Rothwell *(.toc) 232e8222502SBenjamin Herrenschmidt } 233e8222502SBenjamin Herrenschmidt#endif 234e8222502SBenjamin Herrenschmidt 235e8222502SBenjamin Herrenschmidt /* The initial task and kernel stack */ 2362af7687fSTim Abbott INIT_TASK_DATA_SECTION(THREAD_SIZE) 237cabb5587SStephen Rothwell 23875b13483STim Abbott .data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) { 23962bef288STim Abbott PAGE_ALIGNED_DATA(PAGE_SIZE) 240cabb5587SStephen Rothwell } 24114cf11afSPaul Mackerras 2424af57b78STim Abbott .data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) { 24362bef288STim Abbott CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES) 244e8222502SBenjamin Herrenschmidt } 24514cf11afSPaul Mackerras 24654cb27a7SDenys Vlasenko .data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) { 24762bef288STim Abbott READ_MOSTLY_DATA(L1_CACHE_BYTES) 248bd67fcf9STony Breeds } 249bd67fcf9STony Breeds 2505be2a213SSean MacLennan . = ALIGN(PAGE_SIZE); 251366234f6SKumar Gala .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { 25262bef288STim Abbott NOSAVE_DATA 253e8222502SBenjamin Herrenschmidt } 25414cf11afSPaul Mackerras 255903444e4SMichael Ellerman . = ALIGN(PAGE_SIZE); 256903444e4SMichael Ellerman _edata = .; 257903444e4SMichael Ellerman PROVIDE32 (edata = .); 258903444e4SMichael Ellerman 259e8222502SBenjamin Herrenschmidt/* 260e8222502SBenjamin Herrenschmidt * And finally the bss 261e8222502SBenjamin Herrenschmidt */ 2624a288563SPaul Mackerras 26362bef288STim Abbott BSS_SECTION(0, 0, 0) 264cabb5587SStephen Rothwell 265cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 266cabb5587SStephen Rothwell _end = . ; 267e8222502SBenjamin Herrenschmidt PROVIDE32 (end = .); 268023bf6f1STejun Heo 269023bf6f1STejun Heo /* Sections to be discarded. */ 270023bf6f1STejun Heo DISCARDS 27114cf11afSPaul Mackerras} 272