pinebuds/scripts/link/programmer.lds_scat.S
2022-08-15 17:20:27 +08:00

160 lines
3 KiB
ArmAsm

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#include "plat_addr_map.h"
#define MIN_BURN_BUFFER_SIZE 0x2000
#define BURN_BUFFER_END 0x11000
#define HEAP_SECTION_SIZE 0x40
#define STACK_SECTION_SIZE 0x1000
#define CODE_MSG_OVERHEAD 8
LR_vector (RAMX_BASE + BURN_BUFFER_END) NOCOMPRESS
{
vector_table RAM_BASE UNINIT VECTOR_SECTION_SIZE
{
*(.bss.vector_table, +FIRST)
}
reboot_param (ImageBase(vector_table) + VECTOR_SECTION_SIZE) UNINIT REBOOT_PARAM_SECTION_SIZE
{
*(.bss.reboot_param, +FIRST)
}
burn_buffer (ImageBase(reboot_param) + REBOOT_PARAM_SECTION_SIZE) UNINIT
{
/* The size of .burn_buffer should be greater than __rom_HeapLimit. In most cases 8K is enough. */
*(.bss.burn_buffer)
}
ScatterAssert(ImageLimit(burn_buffer) <= (ImageBase(vector_table) + BURN_BUFFER_END))
}
LR_boot_struct +0
{
boot_struct RAMX_TO_RAM(+0)
{
*(.boot_struct, +FIRST)
}
exec_struct +0
{
*(.exec_struct, +FIRST)
}
got_info +0
{
*(.got)
*(.got.plt)
*(.igot.plt)
*(.dynamic)
}
}
LR_text +0
{
text +0 FIXED
{
*(.text*)
#ifndef NOSTD
*(InRoot$$Sections)
*armlib*(+TEXT)
#endif
}
.ARM.extab +0
{
*(.ARM.extab*, .gnu.linkonce.armextab.*)
}
/* .ARM.exidx contains R_ARM_PREL31 (+-0x40000000) offset to functions, which means
* the session location cannot be too far away from the function addresses */
.ARM.exidx +0
{
*(.ARM.exidx*, .gnu.linkonce.armexidx.*)
}
rodata RAMX_TO_RAM(+0)
{
*(.rodata*)
#ifndef NOSTD
*armlib*(+CONST)
KEEP(*(.eh_frame*))
#endif
*(.note.gnu.build-id)
. = ALIGN(4);
}
cust_cmd_init_tbl +0
{
*(.cust_cmd_init_tbl)
}
cust_cmd_hdlr_tbl +0
{
*(.cust_cmd_hldr_tbl)
}
data +0
{
*(.data*)
#ifndef NOSTD
*armlib*(+DATA)
#endif
}
.build_info +0
{
*(.build_info, +FIRST)
}
/* The following section be the last loaded section */
code_start_addr +0
{
*(.code_start_addr, +LAST)
}
bss +0 UNINIT
{
*(.bss*)
*(COMMON)
#ifndef NOSTD
*armlib*(+BSS)
#endif
}
ARM_LIB_HEAP +0 ALIGN 8 EMPTY HEAP_SECTION_SIZE
{
}
ARM_LIB_STACK (RAM_BASE + RAM_SIZE - STACK_SECTION_SIZE) ALIGN 8 EMPTY STACK_SECTION_SIZE
{
}
/* Check if data + heap + stack exceeds RAM limit */
ScatterAssert(ImageBase(ARM_LIB_STACK) >= ImageLimit(ARM_LIB_HEAP))
ScatterAssert(ImageLimit(ARM_LIB_STACK) <= (RAM_BASE + RAM_SIZE))
free_ram ImageLimit(ARM_LIB_HEAP) EMPTY (ImageBase(ARM_LIB_STACK) - ImageLimit(ARM_LIB_HEAP))
{
}
}