From 37030e38c61c0d0a8b0742af75f115bda779c46d Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 9 Dec 2015 08:05:57 +0100 Subject: bsps: Call bsp_work_area_initialize() early Call bsp_work_area_initialize() before bsp_start(). This allows bsp_start() to use malloc() etc. which is beneficial for systems with a plug-and-play hardware enumeration. Update #2408. --- c/src/lib/libbsp/arm/lpc176x/Makefile.am | 1 + c/src/lib/libbsp/arm/lpc176x/startup/bspstart.c | 6 ++- c/src/lib/libbsp/arm/lpc24xx/Makefile.am | 1 + c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c | 4 +- c/src/lib/libbsp/i386/pc386/include/bsp.h | 2 - .../lib/libbsp/i386/pc386/startup/bspgetworkarea.c | 13 ++++-- c/src/lib/libbsp/i386/pc386/startup/bspstart.c | 5 --- c/src/lib/libbsp/shared/bootcard.c | 8 ++-- c/src/lib/libbsp/shared/include/bootcard.h | 2 +- c/src/lib/libbsp/sparc/erc32/Makefile.am | 1 - c/src/lib/libbsp/sparc/erc32/include/bsp.h | 7 ---- c/src/lib/libbsp/sparc/leon2/Makefile.am | 1 - c/src/lib/libbsp/sparc/leon2/include/bsp.h | 7 ---- c/src/lib/libbsp/sparc/leon3/Makefile.am | 3 +- c/src/lib/libbsp/sparc/leon3/include/bsp.h | 7 ---- c/src/lib/libbsp/sparc/shared/amba/ambapp.c | 10 ++--- .../libbsp/sparc/shared/startup/bspgetworkarea.c | 8 +--- .../lib/libbsp/sparc/shared/startup/early_malloc.c | 47 ---------------------- 18 files changed, 31 insertions(+), 102 deletions(-) delete mode 100644 c/src/lib/libbsp/sparc/shared/startup/early_malloc.c (limited to 'c') diff --git a/c/src/lib/libbsp/arm/lpc176x/Makefile.am b/c/src/lib/libbsp/arm/lpc176x/Makefile.am index 352b2d97fe..54eae6e688 100644 --- a/c/src/lib/libbsp/arm/lpc176x/Makefile.am +++ b/c/src/lib/libbsp/arm/lpc176x/Makefile.am @@ -94,6 +94,7 @@ libbsp_a_SOURCES += ../../shared/bspclean.c libbsp_a_SOURCES += ../../shared/bspgetworkarea.c libbsp_a_SOURCES += ../../shared/bsplibc.c libbsp_a_SOURCES += ../../shared/bsppost.c +libbsp_a_SOURCES += ../../shared/bsppretaskinghook.c libbsp_a_SOURCES += ../../shared/bsppredriverhook.c libbsp_a_SOURCES += ../../shared/gnatinstallhandler.c libbsp_a_SOURCES += ../../shared/sbrk.c diff --git a/c/src/lib/libbsp/arm/lpc176x/startup/bspstart.c b/c/src/lib/libbsp/arm/lpc176x/startup/bspstart.c index 1aa8e0ffe9..f1aba444fc 100644 --- a/c/src/lib/libbsp/arm/lpc176x/startup/bspstart.c +++ b/c/src/lib/libbsp/arm/lpc176x/startup/bspstart.c @@ -42,7 +42,7 @@ LINKER_SYMBOL( lpc176x_region_heap_1_end ); extern Heap_Control *RTEMS_Malloc_Heap; #endif -void bsp_pretasking_hook( void ) +static void heap_extend( void ) { #ifdef LPC176X_HEAP_EXTEND _Heap_Extend( RTEMS_Malloc_Heap, @@ -86,4 +86,6 @@ void bsp_start( void ) /* DMA */ lpc176x_dma_initialize(); -} \ No newline at end of file + + heap_extend(); +} diff --git a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am index c7fcb86d13..bc5772bdc5 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am +++ b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am @@ -96,6 +96,7 @@ libbsp_a_SOURCES += ../../shared/bootcard.c \ ../../shared/bspgetworkarea.c \ ../../shared/bsplibc.c \ ../../shared/bsppost.c \ + ../../shared/bsppretaskinghook.c \ ../../shared/bsppredriverhook.c \ ../../shared/gnatinstallhandler.c \ ../../shared/sbrk.c \ diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c index dbceb0190c..6f00f35f99 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c @@ -43,7 +43,7 @@ extern Heap_Control *RTEMS_Malloc_Heap; #endif -void bsp_pretasking_hook(void) +static void heap_extend(void) { #ifdef LPC24XX_HEAP_EXTEND _Heap_Extend( @@ -91,4 +91,6 @@ void bsp_start(void) /* DMA */ lpc24xx_dma_initialize(); + + heap_extend(); } diff --git a/c/src/lib/libbsp/i386/pc386/include/bsp.h b/c/src/lib/libbsp/i386/pc386/include/bsp.h index 5a82ac2122..d9f24e47b4 100644 --- a/c/src/lib/libbsp/i386/pc386/include/bsp.h +++ b/c/src/lib/libbsp/i386/pc386/include/bsp.h @@ -187,8 +187,6 @@ void Calibrate_loop_1ms(void); /* from 'timer.c' */ void rtems_irq_mngt_init(void); /* from 'irq_init.c' */ -void bsp_size_memory(void); /* from 'bspstart.c' */ - #if (BSP_IS_EDISON == 0) void Clock_driver_install_handler(void); /* from 'ckinit.c' */ void Clock_driver_support_initialize_hardware(void); /* from 'ckinit.c' */ diff --git a/c/src/lib/libbsp/i386/pc386/startup/bspgetworkarea.c b/c/src/lib/libbsp/i386/pc386/startup/bspgetworkarea.c index 2e4bf5ca34..5207bac6c1 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/bspgetworkarea.c +++ b/c/src/lib/libbsp/i386/pc386/startup/bspgetworkarea.c @@ -52,7 +52,7 @@ uint32_t bsp_mem_size = 0; /* Size of stack used during initialization. Defined in 'start.s'. */ extern uint32_t _stack_size; -void bsp_size_memory(void) +static void bsp_size_memory(void) { uintptr_t topAddr; @@ -126,8 +126,15 @@ void bsp_size_memory(void) void bsp_work_area_initialize(void) { - void *area_start = (void *) rtemsWorkAreaStart; - uintptr_t area_size = (uintptr_t) bsp_mem_size - (uintptr_t) rtemsWorkAreaStart; + void *area_start; + uintptr_t area_size; + /* + * We need to determine how much memory there is in the system. + */ + bsp_size_memory(); + + area_start = (void *) rtemsWorkAreaStart; + area_size = (uintptr_t) bsp_mem_size - (uintptr_t) rtemsWorkAreaStart; bsp_work_area_initialize_default( area_start, area_size ); } diff --git a/c/src/lib/libbsp/i386/pc386/startup/bspstart.c b/c/src/lib/libbsp/i386/pc386/startup/bspstart.c index 9b1be6407d..ac871f0565 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/bspstart.c +++ b/c/src/lib/libbsp/i386/pc386/startup/bspstart.c @@ -57,11 +57,6 @@ static void bsp_pci_initialize_helper(void) +--------------------------------------------------------------------------*/ static void bsp_start_default( void ) { - /* - * We need to determine how much memory there is in the system. - */ - bsp_size_memory(); - /* * Turn off watchdog */ diff --git a/c/src/lib/libbsp/shared/bootcard.c b/c/src/lib/libbsp/shared/bootcard.c index eeb5746fca..cbeb7b2686 100644 --- a/c/src/lib/libbsp/shared/bootcard.c +++ b/c/src/lib/libbsp/shared/bootcard.c @@ -75,14 +75,14 @@ void boot_card( bsp_boot_cmdline = cmdline; /* - * Invoke Board Support Package initialization routine written in C. + * Initialize the RTEMS Workspace and the C Program Heap. */ - bsp_start(); + bsp_work_area_initialize(); /* - * Initialize the RTEMS Workspace and the C Program Heap. + * Invoke Board Support Package initialization routine written in C. */ - bsp_work_area_initialize(); + bsp_start(); /* * Initialize RTEMS data structures diff --git a/c/src/lib/libbsp/shared/include/bootcard.h b/c/src/lib/libbsp/shared/include/bootcard.h index 93d5041cb4..7c0d3f154e 100644 --- a/c/src/lib/libbsp/shared/include/bootcard.h +++ b/c/src/lib/libbsp/shared/include/bootcard.h @@ -78,9 +78,9 @@ void bsp_reset(void); * * - disable interrupts, interrupts will be enabled during the first context * switch - * - bsp_start() - more advanced initialization * - bsp_work_area_initialize() - initialize the RTEMS Workspace and the C * Program Heap + * - bsp_start() - more advanced initialization * - rtems_initialize_data_structures() * - initialize C Library * - bsp_pretasking_hook() diff --git a/c/src/lib/libbsp/sparc/erc32/Makefile.am b/c/src/lib/libbsp/sparc/erc32/Makefile.am index b00853afb1..f0465b0503 100644 --- a/c/src/lib/libbsp/sparc/erc32/Makefile.am +++ b/c/src/lib/libbsp/sparc/erc32/Makefile.am @@ -43,7 +43,6 @@ libbsp_a_SOURCES += startup/erc32mec.c libbsp_a_SOURCES += startup/boardinit.S libbsp_a_SOURCES += startup/bspidle.c libbsp_a_SOURCES += startup/bspdelay.c -libbsp_a_SOURCES += ../../sparc/shared/startup/early_malloc.c libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_exit.c libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_halt.c # ISR Handler diff --git a/c/src/lib/libbsp/sparc/erc32/include/bsp.h b/c/src/lib/libbsp/sparc/erc32/include/bsp.h index 942a873772..86336349ae 100644 --- a/c/src/lib/libbsp/sparc/erc32/include/bsp.h +++ b/c/src/lib/libbsp/sparc/erc32/include/bsp.h @@ -93,13 +93,6 @@ void BSP_fatal_exit(uint32_t error); void bsp_spurious_initialize( void ); -/* Allocate 8-byte aligned non-freeable pre-malloc() memory. The function - * can be called at any time. The work-area will shrink when called before - * bsp_work_area_initialize(). malloc() is called to get memory when this - * function is called after bsp_work_area_initialize(). - */ -void *bsp_early_malloc(int size); - /* Interrupt Service Routine (ISR) pointer */ typedef void (*bsp_shared_isr)(void *arg); diff --git a/c/src/lib/libbsp/sparc/leon2/Makefile.am b/c/src/lib/libbsp/sparc/leon2/Makefile.am index 7eada5999f..2b5d1956dd 100644 --- a/c/src/lib/libbsp/sparc/leon2/Makefile.am +++ b/c/src/lib/libbsp/sparc/leon2/Makefile.am @@ -42,7 +42,6 @@ libbsp_a_SOURCES += startup/setvec.c libbsp_a_SOURCES += startup/spurious.c libbsp_a_SOURCES += startup/bspidle.c libbsp_a_SOURCES += startup/bspdelay.c -libbsp_a_SOURCES += ../../sparc/shared/startup/early_malloc.c libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_exit.c libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_halt.c diff --git a/c/src/lib/libbsp/sparc/leon2/include/bsp.h b/c/src/lib/libbsp/sparc/leon2/include/bsp.h index 09cf7f702a..acc310a6e1 100644 --- a/c/src/lib/libbsp/sparc/leon2/include/bsp.h +++ b/c/src/lib/libbsp/sparc/leon2/include/bsp.h @@ -117,13 +117,6 @@ void BSP_fatal_exit(uint32_t error); void bsp_spurious_initialize( void ); -/* Allocate 8-byte aligned non-freeable pre-malloc() memory. The function - * can be called at any time. The work-area will shrink when called before - * bsp_work_area_initialize(). malloc() is called to get memory when this - * function is called after bsp_work_area_initialize(). - */ -void *bsp_early_malloc(int size); - /* Interrupt Service Routine (ISR) pointer */ typedef void (*bsp_shared_isr)(void *arg); diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am b/c/src/lib/libbsp/sparc/leon3/Makefile.am index d261f9988c..95f10ebe5b 100644 --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am @@ -38,8 +38,7 @@ libbsp_a_SOURCES += ../../shared/bsplibc.c \ ../../shared/bsppretaskinghook.c startup/bsppredriver.c \ ../../sparc/shared/startup/bspgetworkarea.c ../../shared/sbrk.c \ startup/setvec.c \ - startup/spurious.c startup/bspidle.S startup/bspdelay.c \ - ../../sparc/shared/startup/early_malloc.c + startup/spurious.c startup/bspidle.S startup/bspdelay.c libbsp_a_SOURCES += startup/cpucounter.c libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_exit.c libbsp_a_SOURCES += startup/bsp_fatal_halt.c diff --git a/c/src/lib/libbsp/sparc/leon3/include/bsp.h b/c/src/lib/libbsp/sparc/leon3/include/bsp.h index 5642e14c57..1397716c53 100644 --- a/c/src/lib/libbsp/sparc/leon3/include/bsp.h +++ b/c/src/lib/libbsp/sparc/leon3/include/bsp.h @@ -140,13 +140,6 @@ void bsp_spurious_initialize( void ); */ void rtems_bsp_delay(int usecs); -/* Allocate 8-byte aligned non-freeable pre-malloc() memory. The function - * can be called at any time. The work-area will shrink when called before - * bsp_work_area_initialize(). malloc() is called to get memory when this - * function is called after bsp_work_area_initialize(). - */ -void *bsp_early_malloc(int size); - /* Interrupt Service Routine (ISR) pointer */ typedef void (*bsp_shared_isr)(void *arg); diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp.c b/c/src/lib/libbsp/sparc/shared/amba/ambapp.c index dba56c1f48..e4f1aacbd1 100644 --- a/c/src/lib/libbsp/sparc/shared/amba/ambapp.c +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp.c @@ -23,18 +23,16 @@ /* Allocate one AMBA device */ static struct ambapp_dev *ambapp_alloc_dev_struct(int dev_type) { - int size = sizeof(struct ambapp_dev); struct ambapp_dev *dev; + size_t size = sizeof(*dev); if (dev_type == DEV_APB_SLV) size += sizeof(struct ambapp_apb_info); else size += sizeof(struct ambapp_ahb_info); /* AHB */ - dev = (struct ambapp_dev *)bsp_early_malloc(size); - if (dev == NULL) - return NULL; - memset(dev, 0 , size); - dev->dev_type = dev_type; + dev = (struct ambapp_dev *)calloc(1, size); + if (dev != NULL) + dev->dev_type = dev_type; return dev; } diff --git a/c/src/lib/libbsp/sparc/shared/startup/bspgetworkarea.c b/c/src/lib/libbsp/sparc/shared/startup/bspgetworkarea.c index a68d295826..b05113d9eb 100644 --- a/c/src/lib/libbsp/sparc/shared/startup/bspgetworkarea.c +++ b/c/src/lib/libbsp/sparc/shared/startup/bspgetworkarea.c @@ -20,9 +20,6 @@ /* Tells us where to put the workspace in case remote debugger is present. */ extern uint32_t rdb_start; -/* Must be aligned to 8, _end is aligned to 8 */ -unsigned int early_mem = (unsigned int)&end; - /* * This method returns the base address and size of the area which * is to be allocated between the RTEMS Workspace and the C Program @@ -34,10 +31,9 @@ void bsp_work_area_initialize(void) #define STACK_SIZE (16 * 1024) /* Early dynamic memory allocator is placed just above _end */ - void *work_area_start = (void *)early_mem; + void *work_area_start = (void *)&end; uintptr_t work_area_size = - (uintptr_t)rdb_start - (uintptr_t)early_mem - STACK_SIZE; - early_mem = ~0; /* Signal bsp_early_malloc not to be used anymore */ + (uintptr_t)rdb_start - (uintptr_t)&end - STACK_SIZE; /* * The following may be helpful in debugging what goes wrong when diff --git a/c/src/lib/libbsp/sparc/shared/startup/early_malloc.c b/c/src/lib/libbsp/sparc/shared/startup/early_malloc.c deleted file mode 100644 index 911a7b019b..0000000000 --- a/c/src/lib/libbsp/sparc/shared/startup/early_malloc.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Early dynamic memory allocation (not freeable) for BSP - * boot routines. Minimum alignment 8 bytes. Memory is - * allocated after _end, it will shrink the workspace. - * - * COPYRIGHT (c) 2011. - * Aeroflex 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 -#include - -/* Tells us where to put the workspace in case remote debugger is present. */ -extern uint32_t rdb_start; - -/* Must be aligned to 8 */ -extern unsigned int early_mem; - -/* must be identical to STACK_SIZE in start.S */ -#define STACK_SIZE (16 * 1024) - -/* Allocate 8-byte aligned non-freeable pre-malloc() memory. The function - * can be called at any time. The work-area will shrink when called before - * bsp_work_area_initialize(). malloc() is called to get memory when this function - * is called after bsp_work_area_initialize(). - */ -void *bsp_early_malloc(int size) -{ - void *start; - - /* Not early anymore? */ - if (early_mem == ~0) - return malloc(size); - - size = (size + 7) & ~0x7; - if (rdb_start - STACK_SIZE - early_mem < size) - return NULL; - - start = (void *)early_mem; - early_mem += size; - - return start; -} -- cgit v1.2.3