From 0f6272e5bc7ba7ebebc652aa6157518f875465f0 Mon Sep 17 00:00:00 2001 From: Yong Cong Sin Date: Mon, 27 May 2024 17:58:06 +0800 Subject: [PATCH] tests: debug: symtab: add test Add test for symtab. Signed-off-by: Yong Cong Sin --- tests/subsys/debug/symtab/CMakeLists.txt | 8 ++ tests/subsys/debug/symtab/prj.conf | 3 + tests/subsys/debug/symtab/src/main.c | 158 +++++++++++++++++++++++ tests/subsys/debug/symtab/testcase.yaml | 14 ++ 4 files changed, 183 insertions(+) create mode 100644 tests/subsys/debug/symtab/CMakeLists.txt create mode 100644 tests/subsys/debug/symtab/prj.conf create mode 100644 tests/subsys/debug/symtab/src/main.c create mode 100644 tests/subsys/debug/symtab/testcase.yaml diff --git a/tests/subsys/debug/symtab/CMakeLists.txt b/tests/subsys/debug/symtab/CMakeLists.txt new file mode 100644 index 00000000000..2ba2fc90cee --- /dev/null +++ b/tests/subsys/debug/symtab/CMakeLists.txt @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) + +project(symtab) + +target_sources(app PRIVATE src/main.c) diff --git a/tests/subsys/debug/symtab/prj.conf b/tests/subsys/debug/symtab/prj.conf new file mode 100644 index 00000000000..fbc4e671eeb --- /dev/null +++ b/tests/subsys/debug/symtab/prj.conf @@ -0,0 +1,3 @@ +CONFIG_ZTEST=y + +CONFIG_SYMTAB=y diff --git a/tests/subsys/debug/symtab/src/main.c b/tests/subsys/debug/symtab/src/main.c new file mode 100644 index 00000000000..8fa2018fa78 --- /dev/null +++ b/tests/subsys/debug/symtab/src/main.c @@ -0,0 +1,158 @@ +/* + * Copyright 2024 Meta Platforms + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +const struct symtab_info *symtab; + +static void *setup(void) +{ + symtab = symtab_get(); + + return NULL; +} + +ZTEST_SUITE(test_symtab, NULL, setup, NULL, NULL, NULL); + +ZTEST(test_symtab, test_size) +{ + zassert_true(symtab->length > 0); +} + +ZTEST(test_symtab, test_symtab_find_symbol_name) +{ + extern int main(void); + const uintptr_t first_addr = symtab->first_addr; + const uintptr_t last_addr = first_addr + symtab->entries[symtab->length - 1].offset; + uint32_t offset; + const char *symbol_name; + + zassert_between_inclusive((uintptr_t)main, first_addr, last_addr, + "No valid address found for `main()`"); + + /* Find the name of functions with `symtab_find_symbol_name()` */ + offset = -1; + symbol_name = symtab_find_symbol_name((uintptr_t)main, &offset); + zassert_equal(strcmp(symbol_name, "main"), 0); + zassert_equal(offset, 0); + + /* Do a few more just for fun */ + symbol_name = symtab_find_symbol_name((uintptr_t)strcmp, NULL); + zassert_equal(strcmp(symbol_name, "strcmp"), 0); + + symbol_name = symtab_find_symbol_name((uintptr_t)symtab_find_symbol_name, NULL); + zassert_equal(strcmp(symbol_name, "symtab_find_symbol_name"), 0); + + symbol_name = symtab_find_symbol_name((uintptr_t)test_main, NULL); + zassert_equal(strcmp(symbol_name, "test_main"), 0); + + symbol_name = symtab_find_symbol_name((uintptr_t)setup, NULL); + zassert_equal(strcmp(symbol_name, "setup"), 0); +} + +/** + * This testsuite tests the following position in the symbol table + * + * + * [SYMBOL ADDR] | Name Offset + * before first--> . | "?" (not found) 0x0 + * first--> 0x100 | 0x0 + * 0x101 | 0x1 + * . | + * . | + * . | + * last--> 0x300 | 0x0 + * after last--> 0x301 | 0x1 + * . | + * 0x310 (dummy) | "?" (not found) 0x0 + * . | + * after dummy--> 0x342 | "?" (not found) 0x0 + */ + +ZTEST(test_symtab, test_before_first) +{ + const uintptr_t first_addr = symtab->first_addr; + const char *symbol_name; + uint32_t offset; + + /* No symbol should appear before first_addr, but make sure that first_addr != 0 */ + if (first_addr > 0) { + offset = -1; + symbol_name = symtab_find_symbol_name(first_addr - 1, &offset); + zassert_equal(strcmp(symbol_name, "?"), 0); + zassert_equal(offset, 0); + } else { + ztest_test_skip(); + } +} + +ZTEST(test_symtab, test_first) +{ + const uintptr_t first_addr = symtab->first_addr; + const char *symbol_name; + uint32_t offset; + + offset = -1; + symbol_name = symtab_find_symbol_name(first_addr, &offset); + zassert_equal(strcmp(symbol_name, symtab->entries[0].name), 0); + zassert_equal(offset, 0); + + if ((symtab->entries[0].offset + 1) != symtab->entries[1].offset) { + offset = -1; + symbol_name = symtab_find_symbol_name(first_addr + 1, &offset); + zassert_equal(strcmp(symbol_name, symtab->entries[0].name), 0); + zassert_equal(offset, 1); + } +} + +ZTEST(test_symtab, test_last) +{ + const uintptr_t first_addr = symtab->first_addr; + const int last_idx = symtab->length - 1; + const uintptr_t last_addr = first_addr + symtab->entries[last_idx].offset; + const char *symbol_name; + uint32_t offset; + + offset = -1; + symbol_name = symtab_find_symbol_name(last_addr, &offset); + zassert_equal(strcmp(symbol_name, symtab->entries[last_idx].name), 0); + zassert_equal(offset, 0); +} + +ZTEST(test_symtab, test_after_last) +{ + const uintptr_t first_addr = symtab->first_addr; + const uintptr_t last_offset = symtab->entries[symtab->length - 1].offset; + const uintptr_t last_addr = first_addr + last_offset; + const char *symbol_name; + uint32_t offset; + + /* Test `offset` output with last symbol */ + if (last_offset + 0x1 != symtab->entries[symtab->length].offset) { + offset = -1; + symbol_name = symtab_find_symbol_name(last_addr + 0x1, &offset); + zassert_equal(strcmp(symbol_name, symtab->entries[symtab->length - 1].name), 0); + zassert_equal(offset, 0x1); + } else { + ztest_test_skip(); + } +} + +ZTEST(test_symtab, test_after_dummy) +{ + const uintptr_t first_addr = symtab->first_addr; + const uintptr_t last_dummy_offset = symtab->entries[symtab->length].offset; + const uintptr_t last_dummy_addr = first_addr + last_dummy_offset; + const char *symbol_name; + uint32_t offset; + + /* Test `offset` output with dummy symbol (after last dymbol) */ + offset = -1; + symbol_name = symtab_find_symbol_name(last_dummy_addr + 0x42, &offset); + zassert_equal(strcmp(symbol_name, "?"), 0); + zassert_equal(offset, 0); +} diff --git a/tests/subsys/debug/symtab/testcase.yaml b/tests/subsys/debug/symtab/testcase.yaml new file mode 100644 index 00000000000..e20c196705a --- /dev/null +++ b/tests/subsys/debug/symtab/testcase.yaml @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: Apache-2.0 +common: + platform_allow: + - qemu_riscv32 + - qemu_riscv64 + - qemu_cortex_a53 + - qemu_cortex_m3 + - qemu_xtensa + tags: + - debug + - symtab + +tests: + debug.symtab: {}