linux/arch/xtensa/kernel/vmlinux.lds.S
<<
>>
Prefs
   1/*
   2 * arch/xtensa/kernel/vmlinux.lds.S
   3 *
   4 * Xtensa linker script
   5 *
   6 * This file is subject to the terms and conditions of the GNU General Public
   7 * License.  See the file "COPYING" in the main directory of this archive
   8 * for more details.
   9 *
  10 * Copyright (C) 2001 - 2005 Tensilica Inc.
  11 *
  12 * Chris Zankel <chris@zankel.net>
  13 * Marc Gauthier <marc@tensilica.com, marc@alumni.uwaterloo.ca>
  14 * Joe Taylor <joe@tensilica.com, joetylr@yahoo.com>
  15 */
  16
  17#include <asm-generic/vmlinux.lds.h>
  18
  19#include <asm/variant/core.h>
  20OUTPUT_ARCH(xtensa)
  21ENTRY(_start)
  22
  23#ifdef __XTENSA_EB__
  24jiffies = jiffies_64 + 4;
  25#else
  26jiffies = jiffies_64;
  27#endif
  28
  29#define KERNELOFFSET 0xd0001000
  30
  31/* Note: In the following macros, it would be nice to specify only the
  32   vector name and section kind and construct "sym" and "section" using
  33   CPP concatenation, but that does not work reliably.  Concatenating a
  34   string with "." produces an invalid token.  CPP will not print a
  35   warning because it thinks this is an assembly file, but it leaves
  36   them as multiple tokens and there may or may not be whitespace
  37   between them.  */
  38
  39/* Macro for a relocation entry */
  40
  41#define RELOCATE_ENTRY(sym, section)            \
  42        LONG(sym ## _start);                    \
  43        LONG(sym ## _end);                      \
  44        LONG(LOADADDR(section))
  45
  46/* Macro to define a section for a vector.
  47 *
  48 * Use of the MIN function catches the types of errors illustrated in
  49 * the following example:
  50 *
  51 * Assume the section .DoubleExceptionVector.literal is completely
  52 * full.  Then a programmer adds code to .DoubleExceptionVector.text
  53 * that produces another literal.  The final literal position will
  54 * overlay onto the first word of the adjacent code section
  55 * .DoubleExceptionVector.text.  (In practice, the literals will
  56 * overwrite the code, and the first few instructions will be
  57 * garbage.)
  58 */
  59
  60#define SECTION_VECTOR(sym, section, addr, max_prevsec_size, prevsec)       \
  61  section addr : AT((MIN(LOADADDR(prevsec) + max_prevsec_size,              \
  62                         LOADADDR(prevsec) + SIZEOF(prevsec)) + 3) & ~ 3)   \
  63  {                                                                         \
  64    . = ALIGN(4);                                                           \
  65    sym ## _start = ABSOLUTE(.);                                            \
  66    *(section)                                                              \
  67    sym ## _end = ABSOLUTE(.);                                              \
  68  }
  69
  70/*
  71 *  Mapping of input sections to output sections when linking.
  72 */
  73
  74SECTIONS
  75{
  76  . = KERNELOFFSET;
  77  /* .text section */
  78
  79  _text = .;
  80  _stext = .;
  81  _ftext = .;
  82
  83  .text :
  84  {
  85    /* The .head.text section must be the first section! */
  86    *(.head.text)
  87    *(.literal .text)
  88    VMLINUX_SYMBOL(__sched_text_start) = .;
  89    *(.sched.literal .sched.text)
  90    VMLINUX_SYMBOL(__sched_text_end) = .;
  91    VMLINUX_SYMBOL(__lock_text_start) = .;
  92    *(.spinlock.literal .spinlock.text)
  93    VMLINUX_SYMBOL(__lock_text_end) = .;
  94
  95  }
  96  _etext = .;
  97  PROVIDE (etext = .);
  98
  99  . = ALIGN(16);
 100
 101  RODATA
 102
 103  /*  Relocation table */
 104
 105  .fixup   : { *(.fixup) }
 106
 107  . = ALIGN(16);
 108
 109  __ex_table : {
 110    __start___ex_table = .;
 111    *(__ex_table)
 112    __stop___ex_table = .;
 113  }
 114
 115  /* Data section */
 116
 117  . = ALIGN(XCHAL_ICACHE_LINESIZE);
 118  _fdata = .;
 119  .data :
 120  {
 121    DATA_DATA
 122    CONSTRUCTORS
 123    . = ALIGN(XCHAL_ICACHE_LINESIZE);
 124    *(.data.cacheline_aligned)
 125  }
 126
 127  _edata = .;
 128
 129  /* The initial task */
 130  . = ALIGN(8192);
 131  .data.init_task : { *(.data.init_task) }
 132
 133  /* Initialization code and data: */
 134
 135  . = ALIGN(1 << 12);
 136  __init_begin = .;
 137  .init.text : {
 138        _sinittext = .;
 139        *(.init.literal) *(.cpuinit.literal) 
 140        *(.devinit.literal) *(.meminit.literal)
 141        INIT_TEXT
 142        _einittext = .;
 143  }
 144
 145  .init.data :
 146  {
 147    INIT_DATA
 148    . = ALIGN(0x4);
 149    __tagtable_begin = .;
 150    *(.taglist)
 151    __tagtable_end = .;
 152
 153    . = ALIGN(16);
 154    __boot_reloc_table_start = ABSOLUTE(.);
 155
 156    RELOCATE_ENTRY(_WindowVectors_text,
 157                   .WindowVectors.text);
 158    RELOCATE_ENTRY(_KernelExceptionVector_text,
 159                   .KernelExceptionVector.text);
 160    RELOCATE_ENTRY(_UserExceptionVector_text,
 161                   .UserExceptionVector.text);
 162    RELOCATE_ENTRY(_DoubleExceptionVector_literal,
 163                   .DoubleExceptionVector.literal);
 164    RELOCATE_ENTRY(_DoubleExceptionVector_text,
 165                   .DoubleExceptionVector.text);
 166    RELOCATE_ENTRY(_DebugInterruptVector_text,
 167                   .DebugInterruptVector.text);
 168  
 169    __boot_reloc_table_end = ABSOLUTE(.) ;
 170  }
 171
 172  . = ALIGN(XCHAL_ICACHE_LINESIZE);
 173
 174  __setup_start = .;
 175  .init.setup : { *(.init.setup) }
 176  __setup_end = .;
 177
 178  __initcall_start = .;
 179  .initcall.init : {
 180        INITCALLS
 181  }
 182  __initcall_end = .;
 183
 184  __con_initcall_start = .;
 185  .con_initcall.init : { *(.con_initcall.init) }
 186  __con_initcall_end = .;
 187
 188  SECURITY_INIT
 189
 190
 191#ifdef CONFIG_BLK_DEV_INITRD
 192  . = ALIGN(4096);
 193  __initramfs_start =.;
 194  .init.ramfs : { *(.init.ramfs) }
 195  __initramfs_end = .;
 196#endif
 197
 198  PERCPU(4096)
 199
 200
 201  /* We need this dummy segment here */
 202
 203  . = ALIGN(4);
 204  .dummy : { LONG(0) }
 205
 206  /* The vectors are relocated to the real position at startup time */
 207
 208  SECTION_VECTOR (_WindowVectors_text,
 209                  .WindowVectors.text,
 210                  XCHAL_WINDOW_VECTORS_VADDR, 4,
 211                  .dummy)
 212  SECTION_VECTOR (_DebugInterruptVector_literal,
 213                  .DebugInterruptVector.literal,
 214                  XCHAL_DEBUG_VECTOR_VADDR - 4,
 215                  SIZEOF(.WindowVectors.text),
 216                  .WindowVectors.text)
 217  SECTION_VECTOR (_DebugInterruptVector_text,
 218                  .DebugInterruptVector.text,
 219                  XCHAL_DEBUG_VECTOR_VADDR,
 220                  4,
 221                  .DebugInterruptVector.literal)
 222  SECTION_VECTOR (_KernelExceptionVector_literal,
 223                  .KernelExceptionVector.literal,
 224                  XCHAL_KERNEL_VECTOR_VADDR - 4,
 225                  SIZEOF(.DebugInterruptVector.text),
 226                  .DebugInterruptVector.text)
 227  SECTION_VECTOR (_KernelExceptionVector_text,
 228                  .KernelExceptionVector.text,
 229                  XCHAL_KERNEL_VECTOR_VADDR,
 230                  4,
 231                  .KernelExceptionVector.literal)
 232  SECTION_VECTOR (_UserExceptionVector_literal,
 233                  .UserExceptionVector.literal,
 234                  XCHAL_USER_VECTOR_VADDR - 4,
 235                  SIZEOF(.KernelExceptionVector.text),
 236                  .KernelExceptionVector.text)
 237  SECTION_VECTOR (_UserExceptionVector_text,
 238                  .UserExceptionVector.text,
 239                  XCHAL_USER_VECTOR_VADDR,
 240                  4,
 241                  .UserExceptionVector.literal)
 242  SECTION_VECTOR (_DoubleExceptionVector_literal,
 243                  .DoubleExceptionVector.literal,
 244                  XCHAL_DOUBLEEXC_VECTOR_VADDR - 16,
 245                  SIZEOF(.UserExceptionVector.text),
 246                  .UserExceptionVector.text)
 247  SECTION_VECTOR (_DoubleExceptionVector_text,
 248                  .DoubleExceptionVector.text,
 249                  XCHAL_DOUBLEEXC_VECTOR_VADDR,
 250                  32,
 251                  .DoubleExceptionVector.literal)
 252
 253  . = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3;
 254  . = ALIGN(1 << 12);
 255
 256  __init_end = .;
 257
 258  . = ALIGN(8192);
 259
 260  /* BSS section */
 261  _bss_start = .;
 262  .bss : { *(.bss.page_aligned) *(.bss) }
 263  _bss_end = .;
 264
 265  _end = .;
 266
 267  /* only used by the boot loader  */
 268
 269  . = ALIGN(0x10);
 270  .bootstrap : { *(.bootstrap.literal .bootstrap.text .bootstrap.data) }
 271
 272  . = ALIGN(0x1000);
 273  __initrd_start = .;
 274  .initrd : { *(.initrd) }
 275  __initrd_end = .;
 276
 277  .ResetVector.text XCHAL_RESET_VECTOR_VADDR :
 278  {
 279    *(.ResetVector.text)
 280  }
 281
 282  /* Sections to be discarded */
 283  /DISCARD/ :
 284  {
 285        *(.exit.literal)
 286        EXIT_TEXT
 287        EXIT_DATA
 288        *(.exitcall.exit)
 289  }
 290
 291  .xt.lit : { *(.xt.lit) }
 292  .xt.prop : { *(.xt.prop) }
 293
 294  .debug  0 :  { *(.debug) }
 295  .line  0 :  { *(.line) }
 296  .debug_srcinfo  0 :  { *(.debug_srcinfo) }
 297  .debug_sfnames  0 :  { *(.debug_sfnames) }
 298  .debug_aranges  0 :  { *(.debug_aranges) }
 299  .debug_pubnames  0 :  { *(.debug_pubnames) }
 300  .debug_info  0 :  { *(.debug_info) }
 301  .debug_abbrev  0 :  { *(.debug_abbrev) }
 302  .debug_line  0 :  { *(.debug_line) }
 303  .debug_frame  0 :  { *(.debug_frame) }
 304  .debug_str  0 :  { *(.debug_str) }
 305  .debug_loc  0 :  { *(.debug_loc) }
 306  .debug_macinfo  0 :  { *(.debug_macinfo) }
 307  .debug_weaknames  0 :  { *(.debug_weaknames) }
 308  .debug_funcnames  0 :  { *(.debug_funcnames) }
 309  .debug_typenames  0 :  { *(.debug_typenames) }
 310  .debug_varnames  0 :  { *(.debug_varnames) }
 311
 312  .xt.insn 0 :
 313  {
 314    *(.xt.insn)
 315    *(.gnu.linkonce.x*)
 316  }
 317
 318  .xt.lit 0 :
 319  {
 320    *(.xt.lit)
 321    *(.gnu.linkonce.p*)
 322  }
 323}
 324
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.