Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / arm / kernel / vmlinux.lds.S
index 1131500..2b254e8 100644 (file)
@@ -4,39 +4,46 @@
  */
 
 #include <asm-generic/vmlinux.lds.h>
+#include <linux/config.h>
+#include <asm/thread_info.h>
+#include <asm/memory.h>
        
 OUTPUT_ARCH(arm)
 ENTRY(stext)
+
 #ifndef __ARMEB__
 jiffies = jiffies_64;
 #else
 jiffies = jiffies_64 + 4;
 #endif
+
 SECTIONS
 {
-       . = TEXTADDR;
+#ifdef CONFIG_XIP_KERNEL
+       . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
+#else
+       . = PAGE_OFFSET + TEXT_OFFSET;
+#endif
        .init : {                       /* Init code and data           */
                _stext = .;
-               __init_begin = .;
                        _sinittext = .;
                        *(.init.text)
                        _einittext = .;
                __proc_info_begin = .;
-                       *(.proc.info)
+                       *(.proc.info.init)
                __proc_info_end = .;
                __arch_info_begin = .;
-                       *(.arch.info)
+                       *(.arch.info.init)
                __arch_info_end = .;
                __tagtable_begin = .;
-                       *(.taglist)
+                       *(.taglist.init)
                __tagtable_end = .;
-                       *(.init.data)
                . = ALIGN(16);
                __setup_start = .;
                        *(.init.setup)
                __setup_end = .;
                __early_begin = .;
-                       *(__early_param)
+                       *(.early_param.init)
                __early_end = .;
                __initcall_start = .;
                        *(.initcall1.init)
@@ -57,8 +64,16 @@ SECTIONS
                __initramfs_start = .;
                        usr/built-in.o(.init.ramfs)
                __initramfs_end = .;
+               . = ALIGN(64);
+               __per_cpu_start = .;
+                       *(.data.percpu)
+               __per_cpu_end = .;
+#ifndef CONFIG_XIP_KERNEL
+               __init_begin = _stext;
+               *(.init.data)
                . = ALIGN(4096);
                __init_end = .;
+#endif
        }
 
        /DISCARD/ : {                   /* Exit code and data           */
@@ -79,28 +94,37 @@ SECTIONS
                        *(.glue_7)
                        *(.glue_7t)
                *(.got)                 /* Global offset table          */
-
-               _etext = .;             /* End of text section          */
-       }
-
-       . = ALIGN(16);
-       __ex_table : {                  /* Exception table              */
-               __start___ex_table = .;
-                       *(__ex_table)
-               __stop___ex_table = .;
        }
 
        RODATA
 
-       . = ALIGN(8192);
+       _etext = .;                     /* End of text and rodata section */
+
+#ifdef CONFIG_XIP_KERNEL
+       __data_loc = ALIGN(4);          /* location in binary */
+       . = PAGE_OFFSET + TEXT_OFFSET;
+#else
+       . = ALIGN(THREAD_SIZE);
+       __data_loc = .;
+#endif
+
+       .data : AT(__data_loc) {
+               __data_start = .;       /* address in memory */
 
-       .data : {
                /*
                 * first, the init task union, aligned
                 * to an 8192 byte boundary.
                 */
                *(.init.task)
 
+#ifdef CONFIG_XIP_KERNEL
+               . = ALIGN(4096);
+               __init_begin = .;
+               *(.init.data)
+               . = ALIGN(4096);
+               __init_end = .;
+#endif
+
                . = ALIGN(4096);
                __nosave_begin = .;
                *(.data.nosave)
@@ -113,6 +137,14 @@ SECTIONS
                . = ALIGN(32);
                *(.data.cacheline_aligned)
 
+               /*
+                * The exception fixup table (might need resorting at runtime)
+                */
+               . = ALIGN(32);
+               __start___ex_table = .;
+               *(__ex_table)
+               __stop___ex_table = .;
+
                /*
                 * and the usual data section
                 */
@@ -126,7 +158,7 @@ SECTIONS
                __bss_start = .;        /* BSS                          */
                *(.bss)
                *(COMMON)
-               _end = . ;
+               _end = .;
        }
                                        /* Stabs debugging sections.    */
        .stab 0 : { *(.stab) }
@@ -137,3 +169,11 @@ SECTIONS
        .stab.indexstr 0 : { *(.stab.indexstr) }
        .comment 0 : { *(.comment) }
 }
+
+/*
+ * These must never be empty
+ * If you have to comment these two assert statements out, your
+ * binutils is too old (for other reasons as well)
+ */
+ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
+ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")