summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Makefile.inc3
-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);
}