aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ubicom32/files/arch/ubicom32/kernel/vmlinux.lds.S
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ubicom32/files/arch/ubicom32/kernel/vmlinux.lds.S')
-rw-r--r--target/linux/ubicom32/files/arch/ubicom32/kernel/vmlinux.lds.S370
1 files changed, 370 insertions, 0 deletions
diff --git a/target/linux/ubicom32/files/arch/ubicom32/kernel/vmlinux.lds.S b/target/linux/ubicom32/files/arch/ubicom32/kernel/vmlinux.lds.S
new file mode 100644
index 000000000..cd646772c
--- /dev/null
+++ b/target/linux/ubicom32/files/arch/ubicom32/kernel/vmlinux.lds.S
@@ -0,0 +1,370 @@
+/*
+ * arch/ubicom32/kernel/vmlinux.lds.S
+ * vmlinux primary linker script
+ *
+ * (C) Copyright 2009, Ubicom, Inc.
+ *
+ * This file is part of the Ubicom32 Linux Kernel Port.
+ *
+ * The Ubicom32 Linux Kernel Port is free software: you can redistribute
+ * it and/or modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * The Ubicom32 Linux Kernel Port is distributed in the hope that it
+ * will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ * the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Ubicom32 Linux Kernel Port. If not,
+ * see <http://www.gnu.org/licenses/>.
+ *
+ * Ubicom32 implementation derived from (with many thanks):
+ * arch/m68knommu
+ * arch/blackfin
+ * arch/parisc
+ */
+#include <asm-generic/vmlinux.lds.h>
+#include <asm/ocm_size.h>
+#include <asm/memory_map.h>
+#include <asm/thread_info.h>
+#include <linux/threads.h>
+
+/*
+ * Sanity checks to prevent errors later on that are much harder to understand
+ */
+#if !defined APP_OCM_CODE_SIZE
+#error APP_OCM_CODE_SIZE has not been defined in ocm_size.h
+#endif
+
+#if !defined APP_OCM_DATA_SIZE
+#error APP_OCM_DATA_SIZE has not been defined in ocm_size.h
+#endif
+
+/*
+ * The `free' ocm area that ultra does not use.
+ */
+#if APP_OCM_CODE_SIZE || APP_OCM_DATA_SIZE
+#define OCM_FREE_START (OCMSTART + APP_OCM_CODE_SIZE)
+#define OCM_FREE_LENGTH (OCMSIZE - APP_OCM_CODE_SIZE - APP_OCM_DATA_SIZE)
+#else
+#define OCM_FREE_START OCMEND
+#define OCM_FREE_LENGTH 0
+#endif
+
+/*
+ * If you want to limit OCM use for text/data or completely disable it
+ * you can change these values.
+ */
+#define OCM_TEXT_LENGTH OCM_FREE_LENGTH
+#define OCM_DATA_LENGTH OCM_FREE_LENGTH
+
+#define RAM_START KERNELSTART
+#define RAM_LENGTH ((SDRAMSTART + CONFIG_MIN_RAMSIZE) - RAM_START)
+#define TEXT ram
+#define DATA ram
+#define INIT ram
+#define BSS ram
+
+#ifndef DATA_ADDR
+#define DATA_ADDR
+#endif
+
+#include <asm-generic/vmlinux.lds.h>
+
+OUTPUT_ARCH(ubicom32)
+ENTRY(_start)
+
+MEMORY {
+ ram : ORIGIN = RAM_START, LENGTH = RAM_LENGTH
+ syscall : ORIGIN = OS_SYSCALL_BEGIN, LENGTH = (OS_SYSCALL_END - OS_SYSCALL_BEGIN)
+ ocm : ORIGIN = OCM_FREE_START, LENGTH = OCM_FREE_LENGTH
+}
+
+jiffies = jiffies_64 + 4;
+
+/*
+ * Fixed locations required by gdb coredumps.
+ *
+ * Note that the names are what gdb is expecting so renaming will break
+ * the toolchain.
+ */
+__ocm_begin = OCMSTART;
+__ocm_limit = __ocm_begin + OCMSIZE;
+__sdram_begin = SDRAMSTART;
+__sdram_limit = __sdram_begin + CONFIG_MIN_RAMSIZE;
+__filemedia_begin_addr = FLASHSTART;
+__filemedia_end_addr = __filemedia_begin_addr + 0x00800000;
+
+/*
+ * For internal diagnostics
+ */
+__os_syscall_begin = OS_SYSCALL_BEGIN;
+__os_syscall_end = OS_SYSCALL_END;
+
+SECTIONS {
+
+ .fixed_text : {
+ _begin = .;
+ *(.skip_syscall)
+ *(.old_syscall_entry.text)
+ __fixed_text_end = .;
+ } > TEXT
+ . = _begin + SIZEOF(.fixed_text) ;
+
+ /*
+ * System call text in lower ocm (fixed location, can never change)
+ */
+ __syscall_text_load_begin = .;
+ __syscall_text_run_begin = OS_SYSCALL_BEGIN;
+
+ .syscall_text __syscall_text_run_begin : AT(__syscall_text_load_begin) {
+ *(.syscall_entry.text) /* Must be at OS_SYSCALL_BEGIN 0x3ffc0040 */
+ *(.kernel_unprotected)
+ . = ALIGN(4);
+ __syscall_text_run_end = .;
+ } > syscall /* .syscall_text */
+ . = __syscall_text_load_begin + __syscall_text_run_end - __syscall_text_run_begin ;
+ __ocm_text_load_begin = .;
+ __ocm_text_run_begin = OCM_FREE_START ;
+ .ocm_text __ocm_text_run_begin : AT(__ocm_text_load_begin) {
+#if OCM_TEXT_LENGTH
+ *(.ocm_text)
+ *(.sched.text)
+ *(.spinlock.text)
+#include <asm/ocm_text.lds.inc>
+ . = ALIGN(4);
+#endif
+ __ocm_text_run_end = .;
+ __data_begin = ALIGN(OCM_SECTOR_SIZE);
+ } > ocm /* .ocm_text */
+
+ .ocm_module_text __ocm_text_run_end (NOLOAD) : AT(__ocm_text_run_end) {
+ __ocm_inst_heap_begin = .;
+ /* Reserve the min requested */
+ . += (CONFIG_OCM_MODULES_RESERVATION) * 1024;
+#ifdef CONFIG_OCM_MODULES_MAY_CONSUME_REMAINING_CODESPACE
+ /* Round up to OCM sector size (we cannot use it for data) */
+ . = ALIGN(OCM_SECTOR_SIZE);
+#endif
+ __ocm_inst_heap_end = .;
+ /* update __data_begin */
+ __data_begin = ALIGN(OCM_SECTOR_SIZE);
+ } > ocm /* .ocm_module_text */
+
+ . = __ocm_text_load_begin + __ocm_text_run_end - __ocm_text_run_begin ;
+ __ocm_text_load_end = .;
+
+ __ocm_data_load_begin = .;
+ __ocm_data_run_begin = __data_begin ;
+#if OCM_DATA_LENGTH
+ .ocm_data __ocm_data_run_begin : AT(__ocm_data_load_begin) {
+#if defined(CONFIG_IRQSTACKS_USEOCM)
+ percpu_irq_stacks = .;
+ . += NR_CPUS * THREAD_SIZE;
+#endif
+ *(.ocm_data)
+ . = ALIGN(4) ;
+ __ocm_data_run_end = .;
+ } > ocm
+ . = __ocm_data_load_begin + __ocm_data_run_end - __ocm_data_run_begin ;
+#else
+ __ocm_data_run_end = __ocm_data_run_begin;
+#endif
+ __ocm_data_load_end = .;
+
+ __ocm_free_begin = __ocm_data_run_end;
+ __ocm_free_end = OCM_FREE_START + OCM_FREE_LENGTH;
+
+ .text __ocm_data_load_end : AT(__ocm_data_load_end) {
+ . = ALIGN(4);
+ _stext = .;
+ _text = .;
+ TEXT_TEXT
+ SCHED_TEXT
+ LOCK_TEXT
+ *(.text.lock)
+ *(.text.__libgcc_udivmodsi)
+ *(.text.__libgcc_divmodsi)
+ *(.text.__libgcc_muldi3)
+ *(.text.__libgcc_udivmoddi)
+ *(.text.__libgcc_divmoddi)
+ *(.text.*)
+#if OCM_TEXT_LENGTH == 0
+ *(.ocm_text)
+ *(.sched.text)
+ *(.spinlock.text)
+#endif
+ . = ALIGN(16); /* Exception table */
+ __start___ex_table = .;
+ *(__ex_table)
+ __stop___ex_table = .;
+
+ *(.rodata) *(.rodata.*)
+ *(__vermagic) /* Kernel version magic */
+ *(__markers_strings)
+ *(.rodata1)
+ *(.rodata.str1.1)
+ *(__tracepoints_strings)
+
+ /* PCI quirks */
+ __start_pci_fixups_early = . ;
+ *(.pci_fixup_early)
+ __end_pci_fixups_early = . ;
+ __start_pci_fixups_header = . ;
+ *(.pci_fixup_header)
+ __end_pci_fixups_header = . ;
+ __start_pci_fixups_final = . ;
+ *(.pci_fixup_final)
+ __end_pci_fixups_final = . ;
+ __start_pci_fixups_enable = . ;
+ *(.pci_fixup_enable)
+ __end_pci_fixups_enable = . ;
+ __start_pci_fixups_resume = . ;
+ *(.pci_fixup_resume)
+ __end_pci_fixups_resume = . ;
+ __start_pci_fixups_resume_early = . ;
+ *(.pci_fixup_resume_early)
+ __end_pci_fixups_resume_early = . ;
+ __start_pci_fixups_suspend = . ;
+ *(.pci_fixup_suspend)
+ __end_pci_fixups_suspend = . ;
+
+ __start_builtin_fw = . ;
+ *(.builtin_fw)
+ __end_builtin_fw = . ;
+
+
+ /* Kernel symbol table: Normal symbols */
+ . = ALIGN(4);
+ __start___ksymtab = .;
+ *(__ksymtab)
+ __stop___ksymtab = .;
+
+ /* Kernel symbol table: GPL-only symbols */
+ __start___ksymtab_gpl = .;
+ *(__ksymtab_gpl)
+ __stop___ksymtab_gpl = .;
+
+ /* Kernel symbol table: Normal unused symbols */
+ __start___ksymtab_unused = .;
+ *(__ksymtab_unused)
+ __stop___ksymtab_unused = .;
+
+ /* Kernel symbol table: GPL-only unused symbols */
+ __start___ksymtab_unused_gpl = .;
+ *(__ksymtab_unused_gpl)
+ __stop___ksymtab_unused_gpl = .;
+
+ /* Kernel symbol table: GPL-future symbols */
+ __start___ksymtab_gpl_future = .;
+ *(__ksymtab_gpl_future)
+ __stop___ksymtab_gpl_future = .;
+
+ /* Kernel symbol table: Normal symbols */
+ __start___kcrctab = .;
+ *(__kcrctab)
+ __stop___kcrctab = .;
+
+ /* Kernel symbol table: GPL-only symbols */
+ __start___kcrctab_gpl = .;
+ *(__kcrctab_gpl)
+ __stop___kcrctab_gpl = .;
+
+ /* Kernel symbol table: GPL-future symbols */
+ __start___kcrctab_gpl_future = .;
+ *(__kcrctab_gpl_future)
+ __stop___kcrctab_gpl_future = .;
+
+ /* Kernel symbol table: strings */
+ *(__ksymtab_strings)
+
+ /* Built-in module parameters */
+ . = ALIGN(4) ;
+ __start___param = .;
+ *(__param)
+ __stop___param = .;
+
+ . = ALIGN(4) ;
+ _etext = . ;
+ } > TEXT
+
+ .data DATA_ADDR : {
+ . = ALIGN(4);
+ _sdata = . ;
+ DATA_DATA
+#if OCM_DATA_LENGTH == 0
+ *(.ocm_data)
+#endif
+ . = ALIGN(8192) ;
+ _data_protection_end = .;
+ *(.data.init_task)
+ . = ALIGN(4);
+ _edata = . ;
+ } > DATA
+
+ .init : {
+ . = ALIGN(4096);
+ __init_begin = .;
+ _sinittext = .;
+ INIT_TEXT
+ _einittext = .;
+ *(.init.rodata)
+ INIT_DATA
+ . = ALIGN(16);
+ __setup_start = .;
+ *(.init.setup)
+ __setup_end = .;
+ __initcall_start = .;
+ INITCALLS
+ __initcall_end = .;
+ __con_initcall_start = .;
+ *(.con_initcall.init)
+ __con_initcall_end = .;
+ ___security_initcall_start = .;
+ *(.security_initcall.init)
+ ___security_initcall_end = .;
+#ifdef CONFIG_BLK_DEV_INITRD
+ . = ALIGN(4);
+ __initramfs_start = .;
+ *(.init.ramfs)
+ __initramfs_end = .;
+#endif
+ . = ALIGN(4096);
+ __per_cpu_start = .;
+ *(.data.percpu)
+ *(.data.percpu.shared_aligned)
+ __per_cpu_end = .;
+
+ . = ALIGN(4096);
+ __init_end = .;
+ } > INIT
+
+ .eh_frame :
+ {
+ PROVIDE (___eh_frame_begin = .);
+ *(.eh_frame)
+ LONG (0);
+ PROVIDE (___eh_frame_end = .);
+ } > INIT
+
+ /DISCARD/ : {
+ EXIT_TEXT
+ EXIT_DATA
+ *(.exitcall.exit)
+ }
+
+ .bss : {
+ . = ALIGN(4);
+ _sbss = . ;
+ *(.bss)
+ *(COMMON)
+ . = ALIGN(4) ;
+ _ebss = . ;
+ _end = . ;
+ } > BSS
+
+ NOTES > BSS
+
+}