From 855751b534403877e31c286a672d696826165c05 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 6 Mar 2020 14:48:15 +0900 Subject: [PATCH] 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 --- arch/xtensa/src/esp32/Make.defs | 4 + arch/xtensa/src/esp32/esp32_modtext.c | 86 +++++++++++++++++++ .../esp32/esp32-core/scripts/esp32.template | 4 + .../esp32/esp32-core/scripts/esp32_flash.ld | 4 + .../esp32/esp32-core/scripts/esp32_iram.ld | 3 + include/nuttx/arch.h | 37 ++++++++ 6 files changed, 138 insertions(+) create mode 100644 arch/xtensa/src/esp32/esp32_modtext.c diff --git a/arch/xtensa/src/esp32/Make.defs b/arch/xtensa/src/esp32/Make.defs index 2d8d84bd77..d8c71d8749 100644 --- a/arch/xtensa/src/esp32/Make.defs +++ b/arch/xtensa/src/esp32/Make.defs @@ -106,3 +106,7 @@ endif ifeq ($(CONFIG_ESP32_UART),y) CMN_CSRCS += esp32_serial.c endif + +ifeq ($(CONFIG_ARCH_USE_MODULE_TEXT),y) +CHIP_CSRCS += esp32_modtext.c +endif diff --git a/arch/xtensa/src/esp32/esp32_modtext.c b/arch/xtensa/src/esp32/esp32_modtext.c new file mode 100644 index 0000000000..fc7d78daf6 --- /dev/null +++ b/arch/xtensa/src/esp32/esp32_modtext.c @@ -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 +#include +#include + +#include +#include + +/**************************************************************************** + * 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); +} diff --git a/boards/xtensa/esp32/esp32-core/scripts/esp32.template b/boards/xtensa/esp32/esp32-core/scripts/esp32.template index e7099a0752..7bb7395812 100644 --- a/boards/xtensa/esp32/esp32-core/scripts/esp32.template +++ b/boards/xtensa/esp32/esp32-core/scripts/esp32.template @@ -60,3 +60,7 @@ MEMORY /* Heap ends at top of dram0_0_seg */ _eheap = 0x40000000 - CONFIG_ESP32_TRACEMEM_RESERVE_DRAM; + +/* Module text area ends at top of dram0_0_seg */ + +_emodtext = 0x400a0000; diff --git a/boards/xtensa/esp32/esp32-core/scripts/esp32_flash.ld b/boards/xtensa/esp32/esp32-core/scripts/esp32_flash.ld index 3cc70c124d..bccf2aa8cd 100644 --- a/boards/xtensa/esp32/esp32-core/scripts/esp32_flash.ld +++ b/boards/xtensa/esp32/esp32-core/scripts/esp32_flash.ld @@ -59,6 +59,10 @@ SECTIONS *libpp.a:(.literal .text .literal.* .text.*) *libhal.a:(.literal .text .literal.* .text.*) _iram_text_end = ABSOLUTE(.); + + /* Module text area starts at the end of iram0_0_seg */ + + _smodtext = ABSOLUTE(.); } > iram0_0_seg /* Shared RAM */ diff --git a/boards/xtensa/esp32/esp32-core/scripts/esp32_iram.ld b/boards/xtensa/esp32/esp32-core/scripts/esp32_iram.ld index 61b6fa6d8c..54dcfefa85 100644 --- a/boards/xtensa/esp32/esp32-core/scripts/esp32_iram.ld +++ b/boards/xtensa/esp32/esp32-core/scripts/esp32_iram.ld @@ -70,6 +70,9 @@ SECTIONS _text_end = ABSOLUTE(.); _etext = .; + /* Module text area starts at the end of iram0_0_seg */ + + _smodtext = ABSOLUTE(.); } > iram0_0_seg /* Shared RAM */ diff --git a/include/nuttx/arch.h b/include/nuttx/arch.h index 815a0f65b7..6203a99f13 100644 --- a/include/nuttx/arch.h +++ b/include/nuttx/arch.h @@ -160,6 +160,7 @@ EXTERN volatile bool g_rtc_enabled; */ /* EXTERN const irq_mapped_t g_irqmap[NR_IRQS]; */ + #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); #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 *