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