Root/target/linux/ubicom32/files/arch/ubicom32/kernel/vmlinux.lds.S

1/*
2 * arch/ubicom32/kernel/vmlinux.lds.S
3 * vmlinux primary linker script
4 *
5 * (C) Copyright 2009, Ubicom, Inc.
6 *
7 * This file is part of the Ubicom32 Linux Kernel Port.
8 *
9 * The Ubicom32 Linux Kernel Port is free software: you can redistribute
10 * it and/or modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation, either version 2 of the
12 * License, or (at your option) any later version.
13 *
14 * The Ubicom32 Linux Kernel Port is distributed in the hope that it
15 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
16 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
17 * the GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with the Ubicom32 Linux Kernel Port. If not,
21 * see <http://www.gnu.org/licenses/>.
22 *
23 * Ubicom32 implementation derived from (with many thanks):
24 * arch/m68knommu
25 * arch/blackfin
26 * arch/parisc
27 */
28#include <asm-generic/vmlinux.lds.h>
29#include <asm/ocm_size.h>
30#include <asm/memory_map.h>
31#include <asm/thread_info.h>
32#include <linux/threads.h>
33
34/*
35 * Sanity checks to prevent errors later on that are much harder to understand
36 */
37#if !defined APP_OCM_CODE_SIZE
38#error APP_OCM_CODE_SIZE has not been defined in ocm_size.h
39#endif
40
41#if !defined APP_OCM_DATA_SIZE
42#error APP_OCM_DATA_SIZE has not been defined in ocm_size.h
43#endif
44
45/*
46 * The `free' ocm area that ultra does not use.
47 */
48#if APP_OCM_CODE_SIZE || APP_OCM_DATA_SIZE
49#define OCM_FREE_START (OCMSTART + APP_OCM_CODE_SIZE)
50#define OCM_FREE_LENGTH (OCMSIZE - APP_OCM_CODE_SIZE - APP_OCM_DATA_SIZE)
51#else
52#define OCM_FREE_START OCMEND
53#define OCM_FREE_LENGTH 0
54#endif
55
56/*
57 * If you want to limit OCM use for text/data or completely disable it
58 * you can change these values.
59 */
60#define OCM_TEXT_LENGTH OCM_FREE_LENGTH
61#define OCM_DATA_LENGTH OCM_FREE_LENGTH
62
63#define RAM_START KERNELSTART
64#define RAM_LENGTH ((SDRAMSTART + CONFIG_MIN_RAMSIZE) - RAM_START)
65#define TEXT ram
66#define DATA ram
67#define INIT ram
68#define BSS ram
69
70#ifndef DATA_ADDR
71#define DATA_ADDR
72#endif
73
74#include <asm-generic/vmlinux.lds.h>
75
76OUTPUT_ARCH(ubicom32)
77ENTRY(_start)
78
79MEMORY {
80    ram : ORIGIN = RAM_START, LENGTH = RAM_LENGTH
81    syscall : ORIGIN = OS_SYSCALL_BEGIN, LENGTH = (OS_SYSCALL_END - OS_SYSCALL_BEGIN)
82    ocm : ORIGIN = OCM_FREE_START, LENGTH = OCM_FREE_LENGTH
83}
84
85jiffies = jiffies_64 + 4;
86
87/*
88 * Fixed locations required by gdb coredumps.
89 *
90 * Note that the names are what gdb is expecting so renaming will break
91 * the toolchain.
92 */
93__ocm_begin = OCMSTART;
94__ocm_limit = __ocm_begin + OCMSIZE;
95__sdram_begin = SDRAMSTART;
96__sdram_limit = __sdram_begin + CONFIG_MIN_RAMSIZE;
97__filemedia_begin_addr = FLASHSTART;
98__filemedia_end_addr = __filemedia_begin_addr + 0x00800000;
99
100/*
101 * For internal diagnostics
102 */
103__os_syscall_begin = OS_SYSCALL_BEGIN;
104__os_syscall_end = OS_SYSCALL_END;
105
106SECTIONS {
107
108    .fixed_text : {
109        _begin = .;
110        *(.skip_syscall)
111        *(.old_syscall_entry.text)
112        __fixed_text_end = .;
113    } > TEXT
114    . = _begin + SIZEOF(.fixed_text) ;
115
116    /*
117     * System call text in lower ocm (fixed location, can never change)
118     */
119    __syscall_text_load_begin = .;
120    __syscall_text_run_begin = OS_SYSCALL_BEGIN;
121
122    .syscall_text __syscall_text_run_begin : AT(__syscall_text_load_begin) {
123        *(.syscall_entry.text) /* Must be at OS_SYSCALL_BEGIN 0x3ffc0040 */
124        *(.kernel_unprotected)
125        . = ALIGN(4);
126        __syscall_text_run_end = .;
127    } > syscall /* .syscall_text */
128    . = __syscall_text_load_begin + __syscall_text_run_end - __syscall_text_run_begin ;
129    __ocm_text_load_begin = .;
130    __ocm_text_run_begin = OCM_FREE_START ;
131    .ocm_text __ocm_text_run_begin : AT(__ocm_text_load_begin) {
132#if OCM_TEXT_LENGTH
133        *(.ocm_text)
134        *(.sched.text)
135        *(.spinlock.text)
136#include <asm/ocm_text.lds.inc>
137        . = ALIGN(4);
138#endif
139        __ocm_text_run_end = .;
140        __data_begin = ALIGN(OCM_SECTOR_SIZE);
141    } > ocm /* .ocm_text */
142
143    .ocm_module_text __ocm_text_run_end (NOLOAD) : AT(__ocm_text_run_end) {
144        __ocm_inst_heap_begin = .;
145        /* Reserve the min requested */
146        . += (CONFIG_OCM_MODULES_RESERVATION) * 1024;
147#ifdef CONFIG_OCM_MODULES_MAY_CONSUME_REMAINING_CODESPACE
148        /* Round up to OCM sector size (we cannot use it for data) */
149        . = ALIGN(OCM_SECTOR_SIZE);
150#endif
151        __ocm_inst_heap_end = .;
152        /* update __data_begin */
153        __data_begin = ALIGN(OCM_SECTOR_SIZE);
154    } > ocm /* .ocm_module_text */
155
156    . = __ocm_text_load_begin + __ocm_text_run_end - __ocm_text_run_begin ;
157    __ocm_text_load_end = .;
158
159    __ocm_data_load_begin = .;
160    __ocm_data_run_begin = __data_begin ;
161#if OCM_DATA_LENGTH
162    .ocm_data __ocm_data_run_begin : AT(__ocm_data_load_begin) {
163#if defined(CONFIG_IRQSTACKS_USEOCM)
164        percpu_irq_stacks = .;
165        . += NR_CPUS * THREAD_SIZE;
166#endif
167        *(.ocm_data)
168        . = ALIGN(4) ;
169        __ocm_data_run_end = .;
170    } > ocm
171    . = __ocm_data_load_begin + __ocm_data_run_end - __ocm_data_run_begin ;
172#else
173    __ocm_data_run_end = __ocm_data_run_begin;
174#endif
175    __ocm_data_load_end = .;
176
177    __ocm_free_begin = __ocm_data_run_end;
178    __ocm_free_end = OCM_FREE_START + OCM_FREE_LENGTH;
179
180    .text __ocm_data_load_end : AT(__ocm_data_load_end) {
181        . = ALIGN(4);
182        _stext = .;
183        _text = .;
184        TEXT_TEXT
185        SCHED_TEXT
186        LOCK_TEXT
187        *(.text.lock)
188        *(.text.__libgcc_udivmodsi)
189        *(.text.__libgcc_divmodsi)
190        *(.text.__libgcc_muldi3)
191        *(.text.__libgcc_udivmoddi)
192        *(.text.__libgcc_divmoddi)
193        *(.text.*)
194#if OCM_TEXT_LENGTH == 0
195        *(.ocm_text)
196        *(.sched.text)
197        *(.spinlock.text)
198#endif
199        . = ALIGN(16); /* Exception table */
200        __start___ex_table = .;
201        *(__ex_table)
202        __stop___ex_table = .;
203
204        *(.rodata) *(.rodata.*)
205        *(__vermagic) /* Kernel version magic */
206        *(__markers_strings)
207        *(.rodata1)
208        *(.rodata.str1.1)
209        *(__tracepoints_strings)
210
211         /* PCI quirks */
212        __start_pci_fixups_early = . ;
213            *(.pci_fixup_early)
214        __end_pci_fixups_early = . ;
215        __start_pci_fixups_header = . ;
216            *(.pci_fixup_header)
217        __end_pci_fixups_header = . ;
218        __start_pci_fixups_final = . ;
219            *(.pci_fixup_final)
220        __end_pci_fixups_final = . ;
221        __start_pci_fixups_enable = . ;
222            *(.pci_fixup_enable)
223        __end_pci_fixups_enable = . ;
224        __start_pci_fixups_resume = . ;
225               *(.pci_fixup_resume)
226        __end_pci_fixups_resume = . ;
227        __start_pci_fixups_resume_early = . ;
228               *(.pci_fixup_resume_early)
229        __end_pci_fixups_resume_early = . ;
230        __start_pci_fixups_suspend = . ;
231               *(.pci_fixup_suspend)
232        __end_pci_fixups_suspend = . ;
233
234        __start_builtin_fw = . ;
235            *(.builtin_fw)
236        __end_builtin_fw = . ;
237
238
239        /* Kernel symbol table: Normal symbols */
240        . = ALIGN(4);
241        __start___ksymtab = .;
242        *(__ksymtab)
243        __stop___ksymtab = .;
244
245        /* Kernel symbol table: GPL-only symbols */
246        __start___ksymtab_gpl = .;
247        *(__ksymtab_gpl)
248        __stop___ksymtab_gpl = .;
249
250        /* Kernel symbol table: Normal unused symbols */
251        __start___ksymtab_unused = .;
252        *(__ksymtab_unused)
253        __stop___ksymtab_unused = .;
254
255        /* Kernel symbol table: GPL-only unused symbols */
256        __start___ksymtab_unused_gpl = .;
257        *(__ksymtab_unused_gpl)
258        __stop___ksymtab_unused_gpl = .;
259
260        /* Kernel symbol table: GPL-future symbols */
261        __start___ksymtab_gpl_future = .;
262        *(__ksymtab_gpl_future)
263        __stop___ksymtab_gpl_future = .;
264
265        /* Kernel symbol table: Normal symbols */
266        __start___kcrctab = .;
267        *(__kcrctab)
268        __stop___kcrctab = .;
269
270        /* Kernel symbol table: GPL-only symbols */
271        __start___kcrctab_gpl = .;
272        *(__kcrctab_gpl)
273        __stop___kcrctab_gpl = .;
274
275        /* Kernel symbol table: GPL-future symbols */
276        __start___kcrctab_gpl_future = .;
277        *(__kcrctab_gpl_future)
278        __stop___kcrctab_gpl_future = .;
279
280        /* Kernel symbol table: strings */
281        *(__ksymtab_strings)
282
283        /* Built-in module parameters */
284        . = ALIGN(4) ;
285        __start___param = .;
286        *(__param)
287        __stop___param = .;
288
289        . = ALIGN(4) ;
290        _etext = . ;
291    } > TEXT
292
293    .data DATA_ADDR : {
294        . = ALIGN(4);
295        _sdata = . ;
296        DATA_DATA
297#if OCM_DATA_LENGTH == 0
298        *(.ocm_data)
299#endif
300        . = ALIGN(8192) ;
301        _data_protection_end = .;
302        *(.data.init_task)
303        . = ALIGN(4);
304        _edata = . ;
305    } > DATA
306
307    .init : {
308        . = ALIGN(4096);
309        __init_begin = .;
310        _sinittext = .;
311        INIT_TEXT
312        _einittext = .;
313        *(.init.rodata)
314        INIT_DATA
315        . = ALIGN(16);
316        __setup_start = .;
317        *(.init.setup)
318        __setup_end = .;
319        __initcall_start = .;
320        INITCALLS
321        __initcall_end = .;
322        __con_initcall_start = .;
323        *(.con_initcall.init)
324        __con_initcall_end = .;
325        ___security_initcall_start = .;
326        *(.security_initcall.init)
327        ___security_initcall_end = .;
328#ifdef CONFIG_BLK_DEV_INITRD
329        . = ALIGN(4);
330        __initramfs_start = .;
331        *(.init.ramfs)
332        __initramfs_end = .;
333#endif
334        . = ALIGN(4096);
335        __per_cpu_start = .;
336            *(.data.percpu)
337            *(.data.percpu.shared_aligned)
338        __per_cpu_end = .;
339
340        . = ALIGN(4096);
341        __init_end = .;
342    } > INIT
343
344      .eh_frame :
345      {
346        PROVIDE (___eh_frame_begin = .);
347        *(.eh_frame)
348        LONG (0);
349        PROVIDE (___eh_frame_end = .);
350      } > INIT
351
352    /DISCARD/ : {
353        EXIT_TEXT
354        EXIT_DATA
355        *(.exitcall.exit)
356    }
357
358    .bss : {
359        . = ALIGN(4);
360        _sbss = . ;
361        *(.bss)
362        *(COMMON)
363        . = ALIGN(4) ;
364        _ebss = . ;
365        _end = . ;
366    } > BSS
367
368    NOTES > BSS
369
370}
371

Archive Download this file



interactive