summaryrefslogtreecommitdiffstats
path: root/src/lib/ramstage.ld
blob: 432df40da60d048767c076097e478bde2a5ee5b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
 * This file is part of the coreboot project.
 *
 * Copyright 2014 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
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc.
 */

/* This file is included inside a SECTIONS block */

/* First we place the code and read only data (typically const declared).
 * This could theoretically be placed in rom.
 */
.text : {
	_program = .;
	_ramstage = .;
	_text = .;
	*(.text._start);
	*(.text.stage_entry);
	*(.text);
	*(.text.*);
	. = ALIGN(16);
	_etext = .;
} : to_load

#if IS_ENABLED(CONFIG_COVERAGE)
.ctors : {
	. = ALIGN(0x100);
	__CTOR_LIST__ = .;
	KEEP(*(.ctors));
	LONG(0);
	LONG(0);
	__CTOR_END__ = .;
}
#endif

/* TODO: align data sections to cache lines? (is that really useful?) */
.rodata : {
	_rodata = .;
	. = ALIGN(8);

	/* 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 = . ;
	_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 = .;
}

.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.*)
	_edata = .;
}

.bss . : {
	_bss = .;
	*(.bss)
	*(.bss.*)
	*(.sbss)
	*(.sbss.*)
	_ebss = .;
}

.heap . : {
	_heap = .;
	/* Reserve CONFIG_HEAP_SIZE bytes for the heap */
	. += CONFIG_HEAP_SIZE ;
	. = ALIGN(4);
	_eheap = .;
	_eramstage = .;
	_eprogram = .;
}

/* Discard the sections we don't need/want */

/DISCARD/ : {
	*(.comment)
	*(.note)
	*(.note.*)
}