tests: arch: common: add stack_unwind test
Added test for archs that support it. It triggers an exception
and verify that the fatal message has stack unwind info.
Signed-off-by: Yong Cong Sin <ycsin@meta.com>
diff --git a/tests/arch/common/stack_unwind/CMakeLists.txt b/tests/arch/common/stack_unwind/CMakeLists.txt
new file mode 100644
index 0000000..65858ef
--- /dev/null
+++ b/tests/arch/common/stack_unwind/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (c) 2024 Meta
+# SPDX-License-Identifier: Apache-2.0
+
+cmake_minimum_required(VERSION 3.20.0)
+find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
+project(stack_unwind_test)
+
+FILE(GLOB app_sources src/*.c)
+target_sources(app PRIVATE ${app_sources})
diff --git a/tests/arch/common/stack_unwind/prj.conf b/tests/arch/common/stack_unwind/prj.conf
new file mode 100644
index 0000000..31d2f11
--- /dev/null
+++ b/tests/arch/common/stack_unwind/prj.conf
@@ -0,0 +1,11 @@
+CONFIG_TEST=y
+
+CONFIG_LOG=y
+CONFIG_LOG_BUFFER_SIZE=2048
+
+CONFIG_EXCEPTION_STACK_TRACE=y
+CONFIG_OVERRIDE_FRAME_POINTER_DEFAULT=y
+CONFIG_OMIT_FRAME_POINTER=n
+CONFIG_DEBUG=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_OPTIMIZATIONS=y
diff --git a/tests/arch/common/stack_unwind/src/main.c b/tests/arch/common/stack_unwind/src/main.c
new file mode 100644
index 0000000..0436712
--- /dev/null
+++ b/tests/arch/common/stack_unwind/src/main.c
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2024 Meta
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <stdio.h>
+#include <stdbool.h>
+
+#include <zephyr/kernel.h>
+
+static void func1(int a);
+static void func2(int a);
+
+static void func2(int a)
+{
+ printf("%d: %s\n", a, __func__);
+
+ if (a >= 5) {
+ k_oops();
+ }
+
+ func1(a + 1);
+}
+
+static void func1(int a)
+{
+ printf("%d: %s\n", a, __func__);
+ func2(a + 1);
+}
+
+int main(void)
+{
+ printf("Hello World! %s\n", CONFIG_BOARD);
+
+ func1(1);
+
+ return 0;
+}
diff --git a/tests/arch/common/stack_unwind/testcase.yaml b/tests/arch/common/stack_unwind/testcase.yaml
new file mode 100644
index 0000000..7d963be
--- /dev/null
+++ b/tests/arch/common/stack_unwind/testcase.yaml
@@ -0,0 +1,39 @@
+common:
+ harness: console
+ ignore_faults: true
+ ignore_qemu_crash: true
+ tags: kernel
+tests:
+ arch.common.stack_unwind.riscv:
+ arch_allow: riscv
+ integration_platforms:
+ - qemu_riscv32
+ - qemu_riscv64
+ harness_config:
+ type: multi_line
+ regex:
+ - "E: call trace:"
+ - "E: 0: fp: \\w+ ra: \\w+"
+ - "E: 1: fp: \\w+ ra: \\w+"
+ arch.common.stack_unwind.x86:
+ arch_allow: x86
+ extra_configs:
+ - CONFIG_NO_OPTIMIZATIONS=y
+ integration_platforms:
+ - qemu_x86
+ - qemu_x86_64
+ harness_config:
+ type: multi_line
+ regex:
+ - "E: call trace:"
+ - "E: (E|R)IP: \\w+"
+ arch.common.stack_unwind.arm:
+ arch_allow:
+ - arm64
+ integration_platforms:
+ - qemu_cortex_a53
+ harness_config:
+ type: multi_line
+ regex:
+ - "E: backtrace 0: fp: \\w+ lr: \\w+"
+ - "E: backtrace 1: fp: \\w+ lr: \\w+"