Introduce instruction memory allocator

Necessary for dlfcn etc on ESP32, which has separate memory regions
for instruction and data.

known issues/todo
 * consider something similar to dual heaps for PROTOECTED
 * consider to adapt binfmt as well
This commit is contained in:
YAMAMOTO Takashi 2020-03-06 14:48:15 +09:00 committed by patacongo
parent 03a916acb8
commit 855751b534
6 changed files with 138 additions and 0 deletions

View File

@ -106,3 +106,7 @@ endif
ifeq ($(CONFIG_ESP32_UART),y) ifeq ($(CONFIG_ESP32_UART),y)
CMN_CSRCS += esp32_serial.c CMN_CSRCS += esp32_serial.c
endif endif
ifeq ($(CONFIG_ARCH_USE_MODULE_TEXT),y)
CHIP_CSRCS += esp32_modtext.c
endif

View File

@ -0,0 +1,86 @@
/****************************************************************************
* arch/xtensa/src/esp32/esp32_modtext.c
*
* 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/arch.h>
#include <nuttx/mm/mm.h>
#include <sys/types.h>
#include <debug.h>
/****************************************************************************
* Public Data
****************************************************************************/
extern uint32_t _smodtext;
extern uint32_t _emodtext;
/****************************************************************************
* Private Data
****************************************************************************/
struct mm_heap_s g_module_text;
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: up_module_text_init
*
* Description:
* Initialize the module text allocator
*
****************************************************************************/
void up_module_text_init()
{
mm_initialize(&g_module_text, &_smodtext, &_emodtext - &_smodtext);
}
/****************************************************************************
* Name: up_module_text_alloc
*
* Description:
* Allocate memory for module text.
*
****************************************************************************/
FAR void *up_module_text_alloc(size_t size)
{
return mm_malloc(&g_module_text, size);
}
/****************************************************************************
* Name: up_module_text_free
*
* Description:
* Free memory for module text.
*
****************************************************************************/
void up_module_text_free(FAR void *p)
{
return mm_free(&g_module_text, p);
}

View File

@ -60,3 +60,7 @@ MEMORY
/* Heap ends at top of dram0_0_seg */ /* Heap ends at top of dram0_0_seg */
_eheap = 0x40000000 - CONFIG_ESP32_TRACEMEM_RESERVE_DRAM; _eheap = 0x40000000 - CONFIG_ESP32_TRACEMEM_RESERVE_DRAM;
/* Module text area ends at top of dram0_0_seg */
_emodtext = 0x400a0000;

View File

@ -59,6 +59,10 @@ SECTIONS
*libpp.a:(.literal .text .literal.* .text.*) *libpp.a:(.literal .text .literal.* .text.*)
*libhal.a:(.literal .text .literal.* .text.*) *libhal.a:(.literal .text .literal.* .text.*)
_iram_text_end = ABSOLUTE(.); _iram_text_end = ABSOLUTE(.);
/* Module text area starts at the end of iram0_0_seg */
_smodtext = ABSOLUTE(.);
} > iram0_0_seg } > iram0_0_seg
/* Shared RAM */ /* Shared RAM */

View File

@ -70,6 +70,9 @@ SECTIONS
_text_end = ABSOLUTE(.); _text_end = ABSOLUTE(.);
_etext = .; _etext = .;
/* Module text area starts at the end of iram0_0_seg */
_smodtext = ABSOLUTE(.);
} > iram0_0_seg } > iram0_0_seg
/* Shared RAM */ /* Shared RAM */

View File

@ -160,6 +160,7 @@ EXTERN volatile bool g_rtc_enabled;
*/ */
/* EXTERN const irq_mapped_t g_irqmap[NR_IRQS]; */ /* EXTERN const irq_mapped_t g_irqmap[NR_IRQS]; */
#endif #endif
/**************************************************************************** /****************************************************************************
@ -732,6 +733,42 @@ void up_allocate_pgheap(FAR void **heap_start, size_t *heap_size);
uintptr_t pgalloc(uintptr_t brkaddr, unsigned int npages); uintptr_t pgalloc(uintptr_t brkaddr, unsigned int npages);
#endif #endif
/****************************************************************************
* Name: up_module_text_init
*
* Description:
* Initialize the module text allocator
*
****************************************************************************/
#if defined(CONFIG_ARCH_USE_MODULE_TEXT)
void up_module_text_init(void);
#endif
/****************************************************************************
* Name: up_module_text_alloc
*
* Description:
* Allocate memory for module text.
*
****************************************************************************/
#if defined(CONFIG_ARCH_USE_MODULE_TEXT)
FAR void *up_module_text_alloc(size_t size);
#endif
/****************************************************************************
* Name: up_module_text_free
*
* Description:
* Free memory for module text.
*
****************************************************************************/
#if defined(CONFIG_ARCH_USE_MODULE_TEXT)
void up_module_text_free(FAR void *p);
#endif
/**************************************************************************** /****************************************************************************
* Name: up_sched_have_garbage and up_sched_garbage_collection * Name: up_sched_have_garbage and up_sched_garbage_collection
* *