arch/risc-v: Make bl602 allocate idle stack after ebss

Although almost all board support allocating idle stack after ebss,
bl602 have a different memory layout for idle stack. To unify them,
make idle stack allocated from ebss for bl602.

Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
This commit is contained in:
Inochi Amaoto 2024-05-06 10:03:40 +08:00 committed by Alan Carvalho de Assis
parent 03895f1073
commit 04e40182ad
4 changed files with 14 additions and 52 deletions

View File

@ -28,13 +28,13 @@
#include <nuttx/arch.h>
#include "chip.h"
#include "riscv_internal.h"
/****************************************************************************
* Public Variables
****************************************************************************/
extern uint8_t _heap_start[];
extern uint8_t _heap_size[];
extern uint8_t __heap_end[];
extern uint8_t _heap_wifi_start[];
extern uint8_t _heap_wifi_size[];
@ -59,8 +59,8 @@ extern uint8_t _heap_wifi_size[];
void up_allocate_heap(void **heap_start, size_t *heap_size)
{
*heap_start = (void *)_heap_start;
*heap_size = (size_t)_heap_size;
*heap_start = (void *)g_idle_topstack;
*heap_size = (size_t)((uintptr_t)__heap_end - g_idle_topstack);
}
/****************************************************************************

View File

@ -46,12 +46,9 @@ bl602_start:
la gp, __global_pointer$
.option pop
la sp, g_idle_stack
add s11, sp, zero
la sp, _ebss
li t0, SMP_STACK_SIZE
add sp, sp, t0
andi sp, sp, ~0xF
#ifndef RUN_IN_RAM
@ -106,8 +103,8 @@ bl602_entry_load_data_section_end:
/* Clear bss section */
la a0, __bss_start
la a1, __bss_end
la a0, _sbss
la a1, _ebss
bgeu a0, a1, bl602_entry_zero_bss_end
bl602_entry_zero_bss_loop:

View File

@ -56,19 +56,6 @@
* Private Data
****************************************************************************/
/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
* linker script. _ebss lies at the end of the BSS region. The idle task
* stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
* The IDLE thread is the thread that the system boots on and, eventually,
* becomes the IDLE, do nothing task that runs only when there is nothing
* else to run. The heap continues from there until the end of memory.
* g_idle_topstack is a read-only variable the provides this computed
* address.
*/
uint8_t g_idle_stack[SMP_STACK_SIZE]
locate_data(".noinit_idle_stack");
/* Dont change the name of variable, since we refer this
* g_boot2_partition_table in linker script
*/
@ -79,7 +66,7 @@ static struct boot2_partition_table_s g_boot2_partition_table used_data;
* Public Data
****************************************************************************/
uintptr_t g_idle_topstack;
uintptr_t g_idle_topstack = (uintptr_t)_ebss + SMP_STACK_SIZE;
/****************************************************************************
* Public Functions
@ -163,13 +150,9 @@ void bfl_main(void)
asm volatile("csrw mtvec, %0" ::"r"((uintptr_t)exception_common + 2));
/* Configure IDLE stack */
g_idle_topstack = ((uint32_t)g_idle_stack + SMP_STACK_SIZE);
/* Setup base stack */
riscv_set_basestack((uintptr_t)g_idle_stack, SMP_STACK_SIZE);
riscv_set_basestack((uintptr_t)_ebss, SMP_STACK_SIZE);
/* Configure the UART so we can get debug output */

View File

@ -164,39 +164,21 @@ SECTIONS
PROVIDE ( __boot2_flash_cfg_end = . );
} > ram_tcm
.noinit (NOLOAD) :
{
. = ALIGN(16);
*(.noinit_idle_stack*)
} > ram_tcm
.bss (NOLOAD) :
{
PROVIDE( __bss_start = ADDR(.bss) );
PROVIDE( __bss_end = ADDR(.bss) + SIZEOF(.bss) );
PROVIDE( _sbss = __bss_start );
PROVIDE( _ebss = __bss_end );
PROVIDE( _sbss = ADDR(.bss) );
*(.sbss*)
*(.gnu.linkonce.sb.*)
*(.bss .bss.*)
*(.gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(32);
_ebss = ABSOLUTE(.);
} > ram_tcm
. = ALIGN(4);
PROVIDE( _heap_start = . );
PROVIDE( _heap_size = ADDR(.stack) - _heap_start );
/* .stack ORIGIN(ram_tcm) + LENGTH(ram_tcm) - __stack_size (NOLOAD) : */
.stack ORIGIN(ram_tcm) + LENGTH(ram_tcm) (NOLOAD) :
{
PROVIDE( _sp_irq_base = . );
/* . = . + __stack_size; */
/* PROVIDE( _sp_main = . ); */
} >ram_tcm
/* Heap end used in code */
PROVIDE(__heap_end = ORIGIN(ram_tcm) + LENGTH(ram_tcm));
/*CFG FW used in code*/
PROVIDE( _ld_bl_static_cfg_entry_start = _bl_static_fw_cfg_entry_start );