Skip to content

Commit

Permalink
apps/platform, os/binfmt: add exceptions support in loadable
Browse files Browse the repository at this point in the history
Add support for cpp exceptions in loadable for RTL8730E and
RTL8721CSM.

Signed-off-by: Abhishek Akkabathula <a.akkabathul@samsung.com>
  • Loading branch information
abhishek-samsung committed Feb 26, 2024
1 parent a67b9f7 commit e3a908d
Show file tree
Hide file tree
Showing 18 changed files with 1,760 additions and 49 deletions.
4 changes: 4 additions & 0 deletions apps/platform/gnu/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ ifeq ($(CONFIG_HAVE_CXXINITIALIZE),y)
CSRCS += gnu_cxxinitialize.c
endif

ifeq ($(CONFIG_LIBCXX_EXCEPTION),y)
CSRCS += gnu_unwind_find_exidx.c
endif

# Add the gnu/ sub-directory to the build

VPATH += :gnu
Expand Down
50 changes: 50 additions & 0 deletions apps/platform/gnu/gnu_unwind_find_exidx.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/****************************************************************************
*
* Copyright 2023 Samsung Electronics All Rights Reserved.
*
* Licensed 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 <unwind.h>

/****************************************************************************
* Private Data
****************************************************************************/

extern void *__exidx_start;
extern void *__exidx_end;

/****************************************************************************
* Public Functions
****************************************************************************/

/****************************************************************************
* Name: __gnu_Unwind_Find_exidx
*
* Description:
* This function is called (if exists) by the gcc generated unwind
* run-time in order to retrieve an alternative .ARM.exidx Exception
* index section.
*
****************************************************************************/

volatile _Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr return_address, int *nrecp)
{
*nrecp = &__exidx_end - &__exidx_start;
return (_Unwind_Ptr)&__exidx_start;
}
12 changes: 10 additions & 2 deletions build/configs/rtl8721csm/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ else ifeq ($(CONFIG_CXX_VERSION_14),y)
else
CXXFLAGS += -std=c++11
endif
CXXFLAGS += -pedantic -D_DEBUG -D_LIBCPP_BUILD_STATIC -ffunction-sections -fdata-sections -D__GLIBCXX__
CXXFLAGS += -pedantic -D_DEBUG -D_LIBCPP_BUILD_STATIC -ffunction-sections -fdata-sections -D__GLIBCXX__ -DCONFIG_WCHAR_BUILTIN
endif

ifeq ($(CONFIG_EXTERNAL_TFMICRO),y)
Expand Down Expand Up @@ -249,7 +249,8 @@ ifeq ($(CONFIG_APP_BINARY_SEPARATION),y)
CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs

LDELFFLAGS = -r -e main
LDELFFLAGS = -r
LDELFENTRY = -e main

ifeq ($(WINTOOL),y)
LDELFFLAGS += -T "${shell cygpath -w $(TOPDIR)/userspace/userspace_apps.ld}"
Expand All @@ -258,6 +259,13 @@ else
endif
endif

ifeq ($(CONFIG_LIBCXX_EXCEPTION),y)
#this symbol __gnu_Unwind_Find_exidx should be present in all the cpp binaries (apps, common)
#as it is used to decide which exception table. Also, --force-group-allocation flag is required
#to not generate additional sections with group flag, as we dont support loading such sections.
LDELFFLAGS += --require-defined __gnu_Unwind_Find_exidx --force-group-allocation
endif

LDFLAGS += --gc-sections
LDFLAGS += --defsym=CONFIG_IDLETHREAD_STACKSIZE=$(CONFIG_IDLETHREAD_STACKSIZE)

Expand Down
45 changes: 34 additions & 11 deletions build/configs/rtl8721csm/cpp_loadable/defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,20 @@ CONFIG_ARCH="arm"
# CONFIG_ARCH_CHIP_LM is not set
# CONFIG_ARCH_CHIP_S5J is not set
# CONFIG_ARCH_CHIP_BCM4390X is not set
# CONFIG_ARCH_CHIP_IMX6 is not set
# CONFIG_ARCH_CHIP_STM32 is not set
# CONFIG_ARCH_CHIP_IMXRT is not set
# CONFIG_ARCH_CHIP_STM32L4 is not set
CONFIG_ARCH_CHIP_AMEBAD=y
# CONFIG_ARCH_CHIP_STM32H745 is not set
# CONFIG_ARCH_CHIP_AMEBALITE is not set
# CONFIG_ARCH_CHIP_AMEBASMART is not set
CONFIG_ARCH_CHIP="amebad"
# CONFIG_ARM_THUMB is not set
# CONFIG_ARM_HAVE_DPFPU32 is not set
# CONFIG_ARM_HAVE_NEON is not set
# CONFIG_ARM_FPU_ABI_SOFT is not set
# CONFIG_ARM_HAVE_MPCORE is not set

