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{ 41d4703aefSRusty Russell . = 0; 42d4703aefSRusty Russell reloc_start = .; 43d4703aefSRusty Russell 44e19e4ab4SMichael Ellerman . = KERNELBASE; 45cabb5587SStephen Rothwell 46e8222502SBenjamin Herrenschmidt/* 47e8222502SBenjamin Herrenschmidt * Text, read only data and other permanent read-only sections 48e8222502SBenjamin Herrenschmidt */ 49e8222502SBenjamin Herrenschmidt 50e8222502SBenjamin Herrenschmidt /* Text and gots */ 51366234f6SKumar Gala .text : AT(ADDR(.text) - LOAD_OFFSET) { 52748a7683SKumar Gala ALIGN_FUNCTION(); 53e7039845STim Abbott HEAD_TEXT 54fd593d12SEric W. Biederman _text = .; 5513beadd9STim Abbott /* careful! __ftr_alt_* sections need to be close to .text */ 5613beadd9STim Abbott *(.text .fixup __ftr_alt_* .ref.text) 5714cf11afSPaul Mackerras SCHED_TEXT 5814cf11afSPaul Mackerras LOCK_TEXT 59cabb5587SStephen Rothwell KPROBES_TEXT 606794c782SSteven Rostedt IRQENTRY_TEXT 61e8222502SBenjamin Herrenschmidt 62cabb5587SStephen Rothwell#ifdef CONFIG_PPC32 6314cf11afSPaul Mackerras *(.got1) 6414cf11afSPaul Mackerras __got2_start = .; 6514cf11afSPaul Mackerras *(.got2) 6614cf11afSPaul Mackerras __got2_end = .; 67e8222502SBenjamin Herrenschmidt#endif /* CONFIG_PPC32 */ 68e8222502SBenjamin Herrenschmidt 69303996daSStephen Rothwell } :kernel 70303996daSStephen Rothwell 71cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 72cabb5587SStephen Rothwell _etext = .; 73e8222502SBenjamin Herrenschmidt PROVIDE32 (etext = .); 7414cf11afSPaul Mackerras 75e8222502SBenjamin Herrenschmidt /* Read-only data */ 7614cf11afSPaul Mackerras RODATA 7714cf11afSPaul Mackerras 7862bef288STim Abbott EXCEPTION_TABLE(0) 7914cf11afSPaul Mackerras 80c69cccc9SSegher Boessenkool NOTES :kernel :notes 81c69cccc9SSegher Boessenkool 82c69cccc9SSegher Boessenkool /* The dummy segment contents for the bug workaround mentioned above 83c69cccc9SSegher Boessenkool near PHDRS. */ 8480c60bf9SSegher Boessenkool .dummy : AT(ADDR(.dummy) - LOAD_OFFSET) { 85e16459c6SMilton Miller LONG(0) 86e16459c6SMilton Miller LONG(0) 87e16459c6SMilton Miller LONG(0) 88c69cccc9SSegher Boessenkool } :kernel :dummy 898fb775eeSRoland McGrath 90e8222502SBenjamin Herrenschmidt/* 91e8222502SBenjamin Herrenschmidt * Init sections discarded at runtime 92e8222502SBenjamin Herrenschmidt */ 93cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 9414cf11afSPaul Mackerras __init_begin = .; 9562bef288STim Abbott INIT_TEXT_SECTION(PAGE_SIZE) :kernel 96e8222502SBenjamin Herrenschmidt 9714cf11afSPaul Mackerras /* .exit.text is discarded at runtime, not link time, 98e8222502SBenjamin Herrenschmidt * to deal with references from __bug_table 99e8222502SBenjamin Herrenschmidt */ 100366234f6SKumar Gala .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { 10101ba2bdcSSam Ravnborg EXIT_TEXT 10201ba2bdcSSam Ravnborg } 103e8222502SBenjamin Herrenschmidt 104366234f6SKumar Gala .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { 10501ba2bdcSSam Ravnborg INIT_DATA 10614cf11afSPaul Mackerras __vtop_table_begin = .; 10714cf11afSPaul Mackerras *(.vtop_fixup); 10814cf11afSPaul Mackerras __vtop_table_end = .; 10914cf11afSPaul Mackerras __ptov_table_begin = .; 11014cf11afSPaul Mackerras *(.ptov_fixup); 11114cf11afSPaul Mackerras __ptov_table_end = .; 112c4e3ea25SStephen Rothwell#ifdef CONFIG_PPC_ISERIES 113c4e3ea25SStephen Rothwell __dt_strings_start = .; 114c4e3ea25SStephen Rothwell *(.dt_strings); 115c4e3ea25SStephen Rothwell __dt_strings_end = .; 116c4e3ea25SStephen Rothwell#endif 11714cf11afSPaul Mackerras } 118cabb5587SStephen Rothwell 119366234f6SKumar Gala .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { 12062bef288STim Abbott INIT_SETUP(16) 121cabb5587SStephen Rothwell } 122cabb5587SStephen Rothwell 123366234f6SKumar Gala .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { 12462bef288STim Abbott INIT_CALLS 12514cf11afSPaul Mackerras } 12614cf11afSPaul Mackerras 127366234f6SKumar Gala .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { 12862bef288STim Abbott CON_INITCALL 129cabb5587SStephen Rothwell } 13014cf11afSPaul Mackerras 13114cf11afSPaul Mackerras SECURITY_INIT 13214cf11afSPaul Mackerras 133e8222502SBenjamin Herrenschmidt . = ALIGN(8); 134366234f6SKumar Gala __ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) { 13514cf11afSPaul Mackerras __start___ftr_fixup = .; 136e8222502SBenjamin Herrenschmidt *(__ftr_fixup) 13714cf11afSPaul Mackerras __stop___ftr_fixup = .; 138e8222502SBenjamin Herrenschmidt } 1392d1b2027SKumar Gala . = ALIGN(8); 1407c03d653SBenjamin Herrenschmidt __mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) { 1417c03d653SBenjamin Herrenschmidt __start___mmu_ftr_fixup = .; 1427c03d653SBenjamin Herrenschmidt *(__mmu_ftr_fixup) 1437c03d653SBenjamin Herrenschmidt __stop___mmu_ftr_fixup = .; 1447c03d653SBenjamin Herrenschmidt } 1457c03d653SBenjamin Herrenschmidt . = ALIGN(8); 1462d1b2027SKumar Gala __lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) { 1472d1b2027SKumar Gala __start___lwsync_fixup = .; 1482d1b2027SKumar Gala *(__lwsync_fixup) 1492d1b2027SKumar Gala __stop___lwsync_fixup = .; 1502d1b2027SKumar Gala } 1513f639ee8SStephen Rothwell#ifdef CONFIG_PPC64 1523f639ee8SStephen Rothwell . = ALIGN(8); 153366234f6SKumar Gala __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) { 1543f639ee8SStephen Rothwell __start___fw_ftr_fixup = .; 1553f639ee8SStephen Rothwell *(__fw_ftr_fixup) 1563f639ee8SStephen Rothwell __stop___fw_ftr_fixup = .; 1573f639ee8SStephen Rothwell } 1583f639ee8SStephen Rothwell#endif 159366234f6SKumar Gala .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { 16062bef288STim Abbott INIT_RAM_FS 161cabb5587SStephen Rothwell } 16262bef288STim Abbott 16319390c4dSTejun Heo PERCPU(PAGE_SIZE) 16414cf11afSPaul Mackerras 165e8222502SBenjamin Herrenschmidt . = ALIGN(8); 166366234f6SKumar Gala .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) { 167e8222502SBenjamin Herrenschmidt __machine_desc_start = . ; 168e8222502SBenjamin Herrenschmidt *(.machine.desc) 169e8222502SBenjamin Herrenschmidt __machine_desc_end = . ; 170e8222502SBenjamin Herrenschmidt } 1712a4b9c5aSPaul Mackerras#ifdef CONFIG_RELOCATABLE 172549e8152SPaul Mackerras . = ALIGN(8); 173549e8152SPaul Mackerras .dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET) { *(.dynsym) } 174549e8152SPaul Mackerras .dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) } 175549e8152SPaul Mackerras .dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET) 176549e8152SPaul Mackerras { 177549e8152SPaul Mackerras __dynamic_start = .; 178549e8152SPaul Mackerras *(.dynamic) 179549e8152SPaul Mackerras } 180549e8152SPaul Mackerras .hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) } 181549e8152SPaul Mackerras .interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) } 182549e8152SPaul Mackerras .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET) 183549e8152SPaul Mackerras { 184549e8152SPaul Mackerras __rela_dyn_start = .; 185549e8152SPaul Mackerras *(.rela*) 186549e8152SPaul Mackerras } 1872a4b9c5aSPaul Mackerras#endif 188e8222502SBenjamin Herrenschmidt 189cabb5587SStephen Rothwell /* freed after init ends here */ 190cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 191e8222502SBenjamin Herrenschmidt __init_end = .; 192e8222502SBenjamin Herrenschmidt 193e8222502SBenjamin Herrenschmidt/* 194e8222502SBenjamin Herrenschmidt * And now the various read/write data 195e8222502SBenjamin Herrenschmidt */ 196e8222502SBenjamin Herrenschmidt 197e8222502SBenjamin Herrenschmidt . = ALIGN(PAGE_SIZE); 1984a288563SPaul Mackerras _sdata = .; 199cabb5587SStephen Rothwell 200e8222502SBenjamin Herrenschmidt#ifdef CONFIG_PPC32 201366234f6SKumar Gala .data : AT(ADDR(.data) - LOAD_OFFSET) { 202ca967258SSam Ravnborg DATA_DATA 203e8222502SBenjamin Herrenschmidt *(.sdata) 204e8222502SBenjamin Herrenschmidt *(.got.plt) *(.got) 205cabb5587SStephen Rothwell } 206e8222502SBenjamin Herrenschmidt#else 207366234f6SKumar Gala .data : AT(ADDR(.data) - LOAD_OFFSET) { 2083ae0aa9fSMathieu Desnoyers DATA_DATA 2093ae0aa9fSMathieu Desnoyers *(.data.rel*) 2103ae0aa9fSMathieu Desnoyers *(.toc1) 211cabb5587SStephen Rothwell *(.branch_lt) 212cabb5587SStephen Rothwell } 213cabb5587SStephen Rothwell 214366234f6SKumar Gala .opd : AT(ADDR(.opd) - LOAD_OFFSET) { 215cabb5587SStephen Rothwell *(.opd) 216cabb5587SStephen Rothwell } 217cabb5587SStephen Rothwell 218366234f6SKumar Gala .got : AT(ADDR(.got) - LOAD_OFFSET) { 219cabb5587SStephen Rothwell __toc_start = .; 220cabb5587SStephen Rothwell *(.got) 221cabb5587SStephen Rothwell *(.toc) 222e8222502SBenjamin Herrenschmidt } 223e8222502SBenjamin Herrenschmidt#endif 224e8222502SBenjamin Herrenschmidt 225e8222502SBenjamin Herrenschmidt /* The initial task and kernel stack */ 2262af7687fSTim Abbott INIT_TASK_DATA_SECTION(THREAD_SIZE) 227cabb5587SStephen Rothwell 22875b13483STim Abbott .data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) { 22962bef288STim Abbott PAGE_ALIGNED_DATA(PAGE_SIZE) 230cabb5587SStephen Rothwell } 23114cf11afSPaul Mackerras 2324af57b78STim Abbott .data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) { 23362bef288STim Abbott CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES) 234e8222502SBenjamin Herrenschmidt } 23514cf11afSPaul Mackerras 236*54cb27a7SDenys Vlasenko .data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) { 23762bef288STim Abbott READ_MOSTLY_DATA(L1_CACHE_BYTES) 238bd67fcf9STony Breeds } 239bd67fcf9STony Breeds 2405be2a213SSean MacLennan . = ALIGN(PAGE_SIZE); 241366234f6SKumar Gala .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { 24262bef288STim Abbott NOSAVE_DATA 243e8222502SBenjamin Herrenschmidt } 24414cf11afSPaul Mackerras 245903444e4SMichael Ellerman . = ALIGN(PAGE_SIZE); 246903444e4SMichael Ellerman _edata = .; 247903444e4SMichael Ellerman PROVIDE32 (edata = .); 248903444e4SMichael Ellerman 249e8222502SBenjamin Herrenschmidt/* 250e8222502SBenjamin Herrenschmidt * And finally the bss 251e8222502SBenjamin Herrenschmidt */ 2524a288563SPaul Mackerras 25362bef288STim Abbott BSS_SECTION(0, 0, 0) 254cabb5587SStephen Rothwell 255cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 256cabb5587SStephen Rothwell _end = . ; 257e8222502SBenjamin Herrenschmidt PROVIDE32 (end = .); 258023bf6f1STejun Heo 259023bf6f1STejun Heo /* Sections to be discarded. */ 260023bf6f1STejun Heo DISCARDS 26114cf11afSPaul Mackerras} 262