| /* |
| * Copyright (c) 2016-2025 Nordic Semiconductor ASA |
| * Copyright (c) 2016 Vinayak Kariappa Chettimada |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include "common/assert.h" |
| |
| #if defined(CONFIG_BT_CTLR_ASSERT_HANDLER) |
| void bt_ctlr_assert_handle(char *file, uint32_t line); |
| |
| #if defined(CONFIG_BT_CTLR_ASSERT_OPTIMIZE_FOR_SIZE) |
| BUILD_ASSERT(IS_ENABLED(CONFIG_CPU_CORTEX_M)); |
| /* Generate assertion as undefined instruction exception. |
| */ |
| #define LL_ASSERT(x) \ |
| do { \ |
| if (unlikely(!(x))) { \ |
| __asm__ inline volatile (".inst 0xde00\n"); \ |
| } \ |
| } while (0) |
| |
| #else /* !CONFIG_BT_CTLR_ASSERT_OPTIMIZE_FOR_SIZE */ |
| /* Generate assertion with file name and line number. |
| * NOTE: Variable code size increase per assertion check, depends on full file name path string |
| * length. |
| */ |
| #define LL_ASSERT(cond) \ |
| if (unlikely(!(cond))) { \ |
| BT_ASSERT_PRINT(cond); \ |
| bt_ctlr_assert_handle(__FILE__, __LINE__); \ |
| } |
| #endif /* !CONFIG_BT_CTLR_ASSERT_OPTIMIZE_FOR_SIZE */ |
| |
| #define LL_ASSERT_MSG(cond, fmt, ...) \ |
| if (unlikely(!(cond))) { \ |
| BT_ASSERT_PRINT(cond); \ |
| BT_ASSERT_PRINT_MSG(fmt, ##__VA_ARGS__); \ |
| bt_ctlr_assert_handle(__FILE__, __LINE__); \ |
| } |
| |
| #else /* !CONFIG_BT_CTLR_ASSERT_HANDLER */ |
| |
| #if defined(CONFIG_BT_CTLR_ASSERT_OPTIMIZE_FOR_SIZE) |
| BUILD_ASSERT(IS_ENABLED(CONFIG_CPU_CORTEX_M)); |
| /* Generate assertion as undefined instruction exception. |
| */ |
| #define LL_ASSERT(x) \ |
| do { \ |
| if (unlikely(!(x))) { \ |
| __asm__ inline volatile (".inst 0xde00\n"); \ |
| } \ |
| } while (0) |
| |
| #else /* !CONFIG_BT_CTLR_ASSERT_OPTIMIZE_FOR_SIZE */ |
| #define LL_ASSERT(cond) \ |
| BT_ASSERT(cond) |
| #endif /* !CONFIG_BT_CTLR_ASSERT_OPTIMIZE_FOR_SIZE */ |
| |
| #define LL_ASSERT_MSG(cond, fmt, ...) \ |
| BT_ASSERT_MSG(cond, fmt, ##__VA_ARGS__) |
| #endif /* !CONFIG_BT_CTLR_ASSERT_HANDLER */ |
| |
| /* Fatal asserts. |
| * The Controller will otherwise misbehave causing memory leak or system-wide memory corruptions due |
| * to uncontrolled DMA transfers etc. |
| * It is not safe to disable these assertion checks. |
| */ |
| #define LL_ASSERT_ERR(cond) LL_ASSERT(cond) |
| |
| /* Development asserts. |
| * The Controller will continue to function without memory leak or corruption with these assertion |
| * checks disabled. Example, run-time mis-aligned memory access etc. which do otherwise implicitly |
| * cause CPU fault during development testing. But these type of asserted are essentially required |
| * for debugging, code and unit test coverage during development cycle. |
| */ |
| #if defined(CONFIG_BT_CTLR_ASSERT_DEBUG) |
| #define LL_ASSERT_DBG(cond) LL_ASSERT(cond) |
| #else /* !CONFIG_BT_CTLR_ASSERT_DEBUG */ |
| #define LL_ASSERT_DBG(cond) ARG_UNUSED((cond)) |
| #endif /* !CONFIG_BT_CTLR_ASSERT_DEBUG */ |
| |
| #if defined(CONFIG_BT_CTLR_ASSERT_VENDOR) |
| #define LL_ASSERT_INFO1(cond, param) \ |
| BT_ASSERT_VND(cond, param, 0) |
| #define LL_ASSERT_INFO2(cond, param1, param2) \ |
| BT_ASSERT_VND(cond, param1, param2) |
| #else |
| #define LL_ASSERT_INFO1(cond, param) \ |
| LL_ASSERT_MSG(cond, "param: %u", param) |
| #define LL_ASSERT_INFO2(cond, param1, param2) \ |
| LL_ASSERT_MSG(cond, "param1: %u param2: %u", param1, param2) |
| #endif /* CONFIG_BT_CTLR_ASSERT_VENDOR */ |
| |
| #if defined(CONFIG_BT_CTLR_ASSERT_OVERHEAD_START) |
| #define LL_ASSERT_OVERHEAD(overhead) \ |
| LL_ASSERT_MSG(false, "%s: Actual EVENT_OVERHEAD_START_US = %u", \ |
| __func__, HAL_TICKER_TICKS_TO_US(overhead)); |
| #else /* !CONFIG_BT_CTLR_ASSERT_OVERHEAD_START */ |
| #define LL_ASSERT_OVERHEAD(overhead) ARG_UNUSED(overhead) |
| #endif /* !CONFIG_BT_CTLR_ASSERT_OVERHEAD_START */ |
| |
| #include "hal/debug_vendor_hal.h" |