blob: 1526aadf0a3e83d9210bacf6d51dd1ab51a62e84 [file] [log] [blame]
Aaron Durbin4de29d42015-09-03 22:49:36 -05001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright 2015 Google Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Aaron Durbin4de29d42015-09-03 22:49:36 -050014 */
15
16#include <memlayout.h>
17
18/* This file is included inside a SECTIONS block */
19
20/* First we place the code and read only data (typically const declared).
21 * This could theoretically be placed in rom.
Julius Werner52a92602015-09-11 16:17:50 -070022 * The '.' in '.text . : {' is actually significant to prevent missing some
23 * SoC's entry points due to artificial alignment restrictions, see
24 * https://sourceware.org/binutils/docs/ld/Output-Section-Address.html
Aaron Durbin4de29d42015-09-03 22:49:36 -050025 */
Julius Werner52a92602015-09-11 16:17:50 -070026.text . : {
Aaron Durbin4de29d42015-09-03 22:49:36 -050027 _program = .;
28 _text = .;
Aaron Durbin14714e12015-09-04 12:06:05 -050029 /*
30 * The .rom.* sections are to acommodate x86 romstage. romcc as well
31 * as the assembly files put their text and data in these sections.
32 */
33 *(.rom.text);
34 *(.rom.data);
Aaron Durbin4de29d42015-09-03 22:49:36 -050035 *(.text._start);
36 *(.text.stage_entry);
Julius Werner52a92602015-09-11 16:17:50 -070037 KEEP(*(.id));
Aaron Durbin4de29d42015-09-03 22:49:36 -050038 *(.text);
39 *(.text.*);
40
Aaron Durbin1e9a9142016-09-16 16:23:21 -050041#if ENV_RAMSTAGE || ENV_ROMSTAGE || ENV_POSTCAR
Aaron Durbin4de29d42015-09-03 22:49:36 -050042 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
43 _cbmem_init_hooks = .;
44 KEEP(*(.rodata.cbmem_init_hooks));
45 _ecbmem_init_hooks = .;
Stefan Reinauerf6b10392016-05-20 15:17:17 -070046#endif
Lee Leahyefcee9f2016-04-29 17:26:36 -070047
48 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
49 _rsbe_init_begin = .;
50 KEEP(*(.rsbe_init));
51 _ersbe_init_begin = .;
Aaron Durbin4de29d42015-09-03 22:49:36 -050052
Aaron Durbin83bc0db2015-09-06 10:45:18 -050053#if ENV_RAMSTAGE
Aaron Durbin4de29d42015-09-03 22:49:36 -050054 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
55 _pci_drivers = .;
56 KEEP(*(.rodata.pci_driver));
57 _epci_drivers = .;
58 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
59 _cpu_drivers = .;
60 KEEP(*(.rodata.cpu_driver));
61 _ecpu_drivers = .;
62#endif
63
64 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
65 *(.rodata);
66 *(.rodata.*);
67 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
68 _etext = .;
69} : to_load
70
71#if ENV_RAMSTAGE && IS_ENABLED(CONFIG_COVERAGE)
Julius Werner52a92602015-09-11 16:17:50 -070072.ctors . : {
Patrick Georgi9cc8e922015-09-27 13:45:17 +020073 . = ALIGN(0x100);
Aaron Durbin4de29d42015-09-03 22:49:36 -050074 __CTOR_LIST__ = .;
75 KEEP(*(.ctors));
76 LONG(0);
77 LONG(0);
78 __CTOR_END__ = .;
79}
80#endif
81
82/* Include data, bss, and heap in that order. Not defined for all stages. */
83#if ARCH_STAGE_HAS_DATA_SECTION
Julius Werner52a92602015-09-11 16:17:50 -070084.data . : {
Aaron Durbin4de29d42015-09-03 22:49:36 -050085 . = ALIGN(ARCH_CACHELINE_ALIGN_SIZE);
86 _data = .;
Aaron Durbindde76292015-09-05 12:59:26 -050087
Aaron Durbin7f8afe02016-03-18 12:21:23 -050088/*
89 * The postcar phase uses a stack value that is located in the relocatable
90 * module section. While the postcar stage could be linked like smm and
91 * other rmodules the postcar stage needs similar semantics of the more
92 * traditional stages in the coreboot infrastructure. Therefore it's easier
93 * to specialize this case.
94 */
95#if ENV_RMODULE || ENV_POSTCAR
Aaron Durbindde76292015-09-05 12:59:26 -050096 _rmodule_params = .;
97 KEEP(*(.module_parameters));
98 _ermodule_params = .;
99#endif
100
Aaron Durbin4de29d42015-09-03 22:49:36 -0500101 *(.data);
102 *(.data.*);
Aaron Durbin9a2790e2016-10-28 12:24:48 -0500103 *(.sdata);
104 *(.sdata.*);
Aaron Durbin4de29d42015-09-03 22:49:36 -0500105
106#ifdef __PRE_RAM__
107 PROVIDE(_preram_cbmem_console = .);
108 PROVIDE(_epreram_cbmem_console = _preram_cbmem_console);
Aaron Durbin83bc0db2015-09-06 10:45:18 -0500109#elif ENV_RAMSTAGE
Aaron Durbin4de29d42015-09-03 22:49:36 -0500110 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
111 _bs_init_begin = .;
112 KEEP(*(.bs_init));
113 LONG(0);
114 LONG(0);
115 _ebs_init_begin = .;
116#endif
117
118 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
119 _edata = .;
120}
121#endif
122
123#if ARCH_STAGE_HAS_BSS_SECTION
Julius Werner52a92602015-09-11 16:17:50 -0700124.bss . : {
Aaron Durbin4de29d42015-09-03 22:49:36 -0500125 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
126 _bss = .;
127 *(.bss)
128 *(.bss.*)
129 *(.sbss)
130 *(.sbss.*)
131 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
132 _ebss = .;
133}
134#endif
135
136#if ARCH_STAGE_HAS_HEAP_SECTION
Julius Werner52a92602015-09-11 16:17:50 -0700137.heap . : {
Aaron Durbin4de29d42015-09-03 22:49:36 -0500138 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
139 _heap = .;
Aaron Durbindde76292015-09-05 12:59:26 -0500140 . += (ENV_RMODULE ? __heap_size : CONFIG_HEAP_SIZE);
Aaron Durbin4de29d42015-09-03 22:49:36 -0500141 . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
142 _eheap = .;
143}
144#endif
145
146_eprogram = .;
147
148/* Discard the sections we don't need/want */
149
Patrick Georgifab8ae72016-04-13 20:55:34 +0200150zeroptr = 0;
Patrick Georgiff8076d2016-01-27 08:18:16 +0100151
Aaron Durbin4de29d42015-09-03 22:49:36 -0500152/DISCARD/ : {
153 *(.comment)
154 *(.comment.*)
155 *(.note)
156 *(.note.*)
157 *(.eh_frame);
158}