1dce97c8cSPaul Mundt/* 2dce97c8cSPaul Mundt * ld script to make SuperH Linux kernel 3dce97c8cSPaul Mundt * Written by Niibe Yutaka and Paul Mundt 4dce97c8cSPaul Mundt */ 5dce97c8cSPaul Mundt#ifdef CONFIG_SUPERH64 6dce97c8cSPaul Mundt#define LOAD_OFFSET CONFIG_PAGE_OFFSET 7dce97c8cSPaul MundtOUTPUT_ARCH(sh:sh5) 81da177e4SLinus Torvalds#else 97b022d07SPaul Mundt#define LOAD_OFFSET 0 10dce97c8cSPaul MundtOUTPUT_ARCH(sh) 11dce97c8cSPaul Mundt#endif 12dce97c8cSPaul Mundt 13dce97c8cSPaul Mundt#include <asm/thread_info.h> 14dce97c8cSPaul Mundt#include <asm/cache.h> 15dce97c8cSPaul Mundt#include <asm-generic/vmlinux.lds.h> 16dce97c8cSPaul Mundt 17dce97c8cSPaul MundtENTRY(_start) 18dce97c8cSPaul MundtSECTIONS 19dce97c8cSPaul Mundt{ 20dce97c8cSPaul Mundt#ifdef CONFIG_PMB_FIXED 21dce97c8cSPaul Mundt . = CONFIG_PAGE_OFFSET + (CONFIG_MEMORY_START & 0x1fffffff) + 22dce97c8cSPaul Mundt CONFIG_ZERO_PAGE_OFFSET; 23dce97c8cSPaul Mundt#elif defined(CONFIG_32BIT) 24dce97c8cSPaul Mundt . = CONFIG_PAGE_OFFSET + CONFIG_ZERO_PAGE_OFFSET; 25dce97c8cSPaul Mundt#else 26dce97c8cSPaul Mundt . = CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START + CONFIG_ZERO_PAGE_OFFSET; 27dce97c8cSPaul Mundt#endif 28dce97c8cSPaul Mundt 2953c0054cSMagnus Damm _text = .; /* Text and read-only data */ 3053c0054cSMagnus Damm 31dce97c8cSPaul Mundt .empty_zero_page : AT(ADDR(.empty_zero_page) - LOAD_OFFSET) { 32dce97c8cSPaul Mundt *(.empty_zero_page) 33dce97c8cSPaul Mundt } = 0 34dce97c8cSPaul Mundt 35dce97c8cSPaul Mundt .text : AT(ADDR(.text) - LOAD_OFFSET) { 36dce97c8cSPaul Mundt HEAD_TEXT 37dce97c8cSPaul Mundt TEXT_TEXT 38dce97c8cSPaul Mundt 39dce97c8cSPaul Mundt#ifdef CONFIG_SUPERH64 40dce97c8cSPaul Mundt *(.text64) 41dce97c8cSPaul Mundt *(.text..SHmedia32) 42dce97c8cSPaul Mundt#endif 43dce97c8cSPaul Mundt 44dce97c8cSPaul Mundt SCHED_TEXT 45dce97c8cSPaul Mundt LOCK_TEXT 46dce97c8cSPaul Mundt KPROBES_TEXT 47dce97c8cSPaul Mundt IRQENTRY_TEXT 48dce97c8cSPaul Mundt *(.fixup) 49dce97c8cSPaul Mundt *(.gnu.warning) 50dce97c8cSPaul Mundt _etext = .; /* End of text section */ 51dce97c8cSPaul Mundt } = 0x0009 52dce97c8cSPaul Mundt 53dce97c8cSPaul Mundt . = ALIGN(16); /* Exception table */ 54dce97c8cSPaul Mundt __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { 55dce97c8cSPaul Mundt __start___ex_table = .; 56dce97c8cSPaul Mundt *(__ex_table) 57dce97c8cSPaul Mundt __stop___ex_table = .; 58dce97c8cSPaul Mundt } 59dce97c8cSPaul Mundt 60dce97c8cSPaul Mundt NOTES 61dce97c8cSPaul Mundt RO_DATA(PAGE_SIZE) 62dce97c8cSPaul Mundt 63dce97c8cSPaul Mundt /* 64dce97c8cSPaul Mundt * Code which must be executed uncached and the associated data 65dce97c8cSPaul Mundt */ 66dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 67dce97c8cSPaul Mundt .uncached : AT(ADDR(.uncached) - LOAD_OFFSET) { 68dce97c8cSPaul Mundt __uncached_start = .; 69dce97c8cSPaul Mundt *(.uncached.text) 70dce97c8cSPaul Mundt *(.uncached.data) 71dce97c8cSPaul Mundt __uncached_end = .; 72dce97c8cSPaul Mundt } 73dce97c8cSPaul Mundt 74dce97c8cSPaul Mundt . = ALIGN(THREAD_SIZE); 75dce97c8cSPaul Mundt .data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */ 76dce97c8cSPaul Mundt *(.data.init_task) 77dce97c8cSPaul Mundt 78dce97c8cSPaul Mundt . = ALIGN(L1_CACHE_BYTES); 79dce97c8cSPaul Mundt *(.data.cacheline_aligned) 80dce97c8cSPaul Mundt 81dce97c8cSPaul Mundt . = ALIGN(L1_CACHE_BYTES); 82dce97c8cSPaul Mundt *(.data.read_mostly) 83dce97c8cSPaul Mundt 84dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 85dce97c8cSPaul Mundt *(.data.page_aligned) 86dce97c8cSPaul Mundt 87dce97c8cSPaul Mundt __nosave_begin = .; 88dce97c8cSPaul Mundt *(.data.nosave) 89dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 90dce97c8cSPaul Mundt __nosave_end = .; 91dce97c8cSPaul Mundt 92dce97c8cSPaul Mundt DATA_DATA 93dce97c8cSPaul Mundt CONSTRUCTORS 94dce97c8cSPaul Mundt } 95dce97c8cSPaul Mundt 96dce97c8cSPaul Mundt _edata = .; /* End of data section */ 97dce97c8cSPaul Mundt 98dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); /* Init code and data */ 99dce97c8cSPaul Mundt .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { 100dce97c8cSPaul Mundt __init_begin = .; 101dce97c8cSPaul Mundt _sinittext = .; 102dce97c8cSPaul Mundt INIT_TEXT 103dce97c8cSPaul Mundt _einittext = .; 104dce97c8cSPaul Mundt } 105dce97c8cSPaul Mundt 106dce97c8cSPaul Mundt .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { INIT_DATA } 107dce97c8cSPaul Mundt 108dce97c8cSPaul Mundt . = ALIGN(16); 109dce97c8cSPaul Mundt .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { 110dce97c8cSPaul Mundt __setup_start = .; 111dce97c8cSPaul Mundt *(.init.setup) 112dce97c8cSPaul Mundt __setup_end = .; 113dce97c8cSPaul Mundt } 114dce97c8cSPaul Mundt 115dce97c8cSPaul Mundt .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { 116dce97c8cSPaul Mundt __initcall_start = .; 117dce97c8cSPaul Mundt INITCALLS 118dce97c8cSPaul Mundt __initcall_end = .; 119dce97c8cSPaul Mundt } 120dce97c8cSPaul Mundt 121dce97c8cSPaul Mundt .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { 122dce97c8cSPaul Mundt __con_initcall_start = .; 123dce97c8cSPaul Mundt *(.con_initcall.init) 124dce97c8cSPaul Mundt __con_initcall_end = .; 125dce97c8cSPaul Mundt } 126dce97c8cSPaul Mundt 127dce97c8cSPaul Mundt SECURITY_INIT 128dce97c8cSPaul Mundt 129dce97c8cSPaul Mundt#ifdef CONFIG_BLK_DEV_INITRD 130dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 131d9d674e5SPaul Mundt .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { 132dce97c8cSPaul Mundt __initramfs_start = .; 133dce97c8cSPaul Mundt *(.init.ramfs) 134dce97c8cSPaul Mundt __initramfs_end = .; 135dce97c8cSPaul Mundt } 136dce97c8cSPaul Mundt#endif 137dce97c8cSPaul Mundt 138dce97c8cSPaul Mundt . = ALIGN(4); 139dce97c8cSPaul Mundt .machvec.init : AT(ADDR(.machvec.init) - LOAD_OFFSET) { 140dce97c8cSPaul Mundt __machvec_start = .; 141dce97c8cSPaul Mundt *(.machvec.init) 142dce97c8cSPaul Mundt __machvec_end = .; 143dce97c8cSPaul Mundt } 144dce97c8cSPaul Mundt 145dce97c8cSPaul Mundt PERCPU(PAGE_SIZE) 146dce97c8cSPaul Mundt 147dce97c8cSPaul Mundt /* 148dce97c8cSPaul Mundt * .exit.text is discarded at runtime, not link time, to deal with 149dce97c8cSPaul Mundt * references from __bug_table 150dce97c8cSPaul Mundt */ 151dce97c8cSPaul Mundt .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { EXIT_TEXT } 152dce97c8cSPaul Mundt .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { EXIT_DATA } 153dce97c8cSPaul Mundt 154dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 155dce97c8cSPaul Mundt .bss : AT(ADDR(.bss) - LOAD_OFFSET) { 156dce97c8cSPaul Mundt __init_end = .; 157dce97c8cSPaul Mundt __bss_start = .; /* BSS */ 158dce97c8cSPaul Mundt *(.bss.page_aligned) 159dce97c8cSPaul Mundt *(.bss) 160dce97c8cSPaul Mundt *(COMMON) 161dce97c8cSPaul Mundt . = ALIGN(4); 162dce97c8cSPaul Mundt _ebss = .; /* uClinux MTD sucks */ 163dce97c8cSPaul Mundt _end = . ; 164dce97c8cSPaul Mundt } 165dce97c8cSPaul Mundt 166*023bf6f1STejun Heo STABS_DEBUG 167*023bf6f1STejun Heo DWARF_DEBUG 168*023bf6f1STejun Heo 169dce97c8cSPaul Mundt /* 170dce97c8cSPaul Mundt * When something in the kernel is NOT compiled as a module, the 171dce97c8cSPaul Mundt * module cleanup code and data are put into these segments. Both 172dce97c8cSPaul Mundt * can then be thrown away, as cleanup code is never called unless 173dce97c8cSPaul Mundt * it's a module. 174dce97c8cSPaul Mundt */ 175*023bf6f1STejun Heo DISCARDS 176dce97c8cSPaul Mundt} 177