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 29dce97c8cSPaul Mundt .empty_zero_page : AT(ADDR(.empty_zero_page) - LOAD_OFFSET) { 30dce97c8cSPaul Mundt *(.empty_zero_page) 31dce97c8cSPaul Mundt } = 0 32dce97c8cSPaul Mundt 33dce97c8cSPaul Mundt .text : AT(ADDR(.text) - LOAD_OFFSET) { 34dce97c8cSPaul Mundt _text = .; /* Text and read-only data */ 35dce97c8cSPaul Mundt HEAD_TEXT 36dce97c8cSPaul Mundt TEXT_TEXT 37dce97c8cSPaul Mundt 38dce97c8cSPaul Mundt#ifdef CONFIG_SUPERH64 39dce97c8cSPaul Mundt *(.text64) 40dce97c8cSPaul Mundt *(.text..SHmedia32) 41dce97c8cSPaul Mundt#endif 42dce97c8cSPaul Mundt 43dce97c8cSPaul Mundt SCHED_TEXT 44dce97c8cSPaul Mundt LOCK_TEXT 45dce97c8cSPaul Mundt KPROBES_TEXT 46dce97c8cSPaul Mundt IRQENTRY_TEXT 47dce97c8cSPaul Mundt *(.fixup) 48dce97c8cSPaul Mundt *(.gnu.warning) 49dce97c8cSPaul Mundt _etext = .; /* End of text section */ 50dce97c8cSPaul Mundt } = 0x0009 51dce97c8cSPaul Mundt 52dce97c8cSPaul Mundt . = ALIGN(16); /* Exception table */ 53dce97c8cSPaul Mundt __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { 54dce97c8cSPaul Mundt __start___ex_table = .; 55dce97c8cSPaul Mundt *(__ex_table) 56dce97c8cSPaul Mundt __stop___ex_table = .; 57dce97c8cSPaul Mundt } 58dce97c8cSPaul Mundt 59dce97c8cSPaul Mundt NOTES 60dce97c8cSPaul Mundt RO_DATA(PAGE_SIZE) 61dce97c8cSPaul Mundt 62dce97c8cSPaul Mundt /* 63dce97c8cSPaul Mundt * Code which must be executed uncached and the associated data 64dce97c8cSPaul Mundt */ 65dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 66dce97c8cSPaul Mundt .uncached : AT(ADDR(.uncached) - LOAD_OFFSET) { 67dce97c8cSPaul Mundt __uncached_start = .; 68dce97c8cSPaul Mundt *(.uncached.text) 69dce97c8cSPaul Mundt *(.uncached.data) 70dce97c8cSPaul Mundt __uncached_end = .; 71dce97c8cSPaul Mundt } 72dce97c8cSPaul Mundt 73dce97c8cSPaul Mundt . = ALIGN(THREAD_SIZE); 74dce97c8cSPaul Mundt .data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */ 75dce97c8cSPaul Mundt *(.data.init_task) 76dce97c8cSPaul Mundt 77dce97c8cSPaul Mundt . = ALIGN(L1_CACHE_BYTES); 78dce97c8cSPaul Mundt *(.data.cacheline_aligned) 79dce97c8cSPaul Mundt 80dce97c8cSPaul Mundt . = ALIGN(L1_CACHE_BYTES); 81dce97c8cSPaul Mundt *(.data.read_mostly) 82dce97c8cSPaul Mundt 83dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 84dce97c8cSPaul Mundt *(.data.page_aligned) 85dce97c8cSPaul Mundt 86dce97c8cSPaul Mundt __nosave_begin = .; 87dce97c8cSPaul Mundt *(.data.nosave) 88dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 89dce97c8cSPaul Mundt __nosave_end = .; 90dce97c8cSPaul Mundt 91dce97c8cSPaul Mundt DATA_DATA 92dce97c8cSPaul Mundt CONSTRUCTORS 93dce97c8cSPaul Mundt } 94dce97c8cSPaul Mundt 95dce97c8cSPaul Mundt _edata = .; /* End of data section */ 96dce97c8cSPaul Mundt 97dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); /* Init code and data */ 98dce97c8cSPaul Mundt .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { 99dce97c8cSPaul Mundt __init_begin = .; 100dce97c8cSPaul Mundt _sinittext = .; 101dce97c8cSPaul Mundt INIT_TEXT 102dce97c8cSPaul Mundt _einittext = .; 103dce97c8cSPaul Mundt } 104dce97c8cSPaul Mundt 105dce97c8cSPaul Mundt .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { INIT_DATA } 106dce97c8cSPaul Mundt 107dce97c8cSPaul Mundt . = ALIGN(16); 108dce97c8cSPaul Mundt .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { 109dce97c8cSPaul Mundt __setup_start = .; 110dce97c8cSPaul Mundt *(.init.setup) 111dce97c8cSPaul Mundt __setup_end = .; 112dce97c8cSPaul Mundt } 113dce97c8cSPaul Mundt 114dce97c8cSPaul Mundt .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { 115dce97c8cSPaul Mundt __initcall_start = .; 116dce97c8cSPaul Mundt INITCALLS 117dce97c8cSPaul Mundt __initcall_end = .; 118dce97c8cSPaul Mundt } 119dce97c8cSPaul Mundt 120dce97c8cSPaul Mundt .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { 121dce97c8cSPaul Mundt __con_initcall_start = .; 122dce97c8cSPaul Mundt *(.con_initcall.init) 123dce97c8cSPaul Mundt __con_initcall_end = .; 124dce97c8cSPaul Mundt } 125dce97c8cSPaul Mundt 126dce97c8cSPaul Mundt SECURITY_INIT 127dce97c8cSPaul Mundt 128dce97c8cSPaul Mundt#ifdef CONFIG_BLK_DEV_INITRD 129dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 130*d9d674e5SPaul Mundt .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { 131dce97c8cSPaul Mundt __initramfs_start = .; 132dce97c8cSPaul Mundt *(.init.ramfs) 133dce97c8cSPaul Mundt __initramfs_end = .; 134dce97c8cSPaul Mundt } 135dce97c8cSPaul Mundt#endif 136dce97c8cSPaul Mundt 137dce97c8cSPaul Mundt . = ALIGN(4); 138dce97c8cSPaul Mundt .machvec.init : AT(ADDR(.machvec.init) - LOAD_OFFSET) { 139dce97c8cSPaul Mundt __machvec_start = .; 140dce97c8cSPaul Mundt *(.machvec.init) 141dce97c8cSPaul Mundt __machvec_end = .; 142dce97c8cSPaul Mundt } 143dce97c8cSPaul Mundt 144dce97c8cSPaul Mundt PERCPU(PAGE_SIZE) 145dce97c8cSPaul Mundt 146dce97c8cSPaul Mundt /* 147dce97c8cSPaul Mundt * .exit.text is discarded at runtime, not link time, to deal with 148dce97c8cSPaul Mundt * references from __bug_table 149dce97c8cSPaul Mundt */ 150dce97c8cSPaul Mundt .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { EXIT_TEXT } 151dce97c8cSPaul Mundt .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { EXIT_DATA } 152dce97c8cSPaul Mundt 153dce97c8cSPaul Mundt . = ALIGN(PAGE_SIZE); 154dce97c8cSPaul Mundt .bss : AT(ADDR(.bss) - LOAD_OFFSET) { 155dce97c8cSPaul Mundt __init_end = .; 156dce97c8cSPaul Mundt __bss_start = .; /* BSS */ 157dce97c8cSPaul Mundt *(.bss.page_aligned) 158dce97c8cSPaul Mundt *(.bss) 159dce97c8cSPaul Mundt *(COMMON) 160dce97c8cSPaul Mundt . = ALIGN(4); 161dce97c8cSPaul Mundt _ebss = .; /* uClinux MTD sucks */ 162dce97c8cSPaul Mundt _end = . ; 163dce97c8cSPaul Mundt } 164dce97c8cSPaul Mundt 165dce97c8cSPaul Mundt /* 166dce97c8cSPaul Mundt * When something in the kernel is NOT compiled as a module, the 167dce97c8cSPaul Mundt * module cleanup code and data are put into these segments. Both 168dce97c8cSPaul Mundt * can then be thrown away, as cleanup code is never called unless 169dce97c8cSPaul Mundt * it's a module. 170dce97c8cSPaul Mundt */ 171dce97c8cSPaul Mundt /DISCARD/ : { 172dce97c8cSPaul Mundt *(.exitcall.exit) 173dce97c8cSPaul Mundt } 174dce97c8cSPaul Mundt 175dce97c8cSPaul Mundt STABS_DEBUG 176dce97c8cSPaul Mundt DWARF_DEBUG 177dce97c8cSPaul Mundt} 178