1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * (C) Copyright 2013 4 * David Feng <fenghua@phytium.com.cn> 5 * 6 * (C) Copyright 2002 7 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> 8 */ 9 10#include <config.h> 11#include <asm/psci.h> 12 13OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64") 14OUTPUT_ARCH(aarch64) 15ENTRY(_start) 16SECTIONS 17{ 18#ifdef CONFIG_ARMV8_SECURE_BASE 19 /DISCARD/ : { *(.rela._secure*) } 20#endif 21 . = 0x00000000; 22 23 . = ALIGN(8); 24 .text : 25 { 26 *(.__image_copy_start) 27 CPUDIR/start.o (.text*) 28 } 29 30 /* This needs to come before *(.text*) */ 31 .efi_runtime : { 32 __efi_runtime_start = .; 33 *(.text.efi_runtime*) 34 *(.rodata.efi_runtime*) 35 *(.data.efi_runtime*) 36 __efi_runtime_stop = .; 37 } 38 39 .text_rest : 40 { 41 *(.text*) 42 } 43 44#ifdef CONFIG_ARMV8_PSCI 45 .__secure_start : 46#ifndef CONFIG_ARMV8_SECURE_BASE 47 ALIGN(CONSTANT(COMMONPAGESIZE)) 48#endif 49 { 50 KEEP(*(.__secure_start)) 51 } 52 53#ifndef CONFIG_ARMV8_SECURE_BASE 54#define CONFIG_ARMV8_SECURE_BASE 55#define __ARMV8_PSCI_STACK_IN_RAM 56#endif 57 .secure_text CONFIG_ARMV8_SECURE_BASE : 58 AT(ADDR(.__secure_start) + SIZEOF(.__secure_start)) 59 { 60 *(._secure.text) 61 . = ALIGN(8); 62 __secure_svc_tbl_start = .; 63 KEEP(*(._secure_svc_tbl_entries)) 64 __secure_svc_tbl_end = .; 65 } 66 67 .secure_data : AT(LOADADDR(.secure_text) + SIZEOF(.secure_text)) 68 { 69 *(._secure.data) 70 } 71 72 .secure_stack ALIGN(ADDR(.secure_data) + SIZEOF(.secure_data), 73 CONSTANT(COMMONPAGESIZE)) (NOLOAD) : 74#ifdef __ARMV8_PSCI_STACK_IN_RAM 75 AT(ADDR(.secure_stack)) 76#else 77 AT(LOADADDR(.secure_data) + SIZEOF(.secure_data)) 78#endif 79 { 80 KEEP(*(.__secure_stack_start)) 81 82 . = . + CONFIG_ARMV8_PSCI_NR_CPUS * ARM_PSCI_STACK_SIZE; 83 84 . = ALIGN(CONSTANT(COMMONPAGESIZE)); 85 86 KEEP(*(.__secure_stack_end)) 87 } 88 89#ifndef __ARMV8_PSCI_STACK_IN_RAM 90 . = LOADADDR(.secure_stack); 91#endif 92 93 .__secure_end : AT(ADDR(.__secure_end)) { 94 KEEP(*(.__secure_end)) 95 LONG(0x1d1071c); /* Must output something to reset LMA */ 96 } 97#endif 98 99 . = ALIGN(8); 100 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } 101 102 . = ALIGN(8); 103 .data : { 104 *(.data*) 105 } 106 107 . = ALIGN(8); 108 109 . = .; 110 111 . = ALIGN(8); 112 .u_boot_list : { 113 KEEP(*(SORT(.u_boot_list*))); 114 } 115 116 . = ALIGN(8); 117 118 .efi_runtime_rel : { 119 __efi_runtime_rel_start = .; 120 *(.rel*.efi_runtime) 121 *(.rel*.efi_runtime.*) 122 __efi_runtime_rel_stop = .; 123 } 124 125 . = ALIGN(8); 126 127 .image_copy_end : 128 { 129 *(.__image_copy_end) 130 } 131 132 . = ALIGN(8); 133 134 .rel_dyn_start : 135 { 136 *(.__rel_dyn_start) 137 } 138 139 .rela.dyn : { 140 *(.rela*) 141 } 142 143 .rel_dyn_end : 144 { 145 *(.__rel_dyn_end) 146 } 147 148 _end = .; 149 150 . = ALIGN(8); 151 152 .bss_start : { 153 KEEP(*(.__bss_start)); 154 } 155 156 .bss : { 157 *(.bss*) 158 . = ALIGN(8); 159 } 160 161 .bss_end : { 162 KEEP(*(.__bss_end)); 163 } 164 165 /DISCARD/ : { *(.dynsym) } 166 /DISCARD/ : { *(.dynstr*) } 167 /DISCARD/ : { *(.dynamic*) } 168 /DISCARD/ : { *(.plt*) } 169 /DISCARD/ : { *(.interp*) } 170 /DISCARD/ : { *(.gnu*) } 171 172#ifdef CONFIG_LINUX_KERNEL_IMAGE_HEADER 173#include "linux-kernel-image-header-vars.h" 174#endif 175} 176