19 #ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_ 20 #define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_ 24 #include <mcuxCsslAnalysis.h> 63 #define MCUX_CSSL_FP_DECL_NAME(type, id) \ 64 MCUX_CSSL_CPP_CAT4(mcuxCsslFlowProtection_, type, _, id) 75 #define MCUX_CSSL_FP_DECL_IMPL(type, id) \ 76 MCUX_CSSL_SC_VALUE_TYPE MCUX_CSSL_FP_DECL_NAME(type, id) = \ 77 MCUX_CSSL_CPP_CAT3(MCUX_CSSL_FP_, type, _ID)(id) 86 #define MCUX_CSSL_FP_ID_IMPL() \ 87 MCUX_CSSL_CPP_CAT(__LINE__, u) 106 #define MCUX_CSSL_FP_EXPECTATIONS(...) \ 107 ((uint32_t) 0u + (MCUX_CSSL_CPP_MAP(MCUX_CSSL_CPP_ADD, __VA_ARGS__))) 121 #define MCUX_CSSL_FP_COUNTER_STMT_IMPL(statement) \ 135 #define MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, ...) \ 136 (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) & ((condition) ? ((uint32_t) UINT32_MAX) : ((uint32_t) 0))) 148 #define MCUX_CSSL_FP_VOID_EXPECTATION_IMPL() \ 164 #define MCUX_CSSL_FP_EXPECT_IMPL(...) \ 166 MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \ 188 #define MCUX_CSSL_FP_FUNCTION_ID(id) \ 189 MCUX_CSSL_CPP_CAT(MCUX_CSSL_FP_FUNCID_, id) 196 #define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK \ 206 #define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id) \ 207 (MCUX_CSSL_FP_FUNCTION_VALUE(id) & MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK) 216 #define MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \ 217 (MCUX_CSSL_FP_FUNCTION_VALUE(id) - MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id)) 230 #define MCUX_CSSL_FP_FUNCTION_DECL_IMPL(...) \ 241 #define MCUX_CSSL_FP_FUNCTION_VALUE(id) \ 242 ((uint32_t) MCUX_CSSL_FP_FUNCTION_ID(id)) 254 #define MCUX_CSSL_FP_FUNCTION_DEF_IMPL(...) \ 265 #define MCUX_CSSL_FP_FUNCTION_POINTER_IMPL(type, definition) \ 273 #define MCUX_CSSL_FP_RESULT_OFFSET \ 281 #define MCUX_CSSL_FP_RESULT_MASK \ 291 #define MCUX_CSSL_FP_RESULT_VALUE(result) \ 292 (((uint64_t)(result) & MCUX_CSSL_FP_RESULT_MASK) << MCUX_CSSL_FP_RESULT_OFFSET) 301 #define MCUX_CSSL_FP_RESULT_IMPL(return) \ 302 (uint32_t)(((return) >> MCUX_CSSL_FP_RESULT_OFFSET) & MCUX_CSSL_FP_RESULT_MASK) 309 #define MCUX_CSSL_FP_PROTECTION_OFFSET \ 317 #define MCUX_CSSL_FP_PROTECTION_MASK \ 318 ((uint64_t) 0xFFFFFFFFuLL) 330 #define MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(token) \ 331 ((((uint64_t)(token) & MCUX_CSSL_FP_PROTECTION_MASK)) << MCUX_CSSL_FP_PROTECTION_OFFSET) 343 #define MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL(return) \ 344 (uint32_t)(((return) >> MCUX_CSSL_FP_PROTECTION_OFFSET) & MCUX_CSSL_FP_PROTECTION_MASK) 352 #define MCUX_CSSL_FP_COUNTER_COMPRESSED() \ 369 #define MCUX_CSSL_FP_FUNCTION_CALLED_IMPL(id) \ 370 MCUX_CSSL_FP_FUNCTION_VALUE(id) 386 #define MCUX_CSSL_FP_FUNCTION_ENTERED_IMPL(id) \ 387 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id) 408 #define MCUX_CSSL_FP_LOOP_ID(id) \ 409 MCUX_CSSL_FP_ID_IMPL() 418 #define MCUX_CSSL_FP_LOOP_DECL_IMPL(id) \ 419 MCUX_CSSL_FP_DECL_IMPL(LOOP, id) 429 #define MCUX_CSSL_FP_LOOP_VALUE(id) \ 430 MCUX_CSSL_FP_DECL_NAME(LOOP, id) 443 #define MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, ...) \ 445 MCUX_CSSL_FP_LOOP_VALUE(id) \ 446 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \ 459 #define MCUX_CSSL_FP_LOOP_ITERATION_IMPL1(id) \ 460 MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, 0u) 476 #define MCUX_CSSL_FP_LOOP_ITERATION_IMPL(...) \ 477 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_LOOP_ITERATION_IMPL, __VA_ARGS__) 487 #define MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL(id, count) \ 488 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \ 489 ((count) * MCUX_CSSL_FP_LOOP_VALUE(id)) \ 490 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW() 512 #define MCUX_CSSL_FP_BRANCH_ID(id) \ 513 MCUX_CSSL_FP_ID_IMPL() 522 #define MCUX_CSSL_FP_BRANCH_DECL_IMPL(id) \ 523 MCUX_CSSL_FP_DECL_IMPL(BRANCH, id) 533 #define MCUX_CSSL_FP_BRANCH_VALUE(id) \ 534 MCUX_CSSL_FP_DECL_NAME(BRANCH, id) 541 #define MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE 0x5u 548 #define MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE 0xAu 564 #define MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, scenario, ...) \ 566 (MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \ 567 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \ 584 #define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn(id, ...) \ 585 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, \ 600 #define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1(id) \ 601 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, 0u) 618 #define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL(...) \ 619 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL, __VA_ARGS__) 635 #define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn(id, ...) \ 636 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, \ 651 #define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1(id) \ 652 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, 0u) 669 #define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL(...) \ 670 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL, __VA_ARGS__) 684 #define MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, scenario, condition) \ 685 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \ 686 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \ 687 MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \ 688 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW() 702 #define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2(id, condition) \ 703 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, condition) 716 #define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1(id) \ 717 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \ 718 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \ 719 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, true) \ 720 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \ 721 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8) 736 #define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL(...) \ 737 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL, __VA_ARGS__) 751 #define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2(id, condition) \ 752 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, condition) 765 #define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1(id) \ 766 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \ 767 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \ 768 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, true) \ 769 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \ 770 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8) 785 #define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL(...) \ 786 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL, __VA_ARGS__) 808 #define MCUX_CSSL_FP_SWITCH_ID(id) \ 809 MCUX_CSSL_FP_ID_IMPL() 818 #define MCUX_CSSL_FP_SWITCH_DECL_IMPL(id) \ 819 MCUX_CSSL_FP_DECL_IMPL(SWITCH, id) 829 #define MCUX_CSSL_FP_SWITCH_VALUE(id) \ 830 MCUX_CSSL_FP_DECL_NAME(SWITCH, id) 845 #define MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, ...) \ 847 (MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \ 848 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \ 862 #define MCUX_CSSL_FP_SWITCH_CASE_IMPL2(id, case) \ 863 MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, 0u) 880 #define MCUX_CSSL_FP_SWITCH_CASE_IMPL(...) \ 881 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_CASE_IMPL, __VA_ARGS__) 888 #define MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE \ 903 #define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, ...) \ 904 MCUX_CSSL_FP_SWITCH_CASE_IMPLn( \ 905 id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, __VA_ARGS__) 917 #define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1(id) \ 918 MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, 0u) \ 934 #define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL(...) \ 935 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL, __VA_ARGS__) 950 #define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, condition) \ 951 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \ 952 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \ 953 MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \ 954 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW() 967 #define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2(id, case) \ 968 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \ 969 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \ 970 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, true) \ 971 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \ 972 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8) 989 #define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL(...) \ 990 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_SWITCH_TAKEN_IMPL, __VA_ARGS__) 1003 #define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, condition) \ 1004 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, condition) 1016 #define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1(id) \ 1017 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \ 1018 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \ 1019 MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, true) \ 1020 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \ 1021 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8) 1036 #define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL(...) \ 1037 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL, __VA_ARGS__) 1056 #ifndef MCUX_CSSL_FP_ASSERT_CALLBACK 1057 #define MCUX_CSSL_FP_ASSERT_CALLBACK() \ The default implementation is based on standard C preprocessor functionality.
Provides the API for the CSSL secure counter mechanism.