#
# ARM Options
Expand All @@ -81,10 +88,13 @@ CONFIG_ARCH_CHIP="amebad"
# CONFIG_ARCH_CORTEXM7 is not set
CONFIG_ARCH_CORTEXM33=y
# CONFIG_ARCH_CORTEXM55 is not set
# CONFIG_ARCH_CORTEXA9 is not set
# CONFIG_ARCH_CORTEXR4 is not set
# CONFIG_ARCH_CORTEXA32 is not set
# CONFIG_ARCH_ARMV7M_FAMILY is not set
CONFIG_ARCH_ARMV8M_FAMILY=y
# CONFIG_ARCH_ARMV7R_FAMILY is not set
# CONFIG_ARCH_ARMV7A_FAMILY is not set
CONFIG_ARCH_FAMILY="armv8-m"
CONFIG_ARCH_HAVE_CMNVECTOR=y
CONFIG_ARM_CMNVECTOR=y
Expand Down Expand Up @@ -124,7 +134,7 @@ CONFIG_ARMV8M_DCACHE=y
# CONFIG_ARMV8M_TOOLCHAIN_CODESOURCERYL is not set
CONFIG_ARMV8M_TOOLCHAIN_GNU_EABIL=y
# CONFIG_ARMV8M_TOOLCHAIN_CLANGL is not set
# CONFIG_ARMV8M_TARGET2_PREL is not set
CONFIG_ARMV8M_TARGET2_PREL=y
# CONFIG_ARMV8M_HAVE_STACKCHECK is not set
# CONFIG_ARMV8M_ITMSYSLOG is not set

Expand All @@ -146,11 +156,7 @@ CONFIG_RTL8721D_UART2=y
CONFIG_AMEBAD_I2CTIMEOSEC=0
CONFIG_AMEBAD_I2CTIMEOMS=500
CONFIG_AMEBAD_I2CTIMEOTICKS=500
CONFIG_RTL8721D_SPI=y
CONFIG_SPI1_MASTER=y
# CONFIG_CONFIG_SPI_CS is not set
CONFIG_CONFIG_SPI_EXCHANGE=y
CONFIG_CONFIG_SPI_CMDDATA=y
# CONFIG_AMEBAD_SPI is not set

#
# Realtek RTL8721D WIFI Support
Expand All @@ -168,6 +174,11 @@ CONFIG_AMEBAD_WIFI=y
CONFIG_AMEBAD_TRUSTZONE=y
# CONFIG_AMEBAD_RDP is not set

#
# Realtek RTL8721D CMSIS_NN Support
#
# CONFIG_AMEBAD_CMSIS_NN is not set

#
# Architecture Options
#
Expand All @@ -179,16 +190,21 @@ CONFIG_ARCH_HAVE_IRQPRIO=y
# CONFIG_ARCH_HAVE_COHERENT_DCACHE is not set
# CONFIG_ARCH_HAVE_ADDRENV is not set
# CONFIG_ARCH_NEED_ADDRENV_MAPPING is not set
# CONFIG_ARCH_HAVE_MULTICPU is not set
# CONFIG_ARCH_HAVE_TESTSET is not set
CONFIG_ARCH_HAVE_VFORK=y
# CONFIG_ARCH_HAVE_MMU is not set
CONFIG_ARCH_HAVE_MPU=y
# CONFIG_ARCH_NAND_HWECC is not set
# CONFIG_ARCH_HAVE_EXTCLK is not set
# CONFIG_ARCH_HAVE_POWEROFF is not set
CONFIG_ARCH_HAVE_RESET=y
# CONFIG_ARCH_HAVE_FETCHADD is not set
CONFIG_ARCH_USE_MPU=y
CONFIG_ARCH_IRQPRIO=y
# CONFIG_ARCH_TASKDUMP is not set
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_STACKDUMP_MAX_LENGTH=0
# CONFIG_ENDIAN_BIG is not set
# CONFIG_ARCH_IDLE_CUSTOM is not set
# CONFIG_ARCH_HAVE_RAMFUNCS is not set
Expand Down Expand Up @@ -225,6 +241,8 @@ CONFIG_BOOT_RUNFROMFLASH=y
#
# Boot Memory Configuration
#
CONFIG_RAM_START=0x0
CONFIG_RAM_SIZE=0
CONFIG_RAM_KREGIONx_START="0x10005000,0x02000000,0x02100000"
CONFIG_RAM_KREGIONx_SIZE="466944,1048576,2859008,"
CONFIG_RAM_KREGIONx_HEAP_INDEX="0,0,1,"
Expand Down Expand Up @@ -285,6 +303,7 @@ CONFIG_FLASH_PART_NAME="bl1,bl2,reserved,ss,system_data,kernel,kernel,common,com
# CONFIG_ARCH_BOARD_HAVE_SECOND_FLASH is not set
CONFIG_AUTOMOUNT=y
CONFIG_AUTOMOUNT_USERFS=y
# CONFIG_BOARD_USBDEV_SERIALSTR is not set

