diff options
Diffstat (limited to 'src/arch/ppc/init')
-rw-r--r-- | src/arch/ppc/init/ldscript.lb | 460 | ||||
-rw-r--r-- | src/arch/ppc/init/ppc_main.c | 6 |
2 files changed, 375 insertions, 91 deletions
diff --git a/src/arch/ppc/init/ldscript.lb b/src/arch/ppc/init/ldscript.lb index 63a32b735d..0afc563b50 100644 --- a/src/arch/ppc/init/ldscript.lb +++ b/src/arch/ppc/init/ldscript.lb @@ -1,94 +1,372 @@ -/* - * 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) +/*----------------------------------------------------------------------------+ +| 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. ++----------------------------------------------------------------------------*/ SECTIONS { - /* - * 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) - } + + /*-------------------------------------------------------------------------+ + | 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) + } + } diff --git a/src/arch/ppc/init/ppc_main.c b/src/arch/ppc/init/ppc_main.c index 4dd4487ae8..80674d295e 100644 --- a/src/arch/ppc/init/ppc_main.c +++ b/src/arch/ppc/init/ppc_main.c @@ -6,11 +6,13 @@ #include <board.h> #include <sdram.h> +#ifndef __PPC64__ extern unsigned _iseg[]; extern unsigned _liseg[]; extern unsigned _eliseg[]; void (*payload)(void) = (void (*)(void))_iseg; +#endif /* * At this point we're running out of flash with our @@ -21,7 +23,9 @@ void (*payload)(void) = (void (*)(void))_iseg; * - start hardwaremain() which does remainder of setup */ +#ifndef __PPC64__ extern void flush_dcache(void); +#endif void ppc_main(void) { @@ -43,6 +47,7 @@ void ppc_main(void) */ board_init2(); +#ifndef __PPC64__ /* * Flush cache now that memory is enabled. */ @@ -59,6 +64,7 @@ void ppc_main(void) } payload(); +#endif /* NOT REACHED */ } |