On Fri, 12 Feb 2021 at 10:50, Daniel Hellstrom <dan...@gaisler.com> wrote: > > From: Martin Aberg <mab...@gaisler.com> > > Remember the initial stack pointer in start.S. It can later be used to > determine top of RAM. > --- > bsps/riscv/include/bsp/start.h | 65 > ++++++++++++++++++++++ > bsps/riscv/shared/start/bspgetworkarea-fromstack.c | 53 ++++++++++++++++++ > bsps/riscv/shared/start/start.S | 25 +++++++++ > 3 files changed, 143 insertions(+) > create mode 100644 bsps/riscv/include/bsp/start.h > create mode 100644 bsps/riscv/shared/start/bspgetworkarea-fromstack.c > > diff --git a/bsps/riscv/include/bsp/start.h b/bsps/riscv/include/bsp/start.h > new file mode 100644 > index 0000000..6c9d57d > --- /dev/null > +++ b/bsps/riscv/include/bsp/start.h > @@ -0,0 +1,65 @@ > +/** > + * @file > + * > + * @ingroup RTEMSBSPsRISCVSharedStart > + * > + * @brief RISC-V start definitions. > + */ > + > +/* > + * Copyright (c) 2021 Cobham Gaisler AB. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * > + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > + * SUCH DAMAGE. > + */ > + > +#ifndef LIBBSP_RISCV_SHARED_START_H > +#define LIBBSP_RISCV_SHARED_START_H > + > +/** > + * @defgroup RTEMSBSPsRISCVSharedStart Start Support > + * > + * @ingroup RTEMSBSPsRISCVShared > + * > + * @brief Start support. > + * > + * @{ > + */ > + > +#include <stdint.h> > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +/* > + * This variable is initialized by the first CPU entering the BSP start code. > + * The value is the stack pointer at entry. > + */ > +extern uintptr_t riscv_start_stack_pointer; > + > +#ifdef __cplusplus > +} > +#endif > + > +/** @} */ > + > +#endif /* LIBBSP_RISCV_SHARED_START_H */ > diff --git a/bsps/riscv/shared/start/bspgetworkarea-fromstack.c > b/bsps/riscv/shared/start/bspgetworkarea-fromstack.c > new file mode 100644 > index 0000000..6885a77 > --- /dev/null > +++ b/bsps/riscv/shared/start/bspgetworkarea-fromstack.c > @@ -0,0 +1,53 @@ > +/* > + * This set of routines are the BSP specific initialization > + * support routines. > + * > + * COPYRIGHT (c) 1989-2020. > + * On-Line Applications Research Corporation (OAR), > + * Cobham Gaisler AB. > + * > + * The license and distribution terms for this file may be > + * found in the file LICENSE in this distribution or at > + * http://www.rtems.org/license/LICENSE. > + */ > + > +#include <bsp.h> > +#include <bsp/start.h> > +#include <bsp/bootcard.h> > + > +#include <rtems/sysinit.h> > + > +/* > + * These are provided by the linkcmds for ALL of the BSPs which use this > file. > + */ > +extern char WorkAreaBase[]; > +extern char RamEnd[]; > + > +static Memory_Area _Memory_Areas[ 1 ]; > + > +static void bsp_memory_initialize( void ) > +{ > + char *end; > + > + /* top of RAM inidicated by initial stack pointer */ > + end = (char *) riscv_start_stack_pointer; > + if (end == 0) { > + /* fall back to linker symbol if not set */ > + end = RamEnd; > + } > + _Memory_Initialize( &_Memory_Areas[ 0 ], WorkAreaBase, end ); > +} > + > +RTEMS_SYSINIT_ITEM( > + bsp_memory_initialize, > + RTEMS_SYSINIT_MEMORY, > + RTEMS_SYSINIT_ORDER_MIDDLE > +); > + > +static const Memory_Information _Memory_Information = > + MEMORY_INFORMATION_INITIALIZER( _Memory_Areas ); > + > +const Memory_Information *_Memory_Get( void ) > +{ > + return &_Memory_Information; > +} > diff --git a/bsps/riscv/shared/start/start.S b/bsps/riscv/shared/start/start.S > index 04a62a2..6f40279 100644 > --- a/bsps/riscv/shared/start/start.S > +++ b/bsps/riscv/shared/start/start.S > @@ -35,6 +35,16 @@ > #include <bsp/linker-symbols.h> > #include <bspopts.h> > > +#if __riscv_xlen == 32 > +#define PTR_ALIGN 2 > +#define PTR_SIZE 4 > +#define PTR_VALUE .word > +#elif __riscv_xlen == 64 > +#define PTR_ALIGN 3 > +#define PTR_SIZE 8 > +#define PTR_VALUE .dword > +#endif > + Since that's an architecture thing, I wonder if we can just include cpu.h that already does have macros for pointer sizes and stack alignments https://github.com/RTEMS/rtems/blob/master/cpukit/score/cpu/riscv/include/rtems/score/cpu.h#L70 Similarly, can we define something like "define ASM_CPU_POINTER [d]word" in asm.h (the same file where SREG, LADDR, etc are defined).
> PUBLIC(_start) > > .section .bsp_start_text, "wax", @progbits > @@ -59,6 +69,9 @@ SYM(_start): > LADDR t0, _RISCV_Exception_handler > csrw mtvec, t0 > > + /* Save stack pointer so it can mark end of work area later on */ > + mv t3, sp > + > /* Load stack pointer and branch to secondary processor start if > necessary */ > #ifdef RTEMS_SMP > LADDR sp, _ISR_Stack_area_begin > @@ -74,6 +87,9 @@ SYM(_start): > LADDR sp, _ISR_Stack_area_end > #endif > > + LADDR t0, riscv_start_stack_pointer > + SREG t3, 0(t0) > + > #ifdef BSP_START_COPY_FDT_FROM_U_BOOT > mv a0, a1 > call bsp_fdt_copy > @@ -145,3 +161,12 @@ SYM(_start): > #endif > > #endif /* RTEMS_SMP */ > + > + .section .data, "aw" > + .align PTR_ALIGN > + > + .globl riscv_start_stack_pointer > + .type riscv_start_stack_pointer, @object > + .size riscv_start_stack_pointer, PTR_SIZE > +riscv_start_stack_pointer: > + PTR_VALUE 0 > -- > 2.7.4 > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel