Re: [PATCH v4 1/2] bsp/riscv: Work area size based on stack pointer
On 2022-08-15 17:19, Hesham Almatary wrote: On Mon, 15 Aug 2022 at 15:35, Daniel Cederman wrote: On 2022-08-15 15:43, Hesham Almatary wrote: On Mon, 15 Aug 2022 at 08:16, Daniel Cederman wrote: From: Martin Aberg Remember the initial stack pointer in start.S. It can later be used to determine top of RAM. --- bsps/riscv/include/bsp/start.h| 67 .../shared/start/bspgetworkarea-fromstack.c | 76 +++ bsps/riscv/shared/start/start.S | 15 cpukit/score/cpu/riscv/include/rtems/asm.h| 12 +++ 4 files changed, 170 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 00..f40f1873a7 --- /dev/null +++ b/bsps/riscv/include/bsp/start.h @@ -0,0 +1,67 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 + +#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 const 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 00..d55a876346 --- /dev/null +++ b/bsps/riscv/shared/start/bspgetworkarea-fromstack.c @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief BSP specific initialization support routines + * + */ + +/* + * COPYRIGHT (c) 1989-2020. + * On-Line Applications Research Corporation (OAR). + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + */ + +#include +#include +#include + +#include + +/* + * These are provided by the linkcmds for ALL of the BSPs which use this file. + */ +extern
[PATCH] bsp/riscv: Work area size based on /memory node in fdt
Uses the first entry in the /memory node to determine the end of the work area. Falls back on linker symbol if unable to parse the node. --- bsps/riscv/noel/start/bspgetworkarea.c | 144 + spec/build/bsps/riscv/noel/obj.yml | 1 + 2 files changed, 145 insertions(+) create mode 100644 bsps/riscv/noel/start/bspgetworkarea.c diff --git a/bsps/riscv/noel/start/bspgetworkarea.c b/bsps/riscv/noel/start/bspgetworkarea.c new file mode 100644 index 00..1fa051d25e --- /dev/null +++ b/bsps/riscv/noel/start/bspgetworkarea.c @@ -0,0 +1,144 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief BSP specific initialization support routines + * + */ + +/* + * COPYRIGHT (c) 1989-2020. + * On-Line Applications Research Corporation (OAR). + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + */ + +#include +#include + +#include + +#include + +/* + * 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 const char memory_path[] = "/memory"; + +static void* get_end_of_memory_from_fdt(void) +{ + const void *fdt; + const void *val; + int node; + int parent; + int ac; + int sc; + int len; + uintptr_t start; + uintptr_t size; + + fdt = bsp_fdt_get(); + + node = fdt_path_offset_namelen( +fdt, +memory_path, +(int) sizeof(memory_path) - 1 + ); + + if (node < 0) { +return NULL; + } + + parent = fdt_parent_offset(fdt, node); + if (parent < 0) { +return NULL; + } + + ac = fdt_address_cells(fdt, parent); + if (ac != 1 && ac != 2) { +return NULL; + } + + sc = fdt_size_cells(fdt, parent); + if (sc != 1 && sc != 2) { +return NULL; + } + + if (sc > ac) { +return NULL; + } + + val = fdt_getprop(fdt, node, "reg", &len); + if (len < sc + ac) { +return NULL; + } + + if (ac == 1) { +start = fdt32_to_cpu(((fdt32_t *)val)[0]); +size = fdt32_to_cpu(((fdt32_t *)val)[1]); + } + + if (ac == 2) { +start = fdt64_to_cpu(((fdt64_t *)val)[0]); + +if (sc == 1) + size = fdt32_to_cpu(((fdt32_t *)(val+8))[0]); +else + size = fdt64_to_cpu(((fdt64_t *)val)[1]); + } + + return (void*) (start + size); +} + +static void bsp_memory_initialize( void ) +{ + void *end; + + /* get end of memory from the "/memory" node in the fdt */ + end = get_end_of_memory_from_fdt(); + if (end == 0) { +/* fall back to linker symbol if "/memory" node not found or invalid */ +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/spec/build/bsps/riscv/noel/obj.yml b/spec/build/bsps/riscv/noel/obj.yml index e1b652fa93..f9902f83b5 100644 --- a/spec/build/bsps/riscv/noel/obj.yml +++ b/spec/build/bsps/riscv/noel/obj.yml @@ -22,6 +22,7 @@ source: - bsps/riscv/noel/console/console-config.c - bsps/riscv/riscv/irq/irq.c - bsps/riscv/noel/start/bsp_fatal_halt.c +- bsps/riscv/noel/start/bspgetworkarea.c - bsps/riscv/riscv/start/bspstart.c - bsps/shared/cache/nocache.c - bsps/shared/dev/btimer/btimer-cpucounter.c -- 2.34.1 ___ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel
Re: [PATCH] bsp/riscv: Work area size based on /memory node in fdt
Thanks for the patch. LGTM. I wonder if we can also reuse that for the generic shared RISC-V BSP (e.g., bsps/riscv/riscv) instead of just NOEL? On Wed, 17 Aug 2022 at 09:58, Daniel Cederman wrote: > Uses the first entry in the /memory node to determine the end of the > work area. Falls back on linker symbol if unable to parse the node. > --- > bsps/riscv/noel/start/bspgetworkarea.c | 144 + > spec/build/bsps/riscv/noel/obj.yml | 1 + > 2 files changed, 145 insertions(+) > create mode 100644 bsps/riscv/noel/start/bspgetworkarea.c > > diff --git a/bsps/riscv/noel/start/bspgetworkarea.c > b/bsps/riscv/noel/start/bspgetworkarea.c > new file mode 100644 > index 00..1fa051d25e > --- /dev/null > +++ b/bsps/riscv/noel/start/bspgetworkarea.c > @@ -0,0 +1,144 @@ > +/* SPDX-License-Identifier: BSD-2-Clause */ > + > +/** > + * @file > + * > + * @brief BSP specific initialization support routines > + * > + */ > + > +/* > + * COPYRIGHT (c) 1989-2020. > + * On-Line Applications Research Corporation (OAR). > + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. > + */ > + > +#include > +#include > + > +#include > + > +#include > + > +/* > + * 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 const char memory_path[] = "/memory"; > + > +static void* get_end_of_memory_from_fdt(void) > +{ > + const void *fdt; > + const void *val; > + int node; > + int parent; > + int ac; > + int sc; > + int len; > + uintptr_t start; > + uintptr_t size; > + > + fdt = bsp_fdt_get(); > + > + node = fdt_path_offset_namelen( > +fdt, > +memory_path, > +(int) sizeof(memory_path) - 1 > + ); > + > + if (node < 0) { > +return NULL; > + } > + > + parent = fdt_parent_offset(fdt, node); > + if (parent < 0) { > +return NULL; > + } > + > + ac = fdt_address_cells(fdt, parent); > + if (ac != 1 && ac != 2) { > +return NULL; > + } > + > + sc = fdt_size_cells(fdt, parent); > + if (sc != 1 && sc != 2) { > +return NULL; > + } > + > + if (sc > ac) { > +return NULL; > + } > + > + val = fdt_getprop(fdt, node, "reg", &len); > + if (len < sc + ac) { > +return NULL; > + } > + > + if (ac == 1) { > +start = fdt32_to_cpu(((fdt32_t *)val)[0]); > +size = fdt32_to_cpu(((fdt32_t *)val)[1]); > + } > + > + if (ac == 2) { > +start = fdt64_to_cpu(((fdt64_t *)val)[0]); > + > +if (sc == 1) > + size = fdt32_to_cpu(((fdt32_t *)(val+8))[0]); > +else > + size = fdt64_to_cpu(((fdt64_t *)val)[1]); > + } > + > + return (void*) (start + size); > +} > + > +static void bsp_memory_initialize( void ) > +{ > + void *end; > + > + /* get end of memory from the "/memory" node in the fdt */ > + end = get_end_of_memory_from_fdt(); > + if (end == 0) { > NULL instead of 0? > +/* fall back to linker symbol if "/memory" node not found or invalid > */ > +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/spec/build/bsps/riscv/noel/obj.yml > b/spec/build/bsps/riscv/noel/obj.yml > index e1b652fa93..f9902f83b5 100644 > --- a/spec/build/bsps/riscv/noel/obj.yml > +++ b/spec/build/bsps/riscv/noel/obj.
Re: [PATCH] bsp/riscv: Work area size based on /memory node in fdt
Sure, I can move it to the shared directory (riscv/shared/start). On 2022-08-17 11:16, Hesham Almatary wrote: Thanks for the patch. LGTM. I wonder if we can also reuse that for the generic shared RISC-V BSP (e.g., bsps/riscv/riscv) instead of just NOEL? On Wed, 17 Aug 2022 at 09:58, Daniel Cederman wrote: Uses the first entry in the /memory node to determine the end of the work area. Falls back on linker symbol if unable to parse the node. --- bsps/riscv/noel/start/bspgetworkarea.c | 144 + spec/build/bsps/riscv/noel/obj.yml | 1 + 2 files changed, 145 insertions(+) create mode 100644 bsps/riscv/noel/start/bspgetworkarea.c diff --git a/bsps/riscv/noel/start/bspgetworkarea.c b/bsps/riscv/noel/start/bspgetworkarea.c new file mode 100644 index 00..1fa051d25e --- /dev/null +++ b/bsps/riscv/noel/start/bspgetworkarea.c @@ -0,0 +1,144 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief BSP specific initialization support routines + * + */ + +/* + * COPYRIGHT (c) 1989-2020. + * On-Line Applications Research Corporation (OAR). + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + */ + +#include +#include + +#include + +#include + +/* + * 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 const char memory_path[] = "/memory"; + +static void* get_end_of_memory_from_fdt(void) +{ + const void *fdt; + const void *val; + int node; + int parent; + int ac; + int sc; + int len; + uintptr_t start; + uintptr_t size; + + fdt = bsp_fdt_get(); + + node = fdt_path_offset_namelen( + fdt, + memory_path, + (int) sizeof(memory_path) - 1 + ); + + if (node < 0) { + return NULL; + } + + parent = fdt_parent_offset(fdt, node); + if (parent < 0) { + return NULL; + } + + ac = fdt_address_cells(fdt, parent); + if (ac != 1 && ac != 2) { + return NULL; + } + + sc = fdt_size_cells(fdt, parent); + if (sc != 1 && sc != 2) { + return NULL; + } + + if (sc > ac) { + return NULL; + } + + val = fdt_getprop(fdt, node, "reg", &len); + if (len < sc + ac) { + return NULL; + } + + if (ac == 1) { + start = fdt32_to_cpu(((fdt32_t *)val)[0]); + size = fdt32_to_cpu(((fdt32_t *)val)[1]); + } + + if (ac == 2) { + start = fdt64_to_cpu(((fdt64_t *)val)[0]); + + if (sc == 1) + size = fdt32_to_cpu(((fdt32_t *)(val+8))[0]); + else + size = fdt64_to_cpu(((fdt64_t *)val)[1]); + } + + return (void*) (start + size); +} + +static void bsp_memory_initialize( void ) +{ + void *end; + + /* get end of memory from the "/memory" node in the fdt */ + end = get_end_of_memory_from_fdt(); + if (end == 0) { NULL instead of 0? + /* fall back to linker symbol if "/memory" node not found or invalid */ + end = RamEnd; + } + _Memory_Initialize( &_Memory_Areas[ 0 ], WorkAreaBase, end ); +} + +RTEMS_SYSINIT_ITEM( + bsp_memory_initialize, + RTEMS_SYSINIT_MEMORY,
[PATCH v2 1/1] bsp/riscv: Work area size based on /memory node in fdt
Uses the first entry in the /memory node to determine the end of the work area. Falls back on linker symbol if unable to parse the node. --- bsps/riscv/shared/start/bspgetworkarea.c | 144 +++ spec/build/bsps/riscv/riscv/obj.yml | 1 + 2 files changed, 145 insertions(+) create mode 100644 bsps/riscv/shared/start/bspgetworkarea.c diff --git a/bsps/riscv/shared/start/bspgetworkarea.c b/bsps/riscv/shared/start/bspgetworkarea.c new file mode 100644 index 00..1fa051d25e --- /dev/null +++ b/bsps/riscv/shared/start/bspgetworkarea.c @@ -0,0 +1,144 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief BSP specific initialization support routines + * + */ + +/* + * COPYRIGHT (c) 1989-2020. + * On-Line Applications Research Corporation (OAR). + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + */ + +#include +#include + +#include + +#include + +/* + * 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 const char memory_path[] = "/memory"; + +static void* get_end_of_memory_from_fdt(void) +{ + const void *fdt; + const void *val; + int node; + int parent; + int ac; + int sc; + int len; + uintptr_t start; + uintptr_t size; + + fdt = bsp_fdt_get(); + + node = fdt_path_offset_namelen( +fdt, +memory_path, +(int) sizeof(memory_path) - 1 + ); + + if (node < 0) { +return NULL; + } + + parent = fdt_parent_offset(fdt, node); + if (parent < 0) { +return NULL; + } + + ac = fdt_address_cells(fdt, parent); + if (ac != 1 && ac != 2) { +return NULL; + } + + sc = fdt_size_cells(fdt, parent); + if (sc != 1 && sc != 2) { +return NULL; + } + + if (sc > ac) { +return NULL; + } + + val = fdt_getprop(fdt, node, "reg", &len); + if (len < sc + ac) { +return NULL; + } + + if (ac == 1) { +start = fdt32_to_cpu(((fdt32_t *)val)[0]); +size = fdt32_to_cpu(((fdt32_t *)val)[1]); + } + + if (ac == 2) { +start = fdt64_to_cpu(((fdt64_t *)val)[0]); + +if (sc == 1) + size = fdt32_to_cpu(((fdt32_t *)(val+8))[0]); +else + size = fdt64_to_cpu(((fdt64_t *)val)[1]); + } + + return (void*) (start + size); +} + +static void bsp_memory_initialize( void ) +{ + void *end; + + /* get end of memory from the "/memory" node in the fdt */ + end = get_end_of_memory_from_fdt(); + if (end == 0) { +/* fall back to linker symbol if "/memory" node not found or invalid */ +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/spec/build/bsps/riscv/riscv/obj.yml b/spec/build/bsps/riscv/riscv/obj.yml index 5e767be1bb..b2eb467824 100644 --- a/spec/build/bsps/riscv/riscv/obj.yml +++ b/spec/build/bsps/riscv/riscv/obj.yml @@ -29,6 +29,7 @@ source: - bsps/riscv/riscv/irq/irq.c - bsps/riscv/riscv/start/bsp_fatal_halt.c - bsps/riscv/riscv/start/bspstart.c +- bsps/riscv/shared/start/bspgetworkarea.c - bsps/shared/cache/nocache.c - bsps/shared/dev/btimer/btimer-cpucounter.c - bsps/shared/dev/getentropy/getentropy-cpucounter.c -- 2.34.1 ___ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel
Re: [PATCH v2 1/1] bsp/riscv: Work area size based on /memory node in fdt
I'm ok with this if Hesham acks as well. --joel On Wed, Aug 17, 2022 at 6:35 AM Daniel Cederman wrote: > Uses the first entry in the /memory node to determine the end of the > work area. Falls back on linker symbol if unable to parse the node. > --- > bsps/riscv/shared/start/bspgetworkarea.c | 144 +++ > spec/build/bsps/riscv/riscv/obj.yml | 1 + > 2 files changed, 145 insertions(+) > create mode 100644 bsps/riscv/shared/start/bspgetworkarea.c > > diff --git a/bsps/riscv/shared/start/bspgetworkarea.c > b/bsps/riscv/shared/start/bspgetworkarea.c > new file mode 100644 > index 00..1fa051d25e > --- /dev/null > +++ b/bsps/riscv/shared/start/bspgetworkarea.c > @@ -0,0 +1,144 @@ > +/* SPDX-License-Identifier: BSD-2-Clause */ > + > +/** > + * @file > + * > + * @brief BSP specific initialization support routines > + * > + */ > + > +/* > + * COPYRIGHT (c) 1989-2020. > + * On-Line Applications Research Corporation (OAR). > + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. > + */ > + > +#include > +#include > + > +#include > + > +#include > + > +/* > + * 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 const char memory_path[] = "/memory"; > + > +static void* get_end_of_memory_from_fdt(void) > +{ > + const void *fdt; > + const void *val; > + int node; > + int parent; > + int ac; > + int sc; > + int len; > + uintptr_t start; > + uintptr_t size; > + > + fdt = bsp_fdt_get(); > + > + node = fdt_path_offset_namelen( > +fdt, > +memory_path, > +(int) sizeof(memory_path) - 1 > + ); > + > + if (node < 0) { > +return NULL; > + } > + > + parent = fdt_parent_offset(fdt, node); > + if (parent < 0) { > +return NULL; > + } > + > + ac = fdt_address_cells(fdt, parent); > + if (ac != 1 && ac != 2) { > +return NULL; > + } > + > + sc = fdt_size_cells(fdt, parent); > + if (sc != 1 && sc != 2) { > +return NULL; > + } > + > + if (sc > ac) { > +return NULL; > + } > + > + val = fdt_getprop(fdt, node, "reg", &len); > + if (len < sc + ac) { > +return NULL; > + } > + > + if (ac == 1) { > +start = fdt32_to_cpu(((fdt32_t *)val)[0]); > +size = fdt32_to_cpu(((fdt32_t *)val)[1]); > + } > + > + if (ac == 2) { > +start = fdt64_to_cpu(((fdt64_t *)val)[0]); > + > +if (sc == 1) > + size = fdt32_to_cpu(((fdt32_t *)(val+8))[0]); > +else > + size = fdt64_to_cpu(((fdt64_t *)val)[1]); > + } > + > + return (void*) (start + size); > +} > + > +static void bsp_memory_initialize( void ) > +{ > + void *end; > + > + /* get end of memory from the "/memory" node in the fdt */ > + end = get_end_of_memory_from_fdt(); > + if (end == 0) { > +/* fall back to linker symbol if "/memory" node not found or invalid > */ > +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/spec/build/bsps/riscv/riscv/obj.yml > b/spec/build/bsps/riscv/riscv/obj.yml > index 5e767be1bb..b2eb467824 100644 > --- a/spec/build/bsps/riscv/riscv/obj.yml > +++ b/spec/build/bsps/riscv/riscv/obj.yml > @@ -29,6 +29,7 @@ source: > - bsps/riscv/riscv/irq/irq.c > - bsps/riscv/riscv/start/bsp_fatal_
qoriq build of rtems-libbsd
Hi Not sure what's going on but 6-freebsd-12 does not build for qoriq_e6500_32 In file included from parse.y:88: ../../freebsd/sbin/pfctl/pfctl_parser.h:181:27: error: expected ')' before numeric constant 181 | BITSET_DEFINE(qpri_bitset, QPRI_BITSET_SIZE); | ^ | ) ../../freebsd/sbin/pfctl/pfctl_parser.h:189:49: error: field 'qpris' has incomplete type 189 | struct qpri_bitset qpris; | ^ Waf: Leaving directory `/home/joel/rtems-work/rtems-libbsd/build/powerpc-rtems6-qoriq_e6500_32-default' Build failed ___ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel
Re: qoriq build of rtems-libbsd
Sorry. Forgot to update my libbsd tree and got the wrong error. It is this: /home/joel/rtems-work/tools/6/lib/gcc/powerpc-rtems6/12.1.1/../../../../powerpc-rtems6/bin/ld: ./libbsd.a(nfs_clbio.c.10.o): the target (_bsd_unmapped_buf) of a R_PPC_SDAREL16 relocation is in the wrong output section (.data) ./libbsd.a(nfs_clbio.c.10.o): in function `ncl_putpages': /home/joel/rtems-work/rtems-libbsd/build/powerpc-rtems6-qoriq_e6500_32-default/../../freebsd/sys/fs/nfsclient/nfs_clbio.c:349:(.text.ncl_putpages+0x22a): relocation truncated to fit: R_PPC_SDAREL16 against symbol `_bsd_unmapped_buf' defined in .data.read_mostly section in ./libbsd.a(vfs_bio.c.20.o) collect2: error: ld returned 1 exit status On Wed, Aug 17, 2022 at 3:44 PM Joel Sherrill wrote: > Hi > > Not sure what's going on but 6-freebsd-12 does not build for qoriq_e6500_32 > > In file included from parse.y:88: > ../../freebsd/sbin/pfctl/pfctl_parser.h:181:27: error: expected ')' before > numeric constant > 181 | BITSET_DEFINE(qpri_bitset, QPRI_BITSET_SIZE); > | ^ > | ) > ../../freebsd/sbin/pfctl/pfctl_parser.h:189:49: error: field 'qpris' has > incomplete type > 189 | struct qpri_bitset qpris; > | ^ > > Waf: Leaving directory > `/home/joel/rtems-work/rtems-libbsd/build/powerpc-rtems6-qoriq_e6500_32-default' > Build failed > ___ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel
Re: qoriq build of rtems-libbsd
And the same error happens on qm8xx_stk8xx. On Wed, Aug 17, 2022 at 4:01 PM Joel Sherrill wrote: > Sorry. Forgot to update my libbsd tree and got the wrong error. It is this: > > /home/joel/rtems-work/tools/6/lib/gcc/powerpc-rtems6/12.1.1/../../../../powerpc-rtems6/bin/ld: > ./libbsd.a(nfs_clbio.c.10.o): the target (_bsd_unmapped_buf) of a > R_PPC_SDAREL16 relocation is in the wrong output section (.data) > ./libbsd.a(nfs_clbio.c.10.o): in function `ncl_putpages': > /home/joel/rtems-work/rtems-libbsd/build/powerpc-rtems6-qoriq_e6500_32-default/../../freebsd/sys/fs/nfsclient/nfs_clbio.c:349:(.text.ncl_putpages+0x22a): > relocation truncated to fit: R_PPC_SDAREL16 against symbol > `_bsd_unmapped_buf' defined in .data.read_mostly section in > ./libbsd.a(vfs_bio.c.20.o) > collect2: error: ld returned 1 exit status > > On Wed, Aug 17, 2022 at 3:44 PM Joel Sherrill wrote: > >> Hi >> >> Not sure what's going on but 6-freebsd-12 does not build for >> qoriq_e6500_32 >> >> In file included from parse.y:88: >> ../../freebsd/sbin/pfctl/pfctl_parser.h:181:27: error: expected ')' >> before numeric constant >> 181 | BITSET_DEFINE(qpri_bitset, QPRI_BITSET_SIZE); >> | ^ >> | ) >> ../../freebsd/sbin/pfctl/pfctl_parser.h:189:49: error: field 'qpris' has >> incomplete type >> 189 | struct qpri_bitset qpris; >> | ^ >> >> Waf: Leaving directory >> `/home/joel/rtems-work/rtems-libbsd/build/powerpc-rtems6-qoriq_e6500_32-default' >> Build failed >> > ___ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel
libbsd fails to link on i386
Hi I think the wrong bus.h must be being included somewhere. These are static inline methods on the i386. Hopefully a simple patch for someone who knows what to do: [1992/2039] Linking build/i386-rtems6-pc386-default/ftpd01.exe /home/joel/rtems-work/tools/6/lib/gcc/i386-rtems6/12.1.1/../../../../i386-rtems6/bin/ld: ./libbsd.a(rtems-kernel-bus-dma.c.20.o): in function `_bsd_bus_dmamem_alloc': /home/joel/rtems-work/rtems-libbsd/build/i386-rtems6-pc386-default/../../rtemsbsd/rtems/rtems-kernel-bus-dma.c:264: undefined reference to `bsp_bus_space_write_1' collect2: error: ld returned 1 exit status /home/joel/rtems-work/tools/6/lib/gcc/i386-rtems6/12.1.1/../../../../i386-rtems6/bin/ld: ./libbsd.a(rtems-kernel-bus-dma.c.20.o): in function `_bsd_bus_dmamem_alloc': /home/joel/rtems-work/rtems-libbsd/build/i386-rtems6-pc386-default/../../rtemsbsd/rtems/rtems-kernel-bus-dma.c:264: undefined reference to `bsp_bus_space_write_1' collect2: error: ld returned 1 exit status /home/joel/rtems-work/tools/6/lib/gcc/i386-rtems6/12.1.1/../../../../i386-rtems6/bin/ld: ./libbsd.a(rtems-kernel-bus-dma.c.20.o): in function `_bsd_bus_dmamem_alloc': /home/joel/rtems-work/rtems-libbsd/build/i386-rtems6-pc386-default/../../rtemsbsd/rtems/rtems-kernel-bus-dma.c:264: undefined reference to `bsp_bus_space_write_1' collect2: error: ld returned 1 exit status /home/joel/rtems-work/tools/6/lib/gcc/i386-rtems6/12.1.1/../../../../i386-rtems6/bin/ld: ./libbsd.a(rtems-kernel-bus-dma.c.20.o): in function `_bsd_bus_dmamem_alloc': /home/joel/rtems-work/rtems-libbsd/build/i386-rtems6-pc386-default/../../rtemsbsd/rtems/rtems-kernel-bus-dma.c:264: undefined reference to `bsp_bus_space_write_1' collect2: error: ld returned 1 exit status /home/joel/rtems-work/tools/6/lib/gcc/i386-rtems6/12.1.1/../../../../i386-rtems6/bin/ld: ./libbsd.a(rtems-kernel-bus-dma.c.20.o): in function `_bsd_bus_dmamem_alloc': /home/joel/rtems-work/rtems-libbsd/build/i386-rtems6-pc386-default/../../rtemsbsd/rtems/rtems-kernel-bus-dma.c:264: undefined reference to `bsp_bus_space_write_1' collect2: error: ld returned 1 exit status /home/joel/rtems-work/tools/6/lib/gcc/i386-rtems6/12.1.1/../../../../i386-rtems6/bin/ld: ./libbsd.a(rtems-kernel-bus-dma.c.20.o): in function `_bsd_bus_dmamem_alloc': /home/joel/rtems-work/rtems-libbsd/build/i386-rtems6-pc386-default/../../rtemsbsd/rtems/rtems-kernel-bus-dma.c:264: undefined reference to `bsp_bus_space_write_1' collect2: error: ld returned 1 exit status /home/joel/rtems-work/tools/6/lib/gcc/i386-rtems6/12.1.1/../../../../i386-rtems6/bin/ld: ./libbsd.a(rtems-kernel-bus-dma.c.20.o): in function `_bsd_bus_dmamem_alloc': /home/joel/rtems-work/rtems-libbsd/build/i386-rtems6-pc386-default/../../rtemsbsd/rtems/rtems-kernel-bus-dma.c:264: undefined reference to `bsp_bus_space_write_1' collect2: error: ld returned 1 exit status /home/joel/rtems-work/tools/6/lib/gcc/i386-rtems6/12.1.1/../../../../i386-rtems6/bin/ld: ./libbsd.a(rtems-kernel-bus-dma.c.20.o): in function `_bsd_bus_dmamem_alloc': /home/joel/rtems-work/rtems-libbsd/build/i386-rtems6-pc386-default/../../rtemsbsd/rtems/rtems-kernel-bus-dma.c:264: undefined reference to `bsp_bus_space_write_1' collect2: error: ld returned 1 exit status ___ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel
Re: libbsd fails to link on i386
On 18/8/2022 7:23 am, Joel Sherrill wrote: > I think the wrong bus.h must be being included somewhere. These are static > inline methods on the i386. Hopefully a simple patch for someone who knows > what > to do: Could it be installed with the BSP? Does it happen with a clean prefix? Chris ___ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel