diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/Makefile.inc | 3 | ||||
-rw-r--r-- | src/lib/program.ld (renamed from src/lib/ramstage.ld) | 104 |
2 files changed, 61 insertions, 46 deletions
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 85976672a8..cd2b70a81f 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -197,7 +197,8 @@ ifneq ($(CONFIG_ARCH_X86),y) bootblock-y += bootblock.ld romstage-y += romstage.ld endif -ramstage-y += ramstage.ld + +ramstage-y += program.ld ifeq ($(CONFIG_RELOCATABLE_MODULES),y) ramstage-y += rmodule.c diff --git a/src/lib/ramstage.ld b/src/lib/program.ld index b224827590..1346eafbf8 100644 --- a/src/lib/ramstage.ld +++ b/src/lib/program.ld @@ -1,7 +1,7 @@ /* * This file is part of the coreboot project. * - * Copyright 2014 Google Inc. + * Copyright 2015 Google Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,6 +17,8 @@ * Foundation, Inc. */ +#include <memlayout.h> + /* This file is included inside a SECTIONS block */ /* First we place the code and read only data (typically const declared). @@ -24,19 +26,40 @@ */ .text : { _program = .; - _ramstage = .; _text = .; *(.text._start); *(.text.stage_entry); *(.text); *(.text.*); - . = ALIGN(16); + +#if ENV_RAMSTAGE || ENV_ROMSTAGE + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); + _cbmem_init_hooks = .; + KEEP(*(.rodata.cbmem_init_hooks)); + _ecbmem_init_hooks = .; +#endif + +#if ENV_RAMSTAGE + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); + _pci_drivers = .; + KEEP(*(.rodata.pci_driver)); + _epci_drivers = .; + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); + _cpu_drivers = .; + KEEP(*(.rodata.cpu_driver)); + _ecpu_drivers = .; +#endif + + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); + *(.rodata); + *(.rodata.*); + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _etext = .; } : to_load -#if IS_ENABLED(CONFIG_COVERAGE) +#if ENV_RAMSTAGE && IS_ENABLED(CONFIG_COVERAGE) .ctors : { - . = ALIGN(0x100); + . = ALIGN(0x100) __CTOR_LIST__ = .; KEEP(*(.ctors)); LONG(0); @@ -45,71 +68,62 @@ } #endif -/* TODO: align data sections to cache lines? (is that really useful?) */ -.rodata : { - _rodata = .; - . = ALIGN(8); +/* Include data, bss, and heap in that order. Not defined for all stages. */ +#if ARCH_STAGE_HAS_DATA_SECTION +.data : { + . = ALIGN(ARCH_CACHELINE_ALIGN_SIZE); + _data = .; + *(.data); + *(.data.*); - /* If any changes are made to the driver start/symbols or the - * section names the equivalent changes need to made to - * rmodule.ld. */ - _pci_drivers = . ; - KEEP(*(.rodata.pci_driver)); - _epci_drivers = . ; - _cpu_drivers = . ; - KEEP(*(.rodata.cpu_driver)); - _ecpu_drivers = . ; +#ifdef __PRE_RAM__ + PROVIDE(_preram_cbmem_console = .); + PROVIDE(_epreram_cbmem_console = _preram_cbmem_console); +#elif ENV_RAMSTAGE + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _bs_init_begin = .; KEEP(*(.bs_init)); LONG(0); LONG(0); - _bs_init_end = .; - _cbmem_init_hooks = .; - KEEP(*(.rodata.cbmem_init_hooks)); - _ecbmem_init_hooks = .; - - *(.rodata) - *(.rodata.*) - /* kevinh/Ispiri - Added an align, because the objcopy tool - * incorrectly converts sections that are not long word aligned. - */ - . = ALIGN(8); - - _erodata = .; -} + _ebs_init_begin = .; +#endif -.data : { - /* Move to different cache line to avoid false sharing with .rodata. */ - . = ALIGN(64); /* May not be actual line size, not that important. */ - _data = .; - *(.data) - *(.data.*) + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _edata = .; } +#endif -.bss . : { +#if ARCH_STAGE_HAS_BSS_SECTION +.bss : { + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _bss = .; *(.bss) *(.bss.*) *(.sbss) *(.sbss.*) + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _ebss = .; } +#endif -.heap . : { +#if ARCH_STAGE_HAS_HEAP_SECTION +.heap : { + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _heap = .; - /* Reserve CONFIG_HEAP_SIZE bytes for the heap */ - . += CONFIG_HEAP_SIZE ; - . = ALIGN(4); + . += CONFIG_HEAP_SIZE; + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _eheap = .; - _eramstage = .; - _eprogram = .; } +#endif + +_eprogram = .; /* Discard the sections we don't need/want */ /DISCARD/ : { *(.comment) + *(.comment.*) *(.note) *(.note.*) + *(.eh_frame); } |