#
# SE Selection
Expand Down Expand Up @@ -339,7 +358,10 @@ CONFIG_PREALLOC_TIMERS=8
#
# Tasks and Scheduling
#
# CONFIG_SPINLOCK is not set
CONFIG_INIT_ENTRYPOINT=y
# CONFIG_IRQCOUNT is not set
# CONFIG_SCHED_RESUMESCHEDULER is not set
CONFIG_RR_INTERVAL=10
CONFIG_TASK_NAME_SIZE=31
CONFIG_MAX_TASKS=32
Expand Down Expand Up @@ -977,9 +999,9 @@ CONFIG_MTD_SMART_JOURNALING=y
# CONFIG_ARASTORAGE is not set

#
# Light Weight AI Framework
# AI Framework
#
# CONFIG_LW_AIFW is not set
# CONFIG_AIFW is not set

#
# AraUI Framework
Expand Down Expand Up @@ -1181,7 +1203,7 @@ CONFIG_CXX_VERSION_11=y
# LLVM C++ Library (libcxx)
#
CONFIG_LIBCXX=y
# CONFIG_LIBCXX_EXCEPTION is not set
CONFIG_LIBCXX_EXCEPTION=y
CONFIG_LIBCXX_IOSTREAM_BUFSIZE=32
CONFIG_LIBCXX_HAVE_LIBSUPCXX=y

Expand Down Expand Up @@ -1225,6 +1247,7 @@ CONFIG_ELF_ALIGN_LOG2=2
CONFIG_ELF_STACKSIZE=2048
CONFIG_ELF_BUFFERSIZE=32
CONFIG_ELF_BUFFERINCR=32
CONFIG_ELF_EXIDX_SECTNAME=".ARM.exidx"
CONFIG_ELF_EXCLUDE_SYMBOLS=y
CONFIG_ELF_CACHE_READ=y
CONFIG_ELF_CACHE_BLOCK_SIZE=2048
Expand Down Expand Up @@ -1268,6 +1291,7 @@ CONFIG_BUILTIN_APPS=y
#
# Board Specific Demos
#
# CONFIG_EXAMPLES_AMEBA_MIPI is not set
# CONFIG_EXAMPLES_SSTORAGE is not set
# CONFIG_EXAMPLES_SECURE_WORLD is not set
# CONFIG_EXAMPLES_WIFICSI is not set
Expand Down Expand Up @@ -1301,8 +1325,8 @@ CONFIG_EXAMPLES_HELLOXX=y
#
# CONFIG_EXAMPLES_LIBTUV is not set
# CONFIG_EXAMPLES_LWNL_SAMPLE is not set
# CONFIG_EXAMPLES_MEMORY_FRAGMENTATION_TEST is not set
CONFIG_EXAMPLES_MEM_PROTECT_TEST=y
# CONFIG_EXAMPLES_MEMORY_FRAGMENTATION_TEST is not set
# CONFIG_EXAMPLES_NETTEST is not set

#
Expand Down Expand Up @@ -1462,7 +1486,6 @@ CONFIG_EXAMPLES_WIFIMANAGER_AP_LIST_ITEMS_COUNT=10
# Platform-specific Support
#
# CONFIG_PLATFORM_CONFIGDATA is not set
# CONFIG_HAVE_CXXINITIALIZE is not set

#
# Shell
Expand Down
12 changes: 10 additions & 2 deletions build/configs/rtl8730e/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ else ifeq ($(CONFIG_CXX_VERSION_14),y)
else
CXXFLAGS += -std=c++11
endif
CXXFLAGS += -pedantic -D_DEBUG -D_LIBCPP_BUILD_STATIC -ffunction-sections -fdata-sections -D__GLIBCXX__
CXXFLAGS += -pedantic -D_DEBUG -D_LIBCPP_BUILD_STATIC -ffunction-sections -fdata-sections -D__GLIBCXX__ -DCONFIG_WCHAR_BUILTIN
endif

ifeq ($(CONFIG_LIBCXX_EXCEPTION),y)
Expand Down Expand Up @@ -241,7 +241,8 @@ ifeq ($(CONFIG_APP_BINARY_SEPARATION),y)
CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs

LDELFFLAGS = -r -e main
LDELFFLAGS = -r
LDELFENTRY = -e main

ifeq ($(WINTOOL),y)
LDELFFLAGS += -T "${shell cygpath -w $(TOPDIR)/userspace/userspace_apps.ld}"
Expand All @@ -250,6 +251,13 @@ else
endif
endif

ifeq ($(CONFIG_LIBCXX_EXCEPTION),y)
#this symbol __gnu_Unwind_Find_exidx should be present in all the cpp binaries (apps, common)
#as it is used to decide which exception table. Also, --force-group-allocation flag is required
#to not generate additional sections with group flag, as we dont support loading such sections.
LDELFFLAGS += --require-defined __gnu_Unwind_Find_exidx --force-group-allocation
endif

LDFLAGS += --gc-sections
LDFLAGS += --defsym=CONFIG_IDLETHREAD_STACKSIZE=$(CONFIG_IDLETHREAD_STACKSIZE)

Expand Down

0 comments on commit e3a908d

Please sign in to comment.