summaryrefslogtreecommitdiff
path: root/src/arch/ppc/init/ldscript.lb
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/ppc/init/ldscript.lb')
-rw-r--r--src/arch/ppc/init/ldscript.lb460
1 files changed, 91 insertions, 369 deletions
diff --git a/src/arch/ppc/init/ldscript.lb b/src/arch/ppc/init/ldscript.lb
index 0afc563b50..63a32b735d 100644
--- a/src/arch/ppc/init/ldscript.lb
+++ b/src/arch/ppc/init/ldscript.lb
@@ -1,372 +1,94 @@
-/*----------------------------------------------------------------------------+
-| Memory layout. RAM length is referenced again in __heap_size variable
-| definition.
-+----------------------------------------------------------------------------*/
-MEMORY
-{
- RAM_VECT (rwx) : ORIGIN = 0x00000000, LENGTH = 0x00010000
- RAM (rwx) : ORIGIN = 0x00010000, LENGTH = 0x003F0000
- ROM_INIT (r x) : ORIGIN = 0xFFF00000, LENGTH = 0x00002000
- ROM (r x) : ORIGIN = 0xFFF02000, LENGTH = 0x000FE000
-}
-
-/*----------------------------------------------------------------------------+
-| Sections originally taken from default GNU LD script.
-+----------------------------------------------------------------------------*/
+/*
+ * Memory map:
+ *
+ * _ROMBASE : start of ROM
+ * _RESET : reset vector (may be at top of ROM)
+ * _EXCEPTIONS_VECTORS : exception table
+ *
+ * _ROMSTART : linuxbios text
+ * : payload text
+ *
+ * _RAMBASE : address to copy payload
+ */
+
+/*
+ * Written by Johan Rydberg, based on work by Daniel Kahlin.
+ * Rewritten by Eric Biederman
+ * Re-rewritten by Greg Watson for PPC
+ */
+
+/*
+ * We use ELF as output format. So that we can
+ * debug the code in some form.
+ */
+
+OUTPUT_FORMAT("elf32-powerpc")
+ENTRY(_start)
+
+TARGET(binary)
+INPUT(linuxbios_ram.rom)
SECTIONS
{
-
- /*-------------------------------------------------------------------------+
- | Create dummy section. We need to do this so that the __stext symbol is
- | set correctly.
- +-------------------------------------------------------------------------*/
- .dummyt :
- {
- LONG(0x00000000)
- } > RAM
-
- /*-------------------------------------------------------------------------+
- | Create variable holding the value of the start of the text.
- +-------------------------------------------------------------------------*/
- __stext = . - SIZEOF(.dummyt);
-
- .hash :
- {
- *(.hash)
- } > RAM
-
- .dynsym :
- {
- *(.dynsym)
- } > RAM
-
- .dynstr :
- {
- *(.dynstr)
- } > RAM
-
- .rel.init :
- {
- *(.rel.init)
- } > RAM
-
- .rela.init :
- {
- *(.rela.init)
- } > RAM
-
- .rel.text :
- {
- *(.rel.text)
- *(.rel.text.*)
- *(.rel.gnu.linkonce.t.*)
- } > RAM
-
- .rela.text :
- {
- *(.rela.text)
- *(.rela.text.*)
- *(.rela.gnu.linkonce.t.*)
- } > RAM
-
- .rel.rodata :
- {
- *(.rel.rodata)
- *(.rel.rodata.*)
- *(.rel.gnu.linkonce.r.*)
- } > RAM
-
- .rela.rodata :
- {
- *(.rela.rodata)
- *(.rela.rodata.*)
- *(.rela.gnu.linkonce.r.*)
- } > RAM
-
- .rel.data :
- {
- *(.rel.data)
- *(.rel.data.*)
- *(.rel.gnu.linkonce.d.*)
- } > RAM
-
- .rela.data :
- {
- *(.rela.data)
- *(.rela.data.*)
- *(.rela.gnu.linkonce.d.*)
- } > RAM
-
- .rel.sdata :
- {
- *(.rel.sdata)
- *(.rel.sdata.*)
- *(.rel.gnu.linkonce.s.*)
- } > RAM
-
- .rela.sdata :
- {
- *(.rela.sdata)
- *(.rela.sdata.*)
- *(.rela.gnu.linkonce.s.*)
- } > RAM
-
- .rel.sbss :
- {
- *(.rel.sbss)
- *(.rel.sbss.*)
- *(.rel.gnu.linkonce.sb.*)
- } > RAM
-
- .rela.sbss :
- {
- *(.rela.sbss)
- *(.rela.sbss.*)
- *(.rel.gnu.linkonce.sb.*)
- } > RAM
-
- .rel.sdata2 :
- {
- *(.rel.sdata2)
- *(.rel.sdata2.*)
- *(.rel.gnu.linkonce.s2.*)
- } > RAM
-
- .rela.sdata2 :
- {
- *(.rela.sdata2)
- *(.rela.sdata2.*)
- *(.rela.gnu.linkonce.s2.*)
- } > RAM
-
- .rel.sbss2 :
- {
- *(.rel.sbss2)
- *(.rel.sbss2.*)
- *(.rel.gnu.linkonce.sb2.*)
- } > RAM
-
- .rela.sbss2 :
- {
- *(.rela.sbss2)
- *(.rela.sbss2.*)
- *(.rela.gnu.linkonce.sb2.*)
- } > RAM
-
- .rel.bss :
- {
- *(.rel.bss)
- *(.rel.bss.*)
- *(.rel.gnu.linkonce.b.*)
- } > RAM
-
- .rela.bss :
- {
- *(.rela.bss)
- *(.rela.bss.*)
- *(.rela.gnu.linkonce.b.*)
- } > RAM
-
- .rel.plt :
- {
- *(.rel.plt)
- } > RAM
-
- .rela.plt :
- {
- *(.rela.plt)
- } > RAM
-
- /*-------------------------------------------------------------------------+
- | Keep the .init sections even if they are not referenced. Fill in the
- | space (if any) in the .init serctions with 0.
- +-------------------------------------------------------------------------*/
- .text :
- {
- *(.text)
- *(.text.*)
- *(.stub)
- *(.gnu.warning)
- *(.gnu.linkonce.t.*)
- } > RAM = 0
-
- /*-------------------------------------------------------------------------+
- | Create variable holding the value of the end of the text.
- +-------------------------------------------------------------------------*/
- __etext = .;
-
- /*-------------------------------------------------------------------------+
- | Create variable holding the value of the start of the data.
- +-------------------------------------------------------------------------*/
- __sdata = .;
-
- .rodata :
- {
- *(.rodata)
- *(.rodata.*)
- *(.gnu.linkonce.r.*)
- } > RAM
-
- .rodata1 :
- {
- *(.rodata1)
- } > RAM
-
- .sdata2 :
- {
- *(.sdata2)
- *(.sdata2.*)
- *(.gnu.linkonce.s2.*)
- } > RAM
-
- .sbss2 :
- {
- *(.sbss2)
- *(.sbss2.*)
- *(.gnu.linkonce.sb2.*)
- } > RAM
-
- /*-------------------------------------------------------------------------+
- | Align data to word boundary.
- +-------------------------------------------------------------------------*/
- . = ALIGN(4);
-
- .data :
- {
- *(.data)
- *(.data.*)
- *(.gnu.linkonce.d.*)
- } > RAM
-
- .toc :
- {
- *(.toc)
- *(.toc.*)
- } > RAM
-
- .opd :
- {
- *(.opd)
- *(.opd.*)
- } > RAM
-
- .data1 :
- {
- *(.data1)
- } > RAM
-
- .eh_frame :
- {
- KEEP(*(.eh_frame))
- } > RAM
-
- .fixup :
- {
- *(.fixup)
- } > RAM
-
- .dynamic :
- {
- *(.dynamic)
- } > RAM
-
- /*-------------------------------------------------------------------------+
- | We want the small data sections together, so single-instruction offsets
- | can access them all, and initialized data all before uninitialized, so
- | we can shorten the on-disk segment size.
- +-------------------------------------------------------------------------*/
- .sdata :
- {
- *(.sdata)
- *(.sdata.*)
- *(.gnu.linkonce.s.*)
- } > RAM
-
- /*-------------------------------------------------------------------------+
- | Create variable holding the value of the end of the data.
- +-------------------------------------------------------------------------*/
- __edata = .;
-
- /*-------------------------------------------------------------------------+
- | Create variable holding the value of the start of the bss.
- +-------------------------------------------------------------------------*/
- __sbss = .;
-
- .sbss :
- {
- *(.dynsbss)
- *(.sbss)
- *(.sbss.*)
- *(.gnu.linkonce.sb.*)
- *(.scommon)
- } > RAM
-
- .plt :
- {
- *(.plt)
- } > RAM
-
- /*-------------------------------------------------------------------------+
- | Common symbols are placed in the BSS section.
- +-------------------------------------------------------------------------*/
- .bss :
- {
- *(.dynbss)
- *(.bss)
- *(.bss.*)
- *(.gnu.linkonce.b.*)
- *(COMMON)
- } > RAM
-
- /*-------------------------------------------------------------------------+
- | Align so that the bss size and __ebss are word aligned.
- +-------------------------------------------------------------------------*/
- . = ALIGN(4);
-
- /*-------------------------------------------------------------------------+
- | Create variable holding the value of the end of the bss.
- +-------------------------------------------------------------------------*/
- __ebss = .;
-
- /*-------------------------------------------------------------------------+
- | Create variables describing the heap. The value "0x3F0000" must be
- | equal to RAM length.
- +-------------------------------------------------------------------------*/
- __heap_start = .;
- __heap_size = 0x3F0000 + ADDR(.dummyt) - .;
-
- /*-------------------------------------------------------------------------+
- | Stabs. Symbols in the following sections are relative to the beginning
- | of the section so we begin them at 0.
- +-------------------------------------------------------------------------*/
- .stab 0 :
- {
- *(.stab)
- }
-
- .stabstr 0 :
- {
- *(.stabstr)
- }
-
- .stab.excl 0 :
- {
- *(.stab.excl)
- }
-
- .stab.exclstr 0 :
- {
- *(.stab.exclstr)
- }
-
- .stab.index 0 :
- {
- *(.stab.index)
- }
-
- .stab.indexstr 0 :
- {
- *(.stab.indexstr)
- }
-
+ /*
+ * Absolute location of base of ROM
+ */
+ . = _ROMBASE;
+
+ /*
+ * Absolute location of reset vector. This may actually be at the
+ * the top of ROM.
+ */
+ . = _RESET;
+ .reset . : {
+ *(.rom.reset);
+ . = ALIGN(16);
+ }
+
+ /*
+ * Absolute location of exception vector table.
+ */
+ . = _EXCEPTION_VECTORS;
+ .exception_vectors . : {
+ *(.rom.exception_vectors);
+ . = ALIGN(16);
+ }
+
+ /*
+ * Absolute location of LinuxBIOS initialization code in ROM.
+ */
+ . = _ROMSTART;
+ .rom . : {
+ _rom = .;
+ *(.rom.text);
+ *(.text);
+ *(.rom.data);
+ *(.rodata);
+ *(EXCLUDE_FILE(linuxbios_ram.rom) .data);
+ . = ALIGN(16);
+ _erom = .;
+ }
+ _lrom = LOADADDR(.rom);
+ _elrom = LOADADDR(.rom) + SIZEOF(.rom);
+
+ /*
+ * Ram is the LinuxBIOS code that runs from RAM.
+ */
+ .ram . : {
+ _ram = . ;
+ linuxbios_ram.rom(*)
+ _eram = . ;
+ }
+
+ /*
+ * Absolute location of where LinuxBIOS will be relocated in RAM.
+ */
+ _iseg = _RAMBASE;
+ _eiseg = _iseg + SIZEOF(.ram);
+ _liseg = _ram;
+ _eliseg = _eram;
+
+ /DISCARD/ : {
+ *(.comment)
+ *(.note)
+ }
}