From 13de79cd4f0d25b812e5f4ad4a19bc075496be83 Mon Sep 17 00:00:00 2001 From: Vishnu Banavath Date: Fri, 3 Dec 2021 16:36:51 +0000 Subject: [PATCH 01/20] Add openamp to SE proxy deployment Openamp is required to communicate between secure partitions(running on Cortex-A) and trusted-firmware-m(running on Cortex-M). These changes are to fetch libmetal and openamp from github repo's and build it. Upstream-Status: Pending Signed-off-by: Vishnu Banavath Signed-off-by: Rui Miguel Silva --- deployments/se-proxy/opteesp/lse.S | 28 ++++++++ deployments/se-proxy/se-proxy.cmake | 8 +++ external/openamp/libmetal-init-cache.cmake.in | 20 ++++++ external/openamp/libmetal.cmake | 67 +++++++++++++++++++ external/openamp/openamp-init-cache.cmake.in | 20 ++++++ external/openamp/openamp.cmake | 66 ++++++++++++++++++ 6 files changed, 209 insertions(+) create mode 100644 deployments/se-proxy/opteesp/lse.S create mode 100644 external/openamp/libmetal-init-cache.cmake.in create mode 100644 external/openamp/libmetal.cmake create mode 100644 external/openamp/openamp-init-cache.cmake.in create mode 100644 external/openamp/openamp.cmake diff --git a/deployments/se-proxy/opteesp/lse.S b/deployments/se-proxy/opteesp/lse.S new file mode 100644 index 000000000000..8e466d65fc2b --- /dev/null +++ b/deployments/se-proxy/opteesp/lse.S @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BSD-3-Clause +/* + * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved. + */ + +.text +.globl __aarch64_cas4_acq_rel +.globl __aarch64_cas4_sync + +__aarch64_cas4_acq_rel: + mov w16, w0 + ldaxr w0, [x2] + cmp w0, w16 +0: bne 1f + + stlxr w17, w1, [x2] + cbnz w17, 0b +1: ret + +__aarch64_cas4_sync: + mov w16, w0 + ldxr w0, [x2] + cmp w0, w16 +0: bne 1f + + stlxr w17, w1, [x2] + cbnz w17, 0b +1: ret diff --git a/deployments/se-proxy/se-proxy.cmake b/deployments/se-proxy/se-proxy.cmake index 426c66c05350..d39873a0fe81 100644 --- a/deployments/se-proxy/se-proxy.cmake +++ b/deployments/se-proxy/se-proxy.cmake @@ -61,6 +61,7 @@ add_components(TARGET "se-proxy" target_sources(se-proxy PRIVATE ${CMAKE_CURRENT_LIST_DIR}/common/se_proxy_sp.c ${CMAKE_CURRENT_LIST_DIR}/common/service_proxy_factory.c + ${CMAKE_CURRENT_LIST_DIR}/opteesp/lse.S ) #------------------------------------------------------------------------------- @@ -73,6 +74,13 @@ include(../../../external/nanopb/nanopb.cmake) target_link_libraries(se-proxy PRIVATE nanopb::protobuf-nanopb-static) protobuf_generate_all(TGT "se-proxy" NAMESPACE "protobuf" BASE_DIR "${TS_ROOT}/protocols") +# libmetal +include(../../../external/openamp/libmetal.cmake) + +# OpenAMP +include(../../../external/openamp/openamp.cmake) +target_link_libraries(se-proxy PRIVATE openamp libmetal) + ################################################################# target_include_directories(se-proxy PRIVATE diff --git a/external/openamp/libmetal-init-cache.cmake.in b/external/openamp/libmetal-init-cache.cmake.in new file mode 100644 index 000000000000..04c25fbde960 --- /dev/null +++ b/external/openamp/libmetal-init-cache.cmake.in @@ -0,0 +1,20 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved. +# Copyright (c) 2021-2022, Linaro. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# +#------------------------------------------------------------------------------- + +set(CMAKE_INSTALL_PREFIX "@BUILD_INSTALL_DIR@" CACHE STRING "") +set(CMAKE_TOOLCHAIN_FILE "@TS_EXTERNAL_LIB_TOOLCHAIN_FILE@" CACHE STRING "") +set(BUILD_SHARED_LIBS Off CACHE BOOL "") +set(BUILD_STATIC_LIBS On CACHE BOOL "") + +set(WITH_DOC OFF CACHE BOOL "") +set(WITH_TESTS OFF CACHE BOOL "") +set(WITH_EXAMPLES OFF CACHE BOOL "") +set(WITH_DEFAULT_LOGGER OFF CACHE BOOL "") +set(MACHINE "template" CACHE STRING "") + +@_cmake_fragment@ diff --git a/external/openamp/libmetal.cmake b/external/openamp/libmetal.cmake new file mode 100644 index 000000000000..6e5004ff555c --- /dev/null +++ b/external/openamp/libmetal.cmake @@ -0,0 +1,67 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2022 Linaro Limited +# Copyright (c) 2022, Arm Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# +#------------------------------------------------------------------------------- + +set (LIBMETAL_URL "https://github.com/OpenAMP/libmetal.git" + CACHE STRING "libmetal repository URL") +set (LIBMETAL_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/libmetal_install" + CACHE DIR "libmetal installation directory") +set(LIBMETAL_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_deps/libmetal" + CACHE DIR "libmetal source-code") +set (LIBMETAL_PACKAGE_DIR "${LIBMETAL_INSTALL_DIR}/libmetal/cmake" + CACHE DIR "libmetal CMake package directory") +set (LIBMETAL_TARGET_NAME "libmetal") +set (LIBMETAL_REFSPEC "f252f0e007fbfb8b3a52b1d5901250ddac96baad" + CACHE STRING "The version of libmetal to use") +set(LIBMETAL_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/_deps/libmetal-build") + +set(GIT_OPTIONS + GIT_REPOSITORY ${LIBMETAL_URL} + GIT_TAG ${LIBMETAL_REFSPEC} + GIT_SHALLOW FALSE +) + +if(NOT LIBMETAL_DEBUG) + set(LIBMETAL_BUILD_TYPE "Release") +else() + set(LIBMETAL_BUILD_TYPE "Debug") +endif() + +include(FetchContent) + +# Checking git +find_program(GIT_COMMAND "git") +if (NOT GIT_COMMAND) + message(FATAL_ERROR "Please install git") +endif() + +# Only pass libc settings to libmetal if needed. For environments where the +# standard library is not overridden, this is not needed. +if(TARGET stdlib::c) + include(${TS_ROOT}/tools/cmake/common/PropertyCopy.cmake) + + # Save libc settings + save_interface_target_properties(TGT stdlib::c PREFIX LIBC) + # Translate libc settings to cmake code fragment. Will be inserted into + # libmetal-init-cache.cmake.in when LazyFetch configures the file. + translate_interface_target_properties(PREFIX LIBC RES _cmake_fragment) + unset_saved_properties(LIBC) +endif() + +include(${TS_ROOT}/tools/cmake/common/LazyFetch.cmake REQUIRED) +LazyFetch_MakeAvailable(DEP_NAME libmetal + FETCH_OPTIONS "${GIT_OPTIONS}" + INSTALL_DIR "${LIBMETAL_INSTALL_DIR}" + CACHE_FILE "${TS_ROOT}/external/openamp/libmetal-init-cache.cmake.in" + SOURCE_DIR "${LIBMETAL_SOURCE_DIR}" +) +unset(_cmake_fragment) + +#Create an imported target to have clean abstraction in the build-system. +add_library(libmetal STATIC IMPORTED) +set_property(TARGET libmetal PROPERTY IMPORTED_LOCATION "${LIBMETAL_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}metal${CMAKE_STATIC_LIBRARY_SUFFIX}") +set_property(TARGET libmetal PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${LIBMETAL_INSTALL_DIR}/include") diff --git a/external/openamp/openamp-init-cache.cmake.in b/external/openamp/openamp-init-cache.cmake.in new file mode 100644 index 000000000000..302b80511bce --- /dev/null +++ b/external/openamp/openamp-init-cache.cmake.in @@ -0,0 +1,20 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved. +# Copyright (c) 2021-2022, Linaro. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# +#------------------------------------------------------------------------------- + +set(CMAKE_INSTALL_PREFIX "@BUILD_INSTALL_DIR@" CACHE STRING "") +set(CMAKE_TOOLCHAIN_FILE "@TS_EXTERNAL_LIB_TOOLCHAIN_FILE@" CACHE STRING "") +set(BUILD_SHARED_LIBS Off CACHE BOOL "") +set(BUILD_STATIC_LIBS On CACHE BOOL "") + +set(LIBMETAL_INCLUDE_DIR "@CMAKE_CURRENT_BINARY_DIR@/libmetal_install/include" CACHE + STRING "") +set(LIBMETAL_LIB "@CMAKE_CURRENT_BINARY_DIR@/libmetal_install/lib" CACHE STRING "") +set(RPMSG_BUFFER_SIZE "512" CACHE STRING "") +set(MACHINE "template" CACHE STRING "") + +@_cmake_fragment@ diff --git a/external/openamp/openamp.cmake b/external/openamp/openamp.cmake new file mode 100644 index 000000000000..449f35f4fda4 --- /dev/null +++ b/external/openamp/openamp.cmake @@ -0,0 +1,66 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2022 Linaro Limited +# Copyright (c) 2022, Arm Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# +#------------------------------------------------------------------------------- + +set (OPENAMP_URL "https://github.com/OpenAMP/open-amp.git" + CACHE STRING "OpenAMP repository URL") +set (OPENAMP_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/openamp_install" + CACHE DIR "OpenAMP installation directory") +set (OPENAMP_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_deps/openamp" + CACHE DIR "OpenAMP source code directory") +set (OPENAMP_PACKAGE_DIR "${OPENAMP_INSTALL_DIR}/openamp/cmake" + CACHE DIR "OpenAMP CMake package directory") +set (OPENAMP_TARGET_NAME "openamp") +set (OPENAMP_REFSPEC "347397decaa43372fc4d00f965640ebde042966d" + CACHE STRING "The version of openamp to use") + +set(GIT_OPTIONS + GIT_REPOSITORY ${OPENAMP_URL} + GIT_TAG ${OPENAMP_REFSPEC} + GIT_SHALLOW FALSE +) + +if(NOT OPENAMP_DEBUG) + set(OPENAMP_BUILD_TYPE "Release") +else() + set(OPENAMP_BUILD_TYPE "Debug") +endif() + +include(FetchContent) + +# Checking git +find_program(GIT_COMMAND "git") +if (NOT GIT_COMMAND) + message(FATAL_ERROR "Please install git") +endif() + +# Only pass libc settings to openamp if needed. For environments where the +# standard library is not overridden, this is not needed. +if(TARGET stdlib::c) + include(${TS_ROOT}/tools/cmake/common/PropertyCopy.cmake) + + # Save libc settings + save_interface_target_properties(TGT stdlib::c PREFIX LIBC) + # Translate libc settings to cmake code fragment. Will be inserted into + # libmetal-init-cache.cmake.in when LazyFetch configures the file. + translate_interface_target_properties(PREFIX LIBC RES _cmake_fragment) + unset_saved_properties(LIBC) +endif() + +include(${TS_ROOT}/tools/cmake/common/LazyFetch.cmake REQUIRED) +LazyFetch_MakeAvailable(DEP_NAME openamp + FETCH_OPTIONS "${GIT_OPTIONS}" + INSTALL_DIR "${OPENAMP_INSTALL_DIR}" + CACHE_FILE "${TS_ROOT}/external/openamp/openamp-init-cache.cmake.in" + SOURCE_DIR "${OPENAMP_SOURCE_DIR}" +) +unset(_cmake_fragment) + +#Create an imported target to have clean abstraction in the build-system. +add_library(openamp STATIC IMPORTED) +set_property(TARGET openamp PROPERTY IMPORTED_LOCATION "${OPENAMP_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}open_amp${CMAKE_STATIC_LIBRARY_SUFFIX}") +set_property(TARGET openamp PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${OPENAMP_INSTALL_DIR}/include") -- 2.38.1