/* * Copyright (c) 2022 Nordic Semiconductor * * SPDX-License-Identifier: Apache-2.0 */ #include #include /* The idea of this test is to estimate stack usage of logging messages. Each * test checks stack usage before and after logging a message. Increase of stack * usage is interpreted as stack used by the logging. Test has been used to * characterize some common architectures and it will fail if significantly more * stack is used. * * This will help to detect when changes in logging, toolchain or modules used * by logging increase stack usage. Failure of the test should lead to investigation * to determine if stack usage change is justified. If it is justified, thresholds * may be updated. */ LOG_MODULE_REGISTER(test); static size_t simple_usage; static size_t hexdump_usage; static size_t more_args_usage; /* Stack increase margin. */ #ifdef CONFIG_PICOLIBC #define STACK_USAGE_MARGIN 128 #else #define STACK_USAGE_MARGIN 16 #endif static void after(void *data) { PRINT("#elif %sdefined(CONFIG_LOG_MODE_IMMEDIATE) && %sdefined(CONFIG_NO_OPTIMIZATIONS)\n", IS_ENABLED(CONFIG_LOG_MODE_IMMEDIATE) ? "" : "!", IS_ENABLED(CONFIG_NO_OPTIMIZATIONS) ? "" : "!"); PRINT("#define SIMPLE_USAGE %zu\n", simple_usage); PRINT("#define HEXDUMP_USAGE %zu\n", hexdump_usage); PRINT("#define MORE_ARGS_USAGE %zu\n", more_args_usage); } ZTEST_SUITE(test_log_stack, NULL, NULL, NULL, NULL, after); #define TEST_LOG_STACK(usage, log_msg) do { \ size_t unused, unused2; \ int err; \ \ k_msleep(100); \ err = k_thread_stack_space_get(k_current_get(), &unused); \ zassert_equal(err, 0); \ __DEBRACKET log_msg; \ \ k_msleep(100); \ \ err = k_thread_stack_space_get(k_current_get(), &unused2); \ zassert_equal(err, 0); \ \ usage = unused - unused2; \ PRINT("Stack increase due to log usage: %zu\n", usage); \ } while (0) #if defined(CONFIG_CPU_CORTEX_M0) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 120 #define HEXDUMP_USAGE 120 #define MORE_ARGS_USAGE 136 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 436 #define HEXDUMP_USAGE 436 #define MORE_ARGS_USAGE 452 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 168 #define HEXDUMP_USAGE 168 #define MORE_ARGS_USAGE 171 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 911 #define HEXDUMP_USAGE 911 #define MORE_ARGS_USAGE 927 #endif #elif defined(CONFIG_CPU_CORTEX_M3) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 160 #define HEXDUMP_USAGE 160 #define MORE_ARGS_USAGE 176 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 388 #define HEXDUMP_USAGE 388 #define MORE_ARGS_USAGE 404 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 144 #define HEXDUMP_USAGE 88 #define MORE_ARGS_USAGE 144 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 640 #define HEXDUMP_USAGE 640 #define MORE_ARGS_USAGE 656 #endif #elif defined(CONFIG_X86) && !defined(CONFIG_X86_64) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 72 #define HEXDUMP_USAGE 68 #define MORE_ARGS_USAGE 88 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 448 #define HEXDUMP_USAGE 444 #define MORE_ARGS_USAGE 484 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 288 #define HEXDUMP_USAGE 272 #define MORE_ARGS_USAGE 304 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 988 #define HEXDUMP_USAGE 972 #define MORE_ARGS_USAGE 1020 #endif #elif defined(CONFIG_X86_64) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 168 #define HEXDUMP_USAGE 136 #define MORE_ARGS_USAGE 200 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 1120 #define HEXDUMP_USAGE 1104 #define MORE_ARGS_USAGE 1184 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 576 #define HEXDUMP_USAGE 576 #define MORE_ARGS_USAGE 608 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 1680 #define HEXDUMP_USAGE 1680 #define MORE_ARGS_USAGE 1744 #endif #elif defined(CONFIG_RISCV) && !defined(CONFIG_64BIT) && !defined(CONFIG_SMP) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 136 #define HEXDUMP_USAGE 136 #define MORE_ARGS_USAGE 152 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 504 #define HEXDUMP_USAGE 504 #define MORE_ARGS_USAGE 520 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 240 #define HEXDUMP_USAGE 240 #define MORE_ARGS_USAGE 240 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 992 #define HEXDUMP_USAGE 992 #define MORE_ARGS_USAGE 1008 #endif #elif defined(CONFIG_RISCV) && !defined(CONFIG_64BIT) && defined(CONFIG_SMP) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 96 #define HEXDUMP_USAGE 96 #define MORE_ARGS_USAGE 112 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 456 #define HEXDUMP_USAGE 456 #define MORE_ARGS_USAGE 472 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 304 #define HEXDUMP_USAGE 240 #define MORE_ARGS_USAGE 240 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 1008 #define HEXDUMP_USAGE 1008 #define MORE_ARGS_USAGE 1024 #endif #elif defined(CONFIG_RISCV) && defined(CONFIG_64BIT) && defined(CONFIG_SMP) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 200 #define HEXDUMP_USAGE 168 #define MORE_ARGS_USAGE 232 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 736 #define HEXDUMP_USAGE 768 #define MORE_ARGS_USAGE 768 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 320 #define HEXDUMP_USAGE 320 #define MORE_ARGS_USAGE 320 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 1248 #define HEXDUMP_USAGE 1248 #define MORE_ARGS_USAGE 1280 #endif #elif defined(CONFIG_RISCV) && defined(CONFIG_64BIT) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 240 #define HEXDUMP_USAGE 240 #define MORE_ARGS_USAGE 272 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 704 #define HEXDUMP_USAGE 704 #define MORE_ARGS_USAGE 736 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 320 #define HEXDUMP_USAGE 320 #define MORE_ARGS_USAGE 320 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 1128 #define HEXDUMP_USAGE 1128 #define MORE_ARGS_USAGE 1160 #endif #elif defined(CONFIG_SPARC) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 0 #define HEXDUMP_USAGE 28 #define MORE_ARGS_USAGE 0 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 849 #define HEXDUMP_USAGE 849 #define MORE_ARGS_USAGE 865 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 416 #define HEXDUMP_USAGE 232 #define MORE_ARGS_USAGE 416 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 1544 #define HEXDUMP_USAGE 1544 #define MORE_ARGS_USAGE 1560 #endif #elif defined(CONFIG_XTENSA) #if !defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 72 #define HEXDUMP_USAGE 168 #define MORE_ARGS_USAGE 88 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && !defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 584 #define HEXDUMP_USAGE 584 #define MORE_ARGS_USAGE 600 #elif !defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 336 #define HEXDUMP_USAGE 336 #define MORE_ARGS_USAGE 336 #elif defined(CONFIG_LOG_MODE_IMMEDIATE) && defined(CONFIG_NO_OPTIMIZATIONS) #define SIMPLE_USAGE 1040 #define HEXDUMP_USAGE 1040 #define MORE_ARGS_USAGE 1056 #endif #else /* For other platforms which were not characterized use something big. */ #define SIMPLE_USAGE 2000 #define HEXDUMP_USAGE 2000 #define MORE_ARGS_USAGE 2000 #endif #define SIMPLE_USAGE_LIMIT (SIMPLE_USAGE + STACK_USAGE_MARGIN) #define HEXDUMP_USAGE_LIMIT (HEXDUMP_USAGE + STACK_USAGE_MARGIN) #define MORE_ARGS_USAGE_LIMIT (MORE_ARGS_USAGE + STACK_USAGE_MARGIN) ZTEST(test_log_stack, test_log_simple) { uint32_t test_u = 1; int test_i = 1; TEST_LOG_STACK(simple_usage, (LOG_INF("test %u %d", test_u, test_i))); zassert_true(simple_usage <= SIMPLE_USAGE_LIMIT, "Usage:%zu, expected:%zu", simple_usage, SIMPLE_USAGE_LIMIT); } ZTEST(test_log_stack, test_log_hexdump) { uint8_t data[] = {1, 2, 3, 4}; TEST_LOG_STACK(hexdump_usage, (LOG_HEXDUMP_INF(data, sizeof(data), "description"))); zassert_true(hexdump_usage <= HEXDUMP_USAGE_LIMIT, "Usage:%zu, expected:%zu", hexdump_usage, HEXDUMP_USAGE_LIMIT); } ZTEST(test_log_stack, test_log_more_args) { TEST_LOG_STACK(more_args_usage, (LOG_INF("test %d %d %d %d %d %d", k_uptime_get_32(), k_uptime_get_32(), k_uptime_get_32(), k_uptime_get_32(), k_uptime_get_32(), k_uptime_get_32()))); zassert_true(more_args_usage <= MORE_ARGS_USAGE_LIMIT, "Usage:%zu, expected:%zu", more_args_usage, MORE_ARGS_USAGE_LIMIT); }