forked from Mirrors/opensbi

Enable OpenSBI to support position independent execution. Because the position independent code will cause an additional GOT reference when accessing the global variables, it will reduce performance a bit. Therefore, the position independent execution is disabled by default. Users can through specifying "FW_PIC=y" on the make command to enable this feature. In theory, after enabling position-independent execution, the OpenSBI can run at arbitrary address with appropriate alignment. Therefore, the original relocation mechanism will be skipped. In other words, OpenSBI will directly run at the load address without any code movement. Signed-off-by: Vincent Chen <vincent.chen@sifive.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
95 lines
1.6 KiB
Plaintext
95 lines
1.6 KiB
Plaintext
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2019 Western Digital Corporation or its affiliates.
|
|
*
|
|
* Authors:
|
|
* Anup Patel <anup.patel@wdc.com>
|
|
*/
|
|
|
|
. = FW_TEXT_START;
|
|
|
|
PROVIDE(_fw_start = .);
|
|
|
|
. = ALIGN(0x1000); /* Need this to create proper sections */
|
|
|
|
/* Beginning of the code section */
|
|
|
|
.text :
|
|
{
|
|
PROVIDE(_text_start = .);
|
|
*(.entry)
|
|
*(.text)
|
|
. = ALIGN(8);
|
|
PROVIDE(_text_end = .);
|
|
}
|
|
|
|
. = ALIGN(0x1000); /* Ensure next section is page aligned */
|
|
|
|
/* End of the code sections */
|
|
|
|
/* Beginning of the read-only data sections */
|
|
|
|
. = ALIGN(0x1000); /* Ensure next section is page aligned */
|
|
|
|
.rodata :
|
|
{
|
|
PROVIDE(_rodata_start = .);
|
|
*(.rodata .rodata.*)
|
|
. = ALIGN(8);
|
|
PROVIDE(_rodata_end = .);
|
|
}
|
|
|
|
/* End of the read-only data sections */
|
|
|
|
/* Beginning of the read-write data sections */
|
|
|
|
. = ALIGN(0x1000); /* Ensure next section is page aligned */
|
|
|
|
.data :
|
|
{
|
|
PROVIDE(_data_start = .);
|
|
|
|
*(.sdata)
|
|
*(.sdata.*)
|
|
*(.data)
|
|
*(.data.*)
|
|
*(.readmostly.data)
|
|
*(*.data)
|
|
. = ALIGN(8);
|
|
|
|
PROVIDE(_data_end = .);
|
|
}
|
|
|
|
.dynsym : {
|
|
PROVIDE(__dyn_sym_start = .);
|
|
*(.dynsym)
|
|
PROVIDE(__dyn_sym_end = .);
|
|
}
|
|
|
|
.rela.dyn : {
|
|
PROVIDE(__rel_dyn_start = .);
|
|
*(.rela*)
|
|
. = ALIGN(8);
|
|
PROVIDE(__rel_dyn_end = .);
|
|
}
|
|
|
|
. = ALIGN(0x1000); /* Ensure next section is page aligned */
|
|
|
|
.bss :
|
|
{
|
|
PROVIDE(_bss_start = .);
|
|
*(.sbss)
|
|
*(.sbss.*)
|
|
*(.bss)
|
|
*(.bss.*)
|
|
. = ALIGN(8);
|
|
PROVIDE(_bss_end = .);
|
|
}
|
|
|
|
/* End of the read-write data sections */
|
|
|
|
. = ALIGN(0x1000); /* Need this to create proper sections */
|
|
|
|
PROVIDE(_fw_end = .);
|