b128ce334f
OpenSBI may be compiled as an external library. OpenSBI commit d249d65 (Dec. 11, 2021) needs to be reverted as it causes memcpy / memcmp to end up in the wrong section. That issue has yet no known workaround. OpenSBI may be lauched from the hart0 (e51). It will start the U-Boot and eventually the Linux kernel on harts 1-4. OpenSBI, once initialized properly, will trap and handle illegal instructions (for example, CSR time) and unaligned address accesses among other things. Due to size size limitations for the mpfs eNVM area where the NuttX is located, we actually set up the OpenSBI on its own section which is in the bottom of the DDR memory. Special care must be taken so that the kernel doesn't override the OpenSBI. For example, the Linux device tree may reserve some space from the beginning: opensbi_reserved: opensbi@80000000 { reg = <0x80000000 0x200000>; label = "opensbi-reserved"; }; The resulting nuttx.bin file is very large, but objcopy is used to create the final binary images for the regions (eNVM and DDR) using the nuttx elf file. Co-authored-by: Petro Karashchenko <petro.karashchenko@gmail.com> Signed-off-by: Eero Nurkkala <eero.nurkkala@offcode.fi>
124 lines
3.5 KiB
Plaintext
Executable File
124 lines
3.5 KiB
Plaintext
Executable File
/****************************************************************************
|
|
* boards/risc-v/mpfs/icicle/scripts/ld-envm.script
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
MEMORY
|
|
{
|
|
ddr (rx) : ORIGIN = 0x80000000, LENGTH = 4M /* w/ cache */
|
|
envm (rx) : ORIGIN = 0x20220100, LENGTH = 128K - 256 /* 256 reserved for hss headers */
|
|
l2lim (rwx) : ORIGIN = 0x08000000, LENGTH = 1024k
|
|
l2zerodevice (rwx) : ORIGIN = 0x0A000000, LENGTH = 512k
|
|
}
|
|
|
|
OUTPUT_ARCH("riscv")
|
|
|
|
ENTRY(_stext)
|
|
EXTERN(_vectors)
|
|
SECTIONS
|
|
{
|
|
.text.sbi : {
|
|
sbi*
|
|
} > ddr
|
|
|
|
.ddrstorage : {
|
|
*(.ddrstorage)
|
|
} > ddr
|
|
|
|
.l2_scratchpad : ALIGN(0x10)
|
|
{
|
|
__l2_scratchpad_load = LOADADDR(.l2_scratchpad);
|
|
__l2_scratchpad_start = .;
|
|
__l2_scratchpad_vma_start = .;
|
|
*(.l2_scratchpad)
|
|
|
|
. = ALIGN(0x10);
|
|
__l2_scratchpad_end = .;
|
|
__l2_scratchpad_vma_end = .;
|
|
} > l2zerodevice
|
|
|
|
PROVIDE(__mpfs_nuttx_start = ORIGIN(l2lim));
|
|
|
|
.text : {
|
|
_stext = ABSOLUTE(.);
|
|
*(.vectors)
|
|
*(.text .text.*)
|
|
*(.f-ixup)
|
|
*(.gnu.warning)
|
|
*(.rodata .rodata.* .srodata .srodata.*)
|
|
*(.gnu.linkonce.t.*)
|
|
*(.glue_7)
|
|
*(.glue_7t)
|
|
*(.got)
|
|
*(.gcc_except_table)
|
|
*(.gnu.linkonce.r.*)
|
|
_etext = ABSOLUTE(.);
|
|
} > envm
|
|
|
|
.init_section : ALIGN(4) {
|
|
_sinit = ABSOLUTE(.);
|
|
KEEP(*(.init_array .init_array.*))
|
|
_einit = ABSOLUTE(.);
|
|
} > envm
|
|
|
|
_eronly = ABSOLUTE(.);
|
|
|
|
.data : ALIGN(4) {
|
|
_sdata = ABSOLUTE(.);
|
|
*(.data .data.*)
|
|
*(.sdata .sdata.* .sdata2.*)
|
|
*(.gnu.linkonce.d.*)
|
|
*(.gnu.linkonce.s.*)
|
|
CONSTRUCTORS
|
|
. = ALIGN(4);
|
|
_edata = ABSOLUTE(.);
|
|
} > l2lim AT > envm
|
|
|
|
PROVIDE(__global_pointer$ = _sdata + ((_edata - _sdata) / 2));
|
|
|
|
.bss : ALIGN(4) {
|
|
_sbss = ABSOLUTE(.);
|
|
*(.bss .bss.*)
|
|
*(.sbss .sbss.*)
|
|
*(.gnu.linkonce.b.*)
|
|
*(.gnu.linkonce.sb.*)
|
|
*(COMMON)
|
|
. = ALIGN(4);
|
|
_ebss = ABSOLUTE(.);
|
|
. = ALIGN(32);
|
|
_default_stack_limit = ABSOLUTE(.);
|
|
} > l2lim
|
|
|
|
PROVIDE(__mpfs_nuttx_end = .);
|
|
|
|
/* Stabs debugging sections. */
|
|
|
|
.stab 0 : { *(.stab) }
|
|
.stabstr 0 : { *(.stabstr) }
|
|
.stab.excl 0 : { *(.stab.excl) }
|
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
.stab.index 0 : { *(.stab.index) }
|
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
.comment 0 : { *(.comment) }
|
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
.debug_info 0 : { *(.debug_info) }
|
|
.debug_line 0 : { *(.debug_line) }
|
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
.debug_aranges 0 : { *(.debug_aranges) }
|
|
}
|