diff --git a/CMakeLists.txt b/CMakeLists.txt index 88149950fc8e4b508382ee92c1c832856e93c459..19a8f8514e7e9800dd452e6c9d7c0a67e1e19cd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,32 +32,36 @@ set(BOARDCORE_PATH ${CMAKE_CURRENT_LIST_DIR} CACHE PATH "Path to the skyward-boa # Includes all board/arch specific defines, dependencies, source files and boardcore_link_target function include(${BOARDCORE_PATH}/cmake/boardcore.cmake) -# Define the miosix library with kernel and architecture sources -add_library(skyward-boardcore STATIC ${BOARDCORE_SRC}) - -# Only one include directory for Boardcore! -target_include_directories(skyward-boardcore PUBLIC ${BOARDCORE_PATH}/src/shared) - -# Define DEBUG when in Debug mode -target_compile_definitions(skyward-boardcore PUBLIC $<$<CONFIG:Debug>:DEBUG>) -# Define NDEBUG when not in Debug mode -target_compile_definitions(skyward-boardcore PUBLIC $<$<NOT:$<CONFIG:Debug>>:NDEBUG>) - -# Link libraries -include(${MIOSIX_KPATH}/cmake/LinkTarget.cmake) -miosix_link_target(skyward-boardcore) - -target_link_libraries(skyward-boardcore PUBLIC - TSCPP::TSCPP - Eigen3::Eigen - fmt::fmt-header-only - Catch2::Catch2 - Mavlink::Mavlink -) - -# Link MxGui if supported by the target -if(DEFINED MXGUI_BASE_BOARD_NAME) - target_link_libraries(skyward-boardcore PUBLIC MxGui::${MXGUI_BASE_BOARD_NAME}) -elseif(TARGET MxGui::${BOARD_NAME}) - target_link_libraries(skyward-boardcore PUBLIC MxGui::${BOARD_NAME}) -endif() + +# ### DEFAULT + +# # Define the miosix library with kernel and architecture sources +# add_library(skyward-boardcore STATIC ${BOARDCORE_SRC} ${PROTECT_SRC}) +# link_boardcore_submodules(skyward-boardcore PUBLIC) +# link_boardcore_libraries(skyward-boardcore PUBLIC) + + +### ASPIS + +# Create a library for the duplications +add_library(to_protect_lib STATIC EXCLUDE_FROM_ALL ${PROTECT_SRC}) +target_compile_options(to_protect_lib PRIVATE -S -emit-llvm) +# add_options_boardcore_library(to_protect_lib PUBLIC ${BOARD_NAME}) +link_boardcore_submodules(to_protect_lib PUBLIC) +link_boardcore_libraries(to_protect_lib PUBLIC) + +# Create a library for the board +add_library(external_lib STATIC EXCLUDE_FROM_ALL ${BOARDCORE_SRC}) +target_compile_options(external_lib PRIVATE -S -emit-llvm) +# add_options_boardcore_library(external_lib PUBLIC ${BOARD_NAME}) +link_boardcore_submodules(external_lib PUBLIC) +link_boardcore_libraries(external_lib PUBLIC) + +get_property(CXXFLAGS_RET TARGET miosix PROPERTY TARGET_CXX_FLAGS) + +apply_aspis_passes(to_protect_lib external_lib skyward-boardcore "${CXXFLAGS_RET}") +# add_options_boardcore_library(skyward-boardcore INTERFACE ${BOARD_NAME}) + +link_boardcore_submodules(skyward-boardcore INTERFACE) +link_boardcore_libraries(skyward-boardcore INTERFACE) + diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake index f37825291985479e8bf0e12257c7d88e819aebb0..2dfdeaaa41869b533c0fdf885b0e35db3ca317b7 100644 --- a/cmake/boardcore.cmake +++ b/cmake/boardcore.cmake @@ -45,8 +45,8 @@ set(BOARDCORE_SRC ${BOARDCORE_PATH}/src/shared/actuators/stepper/StepperPWM.cpp # Algorithms - ${BOARDCORE_PATH}/src/shared/algorithms/ADA/ADA.cpp - ${BOARDCORE_PATH}/src/shared/algorithms/MEA/MEA.cpp + ${BOARDCORE_PATH}/src/shared/algorithms/ADA/ADA.cpp # + ${BOARDCORE_PATH}/src/shared/algorithms/MEA/MEA.cpp # ${BOARDCORE_PATH}/src/shared/algorithms/AirBrakes/AirBrakesPI.cpp ${BOARDCORE_PATH}/src/shared/algorithms/AirBrakes/AirBrakesInterp.cpp ${BOARDCORE_PATH}/src/shared/algorithms/NAS/NAS.cpp @@ -153,6 +153,97 @@ set(BOARDCORE_SRC ${BOARDCORE_PATH}/src/shared/utils/DependencyManager/DependencyManager.cpp ) +set(PROTECT_SRC + ${BOARDCORE_PATH}/src/shared/aspis/aspis.cpp + # ${BOARDCORE_PATH}/src/shared/algorithms/MEA/MEA.cpp + # ${BOARDCORE_PATH}/src/shared/algorithms/ADA/ADA.cpp +) + +function(link_boardcore_submodules TARGET TYPE) + # Only one include directory for Boardcore! + target_include_directories(${TARGET} ${TYPE} ${BOARDCORE_PATH}/src/shared) + + # Define DEBUG when in Debug mode + target_compile_definitions(${TARGET} ${TYPE} $<$<CONFIG:Debug>:DEBUG>) + # Define NDEBUG when not in Debug mode + target_compile_definitions(${TARGET} ${TYPE} $<$<NOT:$<CONFIG:Debug>>:NDEBUG>) + + # Link libraries + include(${MIOSIX_KPATH}/cmake/LinkTarget.cmake) + miosix_link_target(${TARGET} ${TYPE}) + +endfunction() + +function(link_boardcore_libraries TARGET TYPE) + target_link_libraries(${TARGET} ${TYPE} + TSCPP::TSCPP + Eigen3::Eigen + fmt::fmt-header-only + Catch2::Catch2 + Mavlink::Mavlink + ) + + # Link MxGui if supported by the target + if(DEFINED MXGUI_BASE_BOARD_NAME) + target_link_libraries(${TARGET} ${TYPE} MxGui::${MXGUI_BASE_BOARD_NAME}) + elseif(TARGET MxGui::${BOARD_NAME}) + target_link_libraries(${TARGET} ${TYPE} MxGui::${BOARD_NAME}) + endif() +endfunction() + +# Given two libs, it creates a static library +function(apply_aspis_passes TO_PROTECT_LIB EXTERNAL_LIB OUTLIBRARY CXXFLAGS_RET) + # Getting the sources of the two libraries + get_property(TO_PROTECT_SRC TARGET ${TO_PROTECT_LIB} PROPERTY SOURCES) + get_property(EXTERNAL_SRC TARGET ${EXTERNAL_LIB} PROPERTY SOURCES) + + # Create list of compiled protected sources for each board + set(PROTECT_COMPILED_SOURCES TO_PROTECT_COMPILED) + list(TRANSFORM TO_PROTECT_SRC APPEND ".o" OUTPUT_VARIABLE PROTECT_COMPILED_SOURCES) + list(TRANSFORM PROTECT_COMPILED_SOURCES REPLACE ${CMAKE_SOURCE_DIR} "") + list(TRANSFORM PROTECT_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TO_PROTECT_LIB}.dir) + + # Create list of compiled boardcore sources for each board + set(EXTERNAL_COMPILED_SOURCES EXTERNAL_COMPILED) + list(TRANSFORM EXTERNAL_SRC APPEND ".o" OUTPUT_VARIABLE EXTERNAL_COMPILED_SOURCES) + list(TRANSFORM EXTERNAL_COMPILED_SOURCES REPLACE ${CMAKE_SOURCE_DIR} "") + list(TRANSFORM EXTERNAL_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${EXTERNAL_LIB}.dir) + + set(ASPIS_PASSES_PATH /home/streben/Documenti/POLIMI/TESI/ASPIS/build/passes) + + add_custom_target( + ${OUTLIBRARY}-target + BYPRODUCTS lib${OUTLIBRARY}.a + COMMAND echo "${PROTECT_COMPILED_SOURCES}" + COMMAND ${MIOSIX_PREFIX}-link -v ${PROTECT_COMPILED_SOURCES} -o duplication.bc + COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libEDDI.so --passes="func-ret-to-ref" duplication.bc -o funcToRef.bc + # COMMAND ${CMAKE_OPT} --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication.bc -o funcToRef.bc + # COMMAND ${CMAKE_OPT} --bugpoint-enable-legacy-pm -load -eddi_verify funcToRef.bc -o dataProtection.bc + COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libSEDDI.so --passes="eddi-verify" funcToRef.bc -o dataProtection.bc + COMMAND ${CMAKE_OPT} --passes="dce,simplifycfg" dataProtection.bc -o simplifycfg.bc + COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libRASM.so --passes="rasm-verify" simplifycfg.bc -o protected.bc + COMMAND echo "${EXTERNAL_COMPILED_SOURCES}" + COMMAND ${MIOSIX_PREFIX}-link ${EXTERNAL_COMPILED_SOURCES} protected.bc -o linked.bc + COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libEDDI.so --passes="duplicate-globals" linked.bc -o out.bc + COMMAND echo "cxxflags_ret : ${CXXFLAGS_RET} ${${CXXFLAGS_RET}}" + COMMAND echo "CXXFLAGS_BASE: ${CXXFLAGS_BASE}" + # COMMAND clang++ -c --target=arm-none-eabi ${${CXXFLAGS_RET}} -o compiled.o out.bc + COMMAND clang++ -c --target=arm-none-eabi ${CXXFLAGS_RET} -o compiled.o out.bc + COMMAND ${CMAKE_AR} ru lib${OUTLIBRARY}.a compiled.o + COMMAND_EXPAND_LISTS + COMMENT "Applying ASPIS passes and creating archive lib${OUTLIBRARY}.a" + ) + add_dependencies(${OUTLIBRARY}-target ${TO_PROTECT_LIB}) + add_dependencies(${OUTLIBRARY}-target ${EXTERNAL_LIB}) + + # Importing the just built library + add_library(${OUTLIBRARY} STATIC IMPORTED) + add_dependencies(${OUTLIBRARY} ${OUTLIBRARY}-target) + set_target_properties(${OUTLIBRARY} PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/lib${OUTLIBRARY}.a) +endfunction() + + + # Function to link the Miosix libraries to a target and register the build command # # boardcore_link_target(<target>) @@ -165,7 +256,7 @@ set(BOARDCORE_SRC function(boardcore_link_target TARGET) # Linker script and linking options are eredited from miosix libraries - + # Linking skyward-boardcore library target_link_libraries(${TARGET} PUBLIC skyward-boardcore) diff --git a/src/shared/aspis/aspis.cpp b/src/shared/aspis/aspis.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9e61a7e49076a888dd199512ec9884e767bc6e42 --- /dev/null +++ b/src/shared/aspis/aspis.cpp @@ -0,0 +1,12 @@ +#include "aspis.h" + +void __attribute__((weak)) DataCorruption_Handler() +{ + while(1); +} + + +void __attribute__((weak)) SigMismatch_Handler() +{ + while(1); +} \ No newline at end of file diff --git a/src/shared/aspis/aspis.h b/src/shared/aspis/aspis.h new file mode 100644 index 0000000000000000000000000000000000000000..17c43706c8b12892b7bdd32ad0cff14734e980de --- /dev/null +++ b/src/shared/aspis/aspis.h @@ -0,0 +1,2 @@ +void DataCorruption_Handler(); +void SigMismatch_Handler(); \ No newline at end of file