Brad Bishop | bec4ebc | 2022-08-03 09:55:16 -0400 | [diff] [blame] | 1 | From 90712f624c7b676e5b9a2d95cbe97d2b63fddcc9 Mon Sep 17 00:00:00 2001 |
| 2 | From: Vishnu Banavath <vishnu.banavath@arm.com> |
| 3 | Date: Fri, 3 Dec 2021 16:36:51 +0000 |
| 4 | Subject: [PATCH] Add openamp to SE proxy deployment |
| 5 | |
| 6 | Openamp is required to communicate between secure partitions(running on |
| 7 | Cortex-A) and trusted-firmware-m(running on Cortex-M). |
| 8 | These changes are to fetch libmetal and openamp from github repo's |
| 9 | and build it. |
| 10 | |
| 11 | Signed-off-by: Rui Miguel Silva <rui.silva@arm.com> |
| 12 | Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com> |
| 13 | |
| 14 | Upstream-Status: Pending [Not submitted to upstream yet] |
| 15 | Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com> |
| 16 | |
| 17 | |
| 18 | --- |
| 19 | deployments/se-proxy/opteesp/CMakeLists.txt | 14 ++++ |
| 20 | deployments/se-proxy/opteesp/lse.S | 19 +++++ |
| 21 | external/openamp/libmetal.cmake | 81 ++++++++++++++++++++ |
| 22 | external/openamp/openamp.cmake | 82 +++++++++++++++++++++ |
| 23 | 4 files changed, 196 insertions(+) |
| 24 | create mode 100644 deployments/se-proxy/opteesp/lse.S |
| 25 | create mode 100644 external/openamp/libmetal.cmake |
| 26 | create mode 100644 external/openamp/openamp.cmake |
| 27 | |
| 28 | diff --git a/deployments/se-proxy/opteesp/CMakeLists.txt b/deployments/se-proxy/opteesp/CMakeLists.txt |
| 29 | index 4e2069a5..248bd7e3 100644 |
| 30 | --- a/deployments/se-proxy/opteesp/CMakeLists.txt |
| 31 | +++ b/deployments/se-proxy/opteesp/CMakeLists.txt |
| 32 | @@ -89,6 +89,7 @@ add_components(TARGET "se-proxy" |
| 33 | target_sources(se-proxy PRIVATE |
| 34 | se_proxy_sp.c |
| 35 | service_proxy_factory.c |
| 36 | + lse.S |
| 37 | ) |
| 38 | |
| 39 | #------------------------------------------------------------------------------- |
| 40 | @@ -108,6 +109,19 @@ include(../../../external/nanopb/nanopb.cmake) |
| 41 | target_link_libraries(se-proxy PRIVATE nanopb::protobuf-nanopb-static) |
| 42 | protobuf_generate_all(TGT "se-proxy" NAMESPACE "protobuf" BASE_DIR "${TS_ROOT}/protocols") |
| 43 | |
| 44 | +# libmetal |
| 45 | +list(APPEND LIBMETAL_EXTERNAL_INCLUDE_PATHS ${SP_DEV_KIT_INCLUDE_DIR}) |
| 46 | +set(LIBMETAL_EXTRA_INCLUDE_PATHS ${LIBMETAL_EXTRA_INCLUDE_PATHS} |
| 47 | + CACHE STRING "" FORCE) |
| 48 | +include(../../../external/openamp/libmetal.cmake) |
| 49 | + |
| 50 | +# OpenAMP |
| 51 | +list(APPEND OPENAMP_EXTERNAL_INCLUDE_PATHS ${SP_DEV_KIT_INCLUDE_DIR}) |
| 52 | +set(OPENAMP_EXTRA_INCLUDE_PATHS ${OPENAMP_EXTRA_INCLUDE_PATHS} |
| 53 | + CACHE STRING "" FORCE) |
| 54 | +include(../../../external/openamp/openamp.cmake) |
| 55 | +target_link_libraries(se-proxy PRIVATE openamp libmetal) |
| 56 | + |
| 57 | ################################################################# |
| 58 | |
| 59 | target_compile_definitions(se-proxy PRIVATE |
| 60 | diff --git a/deployments/se-proxy/opteesp/lse.S b/deployments/se-proxy/opteesp/lse.S |
| 61 | new file mode 100644 |
| 62 | index 00000000..840683a6 |
| 63 | --- /dev/null |
| 64 | +++ b/deployments/se-proxy/opteesp/lse.S |
| 65 | @@ -0,0 +1,19 @@ |
| 66 | +// SPDX-License-Identifier: BSD-3-Clause |
| 67 | +/* |
| 68 | + * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved. |
| 69 | + */ |
| 70 | + |
| 71 | +.text |
| 72 | +.globl __aarch64_cas4_acq_rel |
| 73 | + |
| 74 | +__aarch64_cas4_acq_rel: |
| 75 | + mov w16, w0 |
| 76 | + ldaxr w0, [x2] |
| 77 | + cmp w0, w16 |
| 78 | +0: bne 1f |
| 79 | + |
| 80 | + stlxr w17, w1, [x2] |
| 81 | + cbnz w17, 0b |
| 82 | +1: ret |
| 83 | + |
| 84 | + |
| 85 | diff --git a/external/openamp/libmetal.cmake b/external/openamp/libmetal.cmake |
| 86 | new file mode 100644 |
| 87 | index 00000000..3a647e69 |
| 88 | --- /dev/null |
| 89 | +++ b/external/openamp/libmetal.cmake |
| 90 | @@ -0,0 +1,81 @@ |
| 91 | +#------------------------------------------------------------------------------- |
| 92 | +# Copyright (c) 2021 Linaro Limited |
| 93 | +# Copyright (c) 2021, Arm Limited. All rights reserved. |
| 94 | +# |
| 95 | +# SPDX-License-Identifier: BSD-3-Clause |
| 96 | +# |
| 97 | +#------------------------------------------------------------------------------- |
| 98 | + |
| 99 | +set (LIBMETAL_URL "https://github.com/OpenAMP/libmetal.git" CACHE STRING "libmetal repository URL") |
| 100 | +set (LIBMETAL_INSTALL_PATH "${CMAKE_CURRENT_BINARY_DIR}/libmetal_install" CACHE PATH "libmetal installation directory") |
| 101 | +set (LIBMETAL_PACKAGE_PATH "${LIBMETAL_INSTALL_PATH}/libmetal/cmake" CACHE PATH "libmetal CMake package directory") |
| 102 | +set (LIBMETAL_TARGET_NAME "libmetal") |
| 103 | +set (LIBMETAL_VERSION "f252f0e007fbfb8b3a52b1d5901250ddac96baad" CACHE STRING "The version of libmetal to use") |
| 104 | + |
| 105 | +if(NOT LIBMETAL_DEBUG) |
| 106 | + set(LIBMETAL_BUILD_TYPE "Release") |
| 107 | +else() |
| 108 | + set(LIBMETAL_BUILD_TYPE "Debug") |
| 109 | +endif() |
| 110 | + |
| 111 | +include(FetchContent) |
| 112 | + |
| 113 | +# Checking git |
| 114 | +find_program(GIT_COMMAND "git") |
| 115 | +if (NOT GIT_COMMAND) |
| 116 | + message(FATAL_ERROR "Please install git") |
| 117 | +endif() |
| 118 | + |
| 119 | +FetchContent_Declare( |
| 120 | + libmetal |
| 121 | + GIT_REPOSITORY ${LIBMETAL_URL} |
| 122 | + GIT_TAG ${LIBMETAL_VERSION} |
| 123 | +) |
| 124 | + |
| 125 | +# FetchContent_GetProperties exports libmetal_SOURCE_DIR and libmetal_BINARY_DIR variables |
| 126 | +FetchContent_GetProperties(libmetal) |
| 127 | +if(NOT libmetal_POPULATED) |
| 128 | + message(STATUS "Fetching libmetal") |
| 129 | + FetchContent_Populate(libmetal) |
| 130 | +endif() |
| 131 | + |
| 132 | +# Ensure list of include paths is separated correctly |
| 133 | +string(REPLACE ";" "\\;" LIBMETAL_EXTERNAL_INCLUDE_PATHS "${LIBMETAL_EXTERNAL_INCLUDE_PATHS}") |
| 134 | + |
| 135 | +#Configure the library |
| 136 | +execute_process(COMMAND |
| 137 | + ${CMAKE_COMMAND} |
| 138 | + -DCMAKE_BUILD_TYPE=${LIBMETAL_BUILD_TYPE} |
| 139 | + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} |
| 140 | + -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} |
| 141 | + -DCMAKE_TOOLCHAIN_FILE=${TS_EXTERNAL_LIB_TOOLCHAIN_FILE} |
| 142 | + -DCMAKE_INSTALL_PREFIX=${LIBMETAL_INSTALL_PATH} |
| 143 | + -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} |
| 144 | + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} |
| 145 | + -DCMAKE_C_OUTPUT_EXTENSION=.o |
| 146 | + -DCMAKE_C_COMPILER_WORKS=true |
| 147 | + -DCMAKE_SYSTEM_PROCESSOR=arm |
| 148 | + -DWITH_DOC=off |
| 149 | + -DWITH_TESTS=off |
| 150 | + -DWITH_EXAMPLES=off |
| 151 | + -DWITH_DEFAULT_LOGGER=off |
| 152 | + -DEXTERNAL_INCLUDE_PATHS=${LIBMETAL_EXTERNAL_INCLUDE_PATHS} |
| 153 | + -DMACHINE=template |
| 154 | + ${libmetal_SOURCE_DIR} |
| 155 | + WORKING_DIRECTORY |
| 156 | + ${libmetal_BINARY_DIR} |
| 157 | +) |
| 158 | + |
| 159 | +# Build the library |
| 160 | +execute_process(COMMAND |
| 161 | + ${CMAKE_COMMAND} --build ${libmetal_BINARY_DIR} -- install |
| 162 | + RESULT_VARIABLE _exec_error |
| 163 | + ) |
| 164 | +if (_exec_error) |
| 165 | + message(FATAL_ERROR "Build step of libmetal failed with ${_exec_error}.") |
| 166 | +endif() |
| 167 | + |
| 168 | +#Create an imported target to have clean abstraction in the build-system. |
| 169 | +add_library(libmetal STATIC IMPORTED) |
| 170 | +set_property(TARGET libmetal PROPERTY IMPORTED_LOCATION "${LIBMETAL_INSTALL_PATH}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}metal${CMAKE_STATIC_LIBRARY_SUFFIX}") |
| 171 | +set_property(TARGET libmetal PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${LIBMETAL_INSTALL_PATH}/include") |
| 172 | diff --git a/external/openamp/openamp.cmake b/external/openamp/openamp.cmake |
| 173 | new file mode 100644 |
| 174 | index 00000000..aae13bad |
| 175 | --- /dev/null |
| 176 | +++ b/external/openamp/openamp.cmake |
| 177 | @@ -0,0 +1,82 @@ |
| 178 | +#------------------------------------------------------------------------------- |
| 179 | +# Copyright (c) 2021 Linaro Limited |
| 180 | +# Copyright (c) 2021, Arm Limited. All rights reserved. |
| 181 | +# |
| 182 | +# SPDX-License-Identifier: BSD-3-Clause |
| 183 | +# |
| 184 | +#------------------------------------------------------------------------------- |
| 185 | + |
| 186 | +set (OPENAMP_URL "https://github.com/OpenAMP/open-amp.git" CACHE STRING "OpenAMP repository URL") |
| 187 | +set (OPENAMP_INSTALL_PATH "${CMAKE_CURRENT_BINARY_DIR}/openamp_install" CACHE PATH "OpenAMP installation directory") |
| 188 | +set (OPENAMP_PACKAGE_PATH "${OPENAMP_INSTALL_PATH}/openamp/cmake" CACHE PATH "OpenAMP CMake package directory") |
| 189 | +set (OPENAMP_TARGET_NAME "openamp") |
| 190 | +set (OPENAMP_VERSION "347397decaa43372fc4d00f965640ebde042966d" CACHE STRING "The version of openamp to use") |
| 191 | + |
| 192 | + |
| 193 | +if(NOT OPENAMP_DEBUG) |
| 194 | + set(OPENAMP_BUILD_TYPE "Release") |
| 195 | +else() |
| 196 | + set(OPENAMP_BUILD_TYPE "Debug") |
| 197 | +endif() |
| 198 | + |
| 199 | +include(FetchContent) |
| 200 | + |
| 201 | +# Checking git |
| 202 | +find_program(GIT_COMMAND "git") |
| 203 | +if (NOT GIT_COMMAND) |
| 204 | + message(FATAL_ERROR "Please install git") |
| 205 | +endif() |
| 206 | + |
| 207 | +FetchContent_Declare( |
| 208 | + openamp |
| 209 | + GIT_REPOSITORY ${OPENAMP_URL} |
| 210 | + GIT_TAG ${OPENAMP_VERSION} |
| 211 | +) |
| 212 | + |
| 213 | +# FetchContent_GetProperties exports openamp_SOURCE_DIR and openamp_BINARY_DIR variables |
| 214 | +FetchContent_GetProperties(openamp) |
| 215 | +if(NOT openamp_POPULATED) |
| 216 | + message(STATUS "Fetching openamp") |
| 217 | + FetchContent_Populate(openamp) |
| 218 | +endif() |
| 219 | + |
| 220 | +# Ensure list of include paths is separated correctly |
| 221 | +get_target_property(_libmetal_inc libmetal INTERFACE_INCLUDE_DIRECTORIES) |
| 222 | +set (_openam_external_include_paths ${_libmetal_inc} ${OPENAMP_EXTERNAL_INCLUDE_PATHS}) |
| 223 | +string(REPLACE ";" "\\;" OPENAMP_EXTERNAL_INCLUDE_PATHS "${_openam_external_include_paths}") |
| 224 | + |
| 225 | +#Configure the library |
| 226 | +execute_process(COMMAND |
| 227 | + ${CMAKE_COMMAND} |
| 228 | + -DCMAKE_BUILD_TYPE=${OPENAMP_BUILD_TYPE} |
| 229 | + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} |
| 230 | + -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} |
| 231 | + -DCMAKE_TOOLCHAIN_FILE=${TS_EXTERNAL_LIB_TOOLCHAIN_FILE} |
| 232 | + -DCMAKE_INSTALL_PREFIX=${OPENAMP_INSTALL_PATH} |
| 233 | + -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} |
| 234 | + -DLIBMETAL_INCLUDE_DIR=${CMAKE_CURRENT_BINARY_DIR}/libmetal/lib/include |
| 235 | + -DLIBMETAL_LIB=${CMAKE_CURRENT_BINARY_DIR}/libmetal/lib |
| 236 | + -DCMAKE_C_OUTPUT_EXTENSION=.o |
| 237 | + -DCMAKE_C_COMPILER_WORKS=true |
| 238 | + -DCMAKE_SYSTEM_PROCESSOR=arm |
| 239 | + -DEXTERNAL_INCLUDE_PATHS=${OPENAMP_EXTERNAL_INCLUDE_PATHS} |
| 240 | + -DMACHINE=template |
| 241 | + -DRPMSG_BUFFER_SIZE=512 |
| 242 | + ${openamp_SOURCE_DIR} |
| 243 | + WORKING_DIRECTORY |
| 244 | + ${openamp_BINARY_DIR} |
| 245 | +) |
| 246 | + |
| 247 | +# Build the library |
| 248 | +execute_process(COMMAND |
| 249 | + ${CMAKE_COMMAND} --build ${openamp_BINARY_DIR} -- install |
| 250 | + RESULT_VARIABLE _exec_error |
| 251 | + ) |
| 252 | +if (_exec_error) |
| 253 | + message(FATAL_ERROR "Build step of OpenAMP failed with ${_exec_error}.") |
| 254 | +endif() |
| 255 | + |
| 256 | +#Create an imported target to have clean abstraction in the build-system. |
| 257 | +add_library(openamp STATIC IMPORTED) |
| 258 | +set_property(TARGET openamp PROPERTY IMPORTED_LOCATION "${OPENAMP_INSTALL_PATH}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}open_amp${CMAKE_STATIC_LIBRARY_SUFFIX}") |
| 259 | +set_property(TARGET openamp PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${OPENAMP_INSTALL_PATH}/include") |