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> 914cf11afSPaul Mackerras 10e19e4ab4SMichael EllermanENTRY(_stext) 11e19e4ab4SMichael Ellerman 12c69cccc9SSegher BoessenkoolPHDRS { 13c69cccc9SSegher Boessenkool kernel PT_LOAD FLAGS(7); /* RWX */ 14c69cccc9SSegher Boessenkool notes PT_NOTE FLAGS(0); 15c69cccc9SSegher Boessenkool dummy PT_NOTE FLAGS(0); 16c69cccc9SSegher Boessenkool 17c69cccc9SSegher Boessenkool /* binutils < 2.18 has a bug that makes it misbehave when taking an 18c69cccc9SSegher Boessenkool ELF file with all segments at load address 0 as input. This 19c69cccc9SSegher Boessenkool happens when running "strip" on vmlinux, because of the AT() magic 20c69cccc9SSegher Boessenkool in this linker script. People using GCC >= 4.2 won't run into 21c69cccc9SSegher Boessenkool this problem, because the "build-id" support will put some data 22c69cccc9SSegher Boessenkool into the "notes" segment (at a non-zero load address). 23c69cccc9SSegher Boessenkool 24c69cccc9SSegher Boessenkool To work around this, we force some data into both the "dummy" 25c69cccc9SSegher Boessenkool segment and the kernel segment, so the dummy segment will get a 26c69cccc9SSegher Boessenkool non-zero load address. It's not enough to always create the 27c69cccc9SSegher Boessenkool "notes" segment, since if nothing gets assigned to it, its load 28c69cccc9SSegher Boessenkool address will be zero. */ 29c69cccc9SSegher Boessenkool} 30c69cccc9SSegher Boessenkool 31cabb5587SStephen Rothwell#ifdef CONFIG_PPC64 32cabb5587SStephen RothwellOUTPUT_ARCH(powerpc:common64) 33cabb5587SStephen Rothwelljiffies = jiffies_64; 34cabb5587SStephen Rothwell#else 3514cf11afSPaul MackerrasOUTPUT_ARCH(powerpc:common) 3614cf11afSPaul Mackerrasjiffies = jiffies_64 + 4; 37cabb5587SStephen Rothwell#endif 3814cf11afSPaul MackerrasSECTIONS 3914cf11afSPaul Mackerras{ 40cabb5587SStephen Rothwell /* Sections to be discarded. */ 41cabb5587SStephen Rothwell /DISCARD/ : { 42cabb5587SStephen Rothwell *(.exitcall.exit) 4301ba2bdcSSam Ravnborg EXIT_DATA 44cabb5587SStephen Rothwell } 45cabb5587SStephen Rothwell 46e19e4ab4SMichael Ellerman . = KERNELBASE; 47cabb5587SStephen Rothwell 48e8222502SBenjamin Herrenschmidt/* 49e8222502SBenjamin Herrenschmidt * Text, read only data and other permanent read-only sections 50e8222502SBenjamin Herrenschmidt */ 51e8222502SBenjamin Herrenschmidt 52e8222502SBenjamin Herrenschmidt /* Text and gots */ 53366234f6SKumar Gala .text : AT(ADDR(.text) - LOAD_OFFSET) { 54748a7683SKumar Gala ALIGN_FUNCTION(); 55748a7683SKumar Gala *(.text.head) 56fd593d12SEric W. Biederman _text = .; 57fac23fe4SMichael Ellerman *(.text .fixup .text.init.refok .exit.text.refok __ftr_alt_*) 5814cf11afSPaul Mackerras SCHED_TEXT 5914cf11afSPaul Mackerras LOCK_TEXT 60cabb5587SStephen Rothwell KPROBES_TEXT 61*6794c782SSteven Rostedt IRQENTRY_TEXT 62e8222502SBenjamin Herrenschmidt 63cabb5587SStephen Rothwell#ifdef CONFIG_PPC32 6414cf11afSPaul Mackerras *(.got1) 6514cf11afSPaul Mackerras __got2_start = .; 6614cf11afSPaul Mackerras *(.got2) 6714cf11afSPaul Mackerras __got2_end = .; 68e8222502SBenjamin Herrenschmidt#endif /* CONFIG_PPC32 */ 69e8222502SBenjamin Herrenschmidt 70303996daSStephen Rothwell } :kernel 71303996daSStephen Rothwell 72cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 73cabb5587SStephen Rothwell _etext = .; 74e8222502SBenjamin Herrenschmidt PROVIDE32 (etext = .); 7514cf11afSPaul Mackerras 76e8222502SBenjamin Herrenschmidt /* Read-only data */ 7714cf11afSPaul Mackerras RODATA 7814cf11afSPaul Mackerras 79e8222502SBenjamin Herrenschmidt /* Exception & bug tables */ 80366234f6SKumar Gala __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { 8114cf11afSPaul Mackerras __start___ex_table = .; 8214cf11afSPaul Mackerras *(__ex_table) 8314cf11afSPaul Mackerras __stop___ex_table = .; 8414cf11afSPaul Mackerras } 8514cf11afSPaul Mackerras 86c69cccc9SSegher Boessenkool NOTES :kernel :notes 87c69cccc9SSegher Boessenkool 88c69cccc9SSegher Boessenkool /* The dummy segment contents for the bug workaround mentioned above 89c69cccc9SSegher Boessenkool near PHDRS. */ 9080c60bf9SSegher Boessenkool .dummy : AT(ADDR(.dummy) - LOAD_OFFSET) { 91e16459c6SMilton Miller LONG(0) 92e16459c6SMilton Miller LONG(0) 93e16459c6SMilton Miller LONG(0) 94c69cccc9SSegher Boessenkool } :kernel :dummy 958fb775eeSRoland McGrath 96e8222502SBenjamin Herrenschmidt/* 97e8222502SBenjamin Herrenschmidt * Init sections discarded at runtime 98e8222502SBenjamin Herrenschmidt */ 99cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 10014cf11afSPaul Mackerras __init_begin = .; 101e8222502SBenjamin Herrenschmidt 102366234f6SKumar Gala .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { 10314cf11afSPaul Mackerras _sinittext = .; 10401ba2bdcSSam Ravnborg INIT_TEXT 10514cf11afSPaul Mackerras _einittext = .; 106c69cccc9SSegher Boessenkool } :kernel 107e8222502SBenjamin Herrenschmidt 10814cf11afSPaul Mackerras /* .exit.text is discarded at runtime, not link time, 109e8222502SBenjamin Herrenschmidt * to deal with references from __bug_table 110e8222502SBenjamin Herrenschmidt */ 111366234f6SKumar Gala .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { 11201ba2bdcSSam Ravnborg EXIT_TEXT 11301ba2bdcSSam Ravnborg } 114e8222502SBenjamin Herrenschmidt 115366234f6SKumar Gala .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { 11601ba2bdcSSam Ravnborg INIT_DATA 11714cf11afSPaul Mackerras __vtop_table_begin = .; 11814cf11afSPaul Mackerras *(.vtop_fixup); 11914cf11afSPaul Mackerras __vtop_table_end = .; 12014cf11afSPaul Mackerras __ptov_table_begin = .; 12114cf11afSPaul Mackerras *(.ptov_fixup); 12214cf11afSPaul Mackerras __ptov_table_end = .; 123c4e3ea25SStephen Rothwell#ifdef CONFIG_PPC_ISERIES 124c4e3ea25SStephen Rothwell __dt_strings_start = .; 125c4e3ea25SStephen Rothwell *(.dt_strings); 126c4e3ea25SStephen Rothwell __dt_strings_end = .; 127c4e3ea25SStephen Rothwell#endif 12814cf11afSPaul Mackerras } 129cabb5587SStephen Rothwell 13014cf11afSPaul Mackerras . = ALIGN(16); 131366234f6SKumar Gala .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { 132cabb5587SStephen Rothwell __setup_start = .; 133cabb5587SStephen Rothwell *(.init.setup) 13414cf11afSPaul Mackerras __setup_end = .; 135cabb5587SStephen Rothwell } 136cabb5587SStephen Rothwell 137366234f6SKumar Gala .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { 138cabb5587SStephen Rothwell __initcall_start = .; 13961ce1efeSAndrew Morton INITCALLS 140cabb5587SStephen Rothwell __initcall_end = .; 14114cf11afSPaul Mackerras } 14214cf11afSPaul Mackerras 143366234f6SKumar Gala .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { 144cabb5587SStephen Rothwell __con_initcall_start = .; 145cabb5587SStephen Rothwell *(.con_initcall.init) 14614cf11afSPaul Mackerras __con_initcall_end = .; 147cabb5587SStephen Rothwell } 14814cf11afSPaul Mackerras 14914cf11afSPaul Mackerras SECURITY_INIT 15014cf11afSPaul Mackerras 151e8222502SBenjamin Herrenschmidt . = ALIGN(8); 152366234f6SKumar Gala __ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) { 15314cf11afSPaul Mackerras __start___ftr_fixup = .; 154e8222502SBenjamin Herrenschmidt *(__ftr_fixup) 15514cf11afSPaul Mackerras __stop___ftr_fixup = .; 156e8222502SBenjamin Herrenschmidt } 1572d1b2027SKumar Gala . = ALIGN(8); 1587c03d653SBenjamin Herrenschmidt __mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) { 1597c03d653SBenjamin Herrenschmidt __start___mmu_ftr_fixup = .; 1607c03d653SBenjamin Herrenschmidt *(__mmu_ftr_fixup) 1617c03d653SBenjamin Herrenschmidt __stop___mmu_ftr_fixup = .; 1627c03d653SBenjamin Herrenschmidt } 1637c03d653SBenjamin Herrenschmidt . = ALIGN(8); 1642d1b2027SKumar Gala __lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) { 1652d1b2027SKumar Gala __start___lwsync_fixup = .; 1662d1b2027SKumar Gala *(__lwsync_fixup) 1672d1b2027SKumar Gala __stop___lwsync_fixup = .; 1682d1b2027SKumar Gala } 1693f639ee8SStephen Rothwell#ifdef CONFIG_PPC64 1703f639ee8SStephen Rothwell . = ALIGN(8); 171366234f6SKumar Gala __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) { 1723f639ee8SStephen Rothwell __start___fw_ftr_fixup = .; 1733f639ee8SStephen Rothwell *(__fw_ftr_fixup) 1743f639ee8SStephen Rothwell __stop___fw_ftr_fixup = .; 1753f639ee8SStephen Rothwell } 1763f639ee8SStephen Rothwell#endif 17767d38229SJean-Paul Saman#ifdef CONFIG_BLK_DEV_INITRD 178cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 179366234f6SKumar Gala .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { 180cabb5587SStephen Rothwell __initramfs_start = .; 181cabb5587SStephen Rothwell *(.init.ramfs) 182cabb5587SStephen Rothwell __initramfs_end = .; 183cabb5587SStephen Rothwell } 18467d38229SJean-Paul Saman#endif 185b6e3590fSJeremy Fitzhardinge . = ALIGN(PAGE_SIZE); 186366234f6SKumar Gala .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { 187cabb5587SStephen Rothwell __per_cpu_start = .; 188cabb5587SStephen Rothwell *(.data.percpu) 1895fb7dc37SFenghua Yu *(.data.percpu.shared_aligned) 19014cf11afSPaul Mackerras __per_cpu_end = .; 191cabb5587SStephen Rothwell } 19214cf11afSPaul Mackerras 193e8222502SBenjamin Herrenschmidt . = ALIGN(8); 194366234f6SKumar Gala .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) { 195e8222502SBenjamin Herrenschmidt __machine_desc_start = . ; 196e8222502SBenjamin Herrenschmidt *(.machine.desc) 197e8222502SBenjamin Herrenschmidt __machine_desc_end = . ; 198e8222502SBenjamin Herrenschmidt } 1992a4b9c5aSPaul Mackerras#ifdef CONFIG_RELOCATABLE 200549e8152SPaul Mackerras . = ALIGN(8); 201549e8152SPaul Mackerras .dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET) { *(.dynsym) } 202549e8152SPaul Mackerras .dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) } 203549e8152SPaul Mackerras .dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET) 204549e8152SPaul Mackerras { 205549e8152SPaul Mackerras __dynamic_start = .; 206549e8152SPaul Mackerras *(.dynamic) 207549e8152SPaul Mackerras } 208549e8152SPaul Mackerras .hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) } 209549e8152SPaul Mackerras .interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) } 210549e8152SPaul Mackerras .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET) 211549e8152SPaul Mackerras { 212549e8152SPaul Mackerras __rela_dyn_start = .; 213549e8152SPaul Mackerras *(.rela*) 214549e8152SPaul Mackerras } 2152a4b9c5aSPaul Mackerras#endif 216e8222502SBenjamin Herrenschmidt 217cabb5587SStephen Rothwell /* freed after init ends here */ 218cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 219e8222502SBenjamin Herrenschmidt __init_end = .; 220e8222502SBenjamin Herrenschmidt 221e8222502SBenjamin Herrenschmidt/* 222e8222502SBenjamin Herrenschmidt * And now the various read/write data 223e8222502SBenjamin Herrenschmidt */ 224e8222502SBenjamin Herrenschmidt 225e8222502SBenjamin Herrenschmidt . = ALIGN(PAGE_SIZE); 2264a288563SPaul Mackerras _sdata = .; 227cabb5587SStephen Rothwell 228e8222502SBenjamin Herrenschmidt#ifdef CONFIG_PPC32 229366234f6SKumar Gala .data : AT(ADDR(.data) - LOAD_OFFSET) { 230ca967258SSam Ravnborg DATA_DATA 231e8222502SBenjamin Herrenschmidt *(.sdata) 232e8222502SBenjamin Herrenschmidt *(.got.plt) *(.got) 233cabb5587SStephen Rothwell } 234e8222502SBenjamin Herrenschmidt#else 235366234f6SKumar Gala .data : AT(ADDR(.data) - LOAD_OFFSET) { 2363ae0aa9fSMathieu Desnoyers DATA_DATA 2373ae0aa9fSMathieu Desnoyers *(.data.rel*) 2383ae0aa9fSMathieu Desnoyers *(.toc1) 239cabb5587SStephen Rothwell *(.branch_lt) 240cabb5587SStephen Rothwell } 241cabb5587SStephen Rothwell 242366234f6SKumar Gala .opd : AT(ADDR(.opd) - LOAD_OFFSET) { 243cabb5587SStephen Rothwell *(.opd) 244cabb5587SStephen Rothwell } 245cabb5587SStephen Rothwell 246366234f6SKumar Gala .got : AT(ADDR(.got) - LOAD_OFFSET) { 247cabb5587SStephen Rothwell __toc_start = .; 248cabb5587SStephen Rothwell *(.got) 249cabb5587SStephen Rothwell *(.toc) 250e8222502SBenjamin Herrenschmidt } 251e8222502SBenjamin Herrenschmidt#endif 252e8222502SBenjamin Herrenschmidt 253cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 254cabb5587SStephen Rothwell _edata = .; 255e8222502SBenjamin Herrenschmidt PROVIDE32 (edata = .); 256e8222502SBenjamin Herrenschmidt 257e8222502SBenjamin Herrenschmidt /* The initial task and kernel stack */ 258e8222502SBenjamin Herrenschmidt#ifdef CONFIG_PPC32 259e8222502SBenjamin Herrenschmidt . = ALIGN(8192); 260e8222502SBenjamin Herrenschmidt#else 261e8222502SBenjamin Herrenschmidt . = ALIGN(16384); 262e8222502SBenjamin Herrenschmidt#endif 263366234f6SKumar Gala .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { 264e8222502SBenjamin Herrenschmidt *(.data.init_task) 265cabb5587SStephen Rothwell } 266cabb5587SStephen Rothwell 267cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 268366234f6SKumar Gala .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) { 269e8222502SBenjamin Herrenschmidt *(.data.page_aligned) 270cabb5587SStephen Rothwell } 27114cf11afSPaul Mackerras 272366234f6SKumar Gala .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { 273e8222502SBenjamin Herrenschmidt *(.data.cacheline_aligned) 274e8222502SBenjamin Herrenschmidt } 27514cf11afSPaul Mackerras 276bd67fcf9STony Breeds . = ALIGN(L1_CACHE_BYTES); 277366234f6SKumar Gala .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { 278bd67fcf9STony Breeds *(.data.read_mostly) 279bd67fcf9STony Breeds } 280bd67fcf9STony Breeds 281e8222502SBenjamin Herrenschmidt . = ALIGN(PAGE_SIZE); 282366234f6SKumar Gala .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { 283e8222502SBenjamin Herrenschmidt __nosave_begin = .; 284e8222502SBenjamin Herrenschmidt *(.data.nosave) 285e8222502SBenjamin Herrenschmidt . = ALIGN(PAGE_SIZE); 286e8222502SBenjamin Herrenschmidt __nosave_end = .; 287e8222502SBenjamin Herrenschmidt } 28814cf11afSPaul Mackerras 289e8222502SBenjamin Herrenschmidt/* 290e8222502SBenjamin Herrenschmidt * And finally the bss 291e8222502SBenjamin Herrenschmidt */ 2924a288563SPaul Mackerras 293366234f6SKumar Gala .bss : AT(ADDR(.bss) - LOAD_OFFSET) { 294cabb5587SStephen Rothwell __bss_start = .; 29514cf11afSPaul Mackerras *(.sbss) *(.scommon) 29614cf11afSPaul Mackerras *(.dynbss) 29714cf11afSPaul Mackerras *(.bss) 29814cf11afSPaul Mackerras *(COMMON) 29914cf11afSPaul Mackerras __bss_stop = .; 30014cf11afSPaul Mackerras } 301cabb5587SStephen Rothwell 302cabb5587SStephen Rothwell . = ALIGN(PAGE_SIZE); 303cabb5587SStephen Rothwell _end = . ; 304e8222502SBenjamin Herrenschmidt PROVIDE32 (end = .); 30514cf11afSPaul Mackerras} 306