xref: /openbmc/u-boot/arch/arm/cpu/armv8/u-boot.lds (revision fc82e768)
183d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0+ */
20ae76531SDavid Feng/*
30ae76531SDavid Feng * (C) Copyright 2013
40ae76531SDavid Feng * David Feng <fenghua@phytium.com.cn>
50ae76531SDavid Feng *
60ae76531SDavid Feng * (C) Copyright 2002
70ae76531SDavid Feng * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
80ae76531SDavid Feng */
90ae76531SDavid Feng
10df88cb3bSmacro.wave.z@gmail.com#include <config.h>
11df88cb3bSmacro.wave.z@gmail.com#include <asm/psci.h>
12df88cb3bSmacro.wave.z@gmail.com
130ae76531SDavid FengOUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
140ae76531SDavid FengOUTPUT_ARCH(aarch64)
150ae76531SDavid FengENTRY(_start)
160ae76531SDavid FengSECTIONS
170ae76531SDavid Feng{
18df88cb3bSmacro.wave.z@gmail.com#ifdef CONFIG_ARMV8_SECURE_BASE
19df88cb3bSmacro.wave.z@gmail.com	/DISCARD/ : { *(.rela._secure*) }
20df88cb3bSmacro.wave.z@gmail.com#endif
210ae76531SDavid Feng	. = 0x00000000;
220ae76531SDavid Feng
230ae76531SDavid Feng	. = ALIGN(8);
240ae76531SDavid Feng	.text :
250ae76531SDavid Feng	{
260ae76531SDavid Feng		*(.__image_copy_start)
270ae76531SDavid Feng		CPUDIR/start.o (.text*)
28*7e21fbcaSAlexander Graf	}
29*7e21fbcaSAlexander Graf
30*7e21fbcaSAlexander Graf	/* This needs to come before *(.text*) */
31*7e21fbcaSAlexander Graf	.efi_runtime : {
32*7e21fbcaSAlexander Graf                __efi_runtime_start = .;
33*7e21fbcaSAlexander Graf		*(.text.efi_runtime*)
34*7e21fbcaSAlexander Graf		*(.rodata.efi_runtime*)
35*7e21fbcaSAlexander Graf		*(.data.efi_runtime*)
36*7e21fbcaSAlexander Graf                __efi_runtime_stop = .;
37*7e21fbcaSAlexander Graf	}
38*7e21fbcaSAlexander Graf
39*7e21fbcaSAlexander Graf	.text_rest :
40*7e21fbcaSAlexander Graf	{
410ae76531SDavid Feng		*(.text*)
420ae76531SDavid Feng	}
430ae76531SDavid Feng
44df88cb3bSmacro.wave.z@gmail.com#ifdef CONFIG_ARMV8_PSCI
45df88cb3bSmacro.wave.z@gmail.com	.__secure_start :
46df88cb3bSmacro.wave.z@gmail.com#ifndef CONFIG_ARMV8_SECURE_BASE
47df88cb3bSmacro.wave.z@gmail.com		ALIGN(CONSTANT(COMMONPAGESIZE))
48df88cb3bSmacro.wave.z@gmail.com#endif
49df88cb3bSmacro.wave.z@gmail.com	{
50df88cb3bSmacro.wave.z@gmail.com		KEEP(*(.__secure_start))
51df88cb3bSmacro.wave.z@gmail.com	}
52df88cb3bSmacro.wave.z@gmail.com
53df88cb3bSmacro.wave.z@gmail.com#ifndef CONFIG_ARMV8_SECURE_BASE
54df88cb3bSmacro.wave.z@gmail.com#define CONFIG_ARMV8_SECURE_BASE
55df88cb3bSmacro.wave.z@gmail.com#define __ARMV8_PSCI_STACK_IN_RAM
56df88cb3bSmacro.wave.z@gmail.com#endif
57df88cb3bSmacro.wave.z@gmail.com	.secure_text CONFIG_ARMV8_SECURE_BASE :
58df88cb3bSmacro.wave.z@gmail.com		AT(ADDR(.__secure_start) + SIZEOF(.__secure_start))
59df88cb3bSmacro.wave.z@gmail.com	{
60df88cb3bSmacro.wave.z@gmail.com		*(._secure.text)
61df88cb3bSmacro.wave.z@gmail.com	}
62df88cb3bSmacro.wave.z@gmail.com
63df88cb3bSmacro.wave.z@gmail.com	.secure_data : AT(LOADADDR(.secure_text) + SIZEOF(.secure_text))
64df88cb3bSmacro.wave.z@gmail.com	{
65df88cb3bSmacro.wave.z@gmail.com		*(._secure.data)
66df88cb3bSmacro.wave.z@gmail.com	}
67df88cb3bSmacro.wave.z@gmail.com
68df88cb3bSmacro.wave.z@gmail.com	.secure_stack ALIGN(ADDR(.secure_data) + SIZEOF(.secure_data),
69df88cb3bSmacro.wave.z@gmail.com			    CONSTANT(COMMONPAGESIZE)) (NOLOAD) :
70df88cb3bSmacro.wave.z@gmail.com#ifdef __ARMV8_PSCI_STACK_IN_RAM
71df88cb3bSmacro.wave.z@gmail.com		AT(ADDR(.secure_stack))
72df88cb3bSmacro.wave.z@gmail.com#else
73df88cb3bSmacro.wave.z@gmail.com		AT(LOADADDR(.secure_data) + SIZEOF(.secure_data))
74df88cb3bSmacro.wave.z@gmail.com#endif
75df88cb3bSmacro.wave.z@gmail.com	{
76df88cb3bSmacro.wave.z@gmail.com		KEEP(*(.__secure_stack_start))
77df88cb3bSmacro.wave.z@gmail.com
78df88cb3bSmacro.wave.z@gmail.com		. = . + CONFIG_ARMV8_PSCI_NR_CPUS * ARM_PSCI_STACK_SIZE;
79df88cb3bSmacro.wave.z@gmail.com
80df88cb3bSmacro.wave.z@gmail.com		. = ALIGN(CONSTANT(COMMONPAGESIZE));
81df88cb3bSmacro.wave.z@gmail.com
82df88cb3bSmacro.wave.z@gmail.com		KEEP(*(.__secure_stack_end))
83df88cb3bSmacro.wave.z@gmail.com	}
84df88cb3bSmacro.wave.z@gmail.com
85df88cb3bSmacro.wave.z@gmail.com#ifndef __ARMV8_PSCI_STACK_IN_RAM
86df88cb3bSmacro.wave.z@gmail.com	. = LOADADDR(.secure_stack);
87df88cb3bSmacro.wave.z@gmail.com#endif
88df88cb3bSmacro.wave.z@gmail.com
89df88cb3bSmacro.wave.z@gmail.com	.__secure_end : AT(ADDR(.__secure_end)) {
90df88cb3bSmacro.wave.z@gmail.com		KEEP(*(.__secure_end))
91df88cb3bSmacro.wave.z@gmail.com		LONG(0x1d1071c);	/* Must output something to reset LMA */
92df88cb3bSmacro.wave.z@gmail.com	}
93df88cb3bSmacro.wave.z@gmail.com#endif
94df88cb3bSmacro.wave.z@gmail.com
950ae76531SDavid Feng	. = ALIGN(8);
960ae76531SDavid Feng	.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
970ae76531SDavid Feng
980ae76531SDavid Feng	. = ALIGN(8);
990ae76531SDavid Feng	.data : {
1000ae76531SDavid Feng		*(.data*)
1010ae76531SDavid Feng	}
1020ae76531SDavid Feng
1030ae76531SDavid Feng	. = ALIGN(8);
1040ae76531SDavid Feng
1050ae76531SDavid Feng	. = .;
1060ae76531SDavid Feng
1070ae76531SDavid Feng	. = ALIGN(8);
1080ae76531SDavid Feng	.u_boot_list : {
1090ae76531SDavid Feng		KEEP(*(SORT(.u_boot_list*)));
1100ae76531SDavid Feng	}
1110ae76531SDavid Feng
1120ae76531SDavid Feng	. = ALIGN(8);
1130ae76531SDavid Feng
11450149ea3SAlexander Graf	.efi_runtime_rel : {
11550149ea3SAlexander Graf                __efi_runtime_rel_start = .;
116*7e21fbcaSAlexander Graf		*(.rel*.efi_runtime)
117*7e21fbcaSAlexander Graf		*(.rel*.efi_runtime.*)
11850149ea3SAlexander Graf                __efi_runtime_rel_stop = .;
11950149ea3SAlexander Graf	}
12050149ea3SAlexander Graf
12150149ea3SAlexander Graf	. = ALIGN(8);
12250149ea3SAlexander Graf
1230ae76531SDavid Feng	.image_copy_end :
1240ae76531SDavid Feng	{
1250ae76531SDavid Feng		*(.__image_copy_end)
1260ae76531SDavid Feng	}
1270ae76531SDavid Feng
1280ae76531SDavid Feng	. = ALIGN(8);
1290ae76531SDavid Feng
1300ae76531SDavid Feng	.rel_dyn_start :
1310ae76531SDavid Feng	{
1320ae76531SDavid Feng		*(.__rel_dyn_start)
1330ae76531SDavid Feng	}
1340ae76531SDavid Feng
1350ae76531SDavid Feng	.rela.dyn : {
1360ae76531SDavid Feng		*(.rela*)
1370ae76531SDavid Feng	}
1380ae76531SDavid Feng
1390ae76531SDavid Feng	.rel_dyn_end :
1400ae76531SDavid Feng	{
1410ae76531SDavid Feng		*(.__rel_dyn_end)
1420ae76531SDavid Feng	}
1430ae76531SDavid Feng
1440ae76531SDavid Feng	_end = .;
1450ae76531SDavid Feng
1460ae76531SDavid Feng	. = ALIGN(8);
1470ae76531SDavid Feng
1480ae76531SDavid Feng	.bss_start : {
1490ae76531SDavid Feng		KEEP(*(.__bss_start));
1500ae76531SDavid Feng	}
1510ae76531SDavid Feng
1520ae76531SDavid Feng	.bss : {
1530ae76531SDavid Feng		*(.bss*)
1540ae76531SDavid Feng		 . = ALIGN(8);
1550ae76531SDavid Feng	}
1560ae76531SDavid Feng
1570ae76531SDavid Feng	.bss_end : {
1580ae76531SDavid Feng		KEEP(*(.__bss_end));
1590ae76531SDavid Feng	}
1600ae76531SDavid Feng
1610ae76531SDavid Feng	/DISCARD/ : { *(.dynsym) }
1620ae76531SDavid Feng	/DISCARD/ : { *(.dynstr*) }
1630ae76531SDavid Feng	/DISCARD/ : { *(.dynamic*) }
1640ae76531SDavid Feng	/DISCARD/ : { *(.plt*) }
1650ae76531SDavid Feng	/DISCARD/ : { *(.interp*) }
1660ae76531SDavid Feng	/DISCARD/ : { *(.gnu*) }
1678163faf9SStephen Warren
1688163faf9SStephen Warren#ifdef CONFIG_LINUX_KERNEL_IMAGE_HEADER
1698163faf9SStephen Warren#include "linux-kernel-image-header-vars.h"
1708163faf9SStephen Warren#endif
1710ae76531SDavid Feng}
172